private static NodePointer doStepPredicatesStandard()

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);
    }