package org.basex.query.path;
import static org.basex.query.util.Err.*;
import org.basex.query.QueryContext;
import org.basex.query.QueryException;
import org.basex.query.expr.Expr;
import org.basex.query.item.ANode;
import org.basex.query.item.Value;
import org.basex.query.iter.AxisIter;
import org.basex.query.iter.NodeIter;
import org.basex.util.InputInfo;
/**
* Iterative step expression without numeric predicates.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
final class IterStep extends AxisStep {
/**
* Constructor.
* @param ii input info
* @param a axis
* @param t node test
* @param p predicates
*/
IterStep(final InputInfo ii, final Axis a, final Test t, final Expr[] p) {
super(ii, a, t, p);
}
@Override
public NodeIter iter(final QueryContext ctx) {
return new NodeIter() {
AxisIter ai;
@Override
public ANode next() throws QueryException {
if(ai == null) {
final Value v = checkCtx(ctx);
if(!v.type.isNode()) NODESPATH.thrw(input, IterStep.this, v.type);
ai = axis.iter((ANode) v);
}
while(true) {
ctx.checkStop();
final ANode node = ai.next();
if(node == null) return null;
// evaluate node test and predicates
if(test.eval(node) && preds(node, ctx)) return node.finish();
}
}
@Override
public boolean reset() {
ai = null;
return true;
}
};
}
}