2
2
// This software is subject to the terms of the Common Public License
3
3
// Agreement, available at the following URL:
4
4
// http://www.opensource.org/licenses/cpl.html.
5
- // Copyright (C) 2007-2007 Julian Hyde
5
+ // Copyright (C) 2007-2008 Julian Hyde
6
6
// All Rights Reserved.
7
7
// You must accept the terms of that agreement to use this software.
8
8
*/
19
19
import org .olap4j .mdx .parser .*;
20
20
import org .olap4j .mdx .parser .impl .DefaultMdxParserImpl ;
21
21
import org .olap4j .metadata .*;
22
- import org .w3c .dom .DOMImplementation ;
23
- import org .w3c .dom .Document ;
24
- import org .w3c .dom .Element ;
22
+ import org .w3c .dom .*;
25
23
import org .w3c .dom .ls .DOMImplementationLS ;
26
24
import org .w3c .dom .ls .LSSerializer ;
27
25
import org .xml .sax .SAXException ;
34
32
import java .util .Map .*;
35
33
import java .util .regex .*;
36
34
37
- import javax .xml .transform .*;
38
- import javax .xml .transform .dom .*;
39
- import javax .xml .transform .stream .*;
40
-
41
35
/**
42
36
* Implementation of {@link org.olap4j.OlapConnection}
43
37
* for XML/A providers.
@@ -1078,6 +1072,34 @@ public int compare(
1078
1072
}
1079
1073
1080
1074
static class MemberHandler extends HandlerImpl <XmlaOlap4jMember > {
1075
+
1076
+ /**
1077
+ * Collection of nodes to ignore because they represent standard
1078
+ * built-in properties of Members.
1079
+ */
1080
+ private static final Set <String > EXCLUDED_PROPERTY_NAMES =
1081
+ new HashSet <String >(
1082
+ Arrays .asList (
1083
+ Property .StandardMemberProperty .CATALOG_NAME .name (),
1084
+ Property .StandardMemberProperty .CUBE_NAME .name (),
1085
+ Property .StandardMemberProperty .DIMENSION_UNIQUE_NAME .name (),
1086
+ Property .StandardMemberProperty .HIERARCHY_UNIQUE_NAME .name (),
1087
+ Property .StandardMemberProperty .LEVEL_UNIQUE_NAME .name (),
1088
+ Property .StandardMemberProperty .PARENT_LEVEL .name (),
1089
+ Property .StandardMemberProperty .PARENT_COUNT .name (),
1090
+ Property .StandardMemberProperty .MEMBER_KEY .name (),
1091
+ Property .StandardMemberProperty .IS_PLACEHOLDERMEMBER .name (),
1092
+ Property .StandardMemberProperty .IS_DATAMEMBER .name (),
1093
+ Property .StandardMemberProperty .LEVEL_NUMBER .name (),
1094
+ Property .StandardMemberProperty .MEMBER_ORDINAL .name (),
1095
+ Property .StandardMemberProperty .MEMBER_UNIQUE_NAME .name (),
1096
+ Property .StandardMemberProperty .MEMBER_NAME .name (),
1097
+ Property .StandardMemberProperty .PARENT_UNIQUE_NAME .name (),
1098
+ Property .StandardMemberProperty .MEMBER_TYPE .name (),
1099
+ Property .StandardMemberProperty .MEMBER_CAPTION .name (),
1100
+ Property .StandardMemberProperty .CHILDREN_CARDINALITY .name (),
1101
+ Property .StandardMemberProperty .DEPTH .name ()));
1102
+
1081
1103
public void handle (Element row , Context context , List <XmlaOlap4jMember > list ) {
1082
1104
/*
1083
1105
Example:
@@ -1103,31 +1125,87 @@ public void handle(Element row, Context context, List<XmlaOlap4jMember> list) {
1103
1125
</row>
1104
1126
1105
1127
*/
1106
- int levelNumber = integerElement (row , "LEVEL_NUMBER" );
1107
- int memberOrdinal = integerElement (row , "MEMBER_ORDINAL" );
1128
+ if (false ) {
1129
+ int levelNumber =
1130
+ integerElement (
1131
+ row ,
1132
+ Property .StandardMemberProperty .LEVEL_NUMBER .name ());
1133
+ }
1134
+ int memberOrdinal =
1135
+ integerElement (
1136
+ row ,
1137
+ Property .StandardMemberProperty .MEMBER_ORDINAL .name ());
1108
1138
String memberUniqueName =
1109
- stringElement (row , "MEMBER_UNIQUE_NAME" );
1139
+ stringElement (
1140
+ row ,
1141
+ Property .StandardMemberProperty .MEMBER_UNIQUE_NAME .name ());
1110
1142
String memberName =
1111
- stringElement (row , "MEMBER_NAME" );
1143
+ stringElement (
1144
+ row ,
1145
+ Property .StandardMemberProperty .MEMBER_NAME .name ());
1112
1146
String parentUniqueName =
1113
- stringElement (row , "PARENT_UNIQUE_NAME" );
1147
+ stringElement (
1148
+ row ,
1149
+ Property .StandardMemberProperty .PARENT_UNIQUE_NAME .name ());
1114
1150
Member .Type memberType =
1115
1151
Member .Type .values ()[
1116
- integerElement (row , "MEMBER_TYPE" )];
1152
+ integerElement (
1153
+ row ,
1154
+ Property .StandardMemberProperty .MEMBER_TYPE .name ())];
1117
1155
String memberCaption =
1118
- stringElement (row , "MEMBER_CAPTION" );
1156
+ stringElement (
1157
+ row ,
1158
+ Property .StandardMemberProperty .MEMBER_CAPTION .name ());
1119
1159
int childrenCardinality =
1120
- integerElement (row , "CHILDREN_CARDINALITY" );
1160
+ integerElement (
1161
+ row ,
1162
+ Property .StandardMemberProperty .CHILDREN_CARDINALITY .name ());
1121
1163
// If this member is a measure, we want to return an object that
1122
1164
// implements the Measure interface to all API calls. But we also
1123
1165
// need to retrieve the properties that occur in MDSCHEMA_MEMBERS
1124
1166
// that are not available in MDSCHEMA_MEASURES, so we create a
1125
1167
// member for internal use.
1126
- list . add (
1168
+ XmlaOlap4jMember member =
1127
1169
new XmlaOlap4jMember (
1128
1170
context .getLevel (row ), memberUniqueName , memberName ,
1129
1171
memberCaption , "" , parentUniqueName , memberType ,
1130
- childrenCardinality , memberOrdinal ));
1172
+ childrenCardinality , memberOrdinal );
1173
+ addUserDefinedDimensionProperties (row , member );
1174
+
1175
+ // Usually members have the same depth as their level. (Ragged and
1176
+ // parent-child hierarchies are an exception.) Only store depth for
1177
+ // the unusual ones.
1178
+ final Integer depth =
1179
+ integerElement (
1180
+ row ,
1181
+ Property .StandardMemberProperty .DEPTH .name ());
1182
+ if (depth != null
1183
+ && depth .intValue () != member .getLevel ().getDepth ())
1184
+ {
1185
+ member .setProperty (Property .StandardMemberProperty .DEPTH , depth );
1186
+ }
1187
+ list .add (member );
1188
+ }
1189
+
1190
+ private void addUserDefinedDimensionProperties (
1191
+ Element row ,
1192
+ XmlaOlap4jMember member )
1193
+ {
1194
+ NodeList nodes = row .getChildNodes ();
1195
+ for (int i = 0 ; i < nodes .getLength (); i ++) {
1196
+ Node node = nodes .item (i );
1197
+ if (EXCLUDED_PROPERTY_NAMES .contains (node .getLocalName ())) {
1198
+ continue ;
1199
+ }
1200
+ for (Property property : member .getLevel ().getProperties ()) {
1201
+ if (property instanceof XmlaOlap4jProperty
1202
+ && property .getName ().equalsIgnoreCase (
1203
+ node .getLocalName ()))
1204
+ {
1205
+ member .setProperty (property , node .getTextContent ());
1206
+ }
1207
+ }
1208
+ }
1131
1209
}
1132
1210
}
1133
1211
0 commit comments