Class RolapEvaluator
- All Implemented Interfaces:
Evaluator
- Direct Known Subclasses:
RolapDependencyTestingEvaluator,RolapProfilingEvaluator
RolapEvaluator evaluates expressions in a dimensional environment.
The context contains a member (which may be the default member) for every dimension in the current cube. Certain operations, such as evaluating a calculated member or a tuple, change the current context.
There are two ways of preserving context.
First, the push(mondrian.olap.Member[]) method creates a verbatim copy of the evaluator. Use that copy for computations, and any
changes of state will be made only to the copy.
Second, the savepoint() method tells the evaluator to create a checkpoint of its state, and returns an
int value that can later be passed to restore(int).
The savepoint method is recommended for most purposes, because the initial checkpoint is extremely cheap.
Each call that modifies state (such as Evaluator.setContext(mondrian.olap.Member)) creates, at
a modest cost, an entry on an internal command stack.
One occasion that you would use push is when creating an iterator, and the iterator needs its own evaluator
context, even if the code that created the iterator later reverts the context. In this case, the iterator's
constructor should call push.
Developers note
Many of the methods in this class are performance-critical. Where possible they are declared 'final' so that the JVM can optimize calls to these methods. If future functionality requires it, the 'final' modifier can be removed and these methods can be overridden.
- Since:
- 10 August, 2001
- Author:
- jhyde
-
Nested Class Summary
Nested classes/interfaces inherited from interface mondrian.olap.Evaluator
Evaluator.NamedSetEvaluator, Evaluator.SetEvaluator -
Field Summary
FieldsModifier and TypeFieldDescriptionList of lists of tuples or members, rarely used, but overrides the ordinary dimensional context if set when a cell value comes to be evaluated.protected mondrian.rolap.CellReaderprotected final mondrian.rolap.RolapEvaluatorRootprotected CompoundPredicateInfo -
Constructor Summary
ConstructorsModifierConstructorDescriptionRolapEvaluator(mondrian.rolap.RolapEvaluatorRoot root) Creates a root evaluator.protectedRolapEvaluator(mondrian.rolap.RolapEvaluatorRoot root, RolapEvaluator parent, List<List<Member>> aggregationList) Creates a non-root evaluator. -
Method Summary
Modifier and TypeMethodDescriptionprotected RolapEvaluatorCreates a clone of the current validator.final voidclearExpResultCache(boolean clearValidResult) static EvaluatorCreates an evaluator.booleanReturns whether the current context is an empty cell.final booleanReturns true if the other object is aRolapEvaluatorwith identical context.final ObjectCalculates and returns the value of the cell at the current context.final StringFormats a value as a string according to the current context's format.final StringFormats a value as a string according to the current context's format, using a given format string.Set of expressions actively being expanded.final ObjectgetCachedResult(ExpCacheDescriptor cacheDescriptor) Simple caching of the result of anExp.final LocaleReturns the connection's locale.final RolapMembergetContext(Hierarchy hierarchy) final RolapMembergetContext(RolapHierarchy hierarchy) More specific version ofgetContext(mondrian.olap.Hierarchy), for internal code.final RolapCubegetCube()Returns the current cube.final intgetDepth()Obsolete method.final StringReturns the format string for this cell.final intprotected final org.apache.logging.log4j.LoggerReturns the base (non-virtual) cube that the current measure in the context belongs to.final Member[]Returns an array of the members which make up the current context.final intReturns the number of times that this evaluator has told a lie when retrieving cell values.getNamedSetEvaluator(NamedSet namedSet, boolean create) Returns an evaluator for a named set.final Member[]Returns an array of the non-All members which make up the current context.final TupleListgetOptimizedSlicerTuples(RolapCube baseCube) Returns an optimized list of tuples related to the slicer based on the current evaluator.final ObjectReturns the value of a parameter, evaluating its default value if it is not set.final RolapEvaluatorReturns parent evaluator.getPreviousContext(Hierarchy hierarchy) Returns the member that was the current evaluation context for a particular hierarchy before the most recent change in context.final ObjectgetProperty(String name, Object defaultValue) Retrieves the value of propertyname.final QuerygetQuery()Returns the current query.Returns the start time of the current query.final SchemaReaderReturns aSchemaReaderappropriate for the current access-control context.final Evaluator.SetEvaluatorgetSetEvaluator(Exp exp, boolean create) Returns an evaluator for a set.Return the list of slicer members in the current evaluator context.final TupleListReturn the list of compound slicer tuplesfinal QueryTimingReturns the query timing context for this execution.final inthashCode()booleanfinal booleanbooleanfinal booleanReturns true for an axis that is NON EMPTY.booleanReturns whether it is necessary to check whether to return null for an unrelated dimension.booleanReturns whether native evaluation is enabled in this context.booleanneedToReturnNullForUnrelatedDimension(Member[] members) If IgnoreMeasureForNonJoiningDimension is set to true and one or more members are on unrelated dimension for the measure in current context then returns true.final RuntimeExceptionnewEvalException(Object context, String s) Creates an exception which indicates that an error has occurred during the runtime evaluation of a function.final RolapEvaluatorpush()Creates a new Evaluator with the same context as this evaluator.final Evaluatorpush(boolean nonEmpty) Creates a new evaluator with the same state except nonEmpty propertyfinal Evaluatorpush(boolean nonEmpty, boolean nativeEnabled) Creates a new evaluator with the same state except nonEmpty and nativeEnabled properties.final RolapEvaluatorCreates a new Evaluator with the same context except for one member.final RolapEvaluatorCreates a new Evaluator with each given member overriding the context of the current Evaluator for its hierarchy.final EvaluatorpushAggregation(List<List<Member>> list) Returns a new Aggregator whose aggregation context adds a given list of tuples, and whose evaluation context is the same as this Aggregator.final voidrestore(int savepoint) Restores previous evaluator.final intCreates a savepoint encapsulating the current state of the evalutor.final voidsetContext(List<Member> memberList) Sets the context to a list of members.final voidsetContext(List<Member> memberList, boolean safe) Sets the context to a list of members, optionally skipping the check whether it is necessary to store the previous member of each hierarchy.final MembersetContext(Member member) Makesmemberthe current member of its hierarchy.final voidsetContext(Member[] members) Sets the context to an array of members.final voidsetContext(Member[] members, boolean safe) Sets the context to an array of members, optionally skipping the check whether it is necessary to store the previous member of each hierarchy.final voidsetContext(Member member, boolean safe) Makesmemberthe current member of its hierarchy.final voidsetEvalAxes(boolean evalAxes) Indicate whether the evaluator is evaluating the axesfinal voidsetIterationLength(int iterationLength) Sets the iteration length for the current evaluator contextfinal voidsetNativeEnabled(boolean nativeEnabled) Sets whether native evaluation should be used.final voidsetNonEmpty(boolean nonEmpty) Sets whether an expression evaluation should filter out empty cells.final voidAdds a slicer member to the evaluator context, and remember it as part of the slicer.final voidsetSlicerTuples(TupleList tuples) Sets the slicer tuple object, used later by native evaluation and non-empty crossjoins.booleanChecks if unrelated dimensions to the measure in the current context should be ignored.
-
Field Details
-
cellReader
protected mondrian.rolap.CellReader cellReader -
root
protected final mondrian.rolap.RolapEvaluatorRoot root -
aggregationLists
List of lists of tuples or members, rarely used, but overrides the ordinary dimensional context if set when a cell value comes to be evaluated. -
slicerPredicateInfo
-
-
Constructor Details
-
RolapEvaluator
protected RolapEvaluator(mondrian.rolap.RolapEvaluatorRoot root, RolapEvaluator parent, List<List<Member>> aggregationList) Creates a non-root evaluator.- Parameters:
root- Root context for stack of evaluators (contains information which does not change during the evaluation)parent- Parent evaluator, not nullaggregationList- List of tuples to add to aggregation context, or null
-
RolapEvaluator
public RolapEvaluator(mondrian.rolap.RolapEvaluatorRoot root) Creates a root evaluator.- Parameters:
root- Shared context between this evaluator and its children
-
-
Method Details
-
getActiveNativeExpansions
Set of expressions actively being expanded. Prevents infinite cycle of expansions.- Returns:
- Mutable set of expressions being expanded
-
getSlicerPredicateInfo
-
create
Creates an evaluator. -
getMeasureCube
Description copied from interface:EvaluatorReturns the base (non-virtual) cube that the current measure in the context belongs to.- Specified by:
getMeasureCubein interfaceEvaluator- Returns:
- Cube
-
nativeEnabled
public boolean nativeEnabled()Description copied from interface:EvaluatorReturns whether native evaluation is enabled in this context.- Specified by:
nativeEnabledin interfaceEvaluator- Returns:
- whether native evaluation is enabled in this context
-
currentIsEmpty
public boolean currentIsEmpty()Description copied from interface:EvaluatorReturns whether the current context is an empty cell.- Specified by:
currentIsEmptyin interfaceEvaluator- Returns:
- Whether the current context is an empty cell
-
getPreviousContext
Description copied from interface:EvaluatorReturns the member that was the current evaluation context for a particular hierarchy before the most recent change in context.- Specified by:
getPreviousContextin interfaceEvaluator- Parameters:
hierarchy- Hierarchy- Returns:
- Previous context member for given hierarchy
-
getTiming
Description copied from interface:EvaluatorReturns the query timing context for this execution. -
savepoint
public final int savepoint()Description copied from interface:EvaluatorCreates a savepoint encapsulating the current state of the evalutor. You can restore the evaluator to this state by callingEvaluator.restore(int)with the value returned by this method.This method is typically called before evaluating an expression which is known to corrupt the evaluation context.
Multiple savepoints may be active at the same time for the same evaluator. And, it is allowable to restore to the save savepoint more than once (or not at all). However, when you have rolled back to a particular savepoint you may not restore to a later savepoint.
-
setNativeEnabled
public final void setNativeEnabled(boolean nativeEnabled) Description copied from interface:EvaluatorSets whether native evaluation should be used.- Specified by:
setNativeEnabledin interfaceEvaluator- Parameters:
nativeEnabled- Whether native evaluation should be used
-
getLogger
protected final org.apache.logging.log4j.Logger getLogger() -
getMembers
Description copied from interface:EvaluatorReturns an array of the members which make up the current context.- Specified by:
getMembersin interfaceEvaluator
-
getNonAllMembers
Description copied from interface:EvaluatorReturns an array of the non-All members which make up the current context.Notes:
- The 0th element is a measure, but otherwise the order of the members is unspecified.
- No hierarchy occurs more than once.
- In rare circumstances, some of the members may be an 'All' member.
- The list may contain calculated members.
- Specified by:
getNonAllMembersin interfaceEvaluator
-
getAggregationLists
-
getCube
Description copied from interface:EvaluatorReturns the current cube. -
getQuery
Description copied from interface:EvaluatorReturns the current query. -
getDepth
public final int getDepth()Description copied from interface:EvaluatorObsolete method. -
getParent
Description copied from interface:EvaluatorReturns parent evaluator. -
getSchemaReader
Description copied from interface:EvaluatorReturns aSchemaReaderappropriate for the current access-control context.- Specified by:
getSchemaReaderin interfaceEvaluator
-
getQueryStartTime
Description copied from interface:EvaluatorReturns the start time of the current query.- Specified by:
getQueryStartTimein interfaceEvaluator
-
getDialect
-
push
Description copied from interface:EvaluatorCreates a new Evaluator with each given member overriding the context of the current Evaluator for its hierarchy. Other hierarchies retain the same context as this Evaluator.In mondrian-3.3 and later, a more efficient way to save the state of an evaluator is to call
Evaluator.savepoint()followed byEvaluator.restore(int). We recommend using those methods. -
push
Description copied from interface:EvaluatorCreates a new Evaluator with the same context except for one member.This method is typically called before evaluating an expression which may corrupt the evaluation context.
In mondrian-3.3 and later, a more efficient way to save the state of an evaluator is to call
Evaluator.savepoint()followed byEvaluator.restore(int). We recommend using those methods. -
push
Description copied from interface:EvaluatorCreates a new evaluator with the same state except nonEmpty propertyIn mondrian-3.3 and later, a more efficient way to save the state of an evaluator is to call
Evaluator.savepoint()followed byEvaluator.restore(int). We recommend using those methods. -
push
Description copied from interface:EvaluatorCreates a new evaluator with the same state except nonEmpty and nativeEnabled properties.In mondrian-3.3 and later, a more efficient way to save the state of an evaluator is to call
Evaluator.savepoint()followed byEvaluator.restore(int). We recommend using those methods. -
push
Description copied from interface:EvaluatorCreates a new Evaluator with the same context as this evaluator.This method is typically called before evaluating an expression which may corrupt the evaluation context.
In mondrian-3.3 and later, a more efficient way to save the state of an evaluator is to call
Evaluator.savepoint()followed byEvaluator.restore(int). We recommend using those methods most of the time.However, it makes sense to use this method in the constructor of an iterator. It allows the iterator to modify its evaluation context without affecting the evaluation context of the calling code. This behavior cannot be achieved using
savepoint. -
_push
Creates a clone of the current validator.- Parameters:
aggregationList- List of tuples to add to aggregation context, or null
-
restore
public final void restore(int savepoint) Description copied from interface:EvaluatorRestores previous evaluator.- Specified by:
restorein interfaceEvaluator- Parameters:
savepoint- Savepoint returned byEvaluator.savepoint()
-
pushAggregation
Description copied from interface:EvaluatorReturns a new Aggregator whose aggregation context adds a given list of tuples, and whose evaluation context is the same as this Aggregator.- Specified by:
pushAggregationin interfaceEvaluator- Parameters:
list- List of tuples- Returns:
- Aggregator with
listadded to its aggregation context
-
equals
Returns true if the other object is aRolapEvaluatorwith identical context. -
hashCode
public final int hashCode() -
setSlicerContext
public final void setSlicerContext(List<Member> members, Map<Hierarchy, Set<Member>> membersByHierarchy) Adds a slicer member to the evaluator context, and remember it as part of the slicer. The slicer members are passed onto derived evaluators so that functions using those evaluators can choose to ignore the slicer members. One such function is CrossJoin emptiness check.- Parameters:
members- members in slicermembersByHierarchy- members in slicer by hierarchy
-
getSlicerMembers
Return the list of slicer members in the current evaluator context.- Returns:
- slicerMembers
-
getSlicerMembersByHierarchy
-
setSlicerTuples
Sets the slicer tuple object, used later by native evaluation and non-empty crossjoins.- Parameters:
tuples- slicer
-
getSlicerTuples
Return the list of compound slicer tuples -
isDisjointSlicerTuple
public boolean isDisjointSlicerTuple() -
isMultiLevelSlicerTuple
public boolean isMultiLevelSlicerTuple() -
getOptimizedSlicerTuples
Returns an optimized list of tuples related to the slicer based on the current evaluator. This function removes overridden compound slicer members from the tuple list. TODO: Add Virtual Cube test cases, demonstrating unrelated dimensions. TODO: Test various Tuple List sizes - tuples sizes that are bigger and smaller than list size- Parameters:
baseCube- if this is a virtual cube, remove the unrelated tuples from the slicer.- Returns:
- optimized slicer tuple list
-
setContext
Description copied from interface:EvaluatorMakesmemberthe current member of its hierarchy.- Specified by:
setContextin interfaceEvaluator- Parameters:
member- New member- Returns:
- Previous member of this hierarchy
-
setContext
Description copied from interface:EvaluatorMakesmemberthe current member of its hierarchy.If
safe, checks whether this is the first time that a member of this hierarchy has been changed sinceEvaluator.savepoint()was called. If so, saves the previous member. Ifsafeis false, never saves the previous member.Use
safe = falseonly if you are sure that the context has been set before. For example,int n = 0;
for (Member member : members) {
evaluator.setContext(member, n++ > 0);
}- Specified by:
setContextin interfaceEvaluator- Parameters:
member- New membersafe- Whether to store the member of this hierarchy that was current last time thatEvaluator.savepoint()was called.
-
setContext
Description copied from interface:EvaluatorSets the context to a list of members.Equivalent to
for (Member member : memberList) {
setContext(member);
}- Specified by:
setContextin interfaceEvaluator- Parameters:
memberList- List of members
-
setContext
Description copied from interface:EvaluatorSets the context to a list of members, optionally skipping the check whether it is necessary to store the previous member of each hierarchy.Equivalent to
for (Member member : memberList) {
setContext(member, safe);
}- Specified by:
setContextin interfaceEvaluator- Parameters:
memberList- List of memberssafe- Whether to store the member of each hierarchy that was current last time thatEvaluator.savepoint()was called.
-
setContext
Description copied from interface:EvaluatorSets the context to an array of members.Equivalent to
for (Member member : memberList) {
setContext(member);
}- Specified by:
setContextin interfaceEvaluator- Parameters:
members- Array of members
-
setContext
Description copied from interface:EvaluatorSets the context to an array of members, optionally skipping the check whether it is necessary to store the previous member of each hierarchy.Equivalent to
for (Member member : memberList) {
setContext(member, safe);
}- Specified by:
setContextin interfaceEvaluator- Parameters:
members- Array of memberssafe- Whether to store the member of each hierarchy that was current last time thatEvaluator.savepoint()was called.
-
getContext
- Specified by:
getContextin interfaceEvaluator
-
getContext
More specific version ofgetContext(mondrian.olap.Hierarchy), for internal code.- Parameters:
hierarchy- Hierarchy- Returns:
- current member
-
evaluateCurrent
Description copied from interface:EvaluatorCalculates and returns the value of the cell at the current context.- Specified by:
evaluateCurrentin interfaceEvaluator
-
getProperty
Description copied from interface:EvaluatorRetrieves the value of propertyname. If more than one member in the current context defines that property, the one with the highest solve order has precedence.If the property is not defined, default value is returned.
- Specified by:
getPropertyin interfaceEvaluator
-
getFormatString
Returns the format string for this cell. This is computed by evaluating the format expression in the current context, and therefore different cells may have different format strings.- Specified by:
getFormatStringin interfaceEvaluator
-
getConnectionLocale
Description copied from interface:EvaluatorReturns the connection's locale.- Specified by:
getConnectionLocalein interfaceEvaluator
-
format
Description copied from interface:EvaluatorFormats a value as a string according to the current context's format. -
format
Description copied from interface:EvaluatorFormats a value as a string according to the current context's format, using a given format string. -
getCachedResult
Description copied from interface:EvaluatorSimple caching of the result of anExp. The key for the cache consists of all members of the current context thatexpdepends on. Members of independent hierarchies are not part of the key.- Specified by:
getCachedResultin interfaceEvaluator- See Also:
-
clearExpResultCache
public final void clearExpResultCache(boolean clearValidResult) -
isNonEmpty
public final boolean isNonEmpty()Description copied from interface:EvaluatorReturns true for an axis that is NON EMPTY.May be used by expression evaluators to optimize their result. For example, a top-level crossjoin may be optimized by removing all non-empty set elements before performing the crossjoin. This is possible because of the identity
nonempty(crossjoin(a, b)) == nonempty(crossjoin(nonempty(a), nonempty(b));- Specified by:
isNonEmptyin interfaceEvaluator
-
setNonEmpty
public final void setNonEmpty(boolean nonEmpty) Description copied from interface:EvaluatorSets whether an expression evaluation should filter out empty cells. Allows expressions to modify non empty flag to evaluate their children.- Specified by:
setNonEmptyin interfaceEvaluator
-
newEvalException
Description copied from interface:EvaluatorCreates an exception which indicates that an error has occurred during the runtime evaluation of a function. The caller should then throw that exception.- Specified by:
newEvalExceptionin interfaceEvaluator
-
getNamedSetEvaluator
Description copied from interface:EvaluatorReturns an evaluator for a named set.- Specified by:
getNamedSetEvaluatorin interfaceEvaluator- Parameters:
namedSet- Named setcreate- Whether to create evaluator if not found- Returns:
- Evaluator of named set
-
getSetEvaluator
Description copied from interface:EvaluatorReturns an evaluator for a set.- Specified by:
getSetEvaluatorin interfaceEvaluator- Parameters:
exp- Expressioncreate- Whether to create evaluator if not found- Returns:
- Evaluator of named set
-
getMissCount
public final int getMissCount()Description copied from interface:EvaluatorReturns the number of times that this evaluator has told a lie when retrieving cell values.- Specified by:
getMissCountin interfaceEvaluator
-
getParameterValue
Description copied from interface:EvaluatorReturns the value of a parameter, evaluating its default value if it is not set.- Specified by:
getParameterValuein interfaceEvaluator
-
getIterationLength
public final int getIterationLength()- Specified by:
getIterationLengthin interfaceEvaluator- Returns:
- the iteration length of the current context
-
setIterationLength
public final void setIterationLength(int iterationLength) Description copied from interface:EvaluatorSets the iteration length for the current evaluator context- Specified by:
setIterationLengthin interfaceEvaluator- Parameters:
iterationLength- length to be set
-
isEvalAxes
public final boolean isEvalAxes()- Specified by:
isEvalAxesin interfaceEvaluator- Returns:
- true if evaluating axes
-
setEvalAxes
public final void setEvalAxes(boolean evalAxes) Description copied from interface:EvaluatorIndicate whether the evaluator is evaluating the axes- Specified by:
setEvalAxesin interfaceEvaluator- Parameters:
evalAxes- true if evaluating axes
-