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 intoperator-
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 intcomputeCardinality()Determine the static cardinality.intcomputeHashCode()Get a hashCode for comparing two expressions.intcomputeSpecialProperties()Determine the special properties of this expressionprotected java.lang.StringdisplayOperator()Display the operator used by this binary expressionbooleanequals(java.lang.Object other)Is this expression the same as another expression?protected voidexplainExtraAttributes(ExpressionPresenter out)Add subclass-specific attributes to the expression tree explanation.voidexport(ExpressionPresenter out)Diagnostic print of expression structure.intgetImplementationMethod()An implementation of Expression must provide at least one of the methods evaluateItem(), iterate(), or process().OperandgetLhs()Get the left-hand operandExpressiongetLhsExpression()Get the left-hand operand expressionprotected OperandRolegetOperandRole(int arg)Get the operand roleintgetOperator()Get the operatorOperandgetRhs()Get the right-hand operandExpressiongetRhsExpression()Get 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).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.Expressionoptimize(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 java.lang.Stringtag()Get the element name used to identify this expression in exported expression formatjava.lang.StringtoShortString()Produce a short string identifying the expression for use in error messagesjava.lang.StringtoString()Represent the expression as a string.ExpressiontypeCheck(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:ExpressionGet 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:
operandsin 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:
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
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:
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
public 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
public boolean equals(java.lang.Object other)
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
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:
computeHashCodein 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:
toStringin classExpression- Returns:
- the expression as a string in XPath 3.0 syntax
-
toShortString
public java.lang.String 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
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:
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
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)
-
-