package siena.gae; import java.util.List; import siena.core.async.QueryAsync; import siena.core.async.SienaFuture; import siena.core.options.QueryOptionPage; import com.google.appengine.api.datastore.Entity; public class GaeSienaFutureListMapper<T> implements SienaFuture<List<T>>{ Iterable<Entity> entities; QueryAsync<T> query; GaePersistenceManagerAsync pm; MapType mapType = MapType.ALL; public enum MapType { ALL, KEYS_ONLY }; public GaeSienaFutureListMapper( GaePersistenceManagerAsync pm, Iterable<Entity> entities, QueryAsync<T> query){ this.entities = entities; this.query = query; this.pm = pm; } public GaeSienaFutureListMapper( GaePersistenceManagerAsync pm, Iterable<Entity> entities, QueryAsync<T> query, MapType mapType){ this.entities = entities; this.query = query; this.pm = pm; this.mapType = mapType; } public List<T> get() { List<T> results; switch(mapType){ case KEYS_ONLY: results = GaeMappingUtils.mapEntitiesKeysOnly(entities, query.getQueriedClass()); break; case ALL: default: results = pm.map(query, entities); break; } // if paginating and 0 results then no more data else resets noMoreDataAfter QueryOptionPage pag = (QueryOptionPage)query.option(QueryOptionPage.ID); QueryOptionGaeContext gaeCtx = (QueryOptionGaeContext)query.option(QueryOptionGaeContext.ID); if(pag.isPaginating()){ if(results.size() == 0){ gaeCtx.noMoreDataAfter = true; }else { gaeCtx.noMoreDataAfter = false; } } return results; } }