001 /* 002 // $Id: Dimension.java 229 2009-05-08 19:11:29Z jhyde $ 003 // This software is subject to the terms of the Eclipse Public License v1.0 004 // Agreement, available at the following URL: 005 // http://www.eclipse.org/legal/epl-v10.html. 006 // Copyright (C) 2006-2009 Julian Hyde 007 // All Rights Reserved. 008 // You must accept the terms of that agreement to use this software. 009 */ 010 package org.olap4j.metadata; 011 012 import org.olap4j.OlapException; 013 014 import java.util.HashMap; 015 import java.util.Map; 016 017 /** 018 * An organized hierarchy of categories, known as levels, that describes data 019 * in a cube. 020 * 021 * <p>A Dimension typically describes a similar set of members upon which the 022 * user wants to base an analysis. 023 * 024 * <p>A Dimension must have at least one Hierarchy, and may have more than one, 025 * but most have exactly one Hierarchy.</p> 026 * 027 * @author jhyde 028 * @version $Id: Dimension.java 229 2009-05-08 19:11:29Z jhyde $ 029 * @since Aug 22, 2006 030 */ 031 public interface Dimension extends MetadataElement { 032 033 /** 034 * Returns the hierarchies in this Dimension. 035 * 036 * <p>Many dimensions have only one Hierarchy, whose name is the same as the 037 * Dimension. 038 * 039 * <p>The caller should assume that the list is immutable; 040 * if the caller modifies the list, behavior is undefined.</p> 041 * 042 * @see org.olap4j.OlapDatabaseMetaData#getHierarchies 043 * 044 * @return hierarchies in this dimension 045 */ 046 NamedList<Hierarchy> getHierarchies(); 047 048 /** 049 * Returns the type of this Dimension. 050 * 051 * @return dimension type 052 * 053 * @throws OlapException if database error occurs 054 */ 055 Dimension.Type getDimensionType() throws OlapException; 056 057 /** 058 * Returns the default <code>Hierarchy</code> of this Dimension. 059 * 060 * @return default hierarchy 061 */ 062 Hierarchy getDefaultHierarchy(); 063 064 /** 065 * Enumeration of the types of a <code>Dimension</code>. 066 * 067 * <p>Some of the values are as specified by XMLA. 068 * For example, XMLA specifies MD_DIMTYPE_PRODUCTS with ordinal 8, 069 * which corresponds to the value {@link #PRODUCTS}, 070 * whose {@link #xmlaOrdinal} is 8. 071 * 072 * @see Level.Type 073 * @see Member.Type 074 * @see Dimension#getDimensionType 075 */ 076 public enum Type { 077 /** 078 * Indicates that the dimension is not related to time. 079 */ 080 UNKNOWN(0), 081 082 /** 083 * Indicates that a dimension is a time dimension. 084 */ 085 TIME(1), 086 087 /** 088 * Indicates that a dimension is the Measures dimension. 089 */ 090 MEASURE(2), 091 092 OTHER(3), 093 QUANTITATIVE(5), 094 ACCOUNTS(6), 095 CUSTOMERS(7), 096 PRODUCTS(8), 097 SCENARIO(9), 098 UTILITY(10), 099 CURRENCY(11), 100 RATES(12), 101 CHANNEL(13), 102 PROMOTION(14), 103 ORGANIZATION(15), 104 BILL_OF_MATERIALS(16), 105 GEOGRAPHY(17); 106 107 private final int xmlaOrdinal; 108 109 private static final Map<Integer, Type> xmlaOrdinalTypeMap; 110 111 static { 112 Map<Integer, Type> map = new HashMap<Integer, Type>(); 113 for (Type type : values()) { 114 map.put(type.xmlaOrdinal, type); 115 } 116 xmlaOrdinalTypeMap = map; 117 } 118 119 /** 120 * Creates a Dimension Type. 121 * 122 * @param xmlaOrdinal Ordinal code as specified by XMLA 123 */ 124 private Type(int xmlaOrdinal) { 125 this.xmlaOrdinal = xmlaOrdinal; 126 } 127 128 /** 129 * Returns the ordinal code as specified by XMLA. 130 * 131 * <p>For example, the XMLA specification says that the ordinal of 132 * {@link #PRODUCTS} is 8. 133 * 134 * @return ordinal code as specified by XMLA. 135 */ 136 public final int xmlaOrdinal() { 137 return xmlaOrdinal; 138 } 139 140 /** 141 * Returns the type whose XMLA ordinal code is as given. 142 * 143 * @param xmlaOrdinal Ordinal code as specified by XMLA 144 * @return Dimension type, or null 145 */ 146 public static Type forXmlaOrdinal(int xmlaOrdinal) { 147 return xmlaOrdinalTypeMap.get(xmlaOrdinal); 148 } 149 } 150 } 151 152 // End Dimension.java