Skip to content

Commit

Permalink
MONDRIAN: Get solve_order working.
Browse files Browse the repository at this point in the history
[git-p4: depot-paths = "//open/mondrian/": change = 3253]
  • Loading branch information
ebb committed Feb 24, 2005
1 parent f56d5a0 commit adf45d4
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 17 deletions.
16 changes: 15 additions & 1 deletion src/main/mondrian/olap/Formula.java
Expand Up @@ -243,7 +243,7 @@ public Exp getExpression() {
return exp;
}

Exp getMemberProperty(String name) {
private Exp getMemberProperty(String name) {
return MemberProperty.get(memberProperties, name);
}

Expand All @@ -257,6 +257,20 @@ public Member getMdxMember() {
return mdxMember;
}

/**
* Returns the solve order. (Not valid if this formula defines a set.)
*
* @pre isMember()
* @post return != null
*/
public int getSolveOrder() {
Exp exp = getMemberProperty(Property.PROPERTY_SOLVE_ORDER);
if (exp != null && exp.getType() == Category.Numeric)
return ((Literal)exp).getIntValue();
else
return 0;
}

/**
* Deduces a formatting expression for this calculated member. First it
* looks for properties called "format", "format_string", etc. Then it looks
Expand Down
2 changes: 2 additions & 0 deletions src/main/mondrian/olap/Property.java
Expand Up @@ -48,6 +48,8 @@ public abstract class Property {
public static final String PROPERTY_FORMATTED_VALUE = "FORMATTED_VALUE";
/** Cell property for XML/A. */
public static final String PROPERTY_FORMAT_STRING = "FORMAT_STRING";
/** Calculated member property */
public static final String PROPERTY_SOLVE_ORDER = "SOLVE_ORDER";
/**
* Name of the system property which determines whether to show a member
* (especially a measure or calculated member) in a user interface such as
Expand Down
2 changes: 1 addition & 1 deletion src/main/mondrian/rolap/RolapCalculatedMember.java
Expand Up @@ -38,7 +38,7 @@ class RolapCalculatedMember extends RolapMember {

// override RolapMember
int getSolveOrder() {
return 0;
return formula.getSolveOrder();
}

public Object getPropertyValue(String name) {
Expand Down
30 changes: 15 additions & 15 deletions src/main/mondrian/rolap/RolapEvaluator.java
Expand Up @@ -152,42 +152,42 @@ public Member getContext(Dimension dimension)
}
public Object evaluateCurrent()
{
RolapMember minSolveMember = getMinSolveMember();
if (minSolveMember != null) {
RolapMember maxSolveMember = getMaxSolveMember();
if (maxSolveMember != null) {
// There is at least one calculated member. Expand the first one
// with the lowest solve order.
// with the highest solve order.
RolapMember defaultMember = (RolapMember)
minSolveMember.getHierarchy().getDefaultMember();
maxSolveMember.getHierarchy().getDefaultMember();
Util.assertTrue(
defaultMember != minSolveMember,
defaultMember != maxSolveMember,
"default member must not be calculated");
RolapEvaluator evaluator = (RolapEvaluator) push(defaultMember);
evaluator.setExpanding(minSolveMember);
evaluator.setExpanding(maxSolveMember);
//((RolapEvaluator) evaluator).cellReader = new CachingCellReader(cellReader);
return minSolveMember.getExpression().evaluateScalar(evaluator);
return maxSolveMember.getExpression().evaluateScalar(evaluator);
}
return cellReader.get(this);
}

/**
* Returns the member in the current context which is (a) calculated, and
* (b) has the lowest solve order; returns null if there are no calculated
* (b) has the highest solve order; returns null if there are no calculated
* members.
*/
private RolapMember getMinSolveMember() {
int minSolve = Integer.MAX_VALUE;
RolapMember minSolveMember = null;
private RolapMember getMaxSolveMember() {
int maxSolve = Integer.MIN_VALUE;
RolapMember maxSolveMember = null;
for (int i = 0, count = currentMembers.length; i < count; i++) {
final RolapMember currentMember = currentMembers[i];
if (currentMember.isCalculated()) {
int solve = currentMember.getSolveOrder();
if (solve < minSolve) {
minSolve = solve;
minSolveMember = currentMember;
if (solve > maxSolve) {
maxSolve = solve;
maxSolveMember = currentMember;
}
}
}
return minSolveMember;
return maxSolveMember;
}

private void setExpanding(Member member)
Expand Down
39 changes: 39 additions & 0 deletions testsrc/main/mondrian/test/BasicQueryTest.java
Expand Up @@ -751,6 +751,45 @@ public void testSolveOrder() {
"Row #3: 60.07%" + nl);
}

public void testSolveOrderNonMeasure() {
runQueryCheckResult(
"WITH" + nl +
" MEMBER [Product].[ProdCalc] as '1', SOLVE_ORDER=1" + nl +
" MEMBER [Measures].[MeasuresCalc] as '2', SOLVE_ORDER=2" + nl +
" MEMBER [Time].[TimeCalc] as '3', SOLVE_ORDER=3" + nl +
"SELECT" + nl +
" { [Product].[ProdCalc] } ON columns," + nl +
" {( [Time].[TimeCalc], [Measures].[MeasuresCalc] )} ON rows" + nl +
"FROM Sales",

"Axis #0:" + nl +
"{}" + nl +
"Axis #1:" + nl +
"{[Product].[ProdCalc]}" + nl +
"Axis #2:" + nl +
"{[Time].[TimeCalc], [Measures].[MeasuresCalc]}" + nl +
"Row #0: 3" + nl);
}

public void testSolveOrderNonMeasure2() {
runQueryCheckResult(
"WITH" + nl +
" MEMBER [Store].[StoreCalc] as '0', SOLVE_ORDER=0" + nl +
" MEMBER [Product].[ProdCalc] as '1', SOLVE_ORDER=1" + nl +
"SELECT" + nl +
" { [Product].[ProdCalc] } ON columns," + nl +
" { [Store].[StoreCalc] } ON rows" + nl +
"FROM Sales",

"Axis #0:" + nl +
"{}" + nl +
"Axis #1:" + nl +
"{[Product].[ProdCalc]}" + nl +
"Axis #2:" + nl +
"{[Store].[StoreCalc]}" + nl +
"Row #0: 1" + nl);
}

public void testCalculatedMemberWhichIsNotAMeasure() {
String query = "WITH MEMBER [Product].[BigSeller] AS" + nl +
" 'IIf([Product].[Drink].[Alcoholic Beverages].[Beer and Wine] > 100, \"Yes\",\"No\")'" + nl +
Expand Down

0 comments on commit adf45d4

Please sign in to comment.