package org.sothis.dal.query; import java.io.Serializable; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import org.sothis.core.util.AbstractCursor; import org.sothis.core.util.Pager; import org.sothis.dal.Dao; import org.sothis.dal.Entity; public class DaoCursor<E extends Entity, K extends Serializable> extends AbstractCursor<E> { private final Cnd cnd; private final Chain chain; private List<E> result; private int count = -1; private int seen = 0; private Dao<E, K> dao; public DaoCursor(Dao<E, K> dao, Cnd cnd, Chain chain) { this.dao = dao; this.cnd = cnd; this.chain = chain; } @Override public Iterator<E> iterator() { return new CursorIterator(); } @Override public int count() { if (count == -1) { count = dao.count(cnd); } return count; } private class CursorIterator implements Iterator<E> { private Iterator<E> i; @Override public boolean hasNext() { if (null != i && i.hasNext()) { return true; } if (seen < limit) { result = dao.find(cnd, Pager.make(skip + seen, Math.min(batchSize, limit - seen)), chain); seen += result.size(); i = result.iterator(); } return null != i && i.hasNext(); } @Override public E next() { if (!hasNext()) { throw new NoSuchElementException(); } return i.next(); } @Override public void remove() { } } }