1 10 package mondrian.olap.fun.extra; 11 12 import mondrian.olap.*; 13 import mondrian.olap.fun.FunDefBase; 14 import mondrian.calc.*; 15 import mondrian.calc.impl.AbstractMemberCalc; 16 import mondrian.mdx.ResolvedFunCall; 17 18 import java.util.List ; 19 20 29 public class CalculatedChildFunDef extends FunDefBase { 30 public static final CalculatedChildFunDef instance = new CalculatedChildFunDef(); 31 32 CalculatedChildFunDef() { 33 super("CalculatedChild", "<Member>.CalculatedChild(<String>)", 34 "Returns an existing calculated child member with name <String> from the specified <Member>.", "mmmS"); 35 } 36 37 public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { 38 final MemberCalc memberCalc = compiler.compileMember(call.getArg(0)); 39 final StringCalc stringCalc = compiler.compileString(call.getArg(1)); 40 41 return new AbstractMemberCalc(call, new Calc[] {memberCalc, stringCalc}) { 42 public Member evaluateMember(Evaluator evaluator) { 43 Member member = memberCalc.evaluateMember(evaluator); 44 String name = stringCalc.evaluateString(evaluator); 45 return getCalculatedChild(member, name, evaluator); 46 } 47 }; 48 } 49 50 private Member getCalculatedChild( 51 Member parent, String childName, Evaluator evaluator) { 52 53 final SchemaReader schemaReader = 54 evaluator.getQuery().getSchemaReader(true); 55 Level childLevel = parent.getLevel().getChildLevel(); 56 if (childLevel == null) { 57 return parent.getHierarchy().getNullMember(); 58 } 59 List <Member> calcMemberList = 60 schemaReader.getCalculatedMembers(childLevel); 61 62 for (Member child : calcMemberList) { 63 if (child.getParentMember() == parent && 66 child.getName().equals(childName)) { 67 return child; 68 } 69 } 70 71 return parent.getHierarchy().getNullMember(); 72 } 73 } 74 75 76 | Popular Tags |