From baf33224359fe3110178bd20cb3528d882a89a37 Mon Sep 17 00:00:00 2001 From: Julian Hyde Date: Mon, 27 Apr 2009 23:24:46 +0000 Subject: [PATCH] Fix XMLA driver where dimension type=Geography. See issue https://sourceforge.net/forum/message.php?msg_id=7301948 "j.l.AIOOBE 17 with Geography Dimension". git-svn-id: https://olap4j.svn.sourceforge.net/svnroot/olap4j/trunk@190 c6a108a4-781c-0410-a6c6-c2d559e19af0 --- .../driver/xmla/XmlaOlap4jConnection.java | 2 +- src/org/olap4j/metadata/Dimension.java | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) 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); + } } }