1 10 11 package mondrian.rolap.aggmatcher; 12 13 import mondrian.olap.Hierarchy; 14 import mondrian.resource.MondrianResource; 15 import mondrian.recorder.MessageRecorder; 16 import mondrian.rolap.RolapStar; 17 import mondrian.rolap.RolapLevel; 18 import mondrian.rolap.HierarchyUsage; 19 20 import java.util.Iterator ; 21 22 29 class DefaultRecognizer extends Recognizer { 30 31 private static final MondrianResource mres = MondrianResource.instance(); 32 33 private final DefaultRules aggDefault; 34 35 DefaultRecognizer(final DefaultRules aggDefault, 36 final RolapStar star, 37 final JdbcSchema.Table dbFactTable, 38 final JdbcSchema.Table aggTable, 39 final MessageRecorder msgRecorder) { 40 super(star, dbFactTable, aggTable, msgRecorder); 41 this.aggDefault = aggDefault; 42 } 43 44 47 DefaultRules getRules() { 48 return aggDefault; 49 } 50 51 54 protected Recognizer.Matcher getIgnoreMatcher() { 55 return getRules().getIgnoreMatcher(); 56 } 57 58 62 protected Recognizer.Matcher getFactCountMatcher() { 63 return getRules().getFactCountMatcher(); 64 } 65 66 69 protected Recognizer.Matcher getMeasureMatcher( 70 JdbcSchema.Table.Column.Usage factUsage) { 71 72 String measureName = factUsage.getSymbolicName(); 73 String measureColumnName = factUsage.getColumn().getName(); 74 String aggregateName = factUsage.getAggregator().getName(); 75 76 return getRules().getMeasureMatcher( 77 measureName, 78 measureColumnName, 79 aggregateName); 80 } 81 82 95 protected int checkMeasures() { 96 msgRecorder.pushContextName("DefaultRecognizer.checkMeasures"); 97 98 try { 99 int measureCountCount = 0; 100 101 for (Iterator <JdbcSchema.Table.Column.Usage> it = 102 dbFactTable.getColumnUsages(JdbcSchema.UsageType.MEASURE); 103 it.hasNext(); ) { 104 JdbcSchema.Table.Column.Usage factUsage = it.next(); 105 106 Matcher matcher = getMeasureMatcher(factUsage); 107 108 int matchCount = 0; 109 for (JdbcSchema.Table.Column aggColumn : aggTable.getColumns()) { 110 if (aggColumn.hasUsage(JdbcSchema.UsageType.IGNORE)) { 112 continue; 113 } 114 115 if (matcher.matches(aggColumn.getName())) { 116 makeMeasure(factUsage, aggColumn); 117 118 measureCountCount++; 119 matchCount++; 120 } 121 } 122 123 if (matchCount > 1) { 124 String msg = mres.AggMultipleMatchingMeasure.str( 125 msgRecorder.getContext(), 126 aggTable.getName(), 127 dbFactTable.getName(), 128 matchCount, 129 factUsage.getSymbolicName(), 130 factUsage.getColumn().getName(), 131 factUsage.getAggregator().getName()); 132 msgRecorder.reportError(msg); 133 134 returnValue = false; 135 } 136 } 137 return measureCountCount; 138 139 } finally { 140 msgRecorder.popContextName(); 141 } 142 } 143 144 152 protected int matchForeignKey(JdbcSchema.Table.Column.Usage factUsage) { 153 JdbcSchema.Table.Column factColumn = factUsage.getColumn(); 154 155 Recognizer.Matcher matcher = 157 getRules().getForeignKeyMatcher(factColumn.getName()); 158 159 int matchCount = 0; 160 for (JdbcSchema.Table.Column aggColumn : aggTable.getColumns()) { 161 if (aggColumn.hasUsage(JdbcSchema.UsageType.IGNORE)) { 163 continue; 164 } 165 166 if (matcher.matches(aggColumn.getName())) { 167 makeForeignKey(factUsage, aggColumn, null); 168 matchCount++; 169 } 170 } 171 return matchCount; 172 } 173 174 183 protected boolean matchLevel( 184 final Hierarchy hierarchy, 185 final HierarchyUsage hierarchyUsage, 186 final RolapLevel level) { 187 188 msgRecorder.pushContextName("DefaultRecognizer.matchLevel"); 189 try { 190 191 String usagePrefix = hierarchyUsage.getUsagePrefix(); 192 String hierName = hierarchy.getName(); 193 String levelName = level.getName(); 194 String levelColumnName = getColumnName(level.getKeyExp()); 195 196 Recognizer.Matcher matcher = getRules().getLevelMatcher( 197 usagePrefix, hierName, levelName, levelColumnName); 198 199 for (JdbcSchema.Table.Column aggColumn : aggTable.getColumns()) { 200 if (matcher.matches(aggColumn.getName())) { 201 makeLevel( 202 aggColumn, 203 hierarchy, 204 hierarchyUsage, 205 getColumnName(level.getKeyExp()), 206 getColumnName(level.getKeyExp()), 207 level.getName()); 208 return true; 209 } 210 } 211 return false; 212 213 } finally { 214 msgRecorder.popContextName(); 215 } 216 } 217 } 218 219 | Popular Tags |