1 13 14 package mondrian.rolap; 15 16 import org.apache.log4j.Logger; 17 import mondrian.olap.*; 18 import mondrian.resource.MondrianResource; 19 20 63 class RolapDimension extends DimensionBase { 64 65 private static final Logger LOGGER = Logger.getLogger(RolapDimension.class); 66 67 68 synchronized int getNextOrdinal() { 69 return schema.getNextDimensionOrdinal(); 70 } 71 72 private final Schema schema; 73 74 RolapDimension(Schema schema, 75 String name, 76 int globalOrdinal, 77 DimensionType dimensionType) { 78 super( 79 name, 80 globalOrdinal, 81 dimensionType); 84 85 this.schema = schema; 86 Util.assertTrue((globalOrdinal == 0) == name.equals(MEASURES_NAME)); 87 this.hierarchies = new RolapHierarchy[0]; 88 } 89 90 95 RolapDimension(RolapSchema schema, 96 RolapCube cube, 97 MondrianDef.Dimension xmlDimension, 98 MondrianDef.CubeDimension xmlCubeDimension) { 99 this(schema, 100 xmlDimension.name, 101 chooseOrdinal(cube, xmlCubeDimension), 102 xmlDimension.getDimensionType()); 103 104 Util.assertPrecondition(schema != null); 105 106 if (cube != null) { 107 Util.assertTrue(cube.getSchema() == schema); 108 } 109 110 if (!Util.isEmpty(xmlDimension.caption)) { 111 setCaption(xmlDimension.caption); 112 } 113 this.hierarchies = new RolapHierarchy[xmlDimension.hierarchies.length]; 114 for (int i = 0; i < xmlDimension.hierarchies.length; i++) { 115 RolapHierarchy hierarchy = new RolapHierarchy( 116 cube, this, xmlDimension.hierarchies[i], 117 xmlCubeDimension); 118 hierarchies[i] = hierarchy; 119 } 120 121 if (dimensionType == null) { 123 for (int i = 0; i < hierarchies.length; i++) { 124 Level[] levels = hierarchies[i].getLevels(); 125 LevLoop: 126 for (int j = 0; j < levels.length; j++) { 127 Level lev = levels[j]; 128 if (lev.isAll()) { 129 continue LevLoop; 130 } 131 if (dimensionType == null) { 132 dimensionType = (lev.getLevelType().isTime()) 134 ? DimensionType.TimeDimension 135 : DimensionType.StandardDimension; 136 137 } else { 138 if (dimensionType == DimensionType.TimeDimension && 141 !lev.getLevelType().isTime() && 142 !lev.isAll()) { 143 throw MondrianResource.instance().NonTimeLevelInTimeHierarchy.ex( 144 getUniqueName()); 145 } 146 if (dimensionType != DimensionType.TimeDimension && 147 lev.getLevelType().isTime()) { 148 throw MondrianResource.instance().TimeLevelInNonTimeHierarchy.ex( 149 getUniqueName()); 150 } 151 } 152 } 153 } 154 } 155 } 156 157 protected Logger getLogger() { 158 return LOGGER; 159 } 160 161 165 private static int chooseOrdinal(RolapCube cube, 166 MondrianDef.CubeDimension xmlCubeDimension) { 167 168 if (xmlCubeDimension.name.equals(MEASURES_NAME)) { 169 return 0; 170 } 171 RolapSchema schema = (RolapSchema) cube.getSchema(); 172 if (xmlCubeDimension instanceof MondrianDef.DimensionUsage) { 173 MondrianDef.DimensionUsage usage = 174 (MondrianDef.DimensionUsage) xmlCubeDimension; 175 RolapHierarchy hierarchy = schema.getSharedHierarchy(usage.source); 176 if (hierarchy != null) { 177 cube.createUsage(hierarchy, usage); 178 179 RolapDimension dimension = 180 (RolapDimension) hierarchy.getDimension(); 181 return dimension.getGlobalOrdinal(); 182 } 183 } 184 return schema.getNextDimensionOrdinal(); 185 } 186 187 190 void init(RolapCube cube, MondrianDef.CubeDimension xmlDimension) { 191 for (int i = 0; i < hierarchies.length; i++) { 192 if (hierarchies[i] != null) { 193 ((RolapHierarchy) hierarchies[i]).init(cube, xmlDimension); 194 } 195 } 196 } 197 198 RolapHierarchy newHierarchy(String subName, boolean hasAll) { 199 RolapHierarchy hierarchy = new RolapHierarchy(this, subName, hasAll); 200 this.hierarchies = (RolapHierarchy[]) 201 RolapUtil.addElement(this.hierarchies, hierarchy); 202 return hierarchy; 203 } 204 205 211 public Hierarchy getHierarchy() { 212 return hierarchies[0]; 213 } 214 215 public int getOrdinal(Cube cube) { 216 return ((RolapCube) cube).getOrdinal(this.globalOrdinal); 217 } 218 219 public Schema getSchema() { 220 return schema; 221 } 222 223 226 int getGlobalOrdinal() { 227 return globalOrdinal; 228 } 229 230 237 public RolapDimension copy( 238 RolapCube cube, 239 String name, 240 MondrianDef.CubeDimension xmlCubeDimension) { 241 RolapDimension dimension = new RolapDimension( 242 schema, 243 name, 244 getNextOrdinal(), 245 dimensionType); 246 dimension.hierarchies = (Hierarchy[]) hierarchies.clone(); 247 for (int i = 0; i < hierarchies.length; i++) { 248 final RolapHierarchy hierarchy = (RolapHierarchy) hierarchies[i]; 249 dimension.hierarchies[i] = new RolapHierarchy(cube, dimension, 250 hierarchy.xmlHierarchy, xmlCubeDimension); 251 } 252 return dimension; 253 } 254 } 255 256 | Popular Tags |