package siena.gae;
import java.lang.reflect.Field;
import java.util.Iterator;
import siena.ClassInfo;
import siena.Query;
import siena.core.options.QueryOptionPage;
import com.google.appengine.api.datastore.Entity;
/**
* @author mandubian <pascal.voitot@mandubian.org>
*
* A Siena Iterable<Model> encapsulating a GAE Iterable<Entity> with its Iterator<Model>...
*/
public class GaeSienaIterable<Model> implements Iterable<Model> {
Iterable<Entity> gaeIterable;
Query<Model> query;
GaePersistenceManager pm;
GaeSienaIterable(GaePersistenceManager pm, Iterable<Entity> gaeIterable, Query<Model> query) {
this.gaeIterable = gaeIterable;
this.query = query;
this.pm = pm;
}
public Iterator<Model> iterator() {
return new SienaGaeIterator<Model>(query, gaeIterable);
}
public class SienaGaeIterator<T> implements Iterator<T> {
Field id;
Query<T> query;
Iterator<Entity> gaeIterator;
SienaGaeIterator(Query<T> query, Iterable<Entity> gaeIterable) {
this.query = query;
this.id = ClassInfo.getIdField(query.getQueriedClass());
this.gaeIterator = gaeIterable.iterator();
// 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(!gaeIterator.hasNext()){
gaeCtx.noMoreDataAfter = true;
}else {
gaeCtx.noMoreDataAfter = false;
}
}
}
public boolean hasNext() {
return gaeIterator.hasNext();
}
public T next() {
Entity entity = gaeIterator.next();
T obj = pm.map(query, entity);
return obj;
}
public void remove() {
gaeIterator.remove();
}
}
}