[Mondrian] .Children function not being evaluated natively (no joinwith the fact table)
Julian Hyde
jhyde at pentaho.com
Wed May 13 05:12:31 EDT 2009
This sounds similar to http://jira.pentaho.com/browse/MONDRIAN-506 which you
logged in February.
It also sounds like the issue I wrote about in this blog post:
http://julianhyde.blogspot.com/2009/01/hard-won-lessons-in-mondrian-query.ht
ml
If you read the blog post, you will see I had the same problem you did -
every time I changed something to get the query to perform, something else
broke.
So, read the blog post. My conclusions there are the best I have to offer
right now.
Julian
> -----Original Message-----
> From: mondrian-bounces at pentaho.org
> [mailto:mondrian-bounces at pentaho.org] On Behalf Of Robin Tharappel
> Sent: Tuesday, May 12, 2009 12:49 PM
> To: mondrian at pentaho.org
> Subject: [Mondrian] .Children function not being evaluated
> natively (no joinwith the fact table)
>
> Hello,
>
> With Mondrian 3.0.4 it appears that the .children function is not
> being evaluated natively when specified inside of NON EMPTY set. It
> will return empty children as well. This can be a performance problem
> if the dimension contains a large number of members at the children
> level. By joining the dimension table with the fact table the number
> of members could be reduced . This is the MDX query with the
> FoodMart.xml.
>
>
> with set [#DataSet#] as '{[Product].[All Products].[Food].[Baking
> Goods].[Baking Goods].Children}'
> select {[Measures].[Store Invoice], [Measures].[Supply Time],
> [Measures].[Warehouse Cost], [Measures].[Warehouse Sales]} ON COLUMNS,
> NON EMPTY Hierarchize({[#DataSet#]}) ON ROWS
> from [Warehouse]
> where ([Time].[1997].[Q4].[12])
>
>
> The root cause of this problem is that for this expression
> "[Product].[All Products].[Food].[Baking Goods].[Baking
> Goods].Children", the RolapEvaluator's nonempty is true, but the
> RolapEvaluator.root.slicerEvaluator's nonEmpty property is still
> false. They are out of sync.
>
> The RolapEvaluator.evaluateNamedSet(String, Exp) method will call the
> root.evaluateNamedSet(String, Exp). And it will pass the
> root.slicerEvaluator to the
> FunUtil.getNonEmptyMemberChildren(Evaluator, Member) method for the
> .Children call, which will use this nonEmpty property of the
> slicerEvalutor to determine weather to return the nonEmpty children or
> not.
>
>
> But if I made this change in
> RolapResult$RolapResultEvaluatorRoot.evaluateNamedSet(String, Exp)
> line: 1194 to sync the slicerEvaluator's nonEmpty with Evaluator's
> nonEmpty value. It would break these three unit tests.
>
> testTopMetricWithThreeLevelHierarchy (mondrian.test.TopBottomTest
> testTotalingWhenIgnoreUnrelatedDimensionsPropertyIsTrue(mondri
> an.test.IgnoreUnrelatedDimensionsTest
> testIndependentSlicerMemberNonNative(mondrian.rolap.NonEmptyTest
>
>
> Note that if the .Children function is replaced by an equivalent
> Descendants function it will be evaluated by joining with the fact
> table. Any suggestion for this problem?
>
> Thanks
>
>
>
> The trace stack for the .Children call:
> Thread [main] (Suspended)
> SqlMemberSource.chooseAggStar(MemberChildrenConstraint,
> RolapMember) line: 581
> SqlMemberSource.makeChildMemberSql(RolapMember,
> DataSource, MemberChildrenConstraint) line: 502
> SqlMemberSource.getMemberChildren2(RolapMember,
> List<RolapMember>, MemberChildrenConstraint) line: 836
> SqlMemberSource.getMemberChildren(RolapMember,
> List<RolapMember>, MemberChildrenConstraint) line: 770
> SqlMemberSource.getMemberChildren(List<RolapMember>,
> List<RolapMember>, MemberChildrenConstraint) line: 745
> SmartMemberReader.readMemberChildren(List<RolapMember>,
> List<RolapMember>, MemberChildrenConstraint) line: 237
> SmartMemberReader.getMemberChildren(List<RolapMember>,
> List<RolapMember>, MemberChildrenConstraint) line: 201
>
> RolapCubeHierarchy$RolapCubeHierarchyMemberReader.readMemberCh
ildren(List<RolapMember>,
> List<RolapMember>, MemberChildrenConstraint) line: 472
>
> RolapCubeHierarchy$RolapCubeHierarchyMemberReader.getMemberChi
ldren(List<RolapMember>,
> List<RolapMember>, MemberChildrenConstraint) line: 568
>
> RolapCubeHierarchy$RolapCubeHierarchyMemberReader(SmartMemberR
eader).getMemberChildren(RolapMember,
> List<RolapMember>, MemberChildrenConstraint) line: 169
>
> RolapCube$RolapCubeSchemaReader(RolapSchemaReader).internalGet
MemberChildren(Member,
> MemberChildrenConstraint) line: 155 //Here is
> DefaultMemberChildrenConstraint
>
> RolapCube$RolapCubeSchemaReader(RolapSchemaReader).getMemberCh
> ildren(Member,
> Evaluator) line: 145 //Here the Evaluator is null
>
> RolapCube$RolapCubeSchemaReader(RolapSchemaReader).getMemberCh
> ildren(Member)
> line: 139
>
> Query$QuerySchemaReader(DelegatingSchemaReader).getMemberChild
> ren(Member)
> line: 60
> FunUtil.getNonEmptyMemberChildren(Evaluator, Member) line:
> 1790
> BuiltinFunTable$30$1.evaluateList(Evaluator) line: 906
> SetFunDef$ListSetCalc$1.evaluateVoid(Evaluator) line: 131
> SetFunDef$ListSetCalc.evaluateList(Evaluator) line: 204
>
> SetFunDef$ListSetCalc(AbstractListCalc).evaluate(Evaluator)
> line: 67
> RolapResult.evaluateExp(Calc, RolapEvaluator) line: 794
> RolapResult.access$100(RolapResult, Calc, RolapEvaluator)
> line: 46
>
> RolapResult$RolapResultEvaluatorRoot.evaluateNamedSet(String,
> Exp) line: 1194
> RolapEvaluator.evaluateNamedSet(String, Exp) line: 884
> NamedSetExpr$1.evaluateList(Evaluator) line: 78
> SetFunDef$ListSetCalc$1.evaluateVoid(Evaluator) line: 131
> SetFunDef$ListSetCalc.evaluateList(Evaluator) line: 204
> HierarchizeFunDef$1.evaluateList(Evaluator) line: 48
>
> HierarchizeFunDef$1(AbstractListCalc).evaluate(Evaluator) line: 67
> RolapResult.executeAxis(Evaluator, QueryAxis, Calc,
> boolean, RolapResult$AxisMember) line: 694
> RolapResult.evalLoad(List<Member[]>, int, Evaluator,
> QueryAxis, Calc, AxisMember) line: 557
> RolapResult.loadMembers(List<Member[]>, RolapEvaluator,
> QueryAxis, Calc, AxisMember) line: 532
> RolapResult.<init>(Query, boolean) line: 254
> RolapConnection.execute(Query) line: 597
> CmdRunner.runQuery(String, boolean) line: 566
> CmdRunner.execute(String) line: 543
> CmdRunner.executeMdxCmd(String) line: 2243
> CmdRunner.commandLoop(Reader, boolean) line: 872
> CmdRunner.commandLoop(File) line: 750
> CmdRunner.main(String[]) line: 2397
>
> FunUtil.java
>
> public static Member[] getNonEmptyMemberChildren(
> Evaluator evaluator,
> Member member)
> {
> SchemaReader sr = evaluator.getSchemaReader();
> if (evaluator.isNonEmpty()) {
> return sr.getMemberChildren(member, evaluator);
> } else {
> return sr.getMemberChildren(member);
> }
> }
>
> _______________________________________________
> Mondrian mailing list
> Mondrian at pentaho.org
> http://lists.pentaho.org/mailman/listinfo/mondrian
>
>
>
More information about the Mondrian
mailing list