Skip to content

Commit

Permalink
Added a sortOrder() method to QueryDimension to sort the dimension me…
Browse files Browse the repository at this point in the history
…mbers either in ascending or descending order.

git-svn-id: https://olap4j.svn.sourceforge.net/svnroot/olap4j/trunk@154 c6a108a4-781c-0410-a6c6-c2d559e19af0
  • Loading branch information
lucboudreau committed Mar 26, 2009
1 parent 156558b commit 0f5b0e9
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 1 deletion.
27 changes: 26 additions & 1 deletion src/org/olap4j/query/Olap4jNodeConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -158,7 +160,30 @@ private static List<ParseTreeNode> 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<ParseTreeNode> orderedList = new ArrayList<ParseTreeNode>();
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) {
Expand Down
20 changes: 20 additions & 0 deletions src/org/olap4j/query/QueryDimension.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public class QueryDimension {
protected final List<Selection> selections = new SelectionList();
private final Query query;
protected Dimension dimension;
private SortOrder sortOrder = null;

public QueryDimension(Query query, Dimension dimension) {
super();
Expand Down Expand Up @@ -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<Selection> {
private final List<Selection> list = new ArrayList<Selection>();

Expand All @@ -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
78 changes: 78 additions & 0 deletions testsrc/org/olap4j/OlapTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 0f5b0e9

Please sign in to comment.