package org.basex.query.expr;
import org.basex.query.QueryContext;
import org.basex.query.QueryException;
import org.basex.query.item.Item;
import org.basex.query.item.Value;
import org.basex.query.iter.Iter;
/**
* Iterative filter expression without numeric predicates.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
final class IterFilter extends Filter {
/**
* Constructor.
* @param f original filter
*/
IterFilter(final Filter f) {
super(f.input, f.root, f.preds);
type = f.type;
}
@Override
public Iter iter(final QueryContext ctx) {
return new Iter() {
/** Iterator. */
Iter iter;
@Override
public Item next() throws QueryException {
// first call - initialize iterator
if(iter == null) iter = ctx.iter(root);
// cache context
final Value cv = ctx.value;
final long cp = ctx.pos;
final long cs = ctx.size;
try {
while(true) {
ctx.checkStop();
final Item it = iter.next();
if(it == null) return null;
if(preds(it, ctx)) return it;
}
} finally {
ctx.value = cv;
ctx.pos = cp;
ctx.size = cs;
}
}
};
}
}