/* * Copyright (C) 2015 Stichting Akvo (Akvo Foundation) * * This file is part of Akvo FLOW. * * Akvo FLOW is free software: you can redistribute it and modify it under the terms of * the GNU Affero General Public License (AGPL) as published by the Free Software Foundation, * either version 3 of the License or any later version. * * Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License included below for more details. * * The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>. */ package org.akvo.gae.remoteapi; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.google.appengine.api.datastore.DatastoreService; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.FetchOptions; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyFactory; import com.google.appengine.api.datastore.PreparedQuery; import com.google.appengine.api.datastore.Query; import com.google.appengine.api.datastore.Query.Filter; import com.google.appengine.api.datastore.Query.FilterOperator; import com.google.appengine.api.datastore.Query.FilterPredicate; /* * - Adds surveyGroupId property to SurveyedLocale when missing * - Removes SurveyedLocale that are linked to a non existing Survey */ public class FixSurveyedLocale implements Process { private static String ERR_MSG = "Unable to fix SurveyedLocale [%s], reason: %s"; @Override public void execute(DatastoreService ds, String[] args) throws Exception { final Query q = new Query("SurveyedLocale"); final PreparedQuery pq = ds.prepare(q); final List<Key> toBeRemoved = new ArrayList<>(); System.out.println("Processing SurveyedLocales"); for (Entity sl : pq.asIterable(FetchOptions.Builder.withChunkSize(500))) { if (sl.getProperty("surveyGroupId") != null) { continue; } Long surveyId = (Long) sl.getProperty("creationSurveyId"); if (surveyId == null) { final Long surveyInstanceId = (Long) sl.getProperty("lastSurveyalInstanceId"); if (surveyInstanceId == null) { System.err.println(String.format(ERR_MSG, sl.getKey().getId(), "missing property creationSurveyId and lastSurveyalInstanceId")); continue; } // trying to get surveyGroupId from SurveyInstance -> Survey final Filter fsi = new FilterPredicate(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, KeyFactory.createKey("SurveyInstance", surveyInstanceId)); final Query qsi = new Query("SurveyInstance").setFilter(fsi); final Entity si = ds.prepare(qsi).asSingleEntity(); if (si == null) { System.err.println(String.format(ERR_MSG, sl.getKey().getId(), "missing property creationSurveyId and lastSurveyalInstanceId")); continue; } surveyId = (Long) si.getProperty("surveyId"); if (surveyId == null) { System.err.println(String.format(ERR_MSG, sl.getKey().getId(), "SurveyInstance [" + si.getKey().getId() + "] does not have surveyId property")); continue; } } final Filter fs = new FilterPredicate(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, KeyFactory.createKey("Survey", surveyId)); final Query qs = new Query("Survey").setFilter(fs); final Entity survey = ds.prepare(qs).asSingleEntity(); if (survey == null) { System.err.println(String.format(ERR_MSG, sl.getKey().getId(), "Survey [" + surveyId + "] not found")); System.err.println("Marking SurveyedLocale [" + sl.getKey().getId() + "] to be deleted"); toBeRemoved.add(sl.getKey()); continue; } Long surveyGroupId = (Long) survey.getProperty("surveyGroupId"); if (surveyGroupId == null) { System.err.println(String.format(ERR_MSG, sl.getKey().getId(), "surveyGroupId is null for Survey [" + surveyId + "]")); continue; } sl.setProperty("surveyGroupId", surveyGroupId); sl.setProperty("lastUpdateDateTime", new Date()); ds.put(sl); } if (!toBeRemoved.isEmpty()) { System.out.println("Deleting: " + toBeRemoved); ds.delete(toBeRemoved); } } }