contextInfo.addFlag(SINGLE_STEP_EXECUTION);
newContextInfo.addFlag(SINGLE_STEP_EXECUTION);
    public void analyze(AnalyzeContextInfo contextInfo) throws XPathException {        contextInfo.addFlag(IN_PREDICATE); // set flag to signal subexpression that we are in a predicate        contextInfo.removeFlag(IN_WHERE_CLAUSE);	// remove where clause flag        contextInfo.removeFlag(DOT_TEST);        outerContextId = contextInfo.getContextId();        contextInfo.setContextId(getExpressionId());        AnalyzeContextInfo newContextInfo = new AnalyzeContextInfo(contextInfo);    	newContextInfo.setParent(this);        super.analyze(newContextInfo);              if ((newContextInfo.getFlags() & DOT_TEST) == DOT_TEST)        	innerExpressionDot = true;                Expression inner = getExpression(0);                // Case 1: predicate expression returns a node set.         // Check the returned node set against the context set         // and return all nodes from the context, for which the		// predicate expression returns a non-empty sequence.        if (Type.subTypeOf(inner.returnsType(), Type.NODE)) {            if(!Dependency.dependsOn(inner, Dependency.CONTEXT_ITEM))                executionMode = NODE;            else                executionMode = BOOLEAN;                    // Case 2: predicate expression returns a number.        } else if (Type.subTypeOf(inner.returnsType(), Type.NUMBER) && (inner.getCardinality() == Cardinality.EXACTLY_ONE        		|| inner.getCardinality() == Cardinality.ZERO_OR_ONE)) {            //Just a hint : inner's cardinality may still be potential            executionMode = POSITIONAL;                    // Case 3: predicate expression evaluates to a boolean.        } else            executionMode = BOOLEAN;        		if(executionMode == BOOLEAN) {		    contextInfo.addFlag(SINGLE_STEP_EXECUTION);		    // need to re-analyze:		    super.analyze(contextInfo);		}    }