Skip to content

Commit

Permalink
MONDRIAN
Browse files Browse the repository at this point in the history
       XMLA requires that each member have a ordinal based upon a
       depth first ordering. The implementation is at the top of
       RolapMember, it returns the same results as SQL Server but is
       much slower.

[git-p4: depot-paths = "//open/mondrian/": change = 6293]
  • Loading branch information
Richard Emberson committed Apr 20, 2006
1 parent 1b34f2d commit 681e4a6
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 4 deletions.
55 changes: 55 additions & 0 deletions src/main/mondrian/rolap/RolapMember.java
Expand Up @@ -29,6 +29,61 @@ public class RolapMember extends MemberBase {

private static final Logger LOGGER = Logger.getLogger(RolapMember.class);

/**
* This does a depth first setting of the complete member hierarchy as
* required by the MEMBER_ORDINAL XMLA element.
* For big hierarchies it takes a bunch of time. SQL Server is
* relatively fast in comparison so it might be storing such
* information in the DB.
*
* @param connection
* @param member
*/
public static void setOrdinals(Connection connection, Member member) {
Member parent =
connection.getSchemaReader().getMemberParent(member);

if (parent == null) {
// top of the world
int ordinal = 0;

Member[] siblings = connection.getSchemaReader().
getHierarchyRootMembers(member.getHierarchy());

for (int i = 0; i < siblings.length; i++) {
Member sibling = siblings[i];
ordinal = setAllChildren(ordinal, connection, sibling);
}

} else {
setOrdinals(connection, parent);
}
}
private static int setAllChildren(
int ordinal, Connection connection, Member member) {

if (member instanceof RolapMember) {
((RolapMember) member).setOrdinal(ordinal++);
} else {
// TODO
LOGGER.warn("RolapMember.setAllChildren: NOT RolapMember "+
"member.name=" +member.getName()+
", member.class=" +member.getClass().getName()+
", ordinal=" +ordinal
);
ordinal++;
}

Member[] children =
connection.getSchemaReader().getMemberChildren(member);
for (int i = 0; i < children.length; i++) {
Member child = children[i];
ordinal = setAllChildren(ordinal, connection, child);
}

return ordinal;
}

/**
* Converts a key to a string to be used as part of the member's name
* and unique name.
Expand Down
6 changes: 6 additions & 0 deletions src/main/mondrian/xmla/RowsetDefinition.java
Expand Up @@ -4556,6 +4556,11 @@ private static boolean mask(int value, int mask) {
private void unparseMember(final Connection connection, Cube cube,
Member member, XmlaResponse response,
int treeOp) {

if (member.getOrdinal() == -1) {
RolapMember.setOrdinals(connection, member);
}

// Visit node itself.
if (mask(treeOp, Enumeration.TreeOp.Self.ordinal)) {
emitMember(member, connection, cube, response);
Expand Down Expand Up @@ -4649,6 +4654,7 @@ private void emitMember(Member member, final Connection connection,
row.set(HierarchyUniqueName.name, hierarchy.getUniqueName());
row.set(LevelUniqueName.name, level.getUniqueName());
row.set(LevelNumber.name, level.getDepth());
// XXXXXXXXXXXXXXXXXXX
row.set(MemberOrdinal.name, member.getOrdinal());
row.set(MemberName.name, member.getName());
row.set(MemberUniqueName.name, member.getUniqueName());
Expand Down
4 changes: 2 additions & 2 deletions testsrc/main/mondrian/xmla/basic/MDSCHEMA_MEMBERS_out.xml
Expand Up @@ -184,7 +184,7 @@
<HIERARCHY_UNIQUE_NAME>[Gender]</HIERARCHY_UNIQUE_NAME>
<LEVEL_UNIQUE_NAME>[Gender].[Gender]</LEVEL_UNIQUE_NAME>
<LEVEL_NUMBER>1</LEVEL_NUMBER>
<MEMBER_ORDINAL>-1</MEMBER_ORDINAL>
<MEMBER_ORDINAL>1</MEMBER_ORDINAL>
<MEMBER_NAME>F</MEMBER_NAME>
<MEMBER_UNIQUE_NAME>[Gender].[All Gender].[F]</MEMBER_UNIQUE_NAME>
<MEMBER_TYPE>1</MEMBER_TYPE>
Expand All @@ -203,7 +203,7 @@
<HIERARCHY_UNIQUE_NAME>[Gender]</HIERARCHY_UNIQUE_NAME>
<LEVEL_UNIQUE_NAME>[Gender].[Gender]</LEVEL_UNIQUE_NAME>
<LEVEL_NUMBER>1</LEVEL_NUMBER>
<MEMBER_ORDINAL>-1</MEMBER_ORDINAL>
<MEMBER_ORDINAL>2</MEMBER_ORDINAL>
<MEMBER_NAME>M</MEMBER_NAME>
<MEMBER_UNIQUE_NAME>[Gender].[All Gender].[M]</MEMBER_UNIQUE_NAME>
<MEMBER_TYPE>1</MEMBER_TYPE>
Expand Down
Expand Up @@ -65,7 +65,7 @@
<HIERARCHY_UNIQUE_NAME>[Time]</HIERARCHY_UNIQUE_NAME>
<LEVEL_UNIQUE_NAME>[Time].[Year]</LEVEL_UNIQUE_NAME>
<LEVEL_NUMBER>0</LEVEL_NUMBER>
<MEMBER_ORDINAL>-1</MEMBER_ORDINAL>
<MEMBER_ORDINAL>0</MEMBER_ORDINAL>
<MEMBER_NAME>1997</MEMBER_NAME>
<MEMBER_UNIQUE_NAME>[Time].[1997]</MEMBER_UNIQUE_NAME>
<MEMBER_TYPE>1</MEMBER_TYPE>
Expand All @@ -83,7 +83,7 @@
<HIERARCHY_UNIQUE_NAME>[Time]</HIERARCHY_UNIQUE_NAME>
<LEVEL_UNIQUE_NAME>[Time].[Year]</LEVEL_UNIQUE_NAME>
<LEVEL_NUMBER>0</LEVEL_NUMBER>
<MEMBER_ORDINAL>-1</MEMBER_ORDINAL>
<MEMBER_ORDINAL>17</MEMBER_ORDINAL>
<MEMBER_NAME>1998</MEMBER_NAME>
<MEMBER_UNIQUE_NAME>[Time].[1998]</MEMBER_UNIQUE_NAME>
<MEMBER_TYPE>1</MEMBER_TYPE>
Expand Down

0 comments on commit 681e4a6

Please sign in to comment.