1 10 package mondrian.olap; 11 12 import mondrian.calc.*; 13 import mondrian.calc.impl.BetterExpCompiler; 14 15 import java.util.ArrayList ; 16 import java.util.List ; 17 18 26 public class ExpCacheDescriptor { 27 private final Exp exp; 28 private int[] dependentDimensionOrdinals; 29 private final Calc calc; 30 31 public ExpCacheDescriptor(Exp exp, Calc calc, Evaluator evaluator) { 32 this.calc = calc; 33 this.exp = exp; 34 computeDepends(calc, evaluator); 35 } 36 37 40 public ExpCacheDescriptor(Exp exp, Evaluator evaluator) { 41 this(exp, new BetterExpCompiler(evaluator, null)); 42 } 43 44 47 public ExpCacheDescriptor(Exp exp, ExpCompiler compiler) { 48 this.exp = exp; 49 50 this.calc = compiler.compile(exp); 52 53 computeDepends(calc, compiler.getEvaluator()); 55 } 56 57 private void computeDepends(Calc calc, Evaluator evaluator) { 58 final List <Integer > ordinalList = new ArrayList <Integer >(); 59 final Member[] members = evaluator.getMembers(); 60 for (int i = 0; i < members.length; i++) { 61 Dimension dimension = members[i].getDimension(); 62 if (calc.dependsOn(dimension)) { 63 ordinalList.add(i); 64 } 65 } 66 dependentDimensionOrdinals = new int[ordinalList.size()]; 67 for (int i = 0; i < dependentDimensionOrdinals.length; i++) { 68 dependentDimensionOrdinals[i] = ordinalList.get(i); 69 } 70 } 71 72 public Exp getExp() { 73 return exp; 74 } 75 76 public Calc getCalc() { 77 return calc; 78 } 79 80 public Object evaluate(Evaluator evaluator) { 81 return calc.evaluate(evaluator); 82 } 83 84 89 public int[] getDependentDimensionOrdinals() { 90 return dependentDimensionOrdinals; 91 } 92 93 } 94 95 | Popular Tags |