Skip to content

Commit

Permalink
MONDRIAN: Add anotations to VirtualCubeMeasure (MONDRIAN-667).
Browse files Browse the repository at this point in the history
    Fix annotations test for Ssas2005Compatability=true.

[git-p4: depot-paths = "//open/mondrian-release/3.1/": change = 13260]
  • Loading branch information
julianhyde committed Dec 22, 2009
1 parent 75759a2 commit 7afe046
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 10 deletions.
3 changes: 3 additions & 0 deletions src/main/mondrian/olap/Mondrian.xml
Expand Up @@ -375,6 +375,9 @@ Revision is $Id$
Default true.
</Doc>
</Attribute>
<Object name="annotations" type="Annotations" required="false">
<Doc>Contains values of user-defined properties.</Doc>
</Object>
</Element>

<!-- DimensionUsage =================================================== -->
Expand Down
7 changes: 5 additions & 2 deletions src/main/mondrian/rolap/RolapCube.java
Expand Up @@ -507,7 +507,9 @@ static CellFormatter getCellFormatter(
new RolapVirtualCubeMeasure(
null,
measuresLevel,
(RolapStoredMeasure) cubeMeasure);
(RolapStoredMeasure) cubeMeasure,
RolapHierarchy.createAnnotationMap(
xmlMeasure.annotations));

// Set member's visibility, default true.
Boolean visible = xmlMeasure.visible;
Expand Down Expand Up @@ -2829,7 +2831,8 @@ public Object visit(MemberExpr memberExpr)
new RolapVirtualCubeMeasure(
null,
measuresLevel,
baseMeasure);
baseMeasure,
Collections.<String, Annotation>emptyMap());
if (!measuresFound.contains(virtualCubeMeasure)) {
measuresFound.add(virtualCubeMeasure);
}
Expand Down
14 changes: 11 additions & 3 deletions src/main/mondrian/rolap/RolapVirtualCubeMeasure.java
Expand Up @@ -9,8 +9,9 @@
*/
package mondrian.rolap;

import mondrian.olap.MondrianDef;
import mondrian.olap.CellFormatter;
import mondrian.olap.*;

import java.util.Map;

/**
* Measure which is defined in a virtual cube, and based on a stored measure
Expand All @@ -28,14 +29,17 @@ public class RolapVirtualCubeMeasure
* The measure in the underlying cube.
*/
private final RolapStoredMeasure cubeMeasure;
private final Map<String, Annotation> annotationMap;

public RolapVirtualCubeMeasure(
RolapMember parentMember,
RolapLevel level,
RolapStoredMeasure cubeMeasure)
RolapStoredMeasure cubeMeasure,
Map<String, Annotation> annotationMap)
{
super(parentMember, level, cubeMeasure.getName());
this.cubeMeasure = cubeMeasure;
this.annotationMap = annotationMap;
}

public Object getPropertyValue(String propertyName, boolean matchCase) {
Expand Down Expand Up @@ -69,6 +73,10 @@ public RolapAggregator getAggregator() {
public CellFormatter getFormatter() {
return cubeMeasure.getFormatter();
}

public Map<String, Annotation> getAnnotationMap() {
return annotationMap;
}
}

// End RolapVirtualCubeMeasure.java
89 changes: 84 additions & 5 deletions testsrc/main/mondrian/test/SchemaTest.java
Expand Up @@ -2586,7 +2586,9 @@ public void testBugMondrian355() {
*/
public void testCaptionDescriptionAndAnnotation() {
final String schemaName = "Description schema";
final String cubeName = "DescSales";
final String salesCubeName = "DescSales";
final String virtualCubeName = "DescWarehouseAndSales";
final String warehouseCubeName = "Warehouse";
final TestContext testContext = TestContext.create(
"<Schema name=\"" + schemaName + "\"\n"
+ " description=\"Schema to test descriptions and captions\">\n"
Expand All @@ -2610,7 +2612,17 @@ public void testCaptionDescriptionAndAnnotation() {
+ " levelType=\"TimeMonths\"/>\n"
+ " </Hierarchy>\n"
+ " </Dimension>\n"
+ " <Cube name=\"" + cubeName + "\"\n"
+ " <Dimension name=\"Warehouse\">\n"
+ " <Hierarchy hasAll=\"true\" primaryKey=\"warehouse_id\">\n"
+ " <Table name=\"warehouse\"/>\n"
+ " <Level name=\"Country\" column=\"warehouse_country\" uniqueMembers=\"true\"/>\n"
+ " <Level name=\"State Province\" column=\"warehouse_state_province\"\n"
+ " uniqueMembers=\"true\"/>\n"
+ " <Level name=\"City\" column=\"warehouse_city\" uniqueMembers=\"false\"/>\n"
+ " <Level name=\"Warehouse Name\" column=\"warehouse_name\" uniqueMembers=\"true\"/>\n"
+ " </Hierarchy>\n"
+ " </Dimension>\n"
+ " <Cube name=\"" + salesCubeName + "\"\n"
+ " description=\"Cube description\">\n"
+ " <Annotations><Annotation name=\"a\">Cube</Annotation></Annotations>\n"
+ " <Table name=\"sales_fact_1997\"/>\n"
Expand Down Expand Up @@ -2666,9 +2678,34 @@ public void testCaptionDescriptionAndAnnotation() {
+ " <Formula>TopCount([Time1].MEMBERS, 5, [Measures].[Foo])</Formula>\n"
+ " </NamedSet>\n"
+ "</Cube>\n"
+ "<Cube name=\"" + warehouseCubeName + "\">\n"
+ " <Table name=\"inventory_fact_1997\"/>\n"
+ "\n"
+ " <DimensionUsage name=\"Time\" source=\"Time\" foreignKey=\"time_id\"/>\n"
+ " <DimensionUsage name=\"Warehouse\" source=\"Warehouse\" foreignKey=\"warehouse_id\"/>\n"
+ "\n"
+ " <Measure name=\"Units Shipped\" column=\"units_shipped\" aggregator=\"sum\" formatString=\"#.0\"/>\n"
+ "</Cube>\n"
+ "<VirtualCube name=\"" + virtualCubeName + "\"\n"
+ " caption=\"Virtual cube caption\"\n"
+ " description=\"Virtual cube description\">\n"
+ " <Annotations><Annotation name=\"a\">Virtual cube</Annotation></Annotations>\n"
+ " <VirtualCubeDimension name=\"Time\"/>\n"
+ " <VirtualCubeDimension cubeName=\"" + warehouseCubeName
+ "\" name=\"Warehouse\"/>\n"
+ " <VirtualCubeMeasure cubeName=\"" + salesCubeName
+ "\" name=\"[Measures].[Unit Sales]\">\n"
+ " <Annotations><Annotation name=\"a\">Virtual cube measure</Annotation></Annotations>\n"
+ " </VirtualCubeMeasure>\n"
+ " <VirtualCubeMeasure cubeName=\"" + warehouseCubeName
+ "\" name=\"[Measures].[Units Shipped]\"/>\n"
+ " <CalculatedMember name=\"Profit Per Unit Shipped\" dimension=\"Measures\">\n"
+ " <Formula>1 / [Measures].[Units Shipped]</Formula>\n"
+ " </CalculatedMember>\n"
+ "</VirtualCube>"
+ "</Schema>");
final Result result =
testContext.executeQuery("select from [" + cubeName + "]");
testContext.executeQuery("select from [" + salesCubeName + "]");
final Cube cube = result.getQuery().getCube();
assertEquals("Cube description", cube.getDescription());
checkAnnotations(cube.getAnnotationMap(), "a", "Cube");
Expand Down Expand Up @@ -2730,7 +2767,14 @@ public void testCaptionDescriptionAndAnnotation() {
final Hierarchy timeHierarchy = timeDimension.getHierarchies()[0];
// The hierarchy in the shared dimension does not have a name, so the
// hierarchy usage inherits the name of the dimension usage, Time1.
assertEquals("Time1", timeHierarchy.getName());
final boolean ssasCompatibleNaming =
MondrianProperties.instance().SsasCompatibleNaming.get();
if (ssasCompatibleNaming) {
assertEquals("Time", timeHierarchy.getName());
assertEquals("Time1", timeHierarchy.getDimension().getName());
} else {
assertEquals("Time1", timeHierarchy.getName());
}
// The description is prefixed by the dimension usage name.
assertEquals(
"Time usage caption.Time shared hierarchy description",
Expand All @@ -2754,7 +2798,12 @@ public void testCaptionDescriptionAndAnnotation() {
final Hierarchy time2Hierarchy = time2Dimension.getHierarchies()[0];
// The hierarchy in the shared dimension does not have a name, so the
// hierarchy usage inherits the name of the dimension usage, Time2.
assertEquals("Time2", time2Hierarchy.getName());
if (ssasCompatibleNaming) {
assertEquals("Time", time2Hierarchy.getName());
assertEquals("Time2", time2Hierarchy.getDimension().getName());
} else {
assertEquals("Time2", time2Hierarchy.getName());
}
// The description is prefixed by the dimension usage name (because
// dimension usage has no caption).
assertEquals(
Expand Down Expand Up @@ -2811,6 +2860,36 @@ public void testCaptionDescriptionAndAnnotation() {
assertEquals("Named set caption", namedSet.getCaption());
assertEquals("Named set description", namedSet.getDescription());
checkAnnotations(namedSet.getAnnotationMap(), "a", "Named set");

final Result result2 =
testContext.executeQuery("select from [" + virtualCubeName + "]");
final Cube cube2 = result2.getQuery().getCube();
assertEquals("Virtual cube description", cube2.getDescription());
checkAnnotations(cube2.getAnnotationMap(), "a", "Virtual cube");

final SchemaReader schemaReader2 = cube2.getSchemaReader(null);
final Dimension measuresDimension2 = cube2.getDimensions()[0];
final Hierarchy measuresHierarchy2 =
measuresDimension2.getHierarchies()[0];
final mondrian.olap.Level measuresLevel2 =
measuresHierarchy2.getLevels()[0];
final List<Member> measures2 =
schemaReader2.getLevelMembers(measuresLevel2, true);
final Member measure2 = measures2.get(0);
assertEquals("Unit Sales", measure2.getName());
assertEquals("Measure caption", measure2.getCaption());
assertEquals("Measure description", measure2.getDescription());
assertEquals(
measure2.getDescription(),
measure2.getPropertyValue(Property.DESCRIPTION.name));
assertEquals(
measure2.getCaption(),
measure2.getPropertyValue(Property.CAPTION.name));
assertEquals(
measure2.getCaption(),
measure2.getPropertyValue(Property.MEMBER_CAPTION.name));
checkAnnotations(
measure2.getAnnotationMap(), "a", "Virtual cube measure");
}

private static void checkAnnotations(
Expand Down

0 comments on commit 7afe046

Please sign in to comment.