Skip to content

Commit

Permalink
Adds Cube.isDrillThroughEnabled, adds related tests and adds a mechan…
Browse files Browse the repository at this point in the history
…ism to override values returned by an XMLA server for metadata calls.

git-svn-id: https://olap4j.svn.sourceforge.net/svnroot/olap4j/trunk@432 c6a108a4-781c-0410-a6c6-c2d559e19af0
  • Loading branch information
lucboudreau committed Mar 25, 2011
1 parent a640c01 commit 48d4687
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 3 deletions.
5 changes: 5 additions & 0 deletions src/org/olap4j/driver/xmla/XmlaOlap4jCube.java
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,11 @@ public NamedList<Hierarchy> getHierarchies() {
return Olap4jUtil.cast(hierarchies);
}

public boolean isDrillThroughEnabled() {
// XMLA does not implement drillthrough yet.
return false;
}

public List<Measure> getMeasures() {
return Olap4jUtil.cast(measures);
}
Expand Down
34 changes: 31 additions & 3 deletions src/org/olap4j/driver/xmla/XmlaOlap4jDatabaseMetaData.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,27 @@ abstract class XmlaOlap4jDatabaseMetaData implements OlapDatabaseMetaData {
this.olap4jConnection = olap4jConnection;
}

private ResultSet getMetadata(
XmlaOlap4jConnection.MetadataRequest metadataRequest,
Object... patternValues) throws OlapException
{
return getMetadata(
metadataRequest,
Collections.emptyMap(),
patternValues);
}

/**
* Executes a metadata query and returns the result as a JDBC
* {@link ResultSet}.
*
* @param metadataRequest Name of the metadata request. Corresponds to the
* XMLA method name, e.g. "MDSCHEMA_CUBES"
*
* @param overrides Map of metadata columns to forced values. Used
* to override the value returned by the server for a list of
* columns.
*
* @param patternValues Array of alternating parameter name and value
* pairs. If the parameter value is null, it is ignored.
*
Expand All @@ -64,6 +78,7 @@ abstract class XmlaOlap4jDatabaseMetaData implements OlapDatabaseMetaData {
*/
private ResultSet getMetadata(
XmlaOlap4jConnection.MetadataRequest metadataRequest,
Map<XmlaOlap4jConnection.MetadataColumn, String> overrides,
Object... patternValues) throws OlapException
{
assert patternValues.length % 2 == 0;
Expand Down Expand Up @@ -132,9 +147,13 @@ private ResultSet getMetadata(
for (XmlaOlap4jConnection.MetadataColumn column
: metadataRequest.columns)
{
final String value =
XmlaOlap4jUtil.stringElement(row, column.xmlaName);
valueList.add(value);
if (overrides.containsKey(column)) {
valueList.add(overrides.get(column));
} else {
final String value =
XmlaOlap4jUtil.stringElement(row, column.xmlaName);
valueList.add(value);
}
}
rowList.add(valueList);
}
Expand Down Expand Up @@ -1039,8 +1058,17 @@ public ResultSet getCubes(
String cubeNamePattern)
throws OlapException
{
// XMLA doesn't support drillthrough so override
// whatever the server returns.
final Map<XmlaOlap4jConnection.MetadataColumn, String> overrides =
new HashMap<XmlaOlap4jConnection.MetadataColumn, String>();
overrides.put(
XmlaOlap4jConnection.MetadataRequest
.MDSCHEMA_CUBES.getColumn("IS_DRILLTHROUGH_ENABLED"),
"false");
return getMetadata(
XmlaOlap4jConnection.MetadataRequest.MDSCHEMA_CUBES,
overrides,
"CATALOG_NAME", catalog,
"SCHEMA_NAME", wildcard(schemaPattern),
"CUBE_NAME", wildcard(cubeNamePattern));
Expand Down
7 changes: 7 additions & 0 deletions src/org/olap4j/metadata/Cube.java
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,13 @@ public interface Cube extends MetadataElement {
List<Member> lookupMembers(
Set<Member.TreeOp> treeOps,
List<IdentifierSegment> nameParts) throws OlapException;

/**
* Tells whether or not drill through operations are
* possible in this cube.
* @return True if drillthrough is enabled, false otherwise.
*/
boolean isDrillThroughEnabled();
}

// End Cube.java
27 changes: 27 additions & 0 deletions testsrc/org/olap4j/ConnectionTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2773,6 +2773,33 @@ public void testCubeDimensionsOrder() throws Exception {
sb.toString());
}

public void testCubesDrillthrough() throws Exception {
Class.forName(tester.getDriverClassName());
connection = tester.createConnection();
OlapConnection olapConnection =
tester.getWrapper().unwrap(connection, OlapConnection.class);
Cube cube =
olapConnection
.getOlapCatalogs()
.get("FoodMart")
.getSchemas()
.get("FoodMart")
.getCubes()
.get("Sales");
switch (tester.getFlavor()) {
case MONDRIAN:
assertTrue(cube.isDrillThroughEnabled());
break;
case REMOTE_XMLA :
case XMLA:
assertFalse(cube.isDrillThroughEnabled());
break;
default:
fail();
break;
}
}

/**
* Query with dimension properties.
*
Expand Down
18 changes: 18 additions & 0 deletions testsrc/org/olap4j/MetadataTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,24 @@ public void testDatabaseMetaDataGetCubes() throws SQLException {
if (tester.getFlavor() == TestContext.Tester.Flavor.XMLA) {
assertEquals(lineCount * 2, lineCount3);
}
s = checkResultSet(
olapDatabaseMetaData.getCubes(
"FoodMart",
"FoodMart",
"Sales"),
CUBE_COLUMN_NAMES);
switch (testContext.getTester().getFlavor()) {
case MONDRIAN:
assertTrue(s.contains(", IS_DRILLTHROUGH_ENABLED=true"));
break;
case XMLA:
case REMOTE_XMLA:
assertTrue(s.contains(", IS_DRILLTHROUGH_ENABLED=false"));
assertFalse(s.contains(", IS_DRILLTHROUGH_ENABLED=true"));
break;
default:
throw new RuntimeException("Unknown tester type.");
}

// If we ask for 'Warehouse and Sales' cube we should get it, but
// nothing else.
Expand Down

0 comments on commit 48d4687

Please sign in to comment.