1 10 11 package mondrian.rolap.agg; 12 13 import mondrian.rolap.RolapStar; 14 import mondrian.rolap.StarColumnPredicate; 15 import mondrian.rolap.sql.SqlQuery; 16 17 24 public abstract class AbstractQuerySpec implements QuerySpec { 25 private final RolapStar star; 26 27 protected AbstractQuerySpec(final RolapStar star) { 28 this.star = star; 29 } 30 31 protected SqlQuery newSqlQuery() { 32 return getStar().getSqlQuery(); 33 } 34 35 public RolapStar getStar() { 36 return star; 37 } 38 39 protected abstract void addMeasure(final int i, final SqlQuery sqlQuery); 40 protected abstract boolean isAggregate(); 41 42 protected void nonDistinctGenerateSql( 43 final SqlQuery sqlQuery, boolean ordered, boolean countOnly) 44 { 45 RolapStar.Column[] columns = getColumns(); 47 int arity = columns.length; 48 if (countOnly) { 49 sqlQuery.addSelect("count(*)"); 50 } 51 for (int i = 0; i < arity; i++) { 52 RolapStar.Column column = columns[i]; 53 RolapStar.Table table = column.getTable(); 54 if (table.isFunky()) { 55 continue; 57 } 58 table.addToFrom(sqlQuery, false, true); 59 60 String expr = column.generateExprString(sqlQuery); 61 62 StarColumnPredicate predicate = getColumnPredicate(i); 63 final String where = RolapStar.Column.createInExpr( 64 expr, 65 predicate, 66 column.getDatatype(), 67 sqlQuery.getDialect()); 68 if (!where.equals("true")) { 69 sqlQuery.addWhere(where); 70 } 71 72 if (countOnly) { 73 continue; 74 } 75 76 final SqlQuery.Dialect dialect = sqlQuery.getDialect(); 79 if (dialect.isAS400()) { 80 sqlQuery.addSelect(expr, null); 81 } else { 82 sqlQuery.addSelect(expr, getColumnAlias(i)); 83 } 84 85 if (isAggregate()) { 86 sqlQuery.addGroupBy(expr); 87 } 88 89 if (ordered) { 92 sqlQuery.addOrderBy(expr, true, false, false); 93 } 94 } 95 96 if (!countOnly) { 98 for (int i = 0, count = getMeasureCount(); i < count; i++) { 99 addMeasure(i, sqlQuery); 100 } 101 } 102 } 103 } 104 105 106 | Popular Tags |