/** * Perform optimisation of an expression and its subexpressions. * <p>This method is called after all references to functions and variables have been resolved * to the declaration of the function or variable, and after all type checking has been done.</p> * * @param visitor an expression visitor * @param contextItemType the static type of "." at the point where this expression is invoked. * The parameter is set to null if it is known statically that the context item will be undefined. * If the type of the context item is not known statically, the argument is set to * {@link net.sf.saxon.type.Type#ITEM_TYPE} * @return the original expression, rewritten if appropriate to optimize execution * @throws XPathException if an error is discovered during this phase * (typically a type error) */ /*@NotNull*/ public Expression optimize(ExpressionVisitor visitor, ContextItemStaticInfo contextItemType) throws XPathException { optimizeChildren(visitor, contextItemType); boolean forStreaming = visitor.isOptimizeForStreaming(); setLhsExpression(ExpressionTool.unsortedIfHomogeneous(getLhsExpression(), forStreaming)); setRhsExpression(ExpressionTool.unsortedIfHomogeneous(getRhsExpression(), forStreaming)); Expression op0 = BooleanFn.rewriteEffectiveBooleanValue(getLhsExpression(), visitor, contextItemType); if (op0 != null) { setLhsExpression(op0); } Expression op1 = BooleanFn.rewriteEffectiveBooleanValue(getRhsExpression(), visitor, contextItemType); if (op1 != null) { setRhsExpression(op1); } return preEvaluate(); }
/** * Perform optimisation of an expression and its subexpressions. * <p>This method is called after all references to functions and variables have been resolved * to the declaration of the function or variable, and after all type checking has been done.</p> * * @param visitor an expression visitor * @param contextItemType the static type of "." at the point where this expression is invoked. * The parameter is set to null if it is known statically that the context item will be undefined. * If the type of the context item is not known statically, the argument is set to * {@link net.sf.saxon.type.Type#ITEM_TYPE} * @return the original expression, rewritten if appropriate to optimize execution * @throws XPathException if an error is discovered during this phase * (typically a type error) */ /*@NotNull*/ public Expression optimize(ExpressionVisitor visitor, ContextItemStaticInfo contextItemType) throws XPathException { optimizeChildren(visitor, contextItemType); boolean forStreaming = visitor.isOptimizeForStreaming(); setLhsExpression(ExpressionTool.unsortedIfHomogeneous(getLhsExpression(), forStreaming)); setRhsExpression(ExpressionTool.unsortedIfHomogeneous(getRhsExpression(), forStreaming)); Expression op0 = BooleanFn.rewriteEffectiveBooleanValue(getLhsExpression(), visitor, contextItemType); if (op0 != null) { setLhsExpression(op0); } Expression op1 = BooleanFn.rewriteEffectiveBooleanValue(getRhsExpression(), visitor, contextItemType); if (op1 != null) { setRhsExpression(op1); } return preEvaluate(); }
public Expression typeCheck(ExpressionVisitor visitor, ContextItemStaticInfo contextInfo) throws XPathException { getLhs().typeCheck(visitor, contextInfo); getRhs().typeCheck(visitor, contextInfo); TypeHierarchy th = visitor.getConfiguration().getTypeHierarchy(); XPathException err0 = TypeChecker.ebvError(getLhsExpression(), th); if (err0 != null) { err0.setLocator(getLocation()); throw err0; } XPathException err1 = TypeChecker.ebvError(getRhsExpression(), th); if (err1 != null) { err1.setLocator(getLocation()); throw err1; } // Precompute the EBV of any constant operand if (getLhsExpression() instanceof Literal && !(((Literal) getLhsExpression()).getValue() instanceof BooleanValue)) { setLhsExpression(Literal.makeLiteral( BooleanValue.get(getLhsExpression().effectiveBooleanValue(visitor.makeDynamicContext())), this)); } if (getRhsExpression() instanceof Literal && !(((Literal) getRhsExpression()).getValue() instanceof BooleanValue)) { setRhsExpression(Literal.makeLiteral( BooleanValue.get(getRhsExpression().effectiveBooleanValue(visitor.makeDynamicContext())), this)); } return preEvaluate(); }
public Expression typeCheck(ExpressionVisitor visitor, ContextItemStaticInfo contextInfo) throws XPathException { getLhs().typeCheck(visitor, contextInfo); getRhs().typeCheck(visitor, contextInfo); TypeHierarchy th = visitor.getConfiguration().getTypeHierarchy(); XPathException err0 = TypeChecker.ebvError(getLhsExpression(), th); if (err0 != null) { err0.setLocator(getLocation()); throw err0; } XPathException err1 = TypeChecker.ebvError(getRhsExpression(), th); if (err1 != null) { err1.setLocator(getLocation()); throw err1; } // Precompute the EBV of any constant operand if (getLhsExpression() instanceof Literal && !(((Literal) getLhsExpression()).getValue() instanceof BooleanValue)) { setLhsExpression(Literal.makeLiteral( BooleanValue.get(getLhsExpression().effectiveBooleanValue(visitor.makeDynamicContext())), this)); } if (getRhsExpression() instanceof Literal && !(((Literal) getRhsExpression()).getValue() instanceof BooleanValue)) { setRhsExpression(Literal.makeLiteral( BooleanValue.get(getRhsExpression().effectiveBooleanValue(visitor.makeDynamicContext())), this)); } return preEvaluate(); }
BooleanExpression bf = (BooleanExpression) getFilter(); if (isExplicitlyPositional(bf.getLhsExpression()) && !isExplicitlyPositional(bf.getRhsExpression())) { Expression p0 = forceToBoolean(bf.getLhsExpression()); Expression p1 = forceToBoolean(bf.getRhsExpression()); FilterExpression f1 = new FilterExpression(getBase(), p0); ExpressionTool.copyLocationInfo(this, f1); if (isExplicitlyPositional(bf.getRhsExpression()) && !isExplicitlyPositional(bf.getLhsExpression())) { Expression p0 = forceToBoolean(bf.getLhsExpression()); Expression p1 = forceToBoolean(bf.getRhsExpression()); FilterExpression f1 = new FilterExpression(getBase(), p1); ExpressionTool.copyLocationInfo(this, f1);
BooleanExpression bf = (BooleanExpression) getFilter(); if (isExplicitlyPositional(bf.getLhsExpression()) && !isExplicitlyPositional(bf.getRhsExpression())) { Expression p0 = forceToBoolean(bf.getLhsExpression()); Expression p1 = forceToBoolean(bf.getRhsExpression()); FilterExpression f1 = new FilterExpression(getBase(), p0); ExpressionTool.copyLocationInfo(this, f1); if (isExplicitlyPositional(bf.getRhsExpression()) && !isExplicitlyPositional(bf.getLhsExpression())) { Expression p0 = forceToBoolean(bf.getLhsExpression()); Expression p1 = forceToBoolean(bf.getRhsExpression()); FilterExpression f1 = new FilterExpression(getBase(), p1); ExpressionTool.copyLocationInfo(this, f1);