KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > mondrian > rolap > RolapNativeFilter


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/rolap/RolapNativeFilter.java#14 $
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 // Copyright (C) 2004-2005 TONBELLER AG
8 // All Rights Reserved.
9 // You must accept the terms of that agreement to use this software.
10 */

11 package mondrian.rolap;
12
13 import java.sql.Connection JavaDoc;
14 import java.sql.SQLException JavaDoc;
15 import java.util.ArrayList JavaDoc;
16 import java.util.List JavaDoc;
17 import java.util.Map JavaDoc;
18
19 import javax.sql.DataSource JavaDoc;
20
21 import mondrian.olap.*;
22 import mondrian.rolap.sql.SqlQuery;
23 import mondrian.rolap.sql.TupleConstraint;
24
25 /**
26  * Computes a Filter(set, condition) in SQL.
27  *
28  * @author av
29  * @since Nov 21, 2005
30  * @version $Id: //open/mondrian/src/main/mondrian/rolap/RolapNativeFilter.java#14 $
31  */

32 public class RolapNativeFilter extends RolapNativeSet {
33
34     public RolapNativeFilter() {
35         super.setEnabled(MondrianProperties.instance().EnableNativeFilter.get());
36     }
37
38     class FilterConstraint extends SetConstraint {
39         String JavaDoc filterExpr;
40
41         public FilterConstraint(CrossJoinArg[] args, RolapEvaluator evaluator, String JavaDoc filterByExpr) {
42             super(args, evaluator, true);
43             this.filterExpr = filterByExpr;
44         }
45
46         /**
47          * we alwas need to join the fact table because we want to evalutate
48          * the filter expression against a fact.
49          */

50         protected boolean isJoinRequired() {
51             return true;
52         }
53
54         public void addConstraint(
55             SqlQuery sqlQuery,
56             Map JavaDoc<RolapLevel, RolapStar.Column> levelToColumnMap) {
57             sqlQuery.addHaving(filterExpr);
58             super.addConstraint(sqlQuery, levelToColumnMap);
59         }
60
61         public Object JavaDoc getCacheKey() {
62             List JavaDoc<Object JavaDoc> key = new ArrayList JavaDoc<Object JavaDoc>();
63             key.add(super.getCacheKey());
64             key.add(filterExpr);
65             return key;
66         }
67     }
68
69     protected boolean isStrict() {
70         return true;
71     }
72
73     NativeEvaluator createEvaluator(RolapEvaluator evaluator, FunDef fun, Exp[] args) {
74         if (!isEnabled()) {
75             return null;
76         }
77         if (!FilterConstraint.isValidContext(evaluator)) {
78             return null;
79         }
80         // is this "Filter(<set>, <numeric expr>)"
81
String JavaDoc funName = fun.getName();
82         if (!"Filter".equalsIgnoreCase(funName)) {
83             return null;
84         }
85
86         if (args.length != 2) {
87             return null;
88         }
89
90         // extract the set expression
91
CrossJoinArg[] cargs = checkCrossJoinArg(args[0]);
92         if (cargs == null) {
93             return null;
94         }
95         if (isPreferInterpreter(cargs)) {
96             return null;
97         }
98
99         // extract "order by" expression
100
SchemaReader schemaReader = evaluator.getSchemaReader();
101         DataSource JavaDoc ds = schemaReader.getDataSource();
102
103         // generate the WHERE condition
104
SqlQuery sqlQuery = SqlQuery.newQuery(ds, "NativeFilter");
105         RolapNativeSql sql = new RolapNativeSql(sqlQuery);
106         String JavaDoc filterExpr = sql.generateFilterCondition(args[1]);
107         if (filterExpr == null) {
108             return null;
109         }
110         LOGGER.debug("using native filter");
111
112         evaluator = overrideContext(evaluator, cargs, sql.getStoredMeasure());
113
114         TupleConstraint constraint = new FilterConstraint(cargs, evaluator, filterExpr);
115         return new SetEvaluator(cargs, schemaReader, constraint);
116     }
117
118 }
119
120 // End RolapNativeFilter.java
121
Popular Tags