KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > sql99 > dql > plan > condition > TablePlanMerger


1 package com.daffodilwoods.daffodildb.server.sql99.dql.plan.condition;
2
3 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*;
4 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.predicates.*;
5 import com.daffodilwoods.daffodildb.utils.comparator.*;
6 import com.daffodilwoods.database.resource.*;
7
8 /**
9  * This class provides functionality of merging two predicate.predicate are merged
10  * on bases of their type. It is an utility class.
11  * predicate can be of following type :-
12  * EQUALTO
13  * GREATERTHAN
14  * LESSTHAN
15  * GREATERTHANEQUALTO
16  * LESSTHANEQUALTO
17  * NOTEQUALTO
18  * RANGE_PREDICATE
19  * JOINCOMPARISONPREDICATE
20  * <p>Title: </p>
21  * <p>Description: </p>
22  * <p>Copyright: Copyright (c) 2004</p>
23  * <p>Company: </p>
24  * @author not attributable
25  * @version 1.0
26  */

27 public class TablePlanMerger implements ExecutionPlanConstants {
28   /**
29    * This method is required to get resultant merged predicate.
30    * predicate are merged on basis of their type.
31    * Algo:-
32    * For algorithm of this method please refers to following document
33    * \\server\company\Backend\Daffodil DB\ServerDesign\GetMergedPredicate.doc
34    * @param predicate1
35    * @param predicate2
36    * @param objectComparator
37    * @return
38    * @throws DException
39    */

40    public static predicate getMergedPredicate(predicate predicate1, predicate predicate2, SuperComparator objectComparator) throws DException {
41       predicate1.getColumnDetails();
42       predicate2.getColumnDetails();
43       int type1 = predicate1.getPredicateType();
44       int type2 = predicate2.getPredicateType();
45       switch (type1) {
46          case OperatorConstants.EQUALTO:
47             switch (type2) {
48                case OperatorConstants.EQUALTO:
49                   return case_Equal_Equal_PredicateTypes(predicate1, predicate2, objectComparator);
50                case OperatorConstants.GREATERTHAN:
51                   return case_Equal_GreaterThan_PredicateTypes(predicate1, predicate2, objectComparator);
52                case OperatorConstants.GREATERTHANEQUALTO:
53                   return case_Equal_GreaterThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator);
54                case OperatorConstants.LESSTHAN:
55                   return case_Equal_LessThan_PredicateTypes(predicate1, predicate2, objectComparator);
56                case OperatorConstants.LESSTHANEQUALTO:
57                   return case_Equal_LessThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator);
58                case OperatorConstants.RANGE_PREDICATE:
59                   return case_Equal_Range_PredicateTypes(predicate1, predicate2, objectComparator);
60                case OperatorConstants.JOINCOMPARISONPREDICATE:
61                   return case_Join_PredicateTypes(predicate1, predicate2, objectComparator);
62             }
63          case OperatorConstants.GREATERTHAN:
64             switch (type2) {
65                case OperatorConstants.EQUALTO:
66                   return case_Equal_GreaterThan_PredicateTypes(predicate2, predicate1, objectComparator);
67                case OperatorConstants.GREATERTHAN:
68                   return case_GreaterThan_GreaterThan_PredicateTypes(predicate1, predicate2, objectComparator);
69                case OperatorConstants.GREATERTHANEQUALTO:
70                   return case_GreaterThan_GreaterThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator);
71                case OperatorConstants.LESSTHAN:
72                   return case_GreaterThan_LessThan_PredicateTypes(predicate1, predicate2, objectComparator);
73                case OperatorConstants.LESSTHANEQUALTO:
74                   return case_GreaterThan_LessThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator);
75                case OperatorConstants.RANGE_PREDICATE:
76                   return case_GreaterThan_Range_PredicateTypes(predicate1, predicate2, objectComparator);
77                case OperatorConstants.JOINCOMPARISONPREDICATE:
78                   return case_Join_PredicateTypes(predicate1, predicate2, objectComparator);
79             }
80          case OperatorConstants.GREATERTHANEQUALTO:
81             switch (type2) {
82                case OperatorConstants.EQUALTO:
83                   return case_Equal_GreaterThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator);
84                case OperatorConstants.GREATERTHAN:
85                   return case_GreaterThan_GreaterThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator);
86                case OperatorConstants.GREATERTHANEQUALTO:
87                   return case_GreaterThanEqualTo_GreaterThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator);
88                case OperatorConstants.LESSTHAN:
89                   return case_GreaterThanEqualTo_LessThan_PredicateTypes(predicate1, predicate2, objectComparator);
90                case OperatorConstants.LESSTHANEQUALTO:
91                   return case_GreaterThanEqualTo_LessThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator);
92                case OperatorConstants.RANGE_PREDICATE:
93                   return case_GreaterThanEqualTo_Range_PredicateTypes(predicate1, predicate2, objectComparator);
94                case OperatorConstants.JOINCOMPARISONPREDICATE:
95                   return case_Join_PredicateTypes(predicate1, predicate2, objectComparator);
96             }
97
98          case OperatorConstants.LESSTHAN:
99             switch (type2) {
100                case OperatorConstants.EQUALTO:
101                   return case_Equal_LessThan_PredicateTypes(predicate2, predicate1, objectComparator);
102                case OperatorConstants.GREATERTHAN:
103                   return case_GreaterThan_LessThan_PredicateTypes(predicate2, predicate1, objectComparator);
104                case OperatorConstants.GREATERTHANEQUALTO:
105                   return case_GreaterThanEqualTo_LessThan_PredicateTypes(predicate2, predicate1, objectComparator);
106                case OperatorConstants.LESSTHAN:
107                   return case_LessThan_LessThan_PredicateTypes(predicate1, predicate2, objectComparator);
108                case OperatorConstants.LESSTHANEQUALTO:
109                   return case_LessThan_LessThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator);
110                case OperatorConstants.RANGE_PREDICATE:
111                   return case_LessThan_Range_PredicateTypes(predicate1, predicate2, objectComparator);
112                case OperatorConstants.JOINCOMPARISONPREDICATE:
113                   return case_Join_PredicateTypes(predicate1, predicate2, objectComparator);
114             }
115          case OperatorConstants.LESSTHANEQUALTO:
116             switch (type2) {
117                case OperatorConstants.EQUALTO:
118                   return case_Equal_LessThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator);
119                case OperatorConstants.GREATERTHAN:
120                   return case_GreaterThan_LessThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator);
121                case OperatorConstants.GREATERTHANEQUALTO:
122                   return case_GreaterThanEqualTo_LessThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator);
123                case OperatorConstants.LESSTHAN:
124                   return case_LessThan_LessThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator);
125                case OperatorConstants.LESSTHANEQUALTO:
126                   return case_LessThanEqualTo_LessThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator);
127                case OperatorConstants.RANGE_PREDICATE:
128                   return case_LessThanEqualTo_Range_PredicateTypes(predicate1, predicate2, objectComparator);
129                case OperatorConstants.JOINCOMPARISONPREDICATE:
130                   return case_Join_PredicateTypes(predicate1, predicate2, objectComparator);
131             }
132          case OperatorConstants.RANGE_PREDICATE:
133             switch (type2) {
134                case OperatorConstants.EQUALTO:
135                   return case_Equal_Range_PredicateTypes(predicate2, predicate1, objectComparator);
136                case OperatorConstants.GREATERTHAN:
137                   return case_GreaterThan_Range_PredicateTypes(predicate2, predicate1, objectComparator);
138                case OperatorConstants.GREATERTHANEQUALTO:
139                   return case_GreaterThanEqualTo_Range_PredicateTypes(predicate2, predicate1, objectComparator);
140                case OperatorConstants.LESSTHAN:
141                   return case_LessThan_Range_PredicateTypes(predicate2, predicate1, objectComparator);
142                case OperatorConstants.LESSTHANEQUALTO:
143                   return case_LessThanEqualTo_Range_PredicateTypes(predicate2, predicate1, objectComparator);
144                case OperatorConstants.RANGE_PREDICATE:
145                   return case_Range_Range_PredicateTypes(predicate1, predicate2, objectComparator);
146                case OperatorConstants.JOINCOMPARISONPREDICATE:
147                   return case_Join_PredicateTypes(predicate1, predicate2, objectComparator);
148             }
149          case OperatorConstants.JOINCOMPARISONPREDICATE:
150             switch (type2) {
151                case OperatorConstants.EQUALTO:
152                   return case_Join_PredicateTypes(predicate2, predicate1, objectComparator);
153                case OperatorConstants.GREATERTHAN:
154                   return case_Join_PredicateTypes(predicate2, predicate1, objectComparator);
155                case OperatorConstants.GREATERTHANEQUALTO:
156                   return case_Join_PredicateTypes(predicate2, predicate1, objectComparator);
157                case OperatorConstants.LESSTHAN:
158                   return case_Join_PredicateTypes(predicate2, predicate1, objectComparator);
159                case OperatorConstants.LESSTHANEQUALTO:
160                   return case_Join_PredicateTypes(predicate2, predicate1, objectComparator);
161                case OperatorConstants.RANGE_PREDICATE:
162                   return case_Join_Range_PredicateTypes(predicate1, predicate2, objectComparator);
163                case OperatorConstants.JOINCOMPARISONPREDICATE:
164                   return case_Join_Join_PredicateTypes(predicate1, predicate2, objectComparator);
165             }
166       }
167       return null;
168    }
169
170    private static predicate case_Equal_Equal_PredicateTypes(predicate equalPredicateValue1, predicate equalPredicateValue2, SuperComparator objectComparator) throws DException {
171       if (objectComparator.compare( ( (_ComparisonPredicate) equalPredicateValue1).getValue(), ( (_ComparisonPredicate) equalPredicateValue2).getValue()) == 0) {
172          return equalPredicateValue1;
173       }
174       return null;
175    }
176
177    private static predicate case_Equal_GreaterThan_PredicateTypes(predicate equalPredicateValue1, predicate greaterThanPredicateValue2, SuperComparator objectComparator) throws DException {
178       if (objectComparator.compare( ( (_ComparisonPredicate) greaterThanPredicateValue2).getValue(), ( (_ComparisonPredicate) equalPredicateValue1).getValue()) == -1) {
179          return equalPredicateValue1;
180       }
181       return null;
182    }
183
184    private static predicate case_Equal_GreaterThanEqualTo_PredicateTypes(predicate equalPredicateValue1, predicate greaterThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException {
185       if (objectComparator.compare( ( (_ComparisonPredicate) greaterThanEqualToPredicateValue2).getValue(), ( (_ComparisonPredicate) equalPredicateValue1).getValue()) == 1) {
186          return null;
187       }
188       return equalPredicateValue1;
189    }
190
191    private static predicate case_Equal_LessThan_PredicateTypes(predicate equalPredicateValue1, predicate lessThanPredicateValue2, SuperComparator objectComparator) throws DException {
192       if (objectComparator.compare( ( (_ComparisonPredicate) lessThanPredicateValue2).getValue(), ( (_ComparisonPredicate) equalPredicateValue1).getValue()) == 1) {
193          return equalPredicateValue1;
194       }
195       return null;
196    }
197
198    private static predicate case_Equal_LessThanEqualTo_PredicateTypes(predicate equalPredicateValue1, predicate equalLessThanEqualTo2, SuperComparator objectComparator) throws DException {
199       if (objectComparator.compare( ( (_ComparisonPredicate) equalLessThanEqualTo2).getValue(), ( (_ComparisonPredicate) equalPredicateValue1).getValue()) == -1) {
200          return null;
201       }
202       return equalPredicateValue1;
203    }
204
205    private static predicate case_Equal_Range_PredicateTypes(predicate equalPredicateValue1, predicate rangePredicate2, SuperComparator objectComparator) throws DException {
206       predicate resultantPredicateValue1 = getMergedPredicate(equalPredicateValue1, ( (RangePredicate) rangePredicate2).getBottomPredicate(), objectComparator);
207       if (resultantPredicateValue1 == null) {
208          return null;
209       }
210       return getMergedPredicate(resultantPredicateValue1, ( (RangePredicate) rangePredicate2).getTopPredicate(), objectComparator);
211    }
212
213     private static predicate case_GreaterThan_GreaterThan_PredicateTypes(predicate greaterThanPredicateValue1, predicate greaterThanPredicateValue2, SuperComparator objectComparator) throws DException {
214        if (objectComparator.compare( ( (_ComparisonPredicate) greaterThanPredicateValue1).getValue(), ( (_ComparisonPredicate) greaterThanPredicateValue2).getValue()) == -1) {
215           return greaterThanPredicateValue2;
216        }
217        return greaterThanPredicateValue1;
218     }
219
220    private static predicate case_GreaterThan_GreaterThanEqualTo_PredicateTypes(predicate greaterThanPredicateValue1, predicate greaterThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException {
221       if (objectComparator.compare( ( (_ComparisonPredicate) greaterThanEqualToPredicateValue2).getValue(), ( (_ComparisonPredicate) greaterThanPredicateValue1).getValue()) == 1) {
222          return greaterThanEqualToPredicateValue2;
223       }
224       return greaterThanPredicateValue1;
225    }
226
227    private static predicate case_GreaterThan_LessThan_PredicateTypes(predicate greaterThanPredicateValue1, predicate lessThanPredicateValue2, SuperComparator objectComparator) throws DException {
228       int equal = objectComparator.compare( ( (_ComparisonPredicate) lessThanPredicateValue2).getValue(), ( (_ComparisonPredicate) greaterThanPredicateValue1).getValue());
229       if (equal == 1) {
230          return new RangePredicate(lessThanPredicateValue2, greaterThanPredicateValue1);
231       }
232
233       return null;
234    }
235
236    private static predicate case_GreaterThan_LessThanEqualTo_PredicateTypes(predicate greaterThanPredicateValue1, predicate lessThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException {
237       if (objectComparator.compare( ( (_ComparisonPredicate) lessThanEqualToPredicateValue2).getValue(), ( (_ComparisonPredicate) greaterThanPredicateValue1).getValue()) == 1) {
238          return new RangePredicate(lessThanEqualToPredicateValue2, greaterThanPredicateValue1);
239       }
240       return null;
241    }
242
243    private static predicate case_GreaterThan_Range_PredicateTypes(predicate greaterThanPredicateValue1, predicate rangePredicateValue2, SuperComparator objectComparator) throws DException {
244       predicate p1 = getMergedPredicate( ( (RangePredicate) rangePredicateValue2).bottomPredicate, greaterThanPredicateValue1, objectComparator);
245       if (p1 == null) {
246          return null;
247       }
248       return getMergedPredicate( ( (RangePredicate) rangePredicateValue2).topPredicate, p1, objectComparator);
249
250    }
251
252     private static predicate case_GreaterThanEqualTo_GreaterThanEqualTo_PredicateTypes(predicate greaterThanEqualToPredicateValue1, predicate greaterThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException {
253        if (objectComparator.compare( ( (_ComparisonPredicate) greaterThanEqualToPredicateValue1).getValue(), ( (_ComparisonPredicate) greaterThanEqualToPredicateValue2).getValue()) == -1) {
254           return greaterThanEqualToPredicateValue2;
255        }
256
257        return greaterThanEqualToPredicateValue1;
258     }
259
260    private static predicate case_GreaterThanEqualTo_LessThan_PredicateTypes(predicate greaterThanEqualToPredicateValue1, predicate lessThanPredicateValue2, SuperComparator objectComparator) throws DException {
261       if (objectComparator.compare( ( (_ComparisonPredicate) lessThanPredicateValue2).getValue(), ( (_ComparisonPredicate) greaterThanEqualToPredicateValue1).getValue()) == 1) {
262          RangePredicate rp = new RangePredicate(lessThanPredicateValue2, greaterThanEqualToPredicateValue1);
263          return rp;
264       }
265       return null;
266    }
267
268    private static predicate case_GreaterThanEqualTo_LessThanEqualTo_PredicateTypes(predicate greaterThanEqualToPredicateValue1, predicate lessThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException {
269       int difference = objectComparator.compare( ( (_ComparisonPredicate) greaterThanEqualToPredicateValue1).getValue(), ( (_ComparisonPredicate) lessThanEqualToPredicateValue2).getValue());
270       if (difference == 1) {
271          return null;
272       }
273       if (difference == 0) {
274          ( (_ComparisonPredicate) greaterThanEqualToPredicateValue1).setOperator(OperatorConstants.EQUALTO);
275          return greaterThanEqualToPredicateValue1;
276       }
277       return new RangePredicate(lessThanEqualToPredicateValue2, greaterThanEqualToPredicateValue1);
278    }
279
280    private static predicate case_GreaterThanEqualTo_Range_PredicateTypes(predicate greaterThanEqualToPredicateValue1, predicate rangePredicateValue2, SuperComparator objectComparator) throws DException {
281       predicate p1 = getMergedPredicate( ( (RangePredicate) rangePredicateValue2).bottomPredicate, greaterThanEqualToPredicateValue1, objectComparator);
282       return getMergedPredicate( ( (RangePredicate) rangePredicateValue2).topPredicate, p1, objectComparator);
283    }
284
285     private static predicate case_LessThan_LessThan_PredicateTypes(predicate lessThanPredicateValue1, predicate lessThanPredicateValue2, SuperComparator objectComparator) throws DException {
286        if (objectComparator.compare( ( (_ComparisonPredicate) lessThanPredicateValue1).getValue(), ( (_ComparisonPredicate) lessThanPredicateValue2).getValue()) == -1) {
287           return lessThanPredicateValue1;
288        }
289        return lessThanPredicateValue2;
290     }
291
292    private static predicate case_LessThan_LessThanEqualTo_PredicateTypes(predicate lessThanPredicateValue1, predicate lessThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException {
293       if (objectComparator.compare( ( (_ComparisonPredicate) lessThanEqualToPredicateValue2).getValue(), ( (_ComparisonPredicate) lessThanPredicateValue1).getValue()) == -1) {
294          return lessThanEqualToPredicateValue2;
295       }
296       return lessThanPredicateValue1;
297    }
298
299    private static predicate case_LessThan_Range_PredicateTypes(predicate lessThanPredicateValue1, predicate rangePredicateValue2, SuperComparator objectComparator) throws DException {
300       predicate p1 = getMergedPredicate( ( (RangePredicate) rangePredicateValue2).topPredicate, lessThanPredicateValue1, objectComparator);
301       return getMergedPredicate( ( (RangePredicate) rangePredicateValue2).bottomPredicate, p1, objectComparator);
302    }
303
304     private static predicate case_LessThanEqualTo_LessThanEqualTo_PredicateTypes(predicate lessThanEqualToPredicateValue1, predicate lessThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException {
305        if (objectComparator.compare( ( (_ComparisonPredicate) lessThanEqualToPredicateValue2).getValue(), ( (_ComparisonPredicate) lessThanEqualToPredicateValue1).getValue()) == -1) {
306           return lessThanEqualToPredicateValue2;
307        }
308        return lessThanEqualToPredicateValue1;
309     }
310
311    private static predicate case_LessThanEqualTo_Range_PredicateTypes(predicate lessThanEqualToPredicateValue1, predicate rangePredicateValue2, SuperComparator objectComparator) throws DException {
312       predicate p1 = getMergedPredicate( ( (RangePredicate) rangePredicateValue2).topPredicate, lessThanEqualToPredicateValue1, objectComparator);
313       return getMergedPredicate( ( (RangePredicate) rangePredicateValue2).bottomPredicate, p1, objectComparator);
314    }
315
316    private static predicate case_Range_Range_PredicateTypes(predicate rangePredicateValue1, predicate rangePredicateValue2, SuperComparator objectComparator) throws DException {
317       predicate p1 = getMergedPredicate( ( (RangePredicate) rangePredicateValue1).topPredicate, ( (RangePredicate) rangePredicateValue2).topPredicate, objectComparator);
318       predicate p2 = getMergedPredicate( ( (RangePredicate) rangePredicateValue1).bottomPredicate, ( (RangePredicate) rangePredicateValue2).bottomPredicate, objectComparator);
319       return getMergedPredicate(p1, p2, objectComparator);
320    }
321
322    private static predicate case_Join_PredicateTypes(predicate predicate1, predicate predicate2, SuperComparator objectComparator) throws DException {
323       if (! (predicate2.getPredicateType() == OperatorConstants.JOINCOMPARISONPREDICATE)) {
324          predicate2 = new JoinPredicate(BVEPlanMerger.getBooleanFactor(predicate2));
325       }
326       return new JoinPredicate(BVEPlanMerger.addAndConditions(BVEPlanMerger.getBooleanFactor(predicate2), BVEPlanMerger.getBooleanFactor(predicate1)));
327    }
328
329    private static predicate case_Join_Range_PredicateTypes(predicate predicate1, predicate rangePredicate2, SuperComparator objectComparator) throws DException {
330       booleanvalueexpression joinCond = ( (JoinPredicate) predicate1).getCondition();
331       joinCond = BVEPlanMerger.addAndConditions(BVEPlanMerger.getBooleanFactor( ( (RangePredicate) rangePredicate2).getTopPredicate()), joinCond);
332       joinCond = BVEPlanMerger.addAndConditions(BVEPlanMerger.getBooleanFactor( ( (RangePredicate) rangePredicate2).getBottomPredicate()), joinCond);
333       return new JoinPredicate(joinCond);
334    }
335
336    private static JoinPredicate case_Join_Join_PredicateTypes(predicate predicate1, predicate predicate2, SuperComparator objectComparator) throws DException {
337       return new JoinPredicate(BVEPlanMerger.addAndConditions( ( (JoinPredicate) predicate1).getCondition(), ( (JoinPredicate) predicate2).getCondition()));
338    }
339
340    private static booleanfactor getBooleanFactor(booleanprimary bp) throws DException {
341       return new booleanfactor(new booleantest(bp));
342    }
343 } // end of class
344
Popular Tags