Skip to content

Commit

Permalink
MONDRIAN: introducing ability to omit the default slicer information …
Browse files Browse the repository at this point in the history
…from the xmla output.

MONDRIAN-619

[git-p4: depot-paths = "//open/mondrian/": change = 13111]
  • Loading branch information
Matt Campbell authored and Matt Campbell committed Oct 20, 2009
1 parent 72a5617 commit b4eec54
Show file tree
Hide file tree
Showing 4 changed files with 529 additions and 80 deletions.
3 changes: 2 additions & 1 deletion src/main/mondrian/xmla/Enumeration.java
Expand Up @@ -138,7 +138,8 @@ public enum Content {
None,
Schema,
Data,
SchemaData;
SchemaData,
DataOmitDefaultSlicer;
}

enum MdxSupport {
Expand Down
205 changes: 126 additions & 79 deletions src/main/mondrian/xmla/XmlaHandler.java
Expand Up @@ -26,8 +26,10 @@
import java.math.BigInteger;
import java.sql.*;
import java.util.*;
import java.io.StringWriter;
import java.io.PrintWriter;
import java.util.Date;
import java.io.*;
import java.text.Format;
import java.text.SimpleDateFormat;


/**
Expand Down Expand Up @@ -689,7 +691,8 @@ private void execute(

try {
if ((content == Enumeration.Content.Data)
|| (content == Enumeration.Content.SchemaData))
|| (content == Enumeration.Content.SchemaData)
|| (content == Enumeration.Content.DataOmitDefaultSlicer))
{
if (result != null) {
result.unparse(writer);
Expand Down Expand Up @@ -1716,7 +1719,18 @@ private QueryResult executeQuery(XmlaRequest request)
null);

if (format == Enumeration.Format.Multidimensional) {
return new MDDataSet_Multidimensional(result);
final String contentName =
request.getProperties()
.get(PropertyDefinition.Content.name());
Enumeration.Content content =
valueOf(
Enumeration.Content.class,
contentName,
CONTENT_DEFAULT);
final boolean omitDefaultSlicer =
(content == Enumeration.Content.DataOmitDefaultSlicer);
return
new MDDataSet_Multidimensional(result, omitDefaultSlicer);
} else {
return new MDDataSet_Tabular(result);
}
Expand Down Expand Up @@ -1763,9 +1777,17 @@ protected MDDataSet(Result result) {

static class MDDataSet_Multidimensional extends MDDataSet {
private List<Hierarchy> slicerAxisHierarchies;
private boolean omitDefaultSlicerInfo;

protected MDDataSet_Multidimensional(Result result) {
this(result, false);
}

protected MDDataSet_Multidimensional(
Result result, boolean isDataOmitDefaultSlicerContentType)
{
super(result);
this.omitDefaultSlicerInfo = isDataOmitDefaultSlicerContentType;
}

public void unparse(SaxWriter writer) throws SAXException {
Expand All @@ -1777,9 +1799,6 @@ public void unparse(SaxWriter writer) throws SAXException {
private void olapInfo(SaxWriter writer) {
// What are all of the cube's hierachies
Cube cube = result.getQuery().getCube();
List<Dimension> unseenDimensionList =
new ArrayList<Dimension>(
Arrays.asList(cube.getDimensions()));

writer.startElement("OlapInfo");
writer.startElement("CubeInfo");
Expand All @@ -1802,26 +1821,41 @@ private void olapInfo(SaxWriter writer) {
axisInfo(writer, axes[i], queryAxes[i], "Axis" + i);
axisHierarchyList.addAll(hiers);
}
// Remove all seen dimensions.
for (Hierarchy hier1 : axisHierarchyList) {
unseenDimensionList.remove(hier1.getDimension());
}

///////////////////////////////////////////////
// create AxesInfo for slicer axes
//
// The slicer axes contains the default hierarchy of each dimension
// not seen on another axis.
List<Hierarchy> hierarchies = new ArrayList<Hierarchy>();
for (Dimension dimension : unseenDimensionList) {
hierarchies.add(dimension.getHierarchy());
List<Hierarchy> hierarchies;
final QueryAxis slicerQueryAxis = result.getQuery().getSlicerAxis();
if (omitDefaultSlicerInfo) {
Axis slicerAxis = result.getSlicerAxis();
// only add slicer axis element to response
// if something is on the slicer
if (slicerAxis.getPositions().get(0).size() > 0) {
hierarchies =
axisInfo(
writer, slicerAxis, slicerQueryAxis, "SlicerAxis");
} else {
hierarchies = new ArrayList<Hierarchy>();
}
} else {
// The slicer axes contains the default hierarchy
// of each dimension not seen on another axis.
List<Dimension> unseenDimensionList =
new ArrayList<Dimension>(Arrays.asList(cube.getDimensions()));
for (Hierarchy hier1 : axisHierarchyList) {
unseenDimensionList.remove(hier1.getDimension());
}
hierarchies = new ArrayList<Hierarchy>();
for (Dimension dimension : unseenDimensionList) {
hierarchies.add(dimension.getHierarchy());
}
writer.startElement(
"AxisInfo",
new String[] { "name", "SlicerAxis"});
writeHierarchyInfo(
writer, hierarchies, getProps(slicerQueryAxis));
writer.endElement(); // AxisInfo
}
writer.startElement(
"AxisInfo",
new String[] { "name", "SlicerAxis"});
final QueryAxis slicerAxis = result.getQuery().getSlicerAxis();
writeHierarchyInfo(writer, hierarchies, getProps(slicerAxis));
writer.endElement(); // AxisInfo
slicerAxisHierarchies = hierarchies;
//
///////////////////////////////////////////////
Expand Down Expand Up @@ -1882,7 +1916,6 @@ private List<Hierarchy> axisInfo(
return hierarchies;
}


private void writeHierarchyInfo(
SaxWriter writer,
List<Hierarchy> hierarchies,
Expand Down Expand Up @@ -1950,74 +1983,88 @@ private void axes(SaxWriter writer) {
////////////////////////////////////////////
// now generate SlicerAxis information
//
List<Hierarchy> hierarchies = slicerAxisHierarchies;
writer.startElement(
"Axis",
"name", "SlicerAxis");
writer.startElement("Tuples");
writer.startElement("Tuple");

Map<String, Integer> memberMap = new HashMap<String, Integer>();
Member positionMember;
Axis slicerAxis = result.getSlicerAxis();
if (slicerAxis.getPositions() != null
&& slicerAxis.getPositions().size() > 0)
{
final Position pos0 = slicerAxis.getPositions().get(0);
int i = 0;
for (Member member : pos0) {
memberMap.put(member.getHierarchy().getName(), i++);
if (omitDefaultSlicerInfo) {
final QueryAxis slicerQueryAxis =
result.getQuery().getSlicerAxis();
Axis slicerAxis = result.getSlicerAxis();
// only add slicer axis element to response
// if something is on the slicer
if (slicerAxis.getPositions().get(0).size() > 0) {
axis(
writer,
result.getSlicerAxis(),
getProps(slicerQueryAxis),
"SlicerAxis");
}
}
} else {
List<Hierarchy> hierarchies = slicerAxisHierarchies;
writer.startElement(
"Axis",
"name", "SlicerAxis");
writer.startElement("Tuples");
writer.startElement("Tuple");

final QueryAxis slicerQueryAxis = result.getQuery().getSlicerAxis();
final List<Member> slicerMembers =
result.getSlicerAxis().getPositions().get(0);
for (Hierarchy hierarchy : hierarchies) {
// Find which member is on the slicer. If it's not explicitly
// there, use the default member.
Member member = hierarchy.getDefaultMember();
final Integer indexPosition =
memberMap.get(hierarchy.getName());
if (indexPosition != null) {
positionMember =
slicerAxis.getPositions().get(0).get(indexPosition);
} else {
positionMember = null;
}
for (Member slicerMember : slicerMembers) {
if (slicerMember.getHierarchy().equals(hierarchy)) {
member = slicerMember;
break;
Map<String, Integer> memberMap = new HashMap<String, Integer>();
Member positionMember;
Axis slicerAxis = result.getSlicerAxis();
if (slicerAxis.getPositions() != null
&& slicerAxis.getPositions().size() > 0)
{
final Position pos0 = slicerAxis.getPositions().get(0);
int i = 0;
for (Member member : pos0) {
memberMap.put(member.getHierarchy().getName(), i++);
}
}

if (member != null) {
if (positionMember != null) {
writeMember(
writer, positionMember, null,
slicerAxis.getPositions().get(0), indexPosition,
getProps(slicerQueryAxis));
final QueryAxis slicerQueryAxis =
result.getQuery().getSlicerAxis();
final List<Member> slicerMembers =
result.getSlicerAxis().getPositions().get(0);
for (Hierarchy hierarchy : hierarchies) {
// Find which member is on the slicer.
// If it's not explicitly there, use the default member.
Member member = hierarchy.getDefaultMember();
final Integer indexPosition =
memberMap.get(hierarchy.getName());
if (indexPosition != null) {
positionMember =
slicerAxis.getPositions().get(0).get(indexPosition);
} else {
slicerAxis(writer, member, getProps(slicerQueryAxis));
positionMember = null;
}
for (Member slicerMember : slicerMembers) {
if (slicerMember.getHierarchy().equals(hierarchy)) {
member = slicerMember;
break;
}
}

if (member != null) {
if (positionMember != null) {
writeMember(
writer, positionMember, null,
slicerAxis.getPositions().get(0), indexPosition,
getProps(slicerQueryAxis));
} else {
slicerAxis(
writer, member, getProps(slicerQueryAxis));
}
} else {
LOGGER.warn(
"Can not create SlicerAxis: "
+ "null default member for Hierarchy "
+ hierarchy.getUniqueName());
}
} else {
LOGGER.warn(
"Can not create SlicerAxis: "
+ "null default member for Hierarchy "
+ hierarchy.getUniqueName());
}
writer.endElement(); // Tuple
writer.endElement(); // Tuples
writer.endElement(); // Axis
}

//
////////////////////////////////////////////

writer.endElement(); // Tuple
writer.endElement(); // Tuples
writer.endElement(); // Axis



writer.endElement(); // Axes
}

Expand Down
44 changes: 44 additions & 0 deletions testsrc/main/mondrian/xmla/XmlaBasicTest.java
Expand Up @@ -12,11 +12,13 @@
import mondrian.olap.*;
import mondrian.test.*;
import mondrian.tui.XmlUtil;
import mondrian.tui.XmlaSupport;
import mondrian.spi.Dialect;

import org.w3c.dom.Document;

import java.util.Properties;
import java.util.Map;

/**
* Test XML/A functionality.
Expand Down Expand Up @@ -47,6 +49,8 @@ public class XmlaBasicTest extends XmlaBaseTestCase {
Enumeration.Content.Schema.name();
public static final String CONTENT_SCHEMADATA =
Enumeration.Content.SchemaData.name();
public static final String CONTENT_DATAOMITDEFAULTSLICER =
Enumeration.Content.DataOmitDefaultSlicer.name();

public XmlaBasicTest() {
}
Expand Down Expand Up @@ -612,6 +616,18 @@ public void testExecuteSlicer() throws Exception {
doTest(requestType, props, TestContext.instance());
}

public void testExecuteSlicerContentDataOmitDefaultSlicer()
throws Exception
{
doTestExecuteContentDataOmitDefaultSlicer();
}

public void testExecuteNoSlicerContentDataOmitDefaultSlicer()
throws Exception
{
doTestExecuteContentDataOmitDefaultSlicer();
}

public void testExecuteWithoutCellProperties() throws Exception
{
String requestType = "EXECUTE";
Expand Down Expand Up @@ -844,6 +860,34 @@ public void doTestRT(String requestType, TestContext testContext)
doTest(requestType, props, testContext);
}

private void doTestExecuteContentDataOmitDefaultSlicer() throws Exception {
String requestType = "EXECUTE";
Properties props = getDefaultRequestProperties(requestType);
String requestText = fileToString("request");
TestContext testContext = TestContext.instance();
requestText = testContext.upgradeQuery(requestText);
String respFileName = "${response}";
Document responseDoc = (respFileName != null)
? fileToDocument(respFileName)
: null;

String connectString = testContext.getConnectString();
Map<String, String> catalogNameUrls = getCatalogNameUrls(testContext);

Document expectedDoc;

final String ns = "cxmla";
expectedDoc = (responseDoc != null)
? XmlaSupport.transformSoapXmla(
responseDoc,
new String[][] {{"content", "DataOmitDefaultSlicer"}}, ns)
: null;
doTests(
requestText, props,
testContext, null, connectString, catalogNameUrls,
expectedDoc, XmlaBasicTest.CONTENT_DATAOMITDEFAULTSLICER, null);
}

protected String getSessionId(Action action) {
throw new UnsupportedOperationException();
}
Expand Down

0 comments on commit b4eec54

Please sign in to comment.