Skip to content

Commit

Permalink
MONDRIAN: Remove various redundant copies of member unique name.
Browse files Browse the repository at this point in the history
    Remove internal property "$unique_name_without_hierarchy".
    This change improves both performance and memory usage.

[git-p4: depot-paths = "//open/mondrian-release/3.2/": change = 13534]
  • Loading branch information
julianhyde committed Apr 10, 2010
1 parent 64cbf49 commit 536d494
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 129 deletions.
46 changes: 10 additions & 36 deletions src/main/mondrian/olap/MemberBase.java
Expand Up @@ -66,8 +66,6 @@ public abstract class MemberBase
private static final int FLAG_CALCULATED = 0x40;
private static final int FLAG_MEASURE = 0x80;

protected String parentUniqueName;

/**
* Cached values of {@link mondrian.olap.Member.MemberType} enumeration.
* Without caching, get excessive calls to {@link Object#clone}.
Expand All @@ -81,9 +79,6 @@ protected MemberBase(
{
this.parentMember = parentMember;
this.level = level;
this.parentUniqueName = (parentMember == null)
? null
: parentMember.getUniqueName();
this.flags = memberType.ordinal()
| (memberType == MemberType.ALL ? FLAG_ALL : 0)
| (memberType == MemberType.NULL ? FLAG_NULL : 0)
Expand All @@ -93,12 +88,6 @@ protected MemberBase(
: 0);
}

protected MemberBase() {
this.level = null;
this.flags = 0;
this.parentUniqueName = null;
}

public String getQualifiedName() {
return MondrianResource.instance().MdxMemberName.str(getUniqueName());
}
Expand All @@ -122,16 +111,18 @@ public String getCaption() {
: getName();
}

public String getParentUniqueName() {
return parentUniqueName;
public final String getParentUniqueName() {
return parentMember == null
? null
: parentMember.getUniqueName();
}

public Dimension getDimension() {
return getLevel().getDimension();
return level.getDimension();
}

public Hierarchy getHierarchy() {
return getLevel().getHierarchy();
return level.getHierarchy();
}

public Level getLevel() {
Expand Down Expand Up @@ -177,23 +168,7 @@ public OlapElement lookupChild(

// implement Member
public Member getParentMember() {
// use the cache if possible (getAdoMember can be very expensive)
if (parentUniqueName == null) {
return null; // we are root member, which has no parent
} else if (parentMember != null) {
return parentMember;
} else {
boolean failIfNotFound = true;
final Hierarchy hierarchy = getHierarchy();
final SchemaReader schemaReader =
hierarchy.getDimension().getSchema().getSchemaReader();
List<Id.Segment> parentUniqueNameParts =
Util.parseIdentifier(parentUniqueName);
parentMember =
schemaReader.getMemberByUniqueName(
parentUniqueNameParts, failIfNotFound);
return parentMember;
}
return parentMember;
}

// implement Member
Expand Down Expand Up @@ -225,13 +200,12 @@ private static boolean isChildOrEqualTo(Member member, String uniqueName) {
// found a match
return true;
}
String parentUniqueName = member.getParentUniqueName();
if (parentUniqueName == null) {
// try candidate's parentMember
member = member.getParentMember();
if (member == null) {
// have reached root
return false;
}
// try candidate's parentMember
member = member.getParentMember();
}
}

Expand Down
12 changes: 0 additions & 12 deletions src/main/mondrian/olap/Property.java
Expand Up @@ -593,17 +593,6 @@ public enum Datatype {
"KEY", Datatype.TYPE_STRING, KEY_ORDINAL, false, true, false,
"Key.");

public static final int UNIQUE_NAME_WITHOUT_HIERARCHY_ORDINAL = 47;
/**
* Definition of the internal property which
* describes the unique name of a member minus its
* hierarchy.
*/
public static final Property UNIQUE_NAME_WITHOUT_HIERARCHY =
new Property(
"$unique_name_without_hierarchy", Datatype.TYPE_STRING,
UNIQUE_NAME_WITHOUT_HIERARCHY_ORDINAL, true, true, false, null);

public static final int SCENARIO_ORDINAL = 48;
/**
* Definition of the internal property which
Expand Down Expand Up @@ -762,7 +751,6 @@ public boolean isStandard() {
DATATYPE,
MEMBER_KEY,
KEY,
UNIQUE_NAME_WITHOUT_HIERARCHY,
SCENARIO,
DISPLAY_FOLDER,
});
Expand Down
2 changes: 1 addition & 1 deletion src/main/mondrian/rolap/CacheMemberReader.java
Expand Up @@ -152,7 +152,7 @@ public RolapMember lookupMember(
public List<RolapMember> getRootMembers() {
List<RolapMember> list = new ArrayList<RolapMember>();
for (RolapMember member : members) {
if (member.getParentUniqueName() == null) {
if (member.getParentMember() == null) {
list.add(member);
}
}
Expand Down
73 changes: 8 additions & 65 deletions src/main/mondrian/rolap/RolapCubeHierarchy.java
Expand Up @@ -550,32 +550,6 @@ public List<RolapMember> getRootMembers() {
return rootMembers;
}

private String getUniqueNameForMemberWithoutHierarchy(
RolapMember member)
{
assert member instanceof RolapMemberBase;
assert !(member instanceof RolapCubeMember);
if (false) {
return member.getUniqueName();
}
String name =
(String) member.getPropertyValue(
Property.UNIQUE_NAME_WITHOUT_HIERARCHY.getName());
RolapMember parent = member;
if (name == null) {
StringBuilder fullName = new StringBuilder();
while (parent != null) {
fullName.append("[").append(parent.getName()).append("]");
parent = parent.getParentMember();
}
name = fullName.toString();
member.setProperty(
Property.UNIQUE_NAME_WITHOUT_HIERARCHY.getName(),
name);
}
return name;
}

protected void readMemberChildren(
List<RolapMember> parentMembers,
List<RolapMember> children,
Expand All @@ -593,11 +567,9 @@ protected void readMemberChildren(
continue;
}
final RolapCubeMember cubeMember = (RolapCubeMember) member;
lookup.put(
getUniqueNameForMemberWithoutHierarchy(
cubeMember.getRolapMember()),
cubeMember);
rolapParents.add(cubeMember.getRolapMember());
final RolapMember rolapMember = cubeMember.getRolapMember();
lookup.put(rolapMember.getUniqueName(), cubeMember);
rolapParents.add(rolapMember);
}

// get member children from shared member reader if possible,
Expand All @@ -616,8 +588,7 @@ protected void readMemberChildren(
for (RolapMember currMember : rolapChildren) {
RolapCubeMember parent =
lookup.get(
getUniqueNameForMemberWithoutHierarchy(
currMember.getParentMember()));
currMember.getParentMember().getUniqueName());
RolapCubeLevel level =
parent.getLevel().getChildLevel();
if (level == null) {
Expand Down Expand Up @@ -912,32 +883,6 @@ public List<RolapMember> getRootMembers() {
return getMembersInLevel(cubeLevels[0], 0, Integer.MAX_VALUE);
}

private String getUniqueNameForMemberWithoutHierarchy(
RolapMember member)
{
assert member instanceof RolapMemberBase;
assert !(member instanceof RolapCubeMember);
if (false) {
return member.getUniqueName();
}
String name =
(String) member.getPropertyValue(
Property.UNIQUE_NAME_WITHOUT_HIERARCHY.getName());
RolapMember parent = member;
if (name == null) {
StringBuilder fullName = new StringBuilder();
while (parent != null) {
fullName.append("[").append(parent.getName()).append("]");
parent = parent.getParentMember();
}
name = fullName.toString();
member.setProperty(
Property.UNIQUE_NAME_WITHOUT_HIERARCHY.getName(),
name);
}
return name;
}

protected void readMemberChildren(
List<RolapMember> parentMembers,
List<RolapMember> children,
Expand All @@ -953,10 +898,9 @@ protected void readMemberChildren(
final List<RolapCubeMember> parentRolapCubeMemberList =
Util.cast(parentMembers);
for (RolapCubeMember member : parentRolapCubeMemberList) {
lookup.put(
getUniqueNameForMemberWithoutHierarchy(
member.getRolapMember()), member);
rolapParents.add(member.getRolapMember());
final RolapMember rolapMember = member.getRolapMember();
lookup.put(rolapMember.getUniqueName(), member);
rolapParents.add(rolapMember);
}

// get member children from shared member reader if possible,
Expand All @@ -975,8 +919,7 @@ protected void readMemberChildren(
for (RolapMember currMember : rolapChildren) {
RolapCubeMember parent =
lookup.get(
getUniqueNameForMemberWithoutHierarchy(
currMember.getParentMember()));
currMember.getParentMember().getUniqueName());
RolapCubeLevel level =
parent.getLevel().getChildLevel();
if (level == null) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/mondrian/rolap/RolapCubeMember.java
Expand Up @@ -70,7 +70,7 @@ public String getUniqueName() {
*
* @return Underlying member
*/
public RolapMember getRolapMember() {
public final RolapMember getRolapMember() {
return member;
}

Expand Down
12 changes: 1 addition & 11 deletions src/main/mondrian/rolap/RolapMemberBase.java
Expand Up @@ -61,7 +61,6 @@ void setParentMember(RolapMember parentMember) {
"new parent belongs to different level than old");
}
this.parentMember = parentMember;
this.parentUniqueName = parentMember.getUniqueName();
}

/** Ordinal of the member within the hierarchy. Some member readers do not
Expand Down Expand Up @@ -124,15 +123,6 @@ protected RolapMemberBase(
this(parentMember, level, value, null, MemberType.REGULAR);
}

/**
* Used by RolapCubeMember. Can obsolete when RolapMember becomes a
* hierarchy.
*/
protected RolapMemberBase() {
super();
this.key = null;
}

protected Logger getLogger() {
return LOGGER;
}
Expand All @@ -142,7 +132,7 @@ public RolapLevel getLevel() {
}

public RolapHierarchy getHierarchy() {
return getLevel().getHierarchy();
return (RolapHierarchy) level.getHierarchy();
}

public RolapMember getParentMember() {
Expand Down
7 changes: 4 additions & 3 deletions src/main/mondrian/xmla/RowsetDefinition.java
Expand Up @@ -6129,9 +6129,10 @@ private void outputMember(
row.set(ParentLevel.name, 0);
} else {
row.set(ParentLevel.name, adjustedLevelDepth - 1);
String parentUniqueName = member.getParentUniqueName();
if (parentUniqueName != null) {
row.set(ParentUniqueName.name, parentUniqueName);
final Member parentMember = member.getParentMember();
if (parentMember != null) {
row.set(
ParentUniqueName.name, parentMember.getUniqueName());
}
}

Expand Down

0 comments on commit 536d494

Please sign in to comment.