package crmdna.common; import com.google.appengine.api.datastore.*; import com.google.appengine.api.datastore.Query.FilterOperator; import com.googlecode.objectify.Key; import java.util.ArrayList; import java.util.List; public class DSUtils { @SuppressWarnings("unchecked") public static <T1, T2> List<T2> executeProjectionQuery(String kind, Iterable<Key<T1>> keys, String property, Class<T2> type) { List<com.google.appengine.api.datastore.Key> rawKeys = new ArrayList<>(); for (Key<?> key : keys) { rawKeys.add(key.getRaw()); } AsyncDatastoreService datastore = DatastoreServiceFactory .getAsyncDatastoreService(); com.google.appengine.api.datastore.Query.Filter filter = new com.google.appengine.api.datastore.Query.FilterPredicate( Entity.KEY_RESERVED_PROPERTY, FilterOperator.IN, rawKeys); com.google.appengine.api.datastore.Query q = new com.google.appengine.api.datastore.Query( kind); q.setFilter(filter).addProjection( new PropertyProjection(property, type)); List<Entity> entities = datastore.prepare(q).asList( FetchOptions.Builder.withLimit(20000)); List<T2> list = new ArrayList<>(); for (Entity entity : entities) { list.add((T2) entity.getProperty(property)); } return list; } @SuppressWarnings("unchecked") public static <T1, T2, T3> List<T2> executeProjectionQuery2(Class<T3> kind, Iterable<Key<T1>> keys, String property, Class<T2> type) { List<com.google.appengine.api.datastore.Key> rawKeys = new ArrayList<>(); for (Key<?> key : keys) { rawKeys.add(key.getRaw()); } AsyncDatastoreService datastore = DatastoreServiceFactory .getAsyncDatastoreService(); com.google.appengine.api.datastore.Query.Filter filter = new com.google.appengine.api.datastore.Query.FilterPredicate( Entity.KEY_RESERVED_PROPERTY, FilterOperator.IN, rawKeys); com.google.appengine.api.datastore.Query q = new com.google.appengine.api.datastore.Query( kind.getSimpleName()); q.setFilter(filter).addProjection( new PropertyProjection(property, type)); List<Entity> entities = datastore.prepare(q).asList( FetchOptions.Builder.withLimit(20000)); List<T2> list = new ArrayList<>(); for (Entity entity : entities) { list.add((T2) entity.getProperty(property)); } return list; } }