KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/rolap/agg/AggQuerySpec.java#15 $
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) 2002-2002 Kana Software, Inc.
7 // Copyright (C) 2002-2007 Julian Hyde and others
8 // All Rights Reserved.
9 // You must accept the terms of that agreement to use this software.
10 //
11 // jhyde, 21 March, 2002
12 */

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 /**
23  * An AggStar's version of the {@link QuerySpec}. <p/>
24  *
25  * When/if the {@link AggStar} code is merged into {@link RolapStar}
26  * (or RolapStar is merged into AggStar}, then this, indeed, can implement the
27  * {@link QuerySpec} interface.
28  *
29  * @author Richard M. Emberson
30  * @version $Id: //open/mondrian/src/main/mondrian/rolap/agg/AggQuerySpec.java#15 $
31  */

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 JavaDoc 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         // this should never happen
79
if (column == null) {
80             LOGGER.error("column null for bitPos="+bitPos);
81         }
82         return column;
83     }
84
85     public String JavaDoc getColumnAlias(final int i) {
86         return "c" + Integer.toString(i);
87     }
88
89     /**
90      * Returns the predicate on the <code>i</code>th column.
91      *
92      * <p>If the column is unconstrained, returns
93      * {@link LiteralStarPredicate}(true).
94      *
95      * @param i Column ordinal
96      * @return Constraint on column
97      */

98     public StarColumnPredicate getPredicate(int i) {
99         return segments[0].axes[i].getPredicate();
100     }
101
102     public String JavaDoc 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 JavaDoc alias = getMeasureAlias(i);
114
115         String JavaDoc 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         // add constraining dimensions
126
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 JavaDoc expr = column.generateExprString(sqlQuery);
133
134             StarColumnPredicate predicate = getPredicate(i);
135             final String JavaDoc 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             // some DB2 (AS400) versions throw an error, if a column alias is
145
// there and *not* used in a subsequent order by/group by
146
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         // Add measures.
158
// This can also add non-shared local dimension columns, which are
159
// not measures.
160
for (int i = 0, count = getMeasureCount(); i < count; i++) {
161             addMeasure(i, sqlQuery);
162         }
163     }
164 }
165
166 // End AggQuerySpec.java
167
Popular Tags