KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > mondrian > rolap > agg > DrillThroughQuerySpec


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/rolap/agg/DrillThroughQuerySpec.java#10 $
3 // This software is subject to the terms of the Common Public License
4 // Agreement, available at the following URL:
5 // http://www.opensource.org/licenses/cpl.html.
6 // Copyright (C) 2005-2007 Julian Hyde
7 // All Rights Reserved.
8 // You must accept the terms of that agreement to use this software.
9 */

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 JavaDoc;
19 import java.util.List JavaDoc;
20 import java.util.HashSet JavaDoc;
21 import java.util.Set JavaDoc;
22
23 /**
24  * Provides the information necessary to generate SQL for a drill-through
25  * request.
26  *
27  * @author jhyde
28  * @author Richard M. Emberson
29  * @version $Id: //open/mondrian/src/main/mondrian/rolap/agg/DrillThroughQuerySpec.java#10 $
30  */

31 class DrillThroughQuerySpec extends AbstractQuerySpec {
32     private final CellRequest request;
33     private final boolean countOnly;
34     private final String JavaDoc[] 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 JavaDoc[] computeDistinctColumnNames() {
47         final List JavaDoc<String JavaDoc> columnNames = new ArrayList JavaDoc<String JavaDoc>();
48         final Set JavaDoc<String JavaDoc> columnNameSet = new HashSet JavaDoc<String JavaDoc>();
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 JavaDoc[columnNames.size()]);
58     }
59
60     private void addColumnName(
61         final RolapStar.Column column,
62         final List JavaDoc<String JavaDoc> columnNames,
63         final Set JavaDoc<String JavaDoc> columnNameSet)
64     {
65         String JavaDoc columnName = column.getName();
66         if (columnName != null) {
67             // nothing
68
} 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         // Register the column name, and if it's not unique,
74
// generate names until it is.
75
// Instead of having mysterious column name like x0, x1 ..
76
// rename columns as ColumnName_0, ColumnName_1 ..
77
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 JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc expr = measure.generateExprString(sqlQuery);
125         sqlQuery.addSelect(expr, getMeasureAlias(i));
126     }
127
128     protected boolean isAggregate() {
129         return false;
130     }
131 }
132
133 // End DrillThroughQuerySpec.java
134
Popular Tags