Skip to content

Commit

Permalink
MONDRIAN: Fix olap4j driver behavior for slicer axis of query without…
Browse files Browse the repository at this point in the history
… WHERE clause.

[git-p4: depot-paths = "//open/mondrian/": change = 10418]
  • Loading branch information
julianhyde committed Jan 10, 2008
1 parent 9632926 commit 4c88fa6
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 28 deletions.
7 changes: 6 additions & 1 deletion src/main/mondrian/olap4j/MondrianOlap4jCellSet.java
Expand Up @@ -89,7 +89,12 @@ void execute() {
final QueryAxis queryAxis = result.getQuery().getSlicerAxis();
final Axis axis = result.getSlicerAxis();
if (queryAxis == null) {
filterAxis = null;
// Dummy slicer axis.
QueryAxis queryAxis2 =
new QueryAxis(
false, null, AxisOrdinal.SLICER,
QueryAxis.SubtotalVisibility.Undefined);
filterAxis = new MondrianOlap4jCellSetAxis(this, queryAxis2, axis);
} else {
filterAxis = new MondrianOlap4jCellSetAxis(this, queryAxis, axis);
}
Expand Down
55 changes: 44 additions & 11 deletions src/main/mondrian/olap4j/MondrianOlap4jCellSetAxis.java
Expand Up @@ -9,13 +9,12 @@
*/
package mondrian.olap4j;

import mondrian.olap.AxisOrdinal;
import org.olap4j.*;
import org.olap4j.metadata.*;

import java.util.*;

import mondrian.olap.AxisOrdinal;

/**
* Implementation of {@link org.olap4j.CellSetAxis}
* for the Mondrian OLAP engine.
Expand Down Expand Up @@ -67,17 +66,51 @@ public CellSetAxisMetaData getAxisMetaData() {
}

public List<Position> getPositions() {
return new AbstractList<Position>() {
public Position get(final int index) {
final mondrian.olap.Position mondrianPosition =
axis.getPositions().get(index);
return new MondrianOlap4jPosition(mondrianPosition, index);
switch (getAxisOrdinal()) {
case FILTER:
final List<Hierarchy> hierarchyList =
getAxisMetaData().getHierarchies();
final Member[] members = new Member[hierarchyList.size()];
final MondrianOlap4jConnection olap4jConnection =
olap4jCellSet.olap4jStatement.olap4jConnection;
for (mondrian.olap.Member member : axis.getPositions().get(0)) {
final MondrianOlap4jHierarchy hierarchy =
olap4jConnection.toOlap4j(
member.getHierarchy());
members[hierarchyList.indexOf(hierarchy)] =
olap4jConnection.toOlap4j(
member);
}

public int size() {
return axis.getPositions().size();
int k = -1;
for (Hierarchy hierarchy : hierarchyList) {
++k;
if (members[k] == null) {
members[k] = hierarchy.getDefaultMember();
}
}
};
final Position position = new Position() {
public List<Member> getMembers() {
return Arrays.asList(members);
}

public int getOrdinal() {
return 0;
}
};
return Collections.singletonList(position);
default:
return new AbstractList<Position>() {
public Position get(final int index) {
final mondrian.olap.Position mondrianPosition =
axis.getPositions().get(index);
return new MondrianOlap4jPosition(mondrianPosition, index);
}

public int size() {
return axis.getPositions().size();
}
};
}
}

public int getPositionCount() {
Expand Down
57 changes: 46 additions & 11 deletions src/main/mondrian/olap4j/MondrianOlap4jCellSetAxisMetaData.java
Expand Up @@ -12,11 +12,11 @@
import org.olap4j.Axis;
import org.olap4j.metadata.Hierarchy;
import org.olap4j.metadata.Property;
import org.olap4j.metadata.Dimension;
import mondrian.olap.*;
import mondrian.olap.type.*;

import java.util.List;
import java.util.ArrayList;
import java.util.*;

/**
* Implementation of {@link org.olap4j.CellSetMetaData}
Expand All @@ -28,11 +28,11 @@
*/
class MondrianOlap4jCellSetAxisMetaData implements CellSetAxisMetaData {
private final QueryAxis queryAxis;
private final MondrianOlap4jConnection olap4jConnection;
private final MondrianOlap4jCellSetMetaData cellSetMetaData;
private final List<Property> propertyList = new ArrayList<Property>();

MondrianOlap4jCellSetAxisMetaData(
MondrianOlap4jConnection olap4jConnection,
MondrianOlap4jCellSetMetaData cellSetMetaData,
QueryAxis queryAxis)
{
if (queryAxis == null) {
Expand All @@ -41,7 +41,7 @@ class MondrianOlap4jCellSetAxisMetaData implements CellSetAxisMetaData {
QueryAxis.SubtotalVisibility.Undefined);
}
this.queryAxis = queryAxis;
this.olap4jConnection = olap4jConnection;
this.cellSetMetaData = cellSetMetaData;

// populate property list
for (Id id : queryAxis.getDimensionProperties()) {
Expand All @@ -61,19 +61,27 @@ public Axis getAxisOrdinal() {
}

public List<Hierarchy> getHierarchies() {
List<Hierarchy> hierarchyList =
new ArrayList<Hierarchy>();
final Type type;
final Exp exp = queryAxis.getSet();
switch (queryAxis.getAxisOrdinal()) {
case SLICER:
type = queryAxis.getSet().getType();
type =
exp == null
? null
: exp.getType();
break;
default:
final SetType setType =
(SetType) queryAxis.getSet().getType();
(SetType) exp.getType();
type = setType.getElementType();
}
List<Hierarchy> hierarchyList =
new ArrayList<Hierarchy>();
if (type instanceof TupleType) {
final MondrianOlap4jConnection olap4jConnection =
cellSetMetaData.olap4jStatement.olap4jConnection;
if (type == null) {
// nothing; will deal with slicer later
} else if (type instanceof TupleType) {
final TupleType tupleType = (TupleType) type;
for (Type elementType : tupleType.elementTypes) {
hierarchyList.add(
Expand All @@ -82,7 +90,34 @@ public List<Hierarchy> getHierarchies() {
}
} else {
hierarchyList.add(
olap4jConnection.toOlap4j(type.getHierarchy()));
olap4jConnection.toOlap4j(
type.getHierarchy()));
}

// Slicer contains all dimensions not mentioned on other axes. So, if
// this is the slicer, now add to the list the default hierarchy of
// each dimension not already in the slicer or in another axes.
switch (queryAxis.getAxisOrdinal()) {
case SLICER:
Set<Dimension> dimensionSet = new HashSet<Dimension>();
for (Hierarchy hierarchy : hierarchyList) {
dimensionSet.add(hierarchy.getDimension());
}
for (CellSetAxisMetaData cellSetAxisMetaData
: cellSetMetaData.getAxesMetaData())
{
for (Hierarchy hierarchy
: cellSetAxisMetaData.getHierarchies())
{
dimensionSet.add(hierarchy.getDimension());
}
}
for (Dimension dimension
: cellSetMetaData.getCube().getDimensions()) {
if (dimensionSet.add(dimension)) {
hierarchyList.add(dimension.getDefaultHierarchy());
}
}
}
return hierarchyList;
}
Expand Down
8 changes: 3 additions & 5 deletions src/main/mondrian/olap4j/MondrianOlap4jCellSetMetaData.java
Expand Up @@ -26,7 +26,7 @@
* @since Jun 13, 2007
*/
class MondrianOlap4jCellSetMetaData implements CellSetMetaData {
private final MondrianOlap4jStatement olap4jStatement;
final MondrianOlap4jStatement olap4jStatement;
private final Query query;
private final NamedList<CellSetAxisMetaData> axesMetaData =
new ArrayNamedListImpl<CellSetAxisMetaData>() {
Expand All @@ -43,16 +43,14 @@ protected String getName(CellSetAxisMetaData axisMetaData) {
this.olap4jStatement = olap4jStatement;
this.query = query;

final MondrianOlap4jConnection olap4jConnection =
olap4jStatement.olap4jConnection;
for (final QueryAxis queryAxis : query.getAxes()) {
axesMetaData.add(
new MondrianOlap4jCellSetAxisMetaData(
olap4jConnection, queryAxis));
this, queryAxis));
}
filterAxisMetaData =
new MondrianOlap4jCellSetAxisMetaData(
olap4jConnection, query.getSlicerAxis());
this, query.getSlicerAxis());
}

// implement CellSetMetaData
Expand Down

0 comments on commit 4c88fa6

Please sign in to comment.