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 int
Determine the static cardinality.protected int
Get a hashCode for comparing two expressions.protected int
Determine the special properties of this expressionprotected String
Display the operator used by this binary expressionboolean
Is this expression the same as another expression?protected void
Add subclass-specific attributes to the expression tree explanation.void
Diagnostic print of expression structure.int
An implementation of Expression must provide at least one of the methods evaluateItem(), iterate(), or process().getLhs()
Get the left-hand operandfinal Expression
Get the left-hand operand expressionprotected OperandRole
getOperandRole
(int arg) Get the operand roleint
Get the operatorgetRhs()
Get the right-hand operandfinal Expression
Get the right-hand operand expressionprotected static boolean
isAssociative
(int operator) Determine whether an operator is associative, that is, ((a^b)^c) = (a^(b^c))protected static boolean
isCommutative
(int operator) Determine whether a binary operator is commutative, that is, A op B = B op A.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).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.void
setFlattened
(boolean flattened) Mark an expression as being "flattened".void
setLhsExpression
(Expression child) Set the left-hand operand expressionvoid
setRhsExpression
(Expression child) Set the right-hand operand expressionprotected String
tag()
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, withLocation
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
Methods 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:Expression
Get 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:
operands
in 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:
typeCheck
in 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:
optimize
in 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:
setFlattened
in 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:
computeCardinality
in 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_ZERO
if the result is known to be an empty sequence, orStaticProperty.ALLOWS_MANY
if if is known to return a sequence of length two or more.
-
computeSpecialProperties
protected int computeSpecialProperties()Determine the special properties of this expression- Overrides:
computeSpecialProperties
in 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:
getImplementationMethod
in classExpression
- Returns:
- the implementation method, for example
Expression.ITERATE_METHOD
orExpression.EVALUATE_METHOD
orExpression.PROCESS_METHOD
-
equals
Is this expression the same as another expression?- Overrides:
equals
in 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:
computeHashCode
in 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:
toString
in classExpression
- Returns:
- the expression as a string in XPath 3.0 syntax
-
toShortString
Description copied from class:Expression
Produce a short string identifying the expression for use in error messages- Overrides:
toShortString
in 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:
export
in interfaceExportAgent
- Specified by:
export
in 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)
-