in src/main/java/org/apache/commons/jxpath/ri/axes/SimplePathInterpreter.java [505:555]
private static NodePointer doStepPredicatesStandard(final EvalContext context, final NodePointer parent, final Step[] steps, final int currentStep) {
final Step step = steps[currentStep];
final Expression[] predicates = step.getPredicates();
final int axis = step.getAxis();
if (axis == Compiler.AXIS_SELF) {
return doPredicate(context, parent, steps, currentStep, predicates, 0);
}
final Expression predicate = predicates[0];
// Optimize for a single predicate to avoid building a list
// and to allow the direct access to the index'th element
// in the case of a simple subscript predecate
// It is a very common use case, so it deserves individual
// attention
if (predicates.length == 1) {
final NodeIterator it = getNodeIterator(context, parent, step);
NodePointer pointer = null;
if (it != null) {
if (predicate instanceof NameAttributeTest) { // [@name = key]
final String key = keyFromPredicate(context, predicate);
for (int i = 1; it.setPosition(i); i++) {
final NodePointer ptr = it.getNodePointer();
if (isNameAttributeEqual(ptr, key)) {
pointer = ptr;
break;
}
}
} else {
final int index = indexFromPredicate(context, predicate);
if (it.setPosition(index + 1)) {
pointer = it.getNodePointer();
}
}
}
if (pointer != null) {
return doStep(context, pointer, steps, currentStep + 1);
}
} else {
final NodeIterator it = getNodeIterator(context, parent, step);
if (it != null) {
final List<NodePointer> list = new ArrayList<>();
for (int i = 1; it.setPosition(i); i++) {
list.add(it.getNodePointer());
}
final NodePointer pointer = doPredicatesStandard(context, list, steps, currentStep, predicates, 0);
if (pointer != null) {
return pointer;
}
}
}
return createNullPointer(context, parent, steps, currentStep);
}