Skip to content

Commit

Permalink
MONDRIAN: Fix for 1671613
Browse files Browse the repository at this point in the history
Moved Hierarchy null functionality into RangeFunDef vs. ExpCompiler

[git-p4: depot-paths = "//open/mondrian/": change = 8938]
  • Loading branch information
Will Gorman committed Mar 23, 2007
1 parent aa12df1 commit c0bd61b
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 63 deletions.
14 changes: 0 additions & 14 deletions src/main/mondrian/calc/ExpCompiler.java
Expand Up @@ -53,20 +53,6 @@ public interface ExpCompiler {
*/
MemberCalc compileMember(Exp exp);

/**
* Compiles an expression which yields two {@link Member} results.
* Allows the members to depend on one another, such as a Hierarchial
* NullMember.
*
* @param exp0 first expression
* @param exp1 second expression
*
* @return two member calcs
*/
MemberCalc[] compileMembers(Exp exp0, Exp exp1);



/**
* Compiles an expression which yields a {@link Level} result.
*/
Expand Down
40 changes: 0 additions & 40 deletions src/main/mondrian/calc/impl/AbstractExpCompiler.java
Expand Up @@ -110,46 +110,6 @@ public MemberCalc compileMember(Exp exp) {
assert type instanceof MemberType;
return (MemberCalc) compile(exp);
}

/**
* return two membercalc objects, substituting null's with the hierarchy
* null member of the other expression.
*
* @param exp0 first expression
* @param exp1 second expression
*
* @return two member calcs
*/
public MemberCalc[] compileMembers(Exp exp0, Exp exp1) {
MemberCalc[] members = new MemberCalc[2];

if (exp0.getType() instanceof NullType) {
members[0] = null;
} else {
members[0] = compileMember(exp0);
}

if (exp1.getType() instanceof NullType) {
members[1] = null;
} else {
members[1] = compileMember(exp1);
}

// replace any null types with hierachy null member
// if both objects are null, throw exception

if (members[0]== null && members[1] == null) {
throw MondrianResource.instance().TwoNullsNotSupported.ex();
} else if (members[0] == null) {
Member nullMember = ((RolapMember)members[1].evaluate(null)).getHierarchy().getNullMember();
members[0] = (MemberCalc)ConstantCalc.constantMember(nullMember);
} else if (members[1] == null) {
Member nullMember = ((RolapMember)members[0].evaluate(null)).getHierarchy().getNullMember();
members[1] = (MemberCalc)ConstantCalc.constantMember(nullMember);
}

return members;
}

public LevelCalc compileLevel(Exp exp) {
final Type type = exp.getType();
Expand Down
8 changes: 0 additions & 8 deletions src/main/mondrian/calc/impl/DelegatingExpCompiler.java
Expand Up @@ -54,14 +54,6 @@ public MemberCalc compileMember(Exp exp) {
return (MemberCalc) afterCompile(exp, calc, false);
}

public MemberCalc[] compileMembers(Exp exp0, Exp exp1) {
MemberCalc calc[] = parent.compileMembers(exp0, exp1);
MemberCalc ncalc[] = new MemberCalc[2];
ncalc[0] = (MemberCalc) afterCompile(exp0, calc[0], false);
ncalc[1] = (MemberCalc) afterCompile(exp0, calc[1], false);
return ncalc;
}

public LevelCalc compileLevel(Exp exp) {
final LevelCalc calc = parent.compileLevel(exp);
return (LevelCalc) afterCompile(exp, calc, false);
Expand Down
48 changes: 47 additions & 1 deletion src/main/mondrian/olap/fun/RangeFunDef.java
Expand Up @@ -15,9 +15,14 @@
import mondrian.calc.ExpCompiler;
import mondrian.calc.MemberCalc;
import mondrian.calc.impl.AbstractListCalc;
import mondrian.calc.impl.ConstantCalc;
import mondrian.mdx.ResolvedFunCall;
import mondrian.olap.Evaluator;
import mondrian.olap.Exp;
import mondrian.olap.Member;
import mondrian.olap.type.NullType;
import mondrian.resource.MondrianResource;
import mondrian.rolap.RolapMember;

import java.util.Collections;
import java.util.List;
Expand All @@ -39,8 +44,49 @@ private RangeFunDef() {
"ixmm");
}


/**
* return two membercalc objects, substituting null's with the hierarchy
* null member of the other expression.
*
* @param exp0 first expression
* @param exp1 second expression
*
* @return two member calcs
*/
private MemberCalc[] compileMembers(Exp exp0, Exp exp1, ExpCompiler compiler) {
MemberCalc[] members = new MemberCalc[2];

if (exp0.getType() instanceof NullType) {
members[0] = null;
} else {
members[0] = compiler.compileMember(exp0);
}

if (exp1.getType() instanceof NullType) {
members[1] = null;
} else {
members[1] = compiler.compileMember(exp1);
}

// replace any null types with hierachy null member
// if both objects are null, throw exception

if (members[0]== null && members[1] == null) {
throw MondrianResource.instance().TwoNullsNotSupported.ex();
} else if (members[0] == null) {
Member nullMember = ((RolapMember)members[1].evaluate(null)).getHierarchy().getNullMember();
members[0] = (MemberCalc)ConstantCalc.constantMember(nullMember);
} else if (members[1] == null) {
Member nullMember = ((RolapMember)members[0].evaluate(null)).getHierarchy().getNullMember();
members[1] = (MemberCalc)ConstantCalc.constantMember(nullMember);
}

return members;
}

public Calc compileCall(final ResolvedFunCall call, ExpCompiler compiler) {
final MemberCalc[] memberCalcs = compiler.compileMembers(call.getArg(0), call.getArg(1));
final MemberCalc[] memberCalcs = compileMembers(call.getArg(0), call.getArg(1), compiler);
return new AbstractListCalc(call, new Calc[] {memberCalcs[0], memberCalcs[1]}) {
public List evaluateList(Evaluator evaluator) {
final Member member0 = memberCalcs[0].evaluateMember(evaluator);
Expand Down

0 comments on commit c0bd61b

Please sign in to comment.