From 0f5b0e98732237f4d24fd514a4bb3e5b09e7840d Mon Sep 17 00:00:00 2001 From: Luc Boudreau Date: Thu, 26 Mar 2009 14:36:51 +0000 Subject: [PATCH] Added a sortOrder() method to QueryDimension to sort the dimension members either in ascending or descending order. git-svn-id: https://olap4j.svn.sourceforge.net/svnroot/olap4j/trunk@154 c6a108a4-781c-0410-a6c6-c2d559e19af0 --- src/org/olap4j/query/Olap4jNodeConverter.java | 27 ++++++- src/org/olap4j/query/QueryDimension.java | 20 +++++ testsrc/org/olap4j/OlapTest.java | 78 +++++++++++++++++++ 3 files changed, 124 insertions(+), 1 deletion(-) diff --git a/src/org/olap4j/query/Olap4jNodeConverter.java b/src/org/olap4j/query/Olap4jNodeConverter.java index d2c0cb7..d6eef79 100644 --- a/src/org/olap4j/query/Olap4jNodeConverter.java +++ b/src/org/olap4j/query/Olap4jNodeConverter.java @@ -17,7 +17,9 @@ import org.olap4j.mdx.AxisNode; import org.olap4j.mdx.CallNode; import org.olap4j.mdx.CubeNode; +import org.olap4j.mdx.DimensionNode; import org.olap4j.mdx.IdentifierNode; +import org.olap4j.mdx.LiteralNode; import org.olap4j.mdx.MemberNode; import org.olap4j.mdx.ParseTreeNode; import org.olap4j.mdx.SelectNode; @@ -158,7 +160,30 @@ private static List toOlap4j(QueryDimension dimension) { for (Selection selection : dimension.getSelections()) { members.add(toOlap4j(selection)); } - return members; + if (dimension.getSortOrder() != null) { + CallNode currentMemberNode = new CallNode( + null, + "CurrentMember", + Syntax.Property, + new DimensionNode(null,dimension.getDimension())); + CallNode currentMemberNameNode = new CallNode( + null, + "Name", + Syntax.Property, + currentMemberNode); + List orderedList = new ArrayList(); + orderedList.add( + new CallNode( + null, + "Order", + Syntax.Function, + generateListSetCall(members), + currentMemberNameNode, + LiteralNode.createSymbol(null,dimension.getSortOrder().name()))); + return orderedList; + } else { + return members; + } } private static ParseTreeNode toOlap4j(Selection selection) { diff --git a/src/org/olap4j/query/QueryDimension.java b/src/org/olap4j/query/QueryDimension.java index 2fca802..94e33d7 100644 --- a/src/org/olap4j/query/QueryDimension.java +++ b/src/org/olap4j/query/QueryDimension.java @@ -38,6 +38,7 @@ public class QueryDimension { protected final List selections = new SelectionList(); private final Query query; protected Dimension dimension; + private SortOrder sortOrder = null; public QueryDimension(Query query, Dimension dimension) { super(); @@ -143,6 +144,14 @@ public void setDimension(Dimension dimension) { this.dimension = dimension; } + public void setSortOrder(SortOrder order) { + this.sortOrder = order; + } + + public SortOrder getSortOrder() { + return this.sortOrder; + } + private class SelectionList extends AbstractList { private final List list = new ArrayList(); @@ -169,6 +178,17 @@ public Selection remove(int index) { return list.remove(index); } } + + public static enum SortOrder { + /** + * Ascending sort order. + */ + ASC, + /** + * Descending sort order. + */ + DESC + } } // End QueryDimension.java diff --git a/testsrc/org/olap4j/OlapTest.java b/testsrc/org/olap4j/OlapTest.java index 16da5ac..4a15e17 100644 --- a/testsrc/org/olap4j/OlapTest.java +++ b/testsrc/org/olap4j/OlapTest.java @@ -11,6 +11,7 @@ import org.olap4j.mdx.SelectNode; import org.olap4j.metadata.*; import org.olap4j.query.*; +import org.olap4j.query.QueryDimension.SortOrder; import org.olap4j.test.TestContext; import org.w3c.dom.*; @@ -505,6 +506,83 @@ public void testSwapAxes() { } } + public void testSortDimension() { + try { + Cube cube = getFoodmartCube("Sales"); + if (cube == null) { + fail("Could not find Sales cube"); + } + Query query = new Query("my query", cube); + + // create selections + + QueryDimension productDimension = query.getDimension("Product"); + Member drinkMember = cube.lookupMember("Product", "Drink"); + Selection drinkSelection = + productDimension.createSelection(drinkMember, + Selection.Operator.INCLUDE_CHILDREN); + productDimension.getSelections().add(drinkSelection); + + QueryDimension measuresDimension = query.getDimension("Measures"); + Member storeSalesMember = cube.lookupMember("Measures", "Store Sales"); + Selection storeSalesSelection = + measuresDimension.createSelection(storeSalesMember, + Selection.Operator.MEMBER); + measuresDimension.getSelections().add(storeSalesSelection); + + query.getAxes().get(Axis.ROWS).getDimensions().add(productDimension); + query.getAxes().get(Axis.COLUMNS).getDimensions().add(measuresDimension); + + query.validate(); + + assertEquals(productDimension.getAxis().getLocation(), Axis.ROWS); + assertEquals(measuresDimension.getAxis().getLocation(), Axis.COLUMNS); + + SelectNode mdx = query.getSelect(); + String mdxString = mdx.toString(); + assertEquals( + mdxString, + TestContext.fold("SELECT\n" + + "{[Measures].[Store Sales]} ON COLUMNS,\n" + + "{{[Product].[All Products].[Drink], [Product].[All Products].[Drink].Children}} ON ROWS\n" + + "FROM [Sales]")); + + // Sort the products in ascending order. + query.getDimension("Product").setSortOrder(SortOrder.DESC); + + SelectNode sortedMdx = query.getSelect(); + String sortedMdxString = sortedMdx.toString(); + assertEquals( + sortedMdxString, + TestContext.fold("SELECT\n" + + "{[Measures].[Store Sales]} ON COLUMNS,\n" + + "{Order({{[Product].[All Products].[Drink], [Product].[All Products].[Drink].Children}}, [Product].CurrentMember.Name, DESC)} ON ROWS\n" + + "FROM [Sales]")); + + CellSet results = query.execute(); + String s = TestContext.toString(results); + TestContext.assertEqualsVerbose( + TestContext.fold("Axis #0:\n" + + "{[Store].[All Stores], [Store Size in SQFT].[All Store Size in SQFTs], [Store Type].[All Store Types], [Time].[1997], [Promotion Media].[All Media], [Promotions].[All Promotions], [Customers].[All Customers], [Education Level].[All Education Levels], [Gender].[All Gender], [Marital Status].[All Marital Status], [Yearly Income].[All Yearly Incomes]}\n" + + "Axis #1:\n" + + "{[Measures].[Store Sales]}\n" + + "Axis #2:\n" + + "{[Product].[All Products].[Drink]}\n" + + "{[Product].[All Products].[Drink].[Dairy]}\n" + + "{[Product].[All Products].[Drink].[Beverages]}\n" + + "{[Product].[All Products].[Drink].[Alcoholic Beverages]}\n" + + "Row #0: 48,836.21\n" + + "Row #1: 7,058.60\n" + + "Row #2: 27,748.53\n" + + "Row #3: 14,029.08\n"), + s); + } catch (Exception e) { + e.printStackTrace(); + fail(); + } + } + + public static void listHierarchies(Dimension dimension) {