Skip to content

Commit

Permalink
MONDRIAN: Don't filter on non-conforming dimensions if the dimension …
Browse files Browse the repository at this point in the history
…has no 'all' member and the current member of the dimension is the default. Fixes bug 1534584, "Non-All default member behavior".

	Also, give every hierarchy an 'all' member (even if that member is not visible through MDX), and allocate that member when the hierarchy is initialized (the member reader creates the 'all' member at present).

[git-p4: depot-paths = "//open/mondrian/": change = 7520]
  • Loading branch information
julianhyde committed Sep 1, 2006
1 parent b0fb1e7 commit 4aa4a8f
Show file tree
Hide file tree
Showing 8 changed files with 124 additions and 188 deletions.
49 changes: 0 additions & 49 deletions src/main/mondrian/rolap/ArrayMemberSource.java
Expand Up @@ -12,14 +12,11 @@
*/

package mondrian.rolap;
import mondrian.olap.Member;
import mondrian.olap.Util;
import mondrian.resource.MondrianResource;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;

/**
* <code>ArrayMemberSource</code> implements a flat, static hierarchy. There is
Expand Down Expand Up @@ -76,50 +73,4 @@ public RolapMember lookupMember(String[] uniqueNameParts,
}
}

/*
class HasBoughtDairySource extends ArrayMemberSource
{
public HasBoughtDairySource(RolapHierarchy hierarchy, Properties properties)
{
super(hierarchy, new Thunk(hierarchy).getMembers());
Util.discard(properties);
}
///
//Because Java won't allow us to call methods before constructing {@link
//HasBoughtDairyReader}'s base class.
///
private static class Thunk
{
RolapHierarchy hierarchy;
Thunk(RolapHierarchy hierarchy)
{
this.hierarchy = hierarchy;
}
RolapMember[] getMembers()
{
String[] values = new String[] {"False", "True"};
List list = new ArrayList();
int ordinal = 0;
RolapMember root = null;
RolapLevel level = (RolapLevel) hierarchy.getLevels()[0];
if (hierarchy.hasAll()) {
root = new RolapMember(null, level, null,
hierarchy.getAllMemberName(), Member.ALL_MEMBER_TYPE);
root.setOrdinal(ordinal++);
list.add(root);
level = (RolapLevel) hierarchy.getLevels()[1];
}
for (int i = 0; i < values.length; i++) {
RolapMember member = new RolapMember(root, level, values[i]);
member.setOrdinal(ordinal++);
list.add(member);
}
return (RolapMember[]) list.toArray(RolapUtil.emptyMemberArray);
}
}
}
*/

// End ArrayMemberSource.java
34 changes: 0 additions & 34 deletions src/main/mondrian/rolap/BrandingMemberReader.java

This file was deleted.

61 changes: 45 additions & 16 deletions src/main/mondrian/rolap/RolapHierarchy.java
Expand Up @@ -79,17 +79,23 @@ class RolapHierarchy extends HierarchyBase {
*/
private final RolapLevel nullLevel;

/**
* The 'all' member of this hierarchy. This exists even if the hierarchy
* does not officially have an 'all' member.
*/
private RolapMember allMember;

RolapHierarchy(RolapDimension dimension, String subName, boolean hasAll) {
super(dimension, subName, hasAll);

this.levels = new RolapLevel[0];
setCaption(dimension.getCaption());

this.allLevelName = "(All)";
this.allMemberName = "All " + name + "s";
if (hasAll) {
this.allLevelName = "(All)";
Util.discard(newLevel(this.allLevelName,
RolapLevel.ALL | RolapLevel.UNIQUE));
this.allMemberName = "All " + name + "s";
RolapLevel.ALL | RolapLevel.UNIQUE));
}

// The null member belongs to a level with very similar properties to
Expand Down Expand Up @@ -125,20 +131,34 @@ class RolapHierarchy extends HierarchyBase {
(MondrianDef.InlineTable) xmlHierarchy.relation);
}
this.memberReaderClass = xmlHierarchy.memberReaderClass;

// Create an 'all' level even if the hierarchy does not officially
// have one.
if (xmlHierarchy.allMemberName != null) {
this.allMemberName = xmlHierarchy.allMemberName;
}
if (xmlHierarchy.allLevelName != null) {
this.allLevelName = xmlHierarchy.allLevelName;
}
RolapLevel allLevel = new RolapLevel(
this, 0, this.allLevelName, null, null, null, null, null, null,
null, RolapProperty.emptyArray,
RolapLevel.ALL | RolapLevel.UNIQUE,
RolapLevel.HideMemberCondition.Never,
LevelType.Regular);
this.allMember = new RolapMember(
null, allLevel, null, allMemberName, Member.ALL_MEMBER_TYPE);
// assign "all member" caption
if (xmlHierarchy.allMemberCaption != null &&
xmlHierarchy.allMemberCaption.length() > 0) {
this.allMember.setCaption(xmlHierarchy.allMemberCaption);
}
this.allMember.setOrdinal(0);

// If the hierarchy has an 'all' member, the 'all' level is level 0.
if (hasAll) {
if (xmlHierarchy.allMemberName != null) {
this.allMemberName = xmlHierarchy.allMemberName;
}
if (xmlHierarchy.allLevelName != null) {
this.allLevelName = xmlHierarchy.allLevelName;
}
this.levels = new RolapLevel[xmlHierarchy.levels.length + 1];
this.levels[0] = new RolapLevel(
this, 0, this.allLevelName, null, null, null, null, null, null,
null, RolapProperty.emptyArray,
RolapLevel.ALL | RolapLevel.UNIQUE,
RolapLevel.HideMemberCondition.Never,
LevelType.Regular);
this.levels[0] = allLevel;
for (int i = 0; i < xmlHierarchy.levels.length; i++) {
final MondrianDef.Level xmlLevel = xmlHierarchy.levels[i];
if (xmlLevel.getKeyExp() == null &&
Expand Down Expand Up @@ -166,7 +186,8 @@ class RolapHierarchy extends HierarchyBase {
}
if (xmlHierarchy.relation != null &&
xmlHierarchy.memberReaderClass != null) {
throw MondrianResource.instance().HierarchyMustNotHaveMoreThanOneSource.ex(getUniqueName());
throw MondrianResource.instance().
HierarchyMustNotHaveMoreThanOneSource.ex(getUniqueName());
}
this.primaryKey = xmlHierarchy.primaryKey;
if (!Util.isEmpty(xmlHierarchy.caption)) {
Expand Down Expand Up @@ -363,6 +384,13 @@ public Member getNullMember() {
return nullMember;
}

/**
* Returns the 'all' member.
*/
public RolapMember getAllMember() {
return allMember;
}

public Member createMember(
Member parent,
Level level,
Expand Down Expand Up @@ -590,6 +618,7 @@ RolapDimension createClosedPeerDimension(
// Create a peer hierarchy.
RolapHierarchy peerHier = peerDimension.newHierarchy(subName, true);
peerHier.allMemberName = allMemberName;
peerHier.allMember = allMember;
peerHier.allLevelName = allLevelName;
peerHier.sharedHierarchyName = sharedHierarchyName;
peerHier.primaryKey = primaryKey;
Expand Down
7 changes: 6 additions & 1 deletion src/main/mondrian/rolap/RolapLevel.java
Expand Up @@ -509,7 +509,12 @@ public boolean constrainRequest(
if (column == null) {
// This hierarchy is not one which qualifies the starMeasure
// (this happens in virtual cubes). The starMeasure only has
// a value for the 'all' member of the hierarchy.
// a value for the 'all' member of the hierarchy (or for the
// default member if the hierarchy has no 'all' member)
if (member == hierarchy.getDefaultMember() &&
!hierarchy.hasAll()) {
return false;
}
return true;
}

Expand Down
52 changes: 8 additions & 44 deletions src/main/mondrian/rolap/SqlMemberSource.java
Expand Up @@ -307,18 +307,7 @@ private RolapMember[] getMembers(Connection jdbcConnection) {
Map map = new HashMap();
RolapMember root = null;
if (hierarchy.hasAll()) {
root = new RolapMember(null,
(RolapLevel) hierarchy.getLevels()[0],
null,
hierarchy.getAllMemberName(),
Member.ALL_MEMBER_TYPE);
// assign "all member" caption
if (hierarchy.xmlHierarchy != null &&
hierarchy.xmlHierarchy.allMemberCaption != null &&
hierarchy.xmlHierarchy.allMemberCaption.length() > 0)
root.setCaption(hierarchy.xmlHierarchy.allMemberCaption );

root.setOrdinal(lastOrdinal++);
root = hierarchy.getAllMember();
list.add(root);
}

Expand Down Expand Up @@ -449,29 +438,13 @@ public List getMembersInLevel(
return getMembersInLevel(level, startOrdinal, endOrdinal, constraint);
}

public List getMembersInLevel(RolapLevel level,
public List getMembersInLevel(
RolapLevel level,
int startOrdinal,
int endOrdinal,
TupleConstraint constraint) {
if (level.isAll()) {
final String allMemberName = hierarchy.getAllMemberName();
Object key = cache.makeKey(null, allMemberName);
RolapMember root = cache.getMember(key);
if (root == null) {
root = new RolapMember(null, level, null, allMemberName,
Member.ALL_MEMBER_TYPE);
root.setOrdinal(lastOrdinal++);
cache.putMember(key, root);
if (hierarchy.xmlHierarchy != null &&
hierarchy.xmlHierarchy.allMemberCaption != null &&
hierarchy.xmlHierarchy.allMemberCaption.length() > 0) {
root.setCaption(hierarchy.xmlHierarchy.allMemberCaption );
}

}
List list = new ArrayList(1);
list.add(root);
return list;
return Collections.singletonList(hierarchy.getAllMember());
}
Connection jdbcConnection;
try {
Expand All @@ -491,24 +464,15 @@ public List getMembersInLevel(RolapLevel level,
}
}

private List getMembersInLevel(RolapLevel level,
Connection jdbcConnection,
TupleConstraint constraint) {
private List getMembersInLevel(
RolapLevel level,
Connection jdbcConnection,
TupleConstraint constraint) {
TupleReader tupleReader = new SqlTupleReader(constraint);
tupleReader.addLevelMembers(level, this, null);
return tupleReader.readTuples(jdbcConnection, null, null);
}

public RolapMember getAllMember() {
RolapMember allMember = null;
if (hierarchy.hasAll()) {
final List rootMembers = getRootMembers();
Util.assertTrue(rootMembers.size() == 1);
allMember = (RolapMember) rootMembers.get(0);
}
return allMember;
}

public MemberCache getMemberCache() {
return cache;
}
Expand Down
8 changes: 2 additions & 6 deletions src/main/mondrian/rolap/SqlTupleReader.java
Expand Up @@ -71,11 +71,9 @@ public class SqlTupleReader implements TupleReader {
*/
private class Target {
final RolapLevel level;
final RolapMember allMember;
final MemberCache cache;

RolapLevel[] levels;
RolapHierarchy hierarchy;
List list;
int levelDepth;
boolean parentChild;
Expand All @@ -93,15 +91,13 @@ public Target(
RolapLevel level, MemberBuilder memberBuilder,
RolapMember[] srcMembers) {
this.level = level;
this.allMember = memberBuilder.getAllMember();
this.cache = memberBuilder.getMemberCache();
this.memberBuilder = memberBuilder;
this.srcMembers = srcMembers;
}

public void open() {
hierarchy = (RolapHierarchy) level.getHierarchy();
levels = (RolapLevel[]) hierarchy.getLevels();
levels = (RolapLevel[]) level.getHierarchy().getLevels();
list = new ArrayList();
levelDepth = level.getDepth();
parentChild = level.isParentChild();
Expand Down Expand Up @@ -135,7 +131,7 @@ private int internalAddRow(ResultSet resultSet, int column) throws SQLException
for (int i = 0; i <= levelDepth; i++) {
RolapLevel childLevel = levels[i];
if (childLevel.isAll()) {
member = allMember;
member = ((RolapHierarchy) level.getHierarchy()).getAllMember();
continue;
}
Object value = resultSet.getObject(++column);
Expand Down

0 comments on commit 4aa4a8f

Please sign in to comment.