final Expression path = getArgument(0);
final Expression termsExpr = getArgument(1);
final Expression flagsExpr = (getArgumentCount() == 3) ? getArgument(2) : null;
final boolean matchAll = getMatchFlag(flagsExpr, contextSequence);
NodeSet result;
// if the expression does not depend on the current context item,
// we can evaluate it in one single step
if (path == null || !Dependency.dependsOn(path, Dependency.CONTEXT_ITEM)) {
final boolean canCache =
(getTermDependencies() & Dependency.CONTEXT_ITEM) == Dependency.NO_DEPENDENCY;
if( canCache && cached != null && cached.isValid(contextSequence, contextItem)) {
return cached.getResult();
}
// do we optimize this expression?
if (contextStep == null || preselectResult == null) {
// no optimization: process the whole expression
final NodeSet nodes =
path == null
? contextSequence.toNodeSet()
: path.eval(contextSequence).toNodeSet();
final List<String> terms = getSearchTerms(termsExpr, contextSequence);
result = evalQuery(nodes, terms, matchAll).toNodeSet();
} else {
contextStep.setPreloadedData(contextSequence.getDocumentSet(), preselectResult);
result = path.eval(contextSequence).toNodeSet();
}
if(canCache && contextSequence != null && contextSequence.isCacheable()) {
cached = new CachedResult(contextSequence, contextItem, result);
}
// otherwise we have to walk through each item in the context
} else {
Item current;
// String arg;
NodeSet nodes;
result = new ExtArrayNodeSet();
Sequence temp;
for (final SequenceIterator i = contextSequence.iterate(); i.hasNext();) {
current = i.nextItem();
final List<String> terms = getSearchTerms(termsExpr, contextSequence);