Skip to content

Commit

Permalink
MONDRIAN: Return calculated measures among Level.getMembers() and Hie…
Browse files Browse the repository at this point in the history
…rarchy.getRootMembers() calls. Fix olap4j driver to ensure that members of Measures dimension always implement org.olap4j.metadata.Measure interface.

[git-p4: depot-paths = "//open/mondrian/": change = 10906]
  • Loading branch information
julianhyde committed Apr 17, 2008
1 parent 2059494 commit 1fb6eff
Show file tree
Hide file tree
Showing 25 changed files with 281 additions and 166 deletions.
1 change: 1 addition & 0 deletions demo/FoodMart.xml
Expand Up @@ -315,6 +315,7 @@ Iif("sales_fact_1997"."promotion_id" = 0, 0, "sales_fact_1997"."store_sales")
formula="COALESCEEMPTY((Measures.[Profit], [Time].PREVMEMBER), Measures.[Profit])"
visible="false">
<CalculatedMemberProperty name="FORMAT_STRING" value="$#,##0.00"/>
<CalculatedMemberProperty name="MEMBER_ORDINAL" value="18"/>
</CalculatedMember>
<CalculatedMember
name="Profit Growth"
Expand Down
7 changes: 4 additions & 3 deletions src/main/mondrian/olap/MemberBase.java
Expand Up @@ -85,7 +85,7 @@ protected MemberBase(
this.flags = memberType.ordinal()
| (memberType == MemberType.ALL ? FLAG_ALL : 0)
| (memberType == MemberType.NULL ? FLAG_NULL : 0)
| (computeCalculated() ? FLAG_CALCULATED : 0)
| (computeCalculated(memberType) ? FLAG_CALCULATED : 0)
| (level.getHierarchy().getDimension().isMeasures() ? FLAG_MEASURE : 0);
}

Expand Down Expand Up @@ -229,13 +229,14 @@ public boolean isChildOrEqualTo(String uniqueName) {
* Computes the value to be returned by {@link #isCalculated()}, so it can
* be cached in a variable.
*
* @param memberType Member type
* @return Whether this member is calculated
*/
protected boolean computeCalculated() {
protected boolean computeCalculated(final MemberType memberType) {
// If the member is not created from the "with member ..." MDX, the
// calculated will be null. But it may be still a calculated measure
// stored in the cube.
return isCalculatedInQuery() || getMemberType() == MemberType.FORMULA;
return isCalculatedInQuery() || memberType == MemberType.FORMULA;
}

public int getSolveOrder() {
Expand Down
2 changes: 1 addition & 1 deletion src/main/mondrian/olap/fun/VisualTotalsFunDef.java
Expand Up @@ -207,7 +207,7 @@ private static class VisualTotalMember extends RolapMember {
this.exp = exp;
}

protected boolean computeCalculated() {
protected boolean computeCalculated(final MemberType memberType) {
return true;
}

Expand Down
6 changes: 2 additions & 4 deletions src/main/mondrian/olap4j/MondrianOlap4jCellSetAxis.java
Expand Up @@ -134,13 +134,11 @@ public MondrianOlap4jPosition(

public List<Member> getMembers() {
return new AbstractList<Member>() {

public Member get(int index) {
final mondrian.olap.Member mondrianMember =
mondrianPosition.get(index);
return new MondrianOlap4jMember(
olap4jCellSet.olap4jStatement.olap4jConnection.olap4jSchema,
mondrianMember);
return olap4jCellSet.olap4jStatement.olap4jConnection
.toOlap4j(mondrianMember);
}

public int size() {
Expand Down
8 changes: 3 additions & 5 deletions src/main/mondrian/olap4j/MondrianOlap4jConnection.java
Expand Up @@ -11,7 +11,7 @@

import mondrian.mdx.*;
import mondrian.olap.*;
import mondrian.rolap.RolapStoredMeasure;
import mondrian.rolap.RolapMeasure;
import org.olap4j.Axis;
import org.olap4j.Cell;
import org.olap4j.*;
Expand Down Expand Up @@ -416,8 +416,8 @@ MondrianOlap4jMember toOlap4j(mondrian.olap.Member member) {
if (member == null) {
return null;
}
if (member instanceof RolapStoredMeasure) {
RolapStoredMeasure measure = (RolapStoredMeasure) member;
if (member instanceof RolapMeasure) {
RolapMeasure measure = (RolapMeasure) member;
return new MondrianOlap4jMeasure(
toOlap4j(member.getDimension().getSchema()),
measure);
Expand All @@ -427,8 +427,6 @@ MondrianOlap4jMember toOlap4j(mondrian.olap.Member member) {
member);
}



MondrianOlap4jLevel toOlap4j(mondrian.olap.Level level) {
if (level == null) {
return null;
Expand Down
11 changes: 7 additions & 4 deletions src/main/mondrian/olap4j/MondrianOlap4jHierarchy.java
Expand Up @@ -12,7 +12,7 @@
import org.olap4j.metadata.*;
import org.olap4j.impl.*;

import java.util.Locale;
import java.util.*;

/**
* Implementation of {@link org.olap4j.metadata.Hierarchy}
Expand Down Expand Up @@ -74,18 +74,21 @@ public NamedList<Member> getRootMembers() {
olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection;
final mondrian.olap.Member[] levelMembers =
olap4jConnection.connection.getSchemaReader().getLevelMembers(
hierarchy.getLevels()[0], false);
hierarchy.getLevels()[0], true);

final List<mondrian.olap.Member> levelMemberList =
new ArrayList<mondrian.olap.Member>(Arrays.asList(levelMembers));
return new AbstractNamedList<Member>() {
protected String getName(Member member) {
return member.getName();
}

public Member get(int index) {
return olap4jConnection.toOlap4j(levelMembers[index]);
return olap4jConnection.toOlap4j(levelMemberList.get(index));
}

public int size() {
return levelMembers.length;
return levelMemberList.size();
}
};
}
Expand Down
12 changes: 9 additions & 3 deletions src/main/mondrian/olap4j/MondrianOlap4jMeasure.java
Expand Up @@ -9,8 +9,7 @@
package mondrian.olap4j;

import mondrian.olap.Property;
import mondrian.rolap.RolapAggregator;
import mondrian.rolap.RolapStoredMeasure;
import mondrian.rolap.*;
import org.olap4j.metadata.Datatype;
import org.olap4j.metadata.Measure;

Expand All @@ -30,12 +29,19 @@ public class MondrianOlap4jMeasure
{
MondrianOlap4jMeasure(
MondrianOlap4jSchema olap4jSchema,
RolapStoredMeasure measure)
RolapMeasure measure)
{
super(olap4jSchema, measure);
}

public String toString() {
return getUniqueName();
}

public Aggregator getAggregator() {
if (!(member instanceof RolapStoredMeasure)) {
return Aggregator.UNKNOWN;
}
final RolapAggregator aggregator =
((RolapStoredMeasure) member).getAggregator();
if (aggregator == RolapAggregator.Avg) {
Expand Down
6 changes: 5 additions & 1 deletion src/main/mondrian/olap4j/MondrianOlap4jMember.java
Expand Up @@ -18,6 +18,8 @@
import java.util.List;
import java.util.Locale;

import mondrian.rolap.RolapMeasure;

/**
* Implementation of {@link Member}
* for the Mondrian OLAP engine,
Expand All @@ -37,6 +39,8 @@ class MondrianOlap4jMember implements Member, Named {
mondrian.olap.Member mondrianMember)
{
assert mondrianMember != null;
assert mondrianMember instanceof RolapMeasure
== this instanceof MondrianOlap4jMeasure;
this.olap4jSchema = olap4jSchema;
this.member = mondrianMember;
}
Expand Down Expand Up @@ -108,7 +112,7 @@ public boolean isChildOrEqualTo(Member member) {
}

public boolean isCalculated() {
throw new UnsupportedOperationException();
return getMemberType() == Type.FORMULA;
}

public int getSolveOrder() {
Expand Down
11 changes: 9 additions & 2 deletions src/main/mondrian/rolap/MeasureMemberSource.java
Expand Up @@ -13,6 +13,8 @@

package mondrian.rolap;

import java.util.List;

/**
* A <code>MeasureMemberSource</code> implements the {@link MemberReader}
* interface for the special Measures dimension.
Expand All @@ -26,8 +28,13 @@
* @version $Id$
*/
class MeasureMemberSource extends ArrayMemberSource {
MeasureMemberSource(RolapHierarchy hierarchy, RolapMember[] members) {
super(hierarchy, members);
MeasureMemberSource(
RolapHierarchy hierarchy,
List<RolapMember> memberList)
{
super(
hierarchy,
memberList.toArray(new RolapMember[memberList.size()]));
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/mondrian/rolap/RolapBaseCubeMeasure.java
Expand Up @@ -61,7 +61,7 @@ class RolapBaseCubeMeasure extends RolapMember implements RolapStoredMeasure {
MondrianDef.Expression expression,
String aggregatorName,
String datatype) {
super(parentMember, level, name);
super(parentMember, level, name, null, MemberType.MEASURE);
this.cube = cube;
this.expression = expression;
if (formatString == null) {
Expand Down
11 changes: 7 additions & 4 deletions src/main/mondrian/rolap/RolapCalculatedMember.java
Expand Up @@ -30,9 +30,12 @@ public class RolapCalculatedMember extends RolapMember {
private final Formula formula;

RolapCalculatedMember(
RolapMember parentMember, RolapLevel level, String name,
Formula formula) {
super(parentMember, level, name);
RolapMember parentMember, RolapLevel level, String name,
Formula formula)
{
// A calculated measure has MemberType.FORMULA because FORMULA
// overrides MEASURE.
super(parentMember, level, name, null, MemberType.FORMULA);
this.formula = formula;
}

Expand All @@ -54,7 +57,7 @@ public Object getPropertyValue(String propertyName, boolean matchCase) {
}
}

protected boolean computeCalculated() {
protected boolean computeCalculated(final MemberType memberType) {
return true;
}

Expand Down

0 comments on commit 1fb6eff

Please sign in to comment.