Skip to content

Commit

Permalink
MONDRIAN: Support named sets and calculated members in cubes which re…
Browse files Browse the repository at this point in the history
…fer to each other. Fixes bug 1255595: "Named sets cannot be referenced from calculated members".

[git-p4: depot-paths = "//open/mondrian/": change = 4075]
  • Loading branch information
julianhyde committed Sep 9, 2005
1 parent 6c3cf82 commit 741b8f3
Show file tree
Hide file tree
Showing 4 changed files with 345 additions and 213 deletions.
29 changes: 18 additions & 11 deletions src/main/mondrian/olap/Query.java
Expand Up @@ -761,7 +761,8 @@ private class StackValidator implements Validator {
private final Stack stack = new Stack();
private final FunTable funTable;
private boolean haveCollectedParameters;
private java.util.Set resolvedNodes = new HashSet();
private final Map resolvedNodes = new HashMap();
private final Object placeHolder = "dummy";

/**
* Creates a StackValidator.
Expand All @@ -778,17 +779,21 @@ public Query getQuery() {
}

public Exp validate(Exp exp, boolean scalar) {
if (!resolvedNodes.add(exp)) {
Exp resolved = (Exp) resolvedNodes.get(exp);
if (resolved != null) {
// Expression has already been resolved.
return scalar ? convertToScalar(exp) : exp;
return scalar ? convertToScalar(resolved) : resolved;
}
stack.push(exp);
try {
Exp resolved = exp.accept(this);
// Put in a placeholder while we're resolving to prevent
// recursion.
resolvedNodes.put(exp, placeHolder);
resolved = exp.accept(this);
if (scalar) {
resolved = convertToScalar(resolved);
}
resolvedNodes.add(resolved);
resolvedNodes.put(exp, resolved);
return resolved;
} finally {
stack.pop();
Expand All @@ -800,21 +805,23 @@ private Exp convertToScalar(Exp exp) {
}

public Parameter validate(Parameter parameter) {
if (!resolvedNodes.add(parameter)) {
Parameter resolved = (Parameter) resolvedNodes.get(parameter);
if (resolved != null) {
return parameter; // already resolved
}
stack.push(parameter);
try {
final Parameter resolved = (Parameter) parameter.accept(this);
resolvedNodes.add(resolved);
resolvedNodes.put(parameter, placeHolder);
resolved = (Parameter) parameter.accept(this);
resolvedNodes.put(parameter, resolved);
return resolved;
} finally {
stack.pop();
}
}

public void validate(MemberProperty memberProperty) {
if (!resolvedNodes.add(memberProperty)) {
if (resolvedNodes.put(memberProperty, placeHolder) != null) {
return; // already resolved
}
stack.push(memberProperty);
Expand All @@ -826,7 +833,7 @@ public void validate(MemberProperty memberProperty) {
}

public void validate(QueryAxis axis) {
if (!resolvedNodes.add(axis)) {
if (resolvedNodes.put(axis, placeHolder) != null) {
return; // already resolved
}
stack.push(axis);
Expand All @@ -838,7 +845,7 @@ public void validate(QueryAxis axis) {
}

public void validate(Formula formula) {
if (!resolvedNodes.add(formula)) {
if (resolvedNodes.put(formula, placeHolder) != null) {
return; // already resolved
}
stack.push(formula);
Expand Down

0 comments on commit 741b8f3

Please sign in to comment.