Package net.sf.saxon.expr
Class BinaryExpression
java.lang.Object
net.sf.saxon.expr.Expression
net.sf.saxon.expr.BinaryExpression
- All Implemented Interfaces:
Serializable
,SourceLocator
,LocationProvider
,SaxonLocator
,InstructionInfo
,Locator
- Direct Known Subclasses:
ArithmeticExpression
,ArithmeticExpression10
,BooleanExpression
,GeneralComparison
,GeneralComparison10
,IdentityComparison
,RangeExpression
,ValueComparison
,VennExpression
Binary Expression: a numeric or boolean expression consisting of the
two operands and an operator
- See Also:
-
Field Summary
FieldsFields inherited from class net.sf.saxon.expr.Expression
EFFECTIVE_BOOLEAN_VALUE, EVALUATE_METHOD, EVENT_FEED_METHOD, ITEM_FEED_METHOD, ITERATE_METHOD, locationId, MAX_SEQUENCE_LENGTH, MAX_STRING_LENGTH, PROCESS_METHOD, PUSH_SELECTION, staticProperties, UNBOUNDED_LOWER, UNBOUNDED_UPPER, 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 TypeMethodDescriptionint
Determine the static cardinality.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?void
Diagnostic print of expression structure.protected void
Add subclass-specific attributes to the expression tree explanation.Get the subexpressions (arguments to this expression)Get the operandsint
Get the operatorint
hashCode()
Get a hashCode for comparing two expressions.protected 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).Get the immediate subexpressions of this expressionoptimize
(ExpressionVisitor visitor, ExpressionVisitor.ContextItemType contextItemType) Perform optimisation of an expression and its subexpressions.promote
(PromotionOffer offer, Expression parent) Promote this expression if possibleboolean
replaceSubExpression
(Expression original, Expression replacement) Replace one subexpression by a replacement subexpressionvoid
setFlattened
(boolean flattened) Mark an expression as being "flattened".simplify
(ExpressionVisitor visitor) Simplify an expressiontoString()
The toString() method for an expression attempts to give a representation of the expression in an XPath-like form, but there is no guarantee that the syntax will actually be true XPath.typeCheck
(ExpressionVisitor visitor, ExpressionVisitor.ContextItemType contextItemType) Type-check the expression.Methods inherited from class net.sf.saxon.expr.Expression
addToPathMap, adoptChildExpression, checkForUpdatingSubexpressions, checkPermittedContents, computeDependencies, computeStaticProperties, copy, doPromotion, dynamicError, effectiveBooleanValue, evaluateAsString, evaluateItem, evaluatePendingUpdates, explain, getCardinality, getColumnNumber, getColumnNumber, getConstructType, getContainer, getDependencies, getEvaluationMethod, getExecutable, getExpressionName, getHostLanguage, getImplementationMethod, getIntegerBounds, getIntrinsicDependencies, getItemType, getLineNumber, getLineNumber, getLocationId, getLocationProvider, getObjectName, getProperties, getProperty, getPublicId, getSlotsUsed, getSpecialProperties, getSystemId, getSystemId, hasLoopingSubexpression, hasVariableBinding, implementsStaticTypeCheck, isSubtreeExpression, isUpdatingExpression, isVacuousExpression, iterate, iterateEvents, iterateSameFocusSubExpressions, markTailFunctionCalls, process, resetLocalStaticProperties, setContainer, setEvaluationMethod, setFiltered, setLocationId, staticTypeCheck, suppressValidation, typeError
-
Field Details
-
operand0
-
operand1
-
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
-
simplify
Simplify an expression- Overrides:
simplify
in classExpression
- Parameters:
visitor
- an expression visitor- Returns:
- the simplified expression
- Throws:
XPathException
- if an error is discovered during expression rewriting
-
typeCheck
public Expression typeCheck(ExpressionVisitor visitor, ExpressionVisitor.ContextItemType contextItemType) 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 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 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, ExpressionVisitor.ContextItemType 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
-
promote
Promote this expression if possible- Overrides:
promote
in classExpression
- Parameters:
offer
- details of the offer, for example the offer to move expressions that don't depend on the context to an outer level in the containing expressionparent
- the containing expression in the expression tree- Returns:
- if the offer is not accepted, return this expression unchanged. Otherwise return the result of rewriting the expression to promote this subexpression
- Throws:
XPathException
- if any error is detected
-
iterateSubExpressions
Get the immediate subexpressions of this expression- Overrides:
iterateSubExpressions
in classExpression
- Returns:
- an iterator containing the sub-expressions of this expression
-
getArguments
Get the subexpressions (arguments to this expression)- Returns:
- the arguments, as an array
-
replaceSubExpression
Replace one subexpression by a replacement subexpression- Overrides:
replaceSubExpression
in classExpression
- Parameters:
original
- the original subexpressionreplacement
- the replacement subexpression- Returns:
- true if the original subexpression is found
-
getOperator
public int getOperator()Get the operator- Returns:
- the operator, for example
Token.PLUS
-
getOperands
Get the operands- Returns:
- the two operands of the binary expression, as an array of length 2
-
computeCardinality
public int computeCardinality()Determine the static cardinality. Default implementation returns [0..1] if either operand can be empty, or [1..1] otherwise.- 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
-
computeSpecialProperties
public int computeSpecialProperties()Determine the special properties of this expression- Overrides:
computeSpecialProperties
in classExpression
- Returns:
StaticProperty.NON_CREATIVE
. 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
-
equals
Is this expression the same as another expression? -
hashCode
public int hashCode()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. -
toString
The toString() method for an expression attempts to give a representation of the expression in an XPath-like form, but there is no guarantee that the syntax will actually be true XPath. In the case of XSLT instructions, the toString() method gives an abstracted view of the syntax- Overrides:
toString
in classExpression
- Returns:
- a representation of the expression as a string
-
explain
Diagnostic print of expression structure. The abstract expression tree is written to the supplied output destination.- Specified by:
explain
in classExpression
- Parameters:
out
- the output destination for the displayed expression tree
-
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)
-