Skip to content

Commit

Permalink
MONDRIAN: improve SQL generation for member constraints by coalescing…
Browse files Browse the repository at this point in the history
… members of the same unique parent.

[git-p4: depot-paths = "//open/mondrian/": change = 9654]
  • Loading branch information
Rushan Chen committed Jul 25, 2007
1 parent f6a840c commit caf84cc
Show file tree
Hide file tree
Showing 6 changed files with 532 additions and 222 deletions.
30 changes: 15 additions & 15 deletions src/main/mondrian/rolap/RolapNativeSet.java
Expand Up @@ -392,17 +392,17 @@ public void addConstraint(
protected static class MemberListCrossJoinArg implements CrossJoinArg {
private RolapMember[] members;
private RolapLevel level = null;
private boolean strict;
private boolean restrictMemberTypes;
private boolean hasCalcMembers;
private boolean hasNonCalcMembers;
private boolean hasAllMember;

private MemberListCrossJoinArg(
RolapLevel level, RolapMember[] members, boolean strict,
RolapLevel level, RolapMember[] members, boolean restrictMemberTypes,
boolean hasCalcMembers, boolean hasNonCalcMembers, boolean hasAllMember) {
this.level = level;
this.members = members;
this.strict = strict;
this.restrictMemberTypes = restrictMemberTypes;
this.hasCalcMembers = hasCalcMembers;
this.hasNonCalcMembers = hasNonCalcMembers;
this.hasAllMember = hasAllMember;
Expand All @@ -412,11 +412,11 @@ private MemberListCrossJoinArg(
* Creates an instance of {@link RolapNativeSet.CrossJoinArg}.
*
* @param args members in the list
* @param strict whether calculated members are allowed
* @param restrictMemberTypes whether calculated members are allowed
* @return MemberListCrossJoinArg if member list is well formed,
* NULL if not.
*/
static CrossJoinArg create(Exp[] args, boolean strict) {
static CrossJoinArg create(Exp[] args, boolean restrictMemberTypes) {
if (args.length == 0) {
return null;
}
Expand All @@ -430,18 +430,18 @@ static CrossJoinArg create(Exp[] args, boolean strict) {
(RolapMember)(((MemberExpr)args[i]).getMember());
}

return create(memberList, strict);
return create(memberList, restrictMemberTypes);
}

/**
* Creates an instance of {@link RolapNativeSet.CrossJoinArg}.
*
* @param args members in the list
* @param strict whether calculated members are allowed
* @param restrictMemberTypes whether calculated members are allowed
* @return MemberListCrossJoinArg if member list is well formed,
* NULL if not.
*/
static CrossJoinArg create(List args, boolean strict) {
static CrossJoinArg create(List args, boolean restrictMemberTypes) {
if (args.isEmpty()) {
return null;
}
Expand All @@ -454,7 +454,7 @@ static CrossJoinArg create(List args, boolean strict) {
memberList[i] = (RolapMember) args.get(i);
}

return create(memberList, strict);
return create(memberList, restrictMemberTypes);
}

/**
Expand All @@ -473,7 +473,7 @@ static CrossJoinArg create(List args, boolean strict) {
* members are presented (and then it's flagged appropriately
* for special handling downstream).
*/
static CrossJoinArg create(RolapMember[] args, boolean strict) {
static CrossJoinArg create(RolapMember[] args, boolean restrictMemberTypes) {

RolapLevel level = null;
RolapLevel nullLevel = null;
Expand Down Expand Up @@ -517,7 +517,7 @@ static CrossJoinArg create(RolapMember[] args, boolean strict) {
}

if (m.isCalculated()) {
if (strict) {
if (restrictMemberTypes) {
return null;
}
hasCalcMembers = true;
Expand Down Expand Up @@ -556,7 +556,7 @@ static CrossJoinArg create(RolapMember[] args, boolean strict) {
}

return new MemberListCrossJoinArg(
level, members, strict,
level, members, restrictMemberTypes,
hasCalcMembers, hasNonCalcMembers, hasAllMember);
}

Expand Down Expand Up @@ -593,7 +593,7 @@ public int hashCode() {
for (RolapMember member : members) {
c = 31 * c + member.hashCode();
}
if (strict) {
if (restrictMemberTypes) {
c += 1;
}
return c;
Expand All @@ -604,7 +604,7 @@ public boolean equals(Object obj) {
return false;
}
MemberListCrossJoinArg that = (MemberListCrossJoinArg) obj;
if (this.strict != that.strict) {
if (this.restrictMemberTypes != that.restrictMemberTypes) {
return false;
}
for (int i = 0; i < members.length; i++) {
Expand All @@ -621,7 +621,7 @@ public void addConstraint(
Map<String, RolapStar.Table> relationNamesToStarTableMap) {
SqlConstraintUtils.addMemberConstraint(
sqlQuery, levelToColumnMap, relationNamesToStarTableMap, null,
Arrays.asList(members), strict, true);
Arrays.asList(members), restrictMemberTypes, true);
}
}

Expand Down

0 comments on commit caf84cc

Please sign in to comment.