/* // 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) 2005-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho // All Rights Reserved. */ package mondrian.olap; import mondrian.calc.*; import mondrian.calc.impl.BetterExpCompiler; import java.util.ArrayList; import java.util.List; /** * Holds information necessary to add an expression to the expression result * cache (see {@link Evaluator#getCachedResult(ExpCacheDescriptor)}). * * @author jhyde * @since Aug 16, 2005 */ public class ExpCacheDescriptor { private final Exp exp; private int[] dependentHierarchyOrdinals; private final Calc calc; /** * Creates a descriptor with a given compiled expression. * * @param exp Expression * @param calc Compiled expression * @param evaluator Evaluator */ public ExpCacheDescriptor(Exp exp, Calc calc, Evaluator evaluator) { this.calc = calc; this.exp = exp; computeDepends(calc, evaluator); } /** * Creates a descriptor. * * @param exp Expression * @param evaluator Evaluator */ public ExpCacheDescriptor(Exp exp, Evaluator evaluator) { this(exp, new BetterExpCompiler(evaluator, null)); } /** * Creates a descriptor. * * @param exp Expression * @param compiler Compiler */ public ExpCacheDescriptor(Exp exp, ExpCompiler compiler) { this.exp = exp; // Compile expression. Calc calc = compiler.compile(exp); if (calc == null) { // now allow conversions calc = compiler.compileAs(exp, null, ResultStyle.ANY_ONLY); } this.calc = calc; // Compute list of dependent dimensions. computeDepends(calc, compiler.getEvaluator()); } private void computeDepends(Calc calc, Evaluator evaluator) { final List<Integer> ordinalList = new ArrayList<Integer>(); final Member[] members = evaluator.getMembers(); for (int i = 0; i < members.length; i++) { Hierarchy hierarchy = members[i].getHierarchy(); if (calc.dependsOn(hierarchy)) { ordinalList.add(i); } } dependentHierarchyOrdinals = new int[ordinalList.size()]; for (int i = 0; i < dependentHierarchyOrdinals.length; i++) { dependentHierarchyOrdinals[i] = ordinalList.get(i); } } public Exp getExp() { return exp; } public Calc getCalc() { return calc; } public Object evaluate(Evaluator evaluator) { return calc.evaluate(evaluator); } /** * Returns the ordinals of the hierarchies which this expression is * dependent upon. When the cache descriptor is used to generate a cache * key, the key will consist of a member from each of these hierarchies. */ public int[] getDependentHierarchyOrdinals() { return dependentHierarchyOrdinals; } } // End ExpCacheDescriptor.java