Package net.sf.saxon.expr
Class BinaryExpression
java.lang.Object
net.sf.saxon.expr.Expression
net.sf.saxon.expr.BinaryExpression
- All Implemented Interfaces:
ExportAgent,Locatable,IdentityComparable,Traceable
- Direct Known Subclasses:
ArithmeticExpression,BooleanExpression,FilterExpression,GeneralComparison,GeneralComparison10,IdentityComparison,LookupExpression,SlashExpression,SwitchCaseComparison,ValueComparison,VennExpression
Binary Expression: a numeric or boolean expression consisting of the
two operands and an operator
-
Field Summary
FieldsFields inherited from class net.sf.saxon.expr.Expression
EFFECTIVE_BOOLEAN_VALUE, EVALUATE_METHOD, ITEM_FEED_METHOD, ITERATE_METHOD, MAX_COST, MAX_SEQUENCE_LENGTH, MAX_STRING_LENGTH, PROCESS_METHOD, staticProperties, UNBOUNDED_LOWER, UNBOUNDED_UPPER, UPDATE_METHOD, WATCH_METHOD -
Constructor Summary
ConstructorsConstructorDescriptionBinaryExpression(Expression p0, int op, Expression p1) Create a binary expression identifying the two operands and the operator -
Method Summary
Modifier and TypeMethodDescriptionprotected intDetermine the static cardinality.protected intGet a hashCode for comparing two expressions.protected intDetermine the special properties of this expressionprotected StringDisplay the operator used by this binary expressionbooleanIs this expression the same as another expression?protected voidAdd subclass-specific attributes to the expression tree explanation.voidDiagnostic print of expression structure.intAn implementation of Expression must provide at least one of the methods evaluateItem(), iterate(), or process().getLhs()Get the left-hand operandfinal ExpressionGet the left-hand operand expressionprotected OperandRolegetOperandRole(int arg) Get the operand roleintGet the operatorgetRhs()Get the right-hand operandfinal ExpressionGet the right-hand operand expressionprotected static booleanisAssociative(int operator) Determine whether an operator is associative, that is, ((a^b)^c) = (a^(b^c))protected static booleanisCommutative(int operator) Determine whether a binary operator is commutative, that is, A op B = B op A.protected static booleanisInverse(int op1, int op2) Test if one operator is the inverse of another, so that (A op1 B) is equivalent to (B op2 A).operands()Get the immediate sub-expressions of this expression, with information about the relationship of each expression to its parent expression.optimize(ExpressionVisitor visitor, ContextItemStaticInfo contextItemType) Perform optimisation of an expression and its subexpressions.voidsetFlattened(boolean flattened) Mark an expression as being "flattened".voidsetLhsExpression(Expression child) Set the left-hand operand expressionvoidsetRhsExpression(Expression child) Set the right-hand operand expressionprotected Stringtag()Get the element name used to identify this expression in exported expression formatProduce a short string identifying the expression for use in error messagestoString()Represent the expression as a string.typeCheck(ExpressionVisitor visitor, ContextItemStaticInfo contextInfo) Type-check the expression.Methods inherited from class net.sf.saxon.expr.Expression
addToPathMap, adoptChildExpression, allowExtractingCommonSubexpressions, checkedOperands, checkForUpdatingSubexpressions, checkPermittedContents, computeDependencies, computeStaticProperties, copy, dispatchTailCall, dynamicError, effectiveBooleanValue, evaluateAsString, evaluateItem, explain, getCardinality, getConfiguration, getCost, getDependencies, getElaborator, getEvaluationMethod, getExpressionName, getExtraProperty, getIntegerBounds, getIntrinsicDependencies, getItemType, getLocalRetainedStaticContext, getLocation, getNetCost, getObjectName, getPackageData, getParentExpression, getProperties, getProperty, getRetainedStaticContext, getScopingExpression, getSlotsUsed, getSpecialProperties, getStaticBaseURI, getStaticBaseURIString, getStaticType, getStaticUType, getStreamerName, getTracingTag, hasCompatibleStaticContext, hashCode, hasSpecialProperty, hasVariableBinding, identityHashCode, implementsStaticTypeCheck, isCallOn, isEqual, isIdentical, isInstruction, isLiftable, isMultiThreaded, isStaticPropertiesKnown, isSubtreeExpression, isUpdatingExpression, isVacuousExpression, iterate, makeElaborator, markTailFunctionCalls, operandList, operandSparseList, optimizeChildren, prepareForStreaming, process, resetLocalStaticProperties, restoreParentPointers, setEvaluationMethod, setExtraProperty, setFiltered, setLocation, setParentExpression, setRetainedStaticContext, setRetainedStaticContextLocally, setRetainedStaticContextThoroughly, setStaticProperty, simplify, simplifyChildren, staticTypeCheck, supportsLazyEvaluation, suppressValidation, toPattern, typeCheckChildren, typeError, unordered, verifyParentPointers, withLocationMethods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, waitMethods inherited from interface net.sf.saxon.trace.Traceable
gatherProperties
-
Field Details
-
operator
protected int operator
-
-
Constructor Details
-
BinaryExpression
Create a binary expression identifying the two operands and the operator- Parameters:
p0- the left-hand operandop- the operator, as a token returned by the Tokenizer (e.g. Token.AND)p1- the right-hand operand
-
-
Method Details
-
operands
Description copied from class:ExpressionGet the immediate sub-expressions of this expression, with information about the relationship of each expression to its parent expression.If the expression is a Callable, then it is required that the order of the operands returned by this function is the same as the order of arguments supplied to the corresponding call() method.
- Overrides:
operandsin classExpression- Returns:
- an iterator containing the sub-expressions of this expression
-
getOperandRole
Get the operand role- Parameters:
arg- which argument: 0 for the lhs, 1 for the rhs- Returns:
- the operand role
-
getLhs
Get the left-hand operand- Returns:
- the left-hand operand
-
getLhsExpression
Get the left-hand operand expression- Returns:
- the left-hand operand child expression
-
setLhsExpression
Set the left-hand operand expression- Parameters:
child- the left-hand operand expression
-
getRhs
Get the right-hand operand- Returns:
- the right-hand operand
-
getRhsExpression
Get the right-hand operand expression- Returns:
- the right-hand operand expression
-
setRhsExpression
Set the right-hand operand expression- Parameters:
child- the right-hand operand expression
-
typeCheck
public Expression typeCheck(ExpressionVisitor visitor, ContextItemStaticInfo contextInfo) throws XPathException Type-check the expression. Default implementation for binary operators that accept any kind of operand- Overrides:
typeCheckin classExpression- Parameters:
visitor- an expression visitorcontextInfo- Information available statically about the context item: whether it is (possibly) absent; its static type; its streaming posture.- Returns:
- the original expression, rewritten to perform necessary run-time type checks, and to perform other type-related optimizations
- Throws:
XPathException- if an error is discovered during this phase (typically a type error)
-
optimize
public Expression optimize(ExpressionVisitor visitor, ContextItemStaticInfo contextItemType) throws XPathException Perform optimisation of an expression and its subexpressions.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.
- Overrides:
optimizein classExpression- Parameters:
visitor- an expression visitorcontextItemType- 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 toType.ITEM_TYPE- Returns:
- the original expression, rewritten if appropriate to optimize execution
- Throws:
XPathException- if an error is discovered during this phase (typically a type error)
-
setFlattened
public void setFlattened(boolean flattened) Mark an expression as being "flattened". This is a collective term that includes extracting the string value or typed value, or operations such as simple value construction that concatenate text nodes before atomizing. The implication of all of these is that although the expression might return nodes, the identity of the nodes has no significance. This is called during type checking of the parent expression.- Overrides:
setFlattenedin classExpression- Parameters:
flattened- set to true if the result of the expression is atomized or otherwise turned into an atomic value
-
getOperator
public int getOperator()Get the operator- Returns:
- the operator, for example
Token.PLUS
-
computeCardinality
protected int computeCardinality()Determine the static cardinality. Default implementation returns [0..1] if either operand can be empty, or [1..1] otherwise, provided that the arguments are of atomic type. This caveat is necessary because the method can be called before type-checking, and a node or array with cardinality [1..n] might be atomized to an empty sequence.- Specified by:
computeCardinalityin classExpression- Returns:
- the computed cardinality, as one of the values
StaticProperty.ALLOWS_ZERO_OR_ONE,StaticProperty.EXACTLY_ONE,StaticProperty.ALLOWS_ONE_OR_MORE,StaticProperty.ALLOWS_ZERO_OR_MORE. May also returnStaticProperty.ALLOWS_ZEROif the result is known to be an empty sequence, orStaticProperty.ALLOWS_MANYif if is known to return a sequence of length two or more.
-
computeSpecialProperties
protected int computeSpecialProperties()Determine the special properties of this expression- Overrides:
computeSpecialPropertiesin classExpression- Returns:
StaticProperty.NO_NODES_NEWLY_CREATED. This is overridden for some subclasses.
-
isCommutative
protected static boolean isCommutative(int operator) Determine whether a binary operator is commutative, that is, A op B = B op A.- Parameters:
operator- the operator, for exampleToken.PLUS- Returns:
- true if the operator is commutative
-
isAssociative
protected static boolean isAssociative(int operator) Determine whether an operator is associative, that is, ((a^b)^c) = (a^(b^c))- Parameters:
operator- the operator, for exampleToken.PLUS- Returns:
- true if the operator is associative
-
isInverse
protected static boolean isInverse(int op1, int op2) Test if one operator is the inverse of another, so that (A op1 B) is equivalent to (B op2 A). Commutative operators are the inverse of themselves and are therefore not listed here.- Parameters:
op1- the first operatorop2- the second operator- Returns:
- true if the operators are the inverse of each other
-
getImplementationMethod
public int getImplementationMethod()An implementation of Expression must provide at least one of the methods evaluateItem(), iterate(), or process(). This method indicates which of these methods is provided directly. The other methods will always be available indirectly, using an implementation that relies on one of the other methods.- Specified by:
getImplementationMethodin classExpression- Returns:
- the implementation method, for example
Expression.ITERATE_METHODorExpression.EVALUATE_METHODorExpression.PROCESS_METHOD
-
equals
Is this expression the same as another expression?- Overrides:
equalsin classExpression- Parameters:
other- the other operand; the result is false if this is not an Expression- Returns:
- true if the other operand is an expression and if it can be determined that the two expressions are equivalent, in the sense that they will always return the same result.
-
computeHashCode
protected int computeHashCode()Get a hashCode for comparing two expressions. Note that this hashcode gives the same result for (A op B) and for (B op A), whether or not the operator is commutative.- Overrides:
computeHashCodein classExpression- Returns:
- a computed hash code
-
toString
Represent the expression as a string. The resulting string will be a valid XPath 3.0 expression with no dependencies on namespace bindings other than the binding of the prefix "xs" to the XML Schema namespace.- Overrides:
toStringin classExpression- Returns:
- the expression as a string in XPath 3.0 syntax
-
toShortString
Description copied from class:ExpressionProduce a short string identifying the expression for use in error messages- Overrides:
toShortStringin classExpression- Returns:
- a short string, sufficient to identify the expression
-
export
Diagnostic print of expression structure. The abstract expression tree is written to the supplied output destination.- Specified by:
exportin interfaceExportAgent- Specified by:
exportin classExpression- Parameters:
out- the output destination for the displayed expression tree- Throws:
XPathException- if the export fails, for example if an expression is found that won't work in the target environment.
-
tag
Get the element name used to identify this expression in exported expression format- Returns:
- the element name used to identify this expression
-
explainExtraAttributes
Add subclass-specific attributes to the expression tree explanation. Default implementation does nothing; this is provided for subclasses to override.- Parameters:
out- the output destination for the displayed expression tree
-
displayOperator
Display the operator used by this binary expression- Returns:
- String representation of the operator (for diagnostic display only)
-