diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java b/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java index 9dc8ec9..910c2b9 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java @@ -863,7 +863,7 @@ public void handle(Element row, Context context, List list) final int dimensionType = integerElement(row, "DIMENSION_TYPE"); final Dimension.Type type = - Dimension.Type.values()[dimensionType]; + Dimension.Type.forXmlaOrdinal(dimensionType); final String defaultHierarchyUniqueName = stringElement(row, "DEFAULT_HIERARCHY"); list.add( diff --git a/src/org/olap4j/metadata/Dimension.java b/src/org/olap4j/metadata/Dimension.java index 4e3612e..bdbe5d3 100644 --- a/src/org/olap4j/metadata/Dimension.java +++ b/src/org/olap4j/metadata/Dimension.java @@ -11,6 +11,9 @@ import org.olap4j.OlapException; +import java.util.HashMap; +import java.util.Map; + /** * An organized hierarchy of categories, known as levels, that describes data * in a cube. @@ -103,6 +106,21 @@ public enum Type { private final int xmlaOrdinal; + private static final Map xmlaOrdinalTypeMap; + + static { + Map map = new HashMap(); + for (Type type : values()) { + map.put(type.xmlaOrdinal, type); + } + xmlaOrdinalTypeMap = map; + } + + /** + * Creates a Dimension Type. + * + * @param xmlaOrdinal Ordinal code as specified by XMLA + */ private Type(int xmlaOrdinal) { this.xmlaOrdinal = xmlaOrdinal; } @@ -118,6 +136,16 @@ private Type(int xmlaOrdinal) { public final int xmlaOrdinal() { return xmlaOrdinal; } + + /** + * Returns the type whose XMLA ordinal code is as given. + * + * @param xmlaOrdinal Ordinal code as specified by XMLA + * @return Dimension type, or null + */ + public static Type forXmlaOrdinal(int xmlaOrdinal) { + return xmlaOrdinalTypeMap.get(xmlaOrdinal); + } } }