diff --git a/src/org/olap4j/query/Olap4jNodeConverter.java b/src/org/olap4j/query/Olap4jNodeConverter.java index 4e3e2f2..cce1909 100644 --- a/src/org/olap4j/query/Olap4jNodeConverter.java +++ b/src/org/olap4j/query/Olap4jNodeConverter.java @@ -21,6 +21,7 @@ import org.olap4j.mdx.CallNode; import org.olap4j.mdx.CubeNode; import org.olap4j.mdx.DimensionNode; +import org.olap4j.mdx.HierarchyNode; import org.olap4j.mdx.IdentifierNode; import org.olap4j.mdx.LevelNode; import org.olap4j.mdx.LiteralNode; @@ -578,13 +579,6 @@ private static ParseTreeNode toHierarchyConsistentNode( // consistent results, generate a filter that checks // inclusions for ancestors in higher levels if (qDim.getInclusions().size() > 1) { - CallNode currentMemberNode = - new CallNode( - null, - "CurrentMember", - Syntax.Property, - new DimensionNode(null, qDim.getDimension())); - Map levels = new HashMap(); for (Selection s : qDim.getInclusions()) { if (s.getRootElement() instanceof Member) { @@ -613,6 +607,13 @@ private static ParseTreeNode toHierarchyConsistentNode( if (levelDepths[i] < maxDepth && currentLevel.getLevelType() != Level.Type.ALL) { + CallNode currentMemberNode = + new CallNode( + null, + "CurrentMember", + Syntax.Property, + new HierarchyNode(null, currentLevel.getHierarchy())); + CallNode ancestorNode = new CallNode( null, diff --git a/testsrc/org/olap4j/OlapTest.java b/testsrc/org/olap4j/OlapTest.java index 4af9858..dee98ca 100644 --- a/testsrc/org/olap4j/OlapTest.java +++ b/testsrc/org/olap4j/OlapTest.java @@ -1439,6 +1439,60 @@ public void testCompoundFilter() { fail(); } } + public void testMultipleHierarchyConsistency() { + try { + Cube cube = getFoodmartCube("Sales"); + if (cube == null) { + fail("Could not find Sales cube"); + } + // Setup a base query. + Query query = new Query("my query", cube); + QueryDimension timeDimension = query.getDimension("Time"); + timeDimension.setHierarchyConsistent(true); + + timeDimension.include(nameList("Time.Weekly", "1997", "10", "23")); + timeDimension.include(nameList("Time.Weekly", "1997", "10", "28")); + timeDimension.include(nameList("Time.Weekly", "Year", "1997")); + + QueryDimension measuresDimension = query.getDimension("Measures"); + measuresDimension.include(nameList("Measures", "Sales Count")); + + query.getAxis(Axis.COLUMNS).addDimension(measuresDimension); + query.getAxis(Axis.ROWS).addDimension(timeDimension); + + query.validate(); + + // Validate the generated MDX + String mdxString = query.getSelect().toString(); + TestContext.assertEqualsVerbose( + "SELECT\n" + + "{[Measures].[Sales Count]} ON COLUMNS,\n" + + "{{[Time.Weekly].[1997]}, Filter({{[Time.Weekly].[1997].[10].[23], [Time.Weekly].[1997].[10].[28]}}, (Ancestor([Time.Weekly].CurrentMember, [Time.Weekly].[Year]) IN {[Time.Weekly].[1997]}))} ON ROWS\n" + + "FROM [Sales]", + mdxString); + + // Validate the returned results + CellSet results = query.execute(); + String resultsString = TestContext.toString(results); + TestContext.assertEqualsVerbose( + "Axis #0:\n" + + "{}\n" + + "Axis #1:\n" + + "{[Measures].[Sales Count]}\n" + + "Axis #2:\n" + + "{[Time.Weekly].[1997]}\n" + + "{[Time.Weekly].[1997].[10].[23]}\n" + + "{[Time.Weekly].[1997].[10].[28]}\n" + + "Row #0: 86,837\n" + + "Row #1: 123\n" + + "Row #2: \n", + resultsString); + query.validate(); + } catch (Exception e) { + e.printStackTrace(); + fail(); + } + } public void testHierarchyConsistency() { try { Cube cube = getFoodmartCube("Sales");