Package com.saxonica.ee.optim
Class SwitchExpression
- java.lang.Object
-
- net.sf.saxon.expr.Expression
-
- com.saxonica.ee.optim.SwitchExpression
-
- All Implemented Interfaces:
ExportAgent,ConditionalInstruction,TailCallReturner,Locatable,IdentityComparable,Traceable
public class SwitchExpression extends Expression implements TailCallReturner, ConditionalInstruction
An optimized Choose expression in which all the branches are tests of the same expression for equality with some value. Note this is not quite the same as the XQuery 3.1 switch expression; this switch expression is usually generated as the result of optimizing an xsl:choose or extended if/then/else expression.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classSwitchExpression.SwitchCaseInfoData structure used for holding details of a switch expression
-
Field Summary
Fields Modifier and Type Field Description static OperandRoleSUBJECT-
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 SwitchExpression(SwitchExpression.SwitchCaseInfo switchCaseInfo)Create a switch expression
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description booleanallowExtractingCommonSubexpressions()Ask whether common subexpressions found in the operands of this expression can be extracted and evaluated outside the expression itself.protected intcomputeCardinality()Compute the static cardinality of this expressionExpressioncopy(RebindingMap rebindings)Copy an expression.ItemevaluateItem(XPathContext context)Evaluate an expression as a single item.voidexport(ExpressionPresenter out)Diagnostic print of expression structure.OperandgetAction(int index)java.util.List<Operand>getActions()java.util.Map<AtomicMatchKey,java.lang.Integer>getCaseMap()Get the map from XPathComparable objects representing the values to the expressions to be executed for each of these valuesStringCollatorgetCollation()Get the collation usedjava.lang.StringgetExpressionName()Get a name identifying the kind of expression, in terms meaningful to a user.intgetImplementationMethod()An implementation of Expression must provide at least one of the methods evaluateItem(), iterate(), or process().ItemTypegetItemType()Determine the data type of the expression, if possible.ExpressiongetOtherwiseExpression()Get the default ("otherwise") expressionOperandgetOtherwiseOperand()java.lang.StringgetStreamerName()Get the (partial) name of a class that supports streaming of this kind of expressionExpressiongetSubjectExpression()Get the subject expression (the expression that computes the switch value)booleanisInstruction()Ask whether this expression is an instruction.SequenceIteratoriterate(XPathContext context)Return an Iterator to iterate over the values of a sequence.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.voidprocess(Outputter output, XPathContext context)Process the instruction, without returning any tail callsTailCallprocessLeavingTail(Outputter output, XPathContext context)ProcessLeavingTail: called to do the real work of this instruction.voidsetInstruction(boolean inst)Say whether this switch expression originates as an XSLT instructionExpressionunordered(boolean retainAllNodes, boolean forStreaming)Replace this expression by a simpler expression that delivers the results without regard to order.-
Methods inherited from class net.sf.saxon.expr.Expression
addToPathMap, adoptChildExpression, checkedOperands, checkForUpdatingSubexpressions, checkPermittedContents, computeDependencies, computeHashCode, computeSpecialProperties, computeStaticProperties, dynamicError, effectiveBooleanValue, equals, evaluateAsString, evaluatePendingUpdates, explain, getCardinality, getConfiguration, getCost, getDependencies, getEvaluationMethod, getExtraProperty, getIntegerBounds, getInterpretedExpression, getIntrinsicDependencies, getLocalRetainedStaticContext, getLocation, getNetCost, getObjectName, getPackageData, getParentExpression, getProperties, getProperty, getRetainedStaticContext, getScopingExpression, getSlotsUsed, getSpecialProperties, getStaticBaseURI, getStaticBaseURIString, getStaticType, getStaticUType, getTracingTag, hasCompatibleStaticContext, hashCode, hasSpecialProperty, hasVariableBinding, identityHashCode, implementsStaticTypeCheck, isCallOn, isEqual, isIdentical, isLiftable, isMultiThreaded, isStaticPropertiesKnown, isSubtreeExpression, isUpdatingExpression, isVacuousExpression, markTailFunctionCalls, operandList, operandSparseList, optimize, optimizeChildren, prepareForStreaming, resetLocalStaticProperties, restoreParentPointers, setEvaluationMethod, setExtraProperty, setFiltered, setFlattened, setLocation, setParentExpression, setRetainedStaticContext, setRetainedStaticContextLocally, setRetainedStaticContextThoroughly, setStaticProperty, simplify, simplifyChildren, staticTypeCheck, suppressValidation, toPattern, toShortString, toString, typeCheck, typeCheckChildren, typeError, 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
-
-
-
-
Field Detail
-
SUBJECT
public static final OperandRole SUBJECT
-
-
Constructor Detail
-
SwitchExpression
public SwitchExpression(SwitchExpression.SwitchCaseInfo switchCaseInfo)
Create a switch expression- Parameters:
switchCaseInfo- details of the expression to be constructed
-
-
Method Detail
-
setInstruction
public void setInstruction(boolean inst)
Say whether this switch expression originates as an XSLT instruction- Parameters:
inst- true if this started life as an xsl:choose instruction
-
isInstruction
public boolean isInstruction()
Ask whether this expression is an instruction. In XSLT streamability analysis this is used to distinguish constructs corresponding to XSLT instructions from other constructs.- Overrides:
isInstructionin classExpression- Returns:
- true if this construct originates as an XSLT instruction
-
getSubjectExpression
public Expression getSubjectExpression()
Get the subject expression (the expression that computes the switch value)- Returns:
- the expression that computes the switch value
-
getCaseMap
public java.util.Map<AtomicMatchKey,java.lang.Integer> getCaseMap()
Get the map from XPathComparable objects representing the values to the expressions to be executed for each of these values- Returns:
- the map of case clauses
-
getOtherwiseExpression
public Expression getOtherwiseExpression()
Get the default ("otherwise") expression- Returns:
- the "otherwise" expression giving the value to be returned if none of the cases match
-
getAction
public Operand getAction(int index)
-
getActions
public java.util.List<Operand> getActions()
-
getOtherwiseOperand
public Operand getOtherwiseOperand()
-
operands
public 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
-
getCollation
public StringCollator getCollation()
Get the collation used- Returns:
- the collation
-
computeCardinality
protected int computeCardinality()
Compute the static cardinality of this expression- 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
-
allowExtractingCommonSubexpressions
public boolean allowExtractingCommonSubexpressions()
Ask whether common subexpressions found in the operands of this expression can be extracted and evaluated outside the expression itself. The result is irrelevant in the case of operands evaluated with a different focus, which will never be extracted in this way, even if they have no focus dependency.- Overrides:
allowExtractingCommonSubexpressionsin classExpression- Returns:
- false for this kind of expression
-
copy
public Expression copy(RebindingMap rebindings)
Copy an expression. This makes a deep copy.- Specified by:
copyin classExpression- Parameters:
rebindings- variables that need to be re-bound- Returns:
- the copy of the original 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 expression presenter used to display the structure- Throws:
XPathException- if the export fails, for example if an expression is found that won't work in the target environment.
-
getItemType
public ItemType getItemType()
Determine the data type of the expression, if possible. All expression return sequences, in general; this method determines the type of the items within the sequence, assuming that (a) this is known in advance, and (b) it is the same for all items in the sequence.This method should always return a result, though it may be the best approximation that is available at the time.
- Specified by:
getItemTypein classExpression- Returns:
- a value such as Type.STRING, Type.BOOLEAN, Type.NUMBER, Type.NODE, or Type.ITEM (meaning not known at compile time)
-
unordered
public Expression unordered(boolean retainAllNodes, boolean forStreaming) throws XPathException
Replace this expression by a simpler expression that delivers the results without regard to order.- Overrides:
unorderedin classExpression- Parameters:
retainAllNodes- set to true if the result must contain exactly the same nodes as the original; set to false if the result can eliminate (or introduce) duplicates.forStreaming- set to true if optimizing for streaming- Returns:
- an expression that delivers the same nodes in a more convenient order
- Throws:
XPathException- if the rewrite fails
-
evaluateItem
public Item evaluateItem(XPathContext context) throws XPathException
Evaluate an expression as a single item. This always returns either a single Item or null (denoting the empty sequence). No conversion is done. This method should not be used unless the static type of the expression is a subtype of "item" or "item?": that is, it should not be called if the expression may return a sequence. There is no guarantee that this condition will be detected.- Overrides:
evaluateItemin classExpression- Parameters:
context- The context in which the expression is to be evaluated- Returns:
- the node or atomic value that results from evaluating the expression; or null to indicate that the result is an empty sequence
- Throws:
XPathException- if any dynamic error occurs evaluating the expression
-
iterate
public SequenceIterator iterate(XPathContext context) throws XPathException
Return an Iterator to iterate over the values of a sequence. The value of every expression can be regarded as a sequence, so this method is supported for all expressions. This default implementation handles iteration for expressions that return singleton values: for non-singleton expressions, the subclass must provide its own implementation.- Overrides:
iteratein classExpression- Parameters:
context- supplies the context for evaluation- Returns:
- a SequenceIterator that can be used to iterate over the result of the expression
- Throws:
XPathException- if any dynamic error occurs evaluating the expression
-
process
public void process(Outputter output, XPathContext context) throws XPathException
Process the instruction, without returning any tail calls- Overrides:
processin classExpression- Parameters:
output- the destination for the resultcontext- The dynamic context, giving access to the current node,- Throws:
XPathException- if a dynamic error occurs
-
processLeavingTail
public TailCall processLeavingTail(Outputter output, XPathContext context) throws XPathException
Description copied from interface:TailCallReturnerProcessLeavingTail: called to do the real work of this instruction. This method must be implemented in each subclass. The results of the instruction are written to the current Receiver, which can be obtained via the Controller.- Specified by:
processLeavingTailin interfaceTailCallReturner- Parameters:
output- the destination for the resultcontext- The dynamic context of the transformation, giving access to the current node, the current variables, etc.- Returns:
- null if the instruction has completed execution; or a TailCall indicating a function call or template call that is delegated to the caller, to be made after the stack has been unwound so as to save stack space.
- Throws:
XPathException- if a dynamic error occurs during the evaluation of the instruction
-
getImplementationMethod
public int getImplementationMethod()
Description copied from class:ExpressionAn 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
-
getExpressionName
public java.lang.String getExpressionName()
Get a name identifying the kind of expression, in terms meaningful to a user.- Overrides:
getExpressionNamein classExpression- Returns:
- a name identifying the kind of expression, in terms meaningful to a user. The name will always be in the form of a lexical XML QName, and should match the name used in export() output displaying the expression.
-
getStreamerName
public java.lang.String getStreamerName()
Description copied from class:ExpressionGet the (partial) name of a class that supports streaming of this kind of expression- Overrides:
getStreamerNamein classExpression- Returns:
- the partial name of a class that can be instantiated to provide streaming support in Saxon-EE, or null if there is no such class
-
-