use of mondrian.calc.impl.ValueCalc in project mondrian by pentaho.
the class OrderFunDef method compileCall.
public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
final IterCalc listCalc = compiler.compileIter(call.getArg(0));
List<SortKeySpec> keySpecList = new ArrayList<>();
buildKeySpecList(keySpecList, call, compiler);
final int keySpecCount = keySpecList.size();
// +1 for the listCalc
Calc[] calcList = new Calc[keySpecCount + 1];
calcList[0] = listCalc;
assert keySpecCount >= 1;
final Calc expCalc = keySpecList.get(0).getKey();
calcList[1] = expCalc;
if (keySpecCount == 1) {
if (expCalc.isWrapperFor(MemberValueCalc.class) || expCalc.isWrapperFor(MemberArrayValueCalc.class)) {
List<MemberCalc> constantList = new ArrayList<>();
List<MemberCalc> variableList = new ArrayList<>();
final MemberCalc[] calcs = (MemberCalc[]) ((AbstractCalc) expCalc).getCalcs();
for (MemberCalc memberCalc : calcs) {
if (memberCalc.isWrapperFor(ConstantCalc.class) && !listCalc.dependsOn(memberCalc.getType().getHierarchy())) {
constantList.add(memberCalc);
} else {
variableList.add(memberCalc);
}
}
if (constantList.isEmpty()) {
// All members are non-constant -- cannot optimize
} else if (variableList.isEmpty()) {
// All members are constant. Optimize by setting entire
// context first.
calcList[1] = new ValueCalc(new DummyExp(expCalc.getType()));
return new ContextCalc(calcs, new CalcImpl(call, calcList, keySpecList));
} else {
// Some members are constant. Evaluate these before
// evaluating the list expression.
calcList[1] = MemberValueCalc.create(new DummyExp(expCalc.getType()), variableList.toArray(new MemberCalc[variableList.size()]), compiler.getEvaluator().mightReturnNullForUnrelatedDimension());
return new ContextCalc(constantList.toArray(new MemberCalc[constantList.size()]), new CalcImpl(call, calcList, keySpecList));
}
}
}
for (int i = 1; i < keySpecCount; i++) {
final Calc expCalcs = keySpecList.get(i).getKey();
calcList[i + 1] = expCalcs;
}
return new CalcImpl(call, calcList, keySpecList);
}
use of mondrian.calc.impl.ValueCalc in project mondrian by pentaho.
the class VarPFunDef method compileCall.
public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
final ListCalc listCalc = compiler.compileList(call.getArg(0));
final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call);
return new AbstractDoubleCalc(call, new Calc[] { listCalc, calc }) {
public double evaluateDouble(Evaluator evaluator) {
TupleList memberList = evaluateCurrentList(listCalc, evaluator);
final int savepoint = evaluator.savepoint();
try {
evaluator.setNonEmpty(false);
return (Double) var(evaluator, memberList, calc, true);
} finally {
evaluator.restore(savepoint);
}
}
public boolean dependsOn(Hierarchy hierarchy) {
return anyDependsButFirst(getCalcs(), hierarchy);
}
};
}
use of mondrian.calc.impl.ValueCalc in project mondrian by pentaho.
the class MedianFunDef method compileCall.
public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
final ListCalc listCalc = compiler.compileList(call.getArg(0));
final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call);
return new AbstractDoubleCalc(call, new Calc[] { listCalc, calc }) {
public double evaluateDouble(Evaluator evaluator) {
final int savepoint = evaluator.savepoint();
try {
evaluator.setNonEmpty(false);
TupleList list = evaluateCurrentList(listCalc, evaluator);
final double percentile = percentile(evaluator, list, calc, 0.5);
return percentile;
} finally {
evaluator.restore(savepoint);
}
}
public boolean dependsOn(Hierarchy hierarchy) {
return anyDependsButFirst(getCalcs(), hierarchy);
}
};
}
use of mondrian.calc.impl.ValueCalc in project mondrian by pentaho.
the class VarFunDef method compileCall.
public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
final ListCalc listCalc = compiler.compileList(call.getArg(0));
final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call);
return new AbstractDoubleCalc(call, new Calc[] { listCalc, calc }) {
public double evaluateDouble(Evaluator evaluator) {
final int savepoint = evaluator.savepoint();
try {
evaluator.setNonEmpty(false);
TupleList list = evaluateCurrentList(listCalc, evaluator);
final double var = (Double) var(evaluator, list, calc, false);
return var;
} finally {
evaluator.restore(savepoint);
}
}
public boolean dependsOn(Hierarchy hierarchy) {
return anyDependsButFirst(getCalcs(), hierarchy);
}
};
}
use of mondrian.calc.impl.ValueCalc in project mondrian by pentaho.
the class SumFunDef method compileCall.
protected Calc compileCall(final ResolvedFunCall call, ExpCompiler compiler, ResultStyle resultStyle) {
final Calc ncalc = compiler.compileIter(call.getArg(0));
if (ncalc == null) {
return null;
}
final Calc calc = call.getArgCount() > 1 ? compiler.compileScalar(call.getArg(1), true) : new ValueCalc(call);
// we may have asked for one sort of Calc, but here's what we got.
if (ncalc instanceof ListCalc) {
return genListCalc(call, (ListCalc) ncalc, calc);
} else {
return genIterCalc(call, (IterCalc) ncalc, calc);
}
}
Aggregations