1 10 11 package mondrian.rolap.agg; 12 13 import mondrian.olap.Util; 14 import mondrian.olap.MondrianDef; 15 import mondrian.rolap.RolapStar; 16 import mondrian.rolap.StarColumnPredicate; 17 import mondrian.rolap.sql.SqlQuery; 18 import java.util.ArrayList ; 19 import java.util.List ; 20 import java.util.HashSet ; 21 import java.util.Set ; 22 23 31 class DrillThroughQuerySpec extends AbstractQuerySpec { 32 private final CellRequest request; 33 private final boolean countOnly; 34 private final String [] columnNames; 35 36 public DrillThroughQuerySpec( 37 CellRequest request, 38 boolean countOnly) 39 { 40 super(request.getMeasure().getStar()); 41 this.request = request; 42 this.countOnly = countOnly; 43 this.columnNames = computeDistinctColumnNames(); 44 } 45 46 private String [] computeDistinctColumnNames() { 47 final List <String > columnNames = new ArrayList <String >(); 48 final Set <String > columnNameSet = new HashSet <String >(); 49 50 final RolapStar.Column[] columns = getColumns(); 51 for (RolapStar.Column column : columns) { 52 addColumnName(column, columnNames, columnNameSet); 53 } 54 55 addColumnName(request.getMeasure(), columnNames, columnNameSet); 56 57 return columnNames.toArray(new String [columnNames.size()]); 58 } 59 60 private void addColumnName( 61 final RolapStar.Column column, 62 final List <String > columnNames, 63 final Set <String > columnNameSet) 64 { 65 String columnName = column.getName(); 66 if (columnName != null) { 67 } else if (column.getExpression() instanceof MondrianDef.Column) { 69 columnName = ((MondrianDef.Column) column.getExpression()).name; 70 } else { 71 columnName = "c" + Integer.toString(columnNames.size()); 72 } 73 for (int j = 0; !columnNameSet.add(columnName); j++) { 78 columnName = columnName + "_" + Integer.toString(j); 79 } 80 columnNames.add(columnName); 81 } 82 83 public int getMeasureCount() { 84 return 1; 85 } 86 87 public RolapStar.Measure getMeasure(final int i) { 88 Util.assertTrue(i == 0); 89 return request.getMeasure(); 90 } 91 92 public String getMeasureAlias(final int i) { 93 Util.assertTrue(i == 0); 94 return columnNames[columnNames.length - 1]; 95 } 96 97 public RolapStar.Column[] getColumns() { 98 return request.getConstrainedColumns(); 99 } 100 101 public String getColumnAlias(final int i) { 102 return columnNames[i]; 103 } 104 105 public StarColumnPredicate getColumnPredicate(final int i) { 106 final StarColumnPredicate constr = request.getValueList().get(i); 107 return (constr == null) 108 ? LiteralStarPredicate.TRUE 109 : constr; 110 } 111 112 public String generateSqlQuery() { 113 SqlQuery sqlQuery = newSqlQuery(); 114 nonDistinctGenerateSql(sqlQuery, true, countOnly); 115 return sqlQuery.toString(); 116 } 117 118 protected void addMeasure(final int i, final SqlQuery sqlQuery) { 119 RolapStar.Measure measure = getMeasure(i); 120 121 Util.assertTrue(measure.getTable() == getStar().getFactTable()); 122 measure.getTable().addToFrom(sqlQuery, false, true); 123 124 String expr = measure.generateExprString(sqlQuery); 125 sqlQuery.addSelect(expr, getMeasureAlias(i)); 126 } 127 128 protected boolean isAggregate() { 129 return false; 130 } 131 } 132 133 | Popular Tags |