diff --git a/ivy.xml b/ivy.xml
index 3b3279c..3892cb7 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -76,7 +76,7 @@
-
pos)
{
- CellSetAxis _axis = axis < 0
- ? cellSet.getFilterAxis()
- : cellSet.getAxes().get(axis);
- List positions = _axis.getPositions();
+ final CellSetAxis _axis = cellSet.getAxes().get(axis);
+ final List positions = _axis.getPositions();
final int positionCount = positions.size();
for (int i = 0; i < positionCount; i++) {
- if (axis < 0) {
- if (i > 0) {
- pw.print(", ");
- }
+ pos.set(axis, i);
+ if (axis == 0) {
+ int row =
+ axis + 1 < pos.size()
+ ? pos.get(axis + 1)
+ : 0;
+ pw.print("Row #" + row + ": ");
printCell(cellSet, pw, pos);
+ pw.println();
} else {
- pos.set(axis, i);
- if (axis == 0) {
- int row =
- axis + 1 < pos.size()
- ? pos.get(axis + 1)
- : 0;
- pw.print("Row #" + row + ": ");
- }
printRows(cellSet, pw, axis - 1, pos);
- if (axis == 0) {
- pw.println();
- }
}
}
}
diff --git a/testsrc/org/olap4j/CellSetFormatterTest.java b/testsrc/org/olap4j/CellSetFormatterTest.java
index 7c3ff6f..e1ba11b 100644
--- a/testsrc/org/olap4j/CellSetFormatterTest.java
+++ b/testsrc/org/olap4j/CellSetFormatterTest.java
@@ -127,8 +127,6 @@ public enum Format {
// ~ Tests follow ==========================================================
public void testQuery1Traditional() throws SQLException {
- final TestContext.Tester.Flavor flavor =
- TestContext.instance().getTester().getFlavor();
assertFormat(
query1,
Format.TRADITIONAL,
@@ -316,6 +314,91 @@ public void testEmptyColumnsRectangular() throws SQLException {
+ "| | | WA | |\n");
}
+ public void testFilter() throws SQLException {
+ final String queryString =
+ "select\n"
+ + " crossjoin(\n"
+ + " {[Time].[1997].[Q1], [Time].[1997].[Q2].[4]},\n"
+ + " {[Measures].[Unit Sales]}) on 0,\n"
+ + " {[USA].[CA].[Los Angeles],\n"
+ + " [USA].[CA].[San Francisco]} on 1\n"
+ + "FROM [Sales]\n"
+ + "WHERE ([Gender].[M], [Marital Status].[S])";
+
+ assertFormat(
+ queryString,
+ Format.TRADITIONAL,
+ "Axis #0:\n"
+ + "{[Gender].[M], [Marital Status].[S]}\n"
+ + "Axis #1:\n"
+ + "{[Time].[1997].[Q1], [Measures].[Unit Sales]}\n"
+ + "{[Time].[1997].[Q2].[4], [Measures].[Unit Sales]}\n"
+ + "Axis #2:\n"
+ + "{[Store].[USA].[CA].[Los Angeles]}\n"
+ + "{[Store].[USA].[CA].[San Francisco]}\n"
+ + "Row #0: 1,615\n"
+ + "Row #0: 594\n"
+ + "Row #1: 101\n"
+ + "Row #1: 55\n");
+
+ // TODO: rectagular formatter should print filter
+ assertFormat(
+ queryString,
+ Format.COMPACT_RECTANGULAR,
+ " 1997 \n"
+ + " Q1 Q2\n"
+ + " 4\n"
+ + " Unit Sales Unit Sales\n"
+ + "=== == ============= ========== ==========\n"
+ + "USA CA Los Angeles 1,615 594\n"
+ + " San Francisco 101 55\n");
+
+ // TODO: rectagular formatter should print filter
+ assertFormat(
+ queryString,
+ Format.RECTANGULAR,
+ "| | 1997 |\n"
+ + "| | Q1 | Q2 |\n"
+ + "| | | 4 |\n"
+ + "| | Unit Sales | Unit Sales |\n"
+ + "+-----+----+---------------+------------+------------+\n"
+ + "| USA | CA | Los Angeles | 1,615 | 594 |\n"
+ + "| | | San Francisco | 101 | 55 |\n");
+ }
+
+ public void testFilterCompound() throws SQLException {
+ final String queryString =
+ "select\n"
+ + " crossjoin(\n"
+ + " {[Time].[1997].[Q1], [Time].[1997].[Q2].[4]},\n"
+ + " {[Measures].[Unit Sales]}) on 0,\n"
+ + " {[USA].[CA].[Los Angeles],\n"
+ + " [USA].[CA].[San Francisco]} on 1\n"
+ + "FROM [Sales]\n"
+ + "WHERE [Gender].Children * [Marital Status].Members";
+
+ assertFormat(
+ queryString,
+ Format.TRADITIONAL,
+ "Axis #0:\n"
+ + "{[Gender].[F], [Marital Status].[All Marital Status]}\n"
+ + "{[Gender].[F], [Marital Status].[M]}\n"
+ + "{[Gender].[F], [Marital Status].[S]}\n"
+ + "{[Gender].[M], [Marital Status].[All Marital Status]}\n"
+ + "{[Gender].[M], [Marital Status].[M]}\n"
+ + "{[Gender].[M], [Marital Status].[S]}\n"
+ + "Axis #1:\n"
+ + "{[Time].[1997].[Q1], [Measures].[Unit Sales]}\n"
+ + "{[Time].[1997].[Q2].[4], [Measures].[Unit Sales]}\n"
+ + "Axis #2:\n"
+ + "{[Store].[USA].[CA].[Los Angeles]}\n"
+ + "{[Store].[USA].[CA].[San Francisco]}\n"
+ + "Row #0: 6,373\n"
+ + "Row #0: 1,865\n"
+ + "Row #1: 439\n"
+ + "Row #1: 149\n");
+ }
+
public void testZeroAxesRectangular() throws SQLException {
final String mdx =
"select\n"
diff --git a/testsrc/org/olap4j/ConnectionTest.java b/testsrc/org/olap4j/ConnectionTest.java
index d37fd14..9f44d3d 100644
--- a/testsrc/org/olap4j/ConnectionTest.java
+++ b/testsrc/org/olap4j/ConnectionTest.java
@@ -522,7 +522,12 @@ public void testAxes() throws SQLException {
assertEquals(0, position.getMembers().size());
}
- public void testCompoundSlicer() throws SQLException {
+ /**
+ * Tests a filter with more than one position.
+ *
+ * @throws SQLException on error
+ */
+ public void testCompoundFilter() throws SQLException {
connection = tester.createConnection();
OlapConnection olapConnection =
tester.getWrapper().unwrap(connection, OlapConnection.class);
@@ -531,30 +536,76 @@ public void testCompoundSlicer() throws SQLException {
CellSet cellSet =
statement.executeOlapQuery(
"SELECT {[Measures].[Unit Sales]} on 0,\n"
- + "{[Store].Children} on 1\n"
+ + "{[Product].Children} on 1\n"
+ "FROM [Sales]\n"
+ "WHERE [Time].[1997].[Q1] * [Gender].Members");
List axesList = cellSet.getAxes();
assertEquals(2, axesList.size());
final CellSetAxis filterAxis = cellSet.getFilterAxis();
- final Tester.Flavor flavor =
- TestContext.instance().getTester().getFlavor();
- switch (flavor) {
- case MONDRIAN:
- assertEquals(1, filterAxis.getPositionCount());
- break;
- case XMLA:
- case REMOTE_XMLA:
- assertEquals(3, filterAxis.getPositionCount());
- final List filterPositions = filterAxis.getPositions();
- assertEquals(3, filterPositions.size());
- final Position filterPosition = filterPositions.get(2);
- assertEquals(2, filterPosition.getMembers().size());
- assertEquals("M", filterPosition.getMembers().get(1).getName());
- break;
- default:
- throw Olap4jUtil.unexpected(flavor);
- }
+ assertEquals(3, filterAxis.getPositionCount());
+ final List filterPositions = filterAxis.getPositions();
+ assertEquals(3, filterPositions.size());
+ final Position filterPosition = filterPositions.get(2);
+ assertEquals(2, filterPosition.getMembers().size());
+ assertEquals("M", filterPosition.getMembers().get(1).getName());
+ }
+
+ /**
+ * Tests a filter with zero positions.
+ *
+ * @throws SQLException on error
+ */
+ public void testEmptyFilter() throws SQLException {
+ connection = tester.createConnection();
+ OlapConnection olapConnection =
+ tester.getWrapper().unwrap(connection, OlapConnection.class);
+ OlapStatement statement = olapConnection.createStatement();
+
+ CellSet cellSet =
+ statement.executeOlapQuery(
+ "SELECT {[Measures].[Unit Sales]} on 0,\n"
+ + "{[Product].Children} on 1\n"
+ + "FROM [Sales]\n"
+ + "WHERE [Time].[1997].[Q1] * [Gender].Parent");
+ List axesList = cellSet.getAxes();
+ assertEquals(2, axesList.size());
+ final CellSetAxis filterAxis = cellSet.getFilterAxis();
+ assertEquals(0, filterAxis.getPositionCount());
+ final List filterPositions = filterAxis.getPositions();
+ assertEquals(0, filterPositions.size());
+ assertEquals(2, filterAxis.getAxisMetaData().getHierarchies().size());
+ final Cell cell = cellSet.getCell(Arrays.asList(0, 0));
+ assertTrue(cell.isNull());
+ }
+
+ /**
+ * Tests a query with no filter (no WHERE clause).
+ *
+ * @throws SQLException on error
+ */
+ public void testMissingFilter() throws SQLException {
+ connection = tester.createConnection();
+ OlapConnection olapConnection =
+ tester.getWrapper().unwrap(connection, OlapConnection.class);
+ OlapStatement statement = olapConnection.createStatement();
+ CellSet cellSet =
+ statement.executeOlapQuery(
+ "SELECT {[Measures].[Unit Sales]} on 0,\n"
+ + "{[Product].Children} on 1\n"
+ + "FROM [Sales]\n");
+ List axesList = cellSet.getAxes();
+ assertEquals(2, axesList.size());
+ final CellSetAxis filterAxis = cellSet.getFilterAxis();
+ assertEquals(1, filterAxis.getPositionCount());
+ final List filterPositions = filterAxis.getPositions();
+ assertEquals(1, filterPositions.size());
+ final Position position = filterPositions.get(0);
+ assertEquals(0, position.getMembers().size());
+ assertEquals(
+ 0, filterAxis.getAxisMetaData().getHierarchies().size());
+ assertTrue(filterAxis.getAxisMetaData().getHierarchies().isEmpty());
+ final Cell cell = cellSet.getCell(Arrays.asList(0, 0));
+ assertEquals("24,597", cell.getFormattedValue());
}
public void testMeasureVersusMemberCasting() throws Exception {
diff --git a/testsrc/org/olap4j/test/TestContext.java b/testsrc/org/olap4j/test/TestContext.java
index 467091a..d378f00 100644
--- a/testsrc/org/olap4j/test/TestContext.java
+++ b/testsrc/org/olap4j/test/TestContext.java
@@ -114,7 +114,7 @@ public static String toString(ParseTreeNode node) {
public static String toString(CellSet cellSet) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
- new TraditionalCellSetFormatter().format(cellSet, pw);
+ new TraditionalCellSetFormatter().format(cellSet, pw);
pw.flush();
return sw.toString();
}