| 1 10 11 package mondrian.rolap.aggmatcher; 12 13 import mondrian.olap.Hierarchy; 14 import mondrian.olap.Util; 15 import mondrian.recorder.MessageRecorder; 16 import mondrian.rolap.*; 17 18 import java.util.Iterator ; 19 20 27 class ExplicitRecognizer extends Recognizer { 28 private ExplicitRules.TableDef tableDef; 29 30 ExplicitRecognizer( 31 final ExplicitRules.TableDef tableDef, 32 final RolapStar star, 33 final JdbcSchema.Table dbFactTable, 34 final JdbcSchema.Table aggTable, 35 final MessageRecorder msgRecorder) { 36 super(star, dbFactTable, aggTable, msgRecorder); 37 this.tableDef = tableDef; 38 } 39 40 43 protected ExplicitRules.TableDef getTableDef() { 44 return tableDef; 45 } 46 47 50 protected Recognizer.Matcher getIgnoreMatcher() { 51 return getTableDef().getIgnoreMatcher(); 52 } 53 54 58 protected Recognizer.Matcher getFactCountMatcher() { 59 return getTableDef().getFactCountMatcher(); 60 } 61 62 79 protected int checkMeasures() { 80 msgRecorder.pushContextName("ExplicitRecognizer.checkMeasures"); 81 try { 82 83 int measureColumnCounts = 0; 84 for (JdbcSchema.Table.Column aggColumn : aggTable.getColumns()) { 88 if (aggColumn.hasUsage(JdbcSchema.UsageType.IGNORE)) { 90 continue; 91 } 92 93 String aggColumnName = aggColumn.getName(); 94 95 for (ExplicitRules.TableDef.Measure measure : 96 getTableDef().getMeasures()) 97 { 98 if (measure.getColumnName().equalsIgnoreCase(aggColumnName)) { 100 101 String name = measure.getName(); 102 String [] parts = Util.explode(name); 103 String nameLast = parts[parts.length - 1]; 104 105 RolapStar.Measure m = 106 star.getFactTable().lookupMeasureByName(nameLast); 107 RolapAggregator agg = null; 108 if (m != null) { 109 agg = m.getAggregator(); 110 } 111 makeMeasure(measure, agg, aggColumn); 113 measureColumnCounts++; 114 } 115 } 116 } 117 for (Iterator <JdbcSchema.Table.Column.Usage> it = 122 dbFactTable.getColumnUsages(JdbcSchema.UsageType.MEASURE); 123 it.hasNext(); ) { 124 JdbcSchema.Table.Column.Usage factUsage = it.next(); 125 JdbcSchema.Table.Column factColumn = factUsage.getColumn(); 126 127 if (factColumn.hasUsage(JdbcSchema.UsageType.FOREIGN_KEY)) { 128 String aggFK = 130 getTableDef().getAggregateFK(factColumn.getName()); 131 if (aggFK != null) { 133 JdbcSchema.Table.Column aggColumn = 134 aggTable.getColumn(aggFK); 135 136 if (aggColumn == null) { 138 aggColumn = aggTable.getColumn(aggFK.toLowerCase()); 139 } 140 if (aggColumn == null) { 141 aggColumn = aggTable.getColumn(aggFK.toUpperCase()); 142 } 143 144 if (aggColumn != null) { 145 makeMeasure(factUsage, aggColumn); 146 measureColumnCounts++; 147 } 148 } 149 } 150 } 151 return measureColumnCounts; 152 153 } finally { 154 msgRecorder.popContextName(); 155 } 156 } 157 158 165 protected void makeMeasure( 166 final ExplicitRules.TableDef.Measure measure, 167 RolapAggregator factAgg, 168 final JdbcSchema.Table.Column aggColumn) { 169 RolapStar.Measure rm = measure.getRolapStarMeasure(); 170 171 JdbcSchema.Table.Column.Usage aggUsage = 172 aggColumn.newUsage(JdbcSchema.UsageType.MEASURE); 173 174 aggUsage.setSymbolicName(measure.getSymbolicName()); 175 RolapAggregator ra = (factAgg == null) 176 ? convertAggregator(aggUsage, rm.getAggregator()) 177 : convertAggregator(aggUsage, factAgg, rm.getAggregator()); 178 aggUsage.setAggregator(ra); 179 180 aggUsage.rMeasure = rm; 181 } 182 183 192 protected int matchForeignKey( 193 final JdbcSchema.Table.Column.Usage factUsage) { 194 JdbcSchema.Table.Column factColumn = factUsage.getColumn(); 195 String aggFK = getTableDef().getAggregateFK(factColumn.getName()); 196 197 if (aggFK == null) { 199 return 0; 200 } 201 202 int matchCount = 0; 203 for (JdbcSchema.Table.Column aggColumn : aggTable.getColumns()) { 204 if (aggColumn.hasUsage(JdbcSchema.UsageType.IGNORE)) { 206 continue; 207 } 208 209 if (aggFK.equals(aggColumn.getName())) { 210 makeForeignKey(factUsage, aggColumn, aggFK); 211 matchCount++; 212 } 213 } 214 return matchCount; 215 216 } 217 218 229 protected boolean matchLevel( 230 final Hierarchy hierarchy, 231 final HierarchyUsage hierarchyUsage, 232 final RolapLevel rlevel) { 233 msgRecorder.pushContextName("ExplicitRecognizer.matchLevel"); 234 try { 235 236 String levelUniqueName = rlevel.getUniqueName(); 238 for (ExplicitRules.TableDef.Level level : getTableDef().getLevels()) { 239 if (level.getName().equals(levelUniqueName)) { 240 String columnName = level.getColumnName(); 245 for (JdbcSchema.Table.Column aggColumn : aggTable.getColumns()) { 246 if (aggColumn.getName().equals(columnName)) { 247 makeLevel( 248 aggColumn, 249 hierarchy, 250 hierarchyUsage, 251 getColumnName(rlevel.getKeyExp()), 252 columnName, 253 rlevel.getName()); 254 return true; 255 } 256 } 257 258 } 259 } 260 return false; 261 262 } finally { 263 msgRecorder.popContextName(); 264 } 265 } 266 } 267 268 | Popular Tags |