/*
* This software is subject to the terms of the Eclipse Public License v1.0
* Agreement, available at the following URL:
* http://www.eclipse.org/legal/epl-v10.html.
* You must accept the terms of that agreement to use this software.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package mondrian.rolap;
import mondrian.calc.Calc;
/**
* Entry in the evaluation context that indicates a calculation that needs to
* be performed before we get to the atomic stored cells.
*
* <p>Most of the time it's just members that are calculated, but calculated
* tuples arise when the slicer is a set of tuples.
*
* <p>The evaluator uses this interface to efficiently expand a member or tuple
* from the evaluation context. When evaluated, a calculation will change one or
* more elements of the context (calculated members just change one, but tuple
* sets in the slicer can change more than one).
*
* @author jhyde
* @since May 15, 2009
*/
interface RolapCalculation {
/**
* Pushes this calculated member or tuple onto the stack of evaluation
* contexts, and sets the context to the default member of the hierarchy.
*
* @param evaluator Evaluator
*/
void setContextIn(RolapEvaluator evaluator);
/**
* Returns the solve order of this calculation. Identifies which order
* calculations are expanded.
*
* @return Solve order
*/
int getSolveOrder();
/**
* Returns the ordinal of this calculation; to resolve ties.
*
* @return Ordinal or calculation
*/
int getHierarchyOrdinal();
/**
* Returns whether this calculation is a member is computed from a
* {@code WITH MEMBER} clause in an MDX query.
*
* @return whether this calculation is computed in an MDX query
*/
boolean isCalculatedInQuery();
/**
* Returns the compiled expression to evaluate the scalar value of the
* current cell. This method will be called frequently, so the
* implementation should probably compile once and cache the result.
*
* @param root Root evaluation context
* @return Compiled scalar expression
*/
Calc getCompiledExpression(RolapEvaluatorRoot root);
/**
* Returns whether this calculation contains an aggregate function.
*
* @return Whether this calculation contains an aggregate function.
*/
boolean containsAggregateFunction();
}
// End RolapCalculation.java