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
,EquivalenceComparison
,FilterExpression
,GeneralComparison
,GeneralComparison10
,IdentityComparison
,LookupExpression
,RangeExpression
,SlashExpression
,ValueComparison
,VennExpression
public abstract class BinaryExpression extends Expression
Binary Expression: a numeric or boolean expression consisting of the two operands and an operator
-
-
Field Summary
Fields Modifier and Type Field Description protected int
operator
-
Fields 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
Constructors Constructor Description BinaryExpression(Expression p0, int op, Expression p1)
Create a binary expression identifying the two operands and the operator
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description int
computeCardinality()
Determine the static cardinality.int
computeHashCode()
Get a hashCode for comparing two expressions.int
computeSpecialProperties()
Determine the special properties of this expressionprotected java.lang.String
displayOperator()
Display the operator used by this binary expressionboolean
equals(java.lang.Object other)
Is this expression the same as another expression?protected void
explainExtraAttributes(ExpressionPresenter out)
Add subclass-specific attributes to the expression tree explanation.void
export(ExpressionPresenter out)
Diagnostic print of expression structure.int
getImplementationMethod()
An implementation of Expression must provide at least one of the methods evaluateItem(), iterate(), or process().Operand
getLhs()
Get the left-hand operandExpression
getLhsExpression()
Get the left-hand operand expressionprotected OperandRole
getOperandRole(int arg)
Get the operand roleint
getOperator()
Get the operatorOperand
getRhs()
Get the right-hand operandExpression
getRhsExpression()
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).java.lang.Iterable<Operand>
operands()
Get the immediate sub-expressions of this expression, with information about the relationship of each expression to its parent expression.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 java.lang.String
tag()
Get the element name used to identify this expression in exported expression formatjava.lang.String
toShortString()
Produce a short string identifying the expression for use in error messagesjava.lang.String
toString()
Represent the expression as a string.Expression
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, dynamicError, effectiveBooleanValue, evaluateAsString, evaluateItem, evaluatePendingUpdates, explain, getCardinality, getConfiguration, getCost, getDependencies, getEvaluationMethod, getExpressionName, getExtraProperty, getIntegerBounds, getInterpretedExpression, 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, markTailFunctionCalls, operandList, operandSparseList, optimizeChildren, prepareForStreaming, process, resetLocalStaticProperties, restoreParentPointers, setEvaluationMethod, setExtraProperty, setFiltered, setLocation, setParentExpression, setRetainedStaticContext, setRetainedStaticContextLocally, setRetainedStaticContextThoroughly, setStaticProperty, simplify, simplifyChildren, staticTypeCheck, suppressValidation, toPattern, typeCheckChildren, typeError, unordered, verifyParentPointers
-
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
-
-
-
-
Constructor Detail
-
BinaryExpression
public BinaryExpression(Expression p0, int op, Expression p1)
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 Detail
-
operands
public final java.lang.Iterable<Operand> 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. Default implementation works off the results of iterateSubExpressions()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
protected OperandRole getOperandRole(int arg)
Get the operand role- Parameters:
arg
- which argument: 0 for the lhs, 1 for the rhs- Returns:
- the operand role
-
getLhs
public Operand getLhs()
Get the left-hand operand- Returns:
- the left-hand operand
-
getLhsExpression
public final Expression getLhsExpression()
Get the left-hand operand expression- Returns:
- the left-hand operand child expression
-
setLhsExpression
public void setLhsExpression(Expression child)
Set the left-hand operand expression- Parameters:
child
- the left-hand operand expression
-
getRhs
public Operand getRhs()
Get the right-hand operand- Returns:
- the right-hand operand
-
getRhsExpression
public final Expression getRhsExpression()
Get the right-hand operand expression- Returns:
- the right-hand operand expression
-
setRhsExpression
public void setRhsExpression(Expression child)
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
public 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
public 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
public boolean equals(java.lang.Object other)
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
public 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
public java.lang.String 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
public java.lang.String 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
public void export(ExpressionPresenter out) throws XPathException
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
protected java.lang.String tag()
Get the element name used to identify this expression in exported expression format- Returns:
- the element name used to identify this expression
-
explainExtraAttributes
protected void explainExtraAttributes(ExpressionPresenter out)
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
protected java.lang.String displayOperator()
Display the operator used by this binary expression- Returns:
- String representation of the operator (for diagnostic display only)
-
-