From 82b4b82861a666a60a6828f5879612df689e53d0 Mon Sep 17 00:00:00 2001 From: Julian Hyde Date: Tue, 5 Feb 2008 19:37:23 +0000 Subject: [PATCH] XMLA driver now reads member corresponding to each measure, so that it can sort by ordinal. git-svn-id: https://olap4j.svn.sourceforge.net/svnroot/olap4j/trunk@71 c6a108a4-781c-0410-a6c6-c2d559e19af0 --- .../driver/xmla/XmlaOlap4jConnection.java | 24 +++++++++++++++++-- .../olap4j/driver/xmla/XmlaOlap4jMeasure.java | 5 ++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java b/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java index 45d3025..56a6d6c 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java @@ -805,7 +805,8 @@ public void handle(Element row, Context context, List list) { } static class MeasureHandler extends HandlerImpl { - public void handle(Element row, Context context, List list) { + public void handle(Element row, Context context, List list) + throws OlapException { /* Example: @@ -845,11 +846,30 @@ public void handle(Element row, Context context, List list) { (XmlaOlap4jLevel) context.getCube(row).getHierarchies().get("Measures") .getLevels().get(0); + + // Every measure is a member. MDSCHEMA_MEASURES does not return all + // properties of measures, so lookup the corresponding member. In + // particular, we need the ordinal. + if (list.isEmpty()) { + // First call this method, ask for all members of the measures + // level. This should ensures that we get all members in one + // round trip. + final List measureMembers = measuresLevel.getMembers(); + Olap4jUtil.discard(measureMembers); + } + Member member = + context.getCube(row).getMetadataReader().lookupMemberByUniqueName( + measureUniqueName); + int ordinal = -1; + if (member != null) { + ordinal = member.getOrdinal(); + } + list.add( new XmlaOlap4jMeasure( measuresLevel, measureUniqueName, measureName, measureCaption, description, null, measureAggregator, - datatype, measureIsVisible)); + datatype, measureIsVisible, ordinal)); } public void sortList(List list) { diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jMeasure.java b/src/org/olap4j/driver/xmla/XmlaOlap4jMeasure.java index 6bd37fd..9a01448 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jMeasure.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jMeasure.java @@ -37,11 +37,12 @@ class XmlaOlap4jMeasure String parentMemberUniqueName, Aggregator aggregator, Datatype datatype, - boolean visible) + boolean visible, + int ordinal) { super( olap4jLevel, uniqueName, name, caption, description, - parentMemberUniqueName, Type.MEASURE, 0, -1); + parentMemberUniqueName, Type.MEASURE, 0, ordinal); this.aggregator = aggregator; this.datatype = datatype; this.visible = visible;