Package net.sf.saxon.value
Class SingletonClosure
java.lang.Object
net.sf.saxon.value.Closure
net.sf.saxon.value.SingletonClosure
- All Implemented Interfaces:
ContextOriginator
,Sequence
A SingletonClosure represents a value that has not yet been evaluated: the value is represented
by an expression, together with saved values of all the context variables that the
expression depends on. The value of a SingletonClosure is always either a single item
or an empty sequence.
The expression may depend on local variables and on the context item; these values are held in the saved XPathContext object that is kept as part of the Closure, and they will always be read from that object. The expression may also depend on global variables; these are unchanging, so they can be read from the Bindery in the normal way. Expressions that depend on other contextual information, for example the values of position(), last(), current(), current-group(), should not be evaluated using this mechanism: they should always be evaluated eagerly. This means that the Closure does not need to keep a copy of these context variables.
-
Field Summary
Fields inherited from class net.sf.saxon.value.Closure
depth, expression, inputEvaluator, inputIterator, learningEvaluator, savedXPathContext, serialNumber
-
Constructor Summary
ConstructorsConstructorDescriptionSingletonClosure
(Expression exp, PullEvaluator inputEvaluator, XPathContext context) Constructor should not be called directly, instances should be made using the make() method. -
Method Summary
Modifier and TypeMethodDescriptionasItem()
Return the value in the form of an Itemint
Get the length of the sequencehead()
Get the first item in the sequence.boolean
isBuilt()
itemAt
(int n) Get the n'th item in the sequence (starting from 0).iterate()
Evaluate the expression in a given context to return an iterator over a sequenceEnsure that the sequence is in a form where it can be evaluated more than once.Return a value containing all the items in the sequence returned by this SequenceIteratorMethods inherited from class net.sf.saxon.value.Closure
getExpression, getSavedXPathContext, reduce, saveContext, setInputEvaluator, setLearningEvaluator, setSavedXPathContext
-
Constructor Details
-
SingletonClosure
public SingletonClosure(Expression exp, PullEvaluator inputEvaluator, XPathContext context) throws XPathException Constructor should not be called directly, instances should be made using the make() method.- Parameters:
exp
- the expression to be lazily evaluatedcontext
- the context in which the expression should be evaluated- Throws:
XPathException
- if an error occurs saving the dynamic context
-
-
Method Details
-
iterate
Evaluate the expression in a given context to return an iterator over a sequence -
head
Get the first item in the sequence.- Specified by:
head
in interfaceSequence
- Overrides:
head
in classClosure
- Returns:
- the first item in the sequence if there is one, or null if the sequence is empty
- Throws:
XPathException
- in the situation where the sequence is evaluated lazily, and evaluation of the first item causes a dynamic error.
-
asItem
Return the value in the form of an Item- Returns:
- the value in the form of an Item
- Throws:
XPathException
- if an error is detected
-
itemAt
Get the n'th item in the sequence (starting from 0). This is defined for all SequenceValues, but its real benefits come for a SequenceValue stored extensionally.- Parameters:
n
- the index of the requested item- Returns:
- the n'th item in the sequence
- Throws:
XPathException
- if an error is detected
-
getLength
Get the length of the sequence- Returns:
- the length of the sequence
- Throws:
XPathException
- if an error is detected
-
materialize
Return a value containing all the items in the sequence returned by this SequenceIterator- Specified by:
materialize
in interfaceSequence
- Returns:
- the corresponding value
- Throws:
XPathException
- if evaluating the contents of the sequence (lazily) fails with a dynamic error.
-
makeRepeatable
Description copied from interface:Sequence
Ensure that the sequence is in a form where it can be evaluated more than once. Some sequences (for exampleLazySequence
andClosure
can only be evaluated once, and this operation causes these to be grounded. However, making it repeatable is not the same as making it grounded; it does not flush out all errors. Indeed, lazy evaluation relies on this property, because an expression that has been lifted out of a loop must not be evaluated unless the loop is executed at least once, to prevent spurious errors.- Specified by:
makeRepeatable
in interfaceSequence
- Overrides:
makeRepeatable
in classClosure
- Returns:
- An equivalent sequence that can be repeatedly evaluated
-
isBuilt
public boolean isBuilt()
-