1 13 package mondrian.rolap.agg; 14 15 import mondrian.rolap.RolapStar; 16 import mondrian.rolap.StarColumnPredicate; 17 import mondrian.rolap.aggmatcher.AggStar; 18 import mondrian.rolap.sql.SqlQuery; 19 20 import org.apache.log4j.Logger; 21 22 32 class AggQuerySpec { 33 private static final Logger LOGGER = Logger.getLogger(AggQuerySpec.class); 34 35 private final AggStar aggStar; 36 private final Segment[] segments; 37 private final boolean rollup; 38 39 AggQuerySpec( 40 final AggStar aggStar, 41 final Segment[] segments, 42 final boolean rollup) { 43 this.aggStar = aggStar; 44 this.segments = segments; 45 this.rollup = rollup; 46 } 47 48 protected SqlQuery newSqlQuery() { 49 return getStar().getSqlQuery(); 50 } 51 52 public RolapStar getStar() { 53 return aggStar.getStar(); 54 } 55 56 public int getMeasureCount() { 57 return segments.length; 58 } 59 60 public AggStar.FactTable.Column getMeasureAsColumn(final int i) { 61 int bitPos = segments[i].measure.getBitPosition(); 62 return aggStar.lookupColumn(bitPos); 63 } 64 65 public String getMeasureAlias(final int i) { 66 return "m" + Integer.toString(i); 67 } 68 69 public int getColumnCount() { 70 return segments[0].aggregation.getColumns().length; 71 } 72 73 public AggStar.Table.Column getColumn(final int i) { 74 RolapStar.Column[] columns = segments[0].aggregation.getColumns(); 75 int bitPos = columns[i].getBitPosition(); 76 AggStar.Table.Column column = aggStar.lookupColumn(bitPos); 77 78 if (column == null) { 80 LOGGER.error("column null for bitPos="+bitPos); 81 } 82 return column; 83 } 84 85 public String getColumnAlias(final int i) { 86 return "c" + Integer.toString(i); 87 } 88 89 98 public StarColumnPredicate getPredicate(int i) { 99 return segments[0].axes[i].getPredicate(); 100 } 101 102 public String generateSqlQuery() { 103 SqlQuery sqlQuery = newSqlQuery(); 104 generateSql(sqlQuery); 105 return sqlQuery.toString(); 106 } 107 108 protected void addMeasure(final int i, final SqlQuery query) { 109 AggStar.FactTable.Measure column = 110 (AggStar.FactTable.Measure) getMeasureAsColumn(i); 111 112 column.getTable().addToFrom(query, false, true); 113 String alias = getMeasureAlias(i); 114 115 String expr; 116 if (rollup) { 117 expr = column.generateRollupString(query); 118 } else { 119 expr = column.generateExprString(query); 120 } 121 query.addSelect(expr, alias); 122 } 123 124 protected void generateSql(final SqlQuery sqlQuery) { 125 int columnCnt = getColumnCount(); 127 for (int i = 0; i < columnCnt; i++) { 128 AggStar.Table.Column column = getColumn(i); 129 AggStar.Table table = column.getTable(); 130 table.addToFrom(sqlQuery, false, true); 131 132 String expr = column.generateExprString(sqlQuery); 133 134 StarColumnPredicate predicate = getPredicate(i); 135 final String where = RolapStar.Column.createInExpr( 136 expr, 137 predicate, 138 column.getDatatype(), 139 sqlQuery.getDialect()); 140 if (!where.equals("true")) { 141 sqlQuery.addWhere(where); 142 } 143 144 if (sqlQuery.getDialect().isAS400()) { 147 sqlQuery.addSelect(expr, null); 148 } else { 149 sqlQuery.addSelect(expr, getColumnAlias(i)); 150 } 151 152 if (rollup) { 153 sqlQuery.addGroupBy(expr); 154 } 155 } 156 157 for (int i = 0, count = getMeasureCount(); i < count; i++) { 161 addMeasure(i, sqlQuery); 162 } 163 } 164 } 165 166 | Popular Tags |