Search in sources :

Example 1 with AbstractCalc

use of mondrian.calc.impl.AbstractCalc 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);
}
Also used : MemberArrayValueCalc(mondrian.calc.impl.MemberArrayValueCalc) MemberValueCalc(mondrian.calc.impl.MemberValueCalc) ValueCalc(mondrian.calc.impl.ValueCalc) SortKeySpec(mondrian.olap.fun.sort.SortKeySpec) IterCalc(mondrian.calc.IterCalc) GenericIterCalc(mondrian.calc.impl.GenericIterCalc) ArrayList(java.util.ArrayList) ConstantCalc(mondrian.calc.impl.ConstantCalc) MemberArrayValueCalc(mondrian.calc.impl.MemberArrayValueCalc) Calc(mondrian.calc.Calc) ConstantCalc(mondrian.calc.impl.ConstantCalc) IterCalc(mondrian.calc.IterCalc) MemberCalc(mondrian.calc.MemberCalc) AbstractListCalc(mondrian.calc.impl.AbstractListCalc) GenericIterCalc(mondrian.calc.impl.GenericIterCalc) MemberValueCalc(mondrian.calc.impl.MemberValueCalc) ValueCalc(mondrian.calc.impl.ValueCalc) AbstractCalc(mondrian.calc.impl.AbstractCalc) MemberArrayValueCalc(mondrian.calc.impl.MemberArrayValueCalc) MemberValueCalc(mondrian.calc.impl.MemberValueCalc) DummyExp(mondrian.calc.DummyExp) MemberCalc(mondrian.calc.MemberCalc)

Aggregations

ArrayList (java.util.ArrayList)1 Calc (mondrian.calc.Calc)1 DummyExp (mondrian.calc.DummyExp)1 IterCalc (mondrian.calc.IterCalc)1 MemberCalc (mondrian.calc.MemberCalc)1 AbstractCalc (mondrian.calc.impl.AbstractCalc)1 AbstractListCalc (mondrian.calc.impl.AbstractListCalc)1 ConstantCalc (mondrian.calc.impl.ConstantCalc)1 GenericIterCalc (mondrian.calc.impl.GenericIterCalc)1 MemberArrayValueCalc (mondrian.calc.impl.MemberArrayValueCalc)1 MemberValueCalc (mondrian.calc.impl.MemberValueCalc)1 ValueCalc (mondrian.calc.impl.ValueCalc)1 SortKeySpec (mondrian.olap.fun.sort.SortKeySpec)1