Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
OJBSearchFilter |
|
| 5.416666666666667;5.417 |
1 | package org.apache.ojb.broker.query; | |
2 | ||
3 | /* Copyright 2002-2005 The Apache Software Foundation | |
4 | * | |
5 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
6 | * you may not use this file except in compliance with the License. | |
7 | * You may obtain a copy of the License at | |
8 | * | |
9 | * http://www.apache.org/licenses/LICENSE-2.0 | |
10 | * | |
11 | * Unless required by applicable law or agreed to in writing, software | |
12 | * distributed under the License is distributed on an "AS IS" BASIS, | |
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | * See the License for the specific language governing permissions and | |
15 | * limitations under the License. | |
16 | */ | |
17 | ||
18 | import java.util.Enumeration; | |
19 | import java.util.Hashtable; | |
20 | import java.util.Vector; | |
21 | ||
22 | /** | |
23 | * OJB Search Filter Class for ObJectRelationalBridge O/R mapping tool | |
24 | * | |
25 | * This class builds a search filter tree, specifing how names and | |
26 | * values are to be compared when searching a database. | |
27 | * This extends SearchFilter and implements the Convert method | |
28 | * that produces the search filter string for the SQL database | |
29 | * | |
30 | * @author David Forslund | |
31 | * @author koenig | |
32 | * @version $Revision: 1.1 $ $Date: 2007-08-24 22:17:36 $ | |
33 | */ | |
34 | public class OJBSearchFilter extends SearchFilter | |
35 | { | |
36 | Criteria criteria = new Criteria(); | |
37 | ||
38 | /** | |
39 | * Constructors are not needed, as the base class has a default constructor. | |
40 | * | |
41 | */ | |
42 | ||
43 | /** | |
44 | * Change the search filter to one that specifies an element to | |
45 | * match or not match one of a list of values. | |
46 | * The old search filter is deleted. | |
47 | * | |
48 | * @param elementName is the name of the element to be matched | |
49 | * @param values is a vector of possible matches | |
50 | * @param oper is the IN or NOT_IN operator to indicate how to matche | |
51 | */ | |
52 | public void matchList(String elementName, Vector values, int oper) | |
53 | { | |
54 | ||
55 | // Delete the old search criteria | |
56 | criteria = new Criteria(); | |
57 | ||
58 | if (oper != NOT_IN) | |
59 | { | |
60 | for (int i = 0; i < values.size(); i++) | |
61 | { | |
62 | Criteria tempCrit = new Criteria(); | |
63 | ||
64 | tempCrit.addEqualTo(elementName, values.elementAt(i)); | |
65 | criteria.addOrCriteria(tempCrit); | |
66 | } | |
67 | } | |
68 | else | |
69 | { | |
70 | for (int i = 0; i < values.size(); i++) | |
71 | { | |
72 | criteria.addNotEqualTo(elementName, values.elementAt(i)); | |
73 | } | |
74 | } | |
75 | } | |
76 | ||
77 | /** | |
78 | * Change the search filter to one that specifies an element to not | |
79 | * match one of a list of values. | |
80 | * The old search filter is deleted. | |
81 | * | |
82 | * @param elementName is the name of the element to be matched | |
83 | * @param values is an array of possible matches | |
84 | * @param oper is the IN or NOT_IN operator to indicate how to matche | |
85 | */ | |
86 | public void matchList(String elementName, String[] values, int oper) | |
87 | { | |
88 | ||
89 | // see also matchList(String elementName, Vector values, int oper) | |
90 | // Delete the old search criteria | |
91 | criteria = new Criteria(); | |
92 | ||
93 | if (oper != NOT_IN) | |
94 | { | |
95 | for (int i = 0; i < values.length; i++) | |
96 | { | |
97 | Criteria tempCrit = new Criteria(); | |
98 | ||
99 | tempCrit.addEqualTo(elementName, values[i]); | |
100 | criteria.addOrCriteria(tempCrit); | |
101 | } | |
102 | } | |
103 | else | |
104 | { | |
105 | for (int i = 0; i < values.length; i++) | |
106 | { | |
107 | criteria.addNotEqualTo(elementName, values[i]); | |
108 | } | |
109 | } | |
110 | } | |
111 | ||
112 | /** | |
113 | * Change the search filter to one that specifies an element to not | |
114 | * match one of a list of integer values. | |
115 | * The old search filter is deleted. | |
116 | * | |
117 | * @param elementName is the name of the element to be matched | |
118 | * @param values is an array of possible integer matches | |
119 | * @param oper is the IN or NOT_IN operator to indicate how to matche | |
120 | */ | |
121 | public void matchList(String elementName, int[] values, int oper) | |
122 | { | |
123 | ||
124 | // see also matchList(String elementName, Vector values, int oper) | |
125 | // Delete the old search criteria | |
126 | criteria = new Criteria(); | |
127 | ||
128 | if (oper != NOT_IN) | |
129 | { | |
130 | for (int i = 0; i < values.length; i++) | |
131 | { | |
132 | Criteria tempCrit = new Criteria(); | |
133 | ||
134 | tempCrit.addEqualTo(elementName, new Integer(values[i])); | |
135 | criteria.addOrCriteria(tempCrit); | |
136 | } | |
137 | } | |
138 | else | |
139 | { | |
140 | for (int i = 0; i < values.length; i++) | |
141 | { | |
142 | criteria.addNotEqualTo(elementName, new Integer(values[i])); | |
143 | } | |
144 | } | |
145 | } | |
146 | ||
147 | /** | |
148 | * Change the search filter to one that specifies an element to not | |
149 | * match one single value. | |
150 | * The old search filter is deleted. | |
151 | * | |
152 | * @param elementName is the name of the element to be matched | |
153 | * @param value is the value to not be matched | |
154 | * @param oper is the IN or NOT_IN operator to indicate how to matche | |
155 | */ | |
156 | public void matchValue(String elementName, String value, int oper) | |
157 | { | |
158 | ||
159 | // Delete the old search criteria | |
160 | criteria = new Criteria(); | |
161 | ||
162 | if (oper != NOT_IN) | |
163 | { | |
164 | criteria.addEqualTo(elementName, value); | |
165 | } | |
166 | else | |
167 | { | |
168 | criteria.addNotEqualTo(elementName, value); | |
169 | } | |
170 | } | |
171 | ||
172 | /** | |
173 | * ----------------------------------------------------------- | |
174 | * @param elementName | |
175 | * @param value | |
176 | * @param oper | |
177 | */ | |
178 | public void matchValue(String elementName, int value, int oper) | |
179 | { | |
180 | ||
181 | // Delete the old search criteria | |
182 | criteria = new Criteria(); | |
183 | ||
184 | if (oper != NOT_IN) | |
185 | { | |
186 | criteria.addEqualTo(elementName, new Integer(value)); | |
187 | } | |
188 | else | |
189 | { | |
190 | criteria.addNotEqualTo(elementName, new Integer(value)); | |
191 | } | |
192 | } | |
193 | ||
194 | /** | |
195 | * Change the search filter to one that compares an element name to a value. | |
196 | * The old search filter is deleted. | |
197 | * | |
198 | * @param elementName is the name of the element to be tested | |
199 | * @param value is the value to be compared against | |
200 | * @param oper is the binary comparison operator to be used | |
201 | * @exception DBException | |
202 | */ | |
203 | public void compareFilter(String elementName, String value, | |
204 | int oper) throws DBException | |
205 | { | |
206 | ||
207 | // Delete the old search criteria | |
208 | criteria = new Criteria(); | |
209 | ||
210 | // If this is not a binary operator, throw an exception | |
211 | if ((oper & BINARY_OPER_MASK) == 0) | |
212 | { | |
213 | throw new DBException(); | |
214 | } | |
215 | ||
216 | switch (oper) | |
217 | { | |
218 | ||
219 | case LIKE: | |
220 | { | |
221 | criteria.addLike(elementName, value); | |
222 | ||
223 | break; | |
224 | } | |
225 | ||
226 | case EQUAL: | |
227 | { | |
228 | criteria.addEqualTo(elementName, value); | |
229 | ||
230 | break; | |
231 | } | |
232 | ||
233 | case NOT_EQUAL: | |
234 | { | |
235 | criteria.addNotEqualTo(elementName, value); | |
236 | ||
237 | break; | |
238 | } | |
239 | ||
240 | case LESS_THAN: | |
241 | { | |
242 | criteria.addLessThan(elementName, value); | |
243 | ||
244 | break; | |
245 | } | |
246 | ||
247 | case GREATER_THAN: | |
248 | { | |
249 | criteria.addGreaterThan(elementName, value); | |
250 | ||
251 | break; | |
252 | } | |
253 | ||
254 | case GREATER_EQUAL: | |
255 | { | |
256 | criteria.addGreaterOrEqualThan(elementName, value); | |
257 | ||
258 | break; | |
259 | } | |
260 | ||
261 | case LESS_EQUAL: | |
262 | { | |
263 | criteria.addLessOrEqualThan(elementName, value); | |
264 | ||
265 | break; | |
266 | } | |
267 | ||
268 | default: | |
269 | { | |
270 | throw new DBException("Unsupported binary operation in OJBSearchFilter!"); | |
271 | } | |
272 | } | |
273 | } | |
274 | ||
275 | /** | |
276 | * Change the search filter to one that specifies a set of elements and their values | |
277 | * that must match, and the operator to use to combine the elements. | |
278 | * Each key is compared for an equal match to the value, and all | |
279 | * comparisons are combined by the specified logical operator (OR or AND). | |
280 | * The old search filter is deleted. | |
281 | * | |
282 | * @param elements is a hashtable holding key-value pairs | |
283 | * @param combine_op is the logical operator to be used to combine the comparisons | |
284 | * @param compare_op is the binary operator to be used for the comparisons | |
285 | * @exception DBException | |
286 | */ | |
287 | public void matchSet(Hashtable elements, int combine_op, | |
288 | int compare_op) throws DBException | |
289 | { | |
290 | ||
291 | // Delete the old search criteria | |
292 | criteria = new Criteria(); | |
293 | ||
294 | // If compare_op is not a binary operator, throw an exception | |
295 | if ((compare_op & BINARY_OPER_MASK) == 0) | |
296 | { | |
297 | throw new DBException(); | |
298 | } | |
299 | ||
300 | if (combine_op == AND) | |
301 | { | |
302 | // combine all value pairs by an AND | |
303 | ||
304 | // For each of the elements in the hashtable, create a comparison node for the match | |
305 | for (Enumeration e = elements.keys(); e.hasMoreElements();) | |
306 | { | |
307 | ||
308 | // Get the element name from the enumerator | |
309 | // and its value | |
310 | String elementName = (String) e.nextElement(); | |
311 | String elementValue = (String) elements.get(elementName); | |
312 | ||
313 | switch (compare_op) | |
314 | { | |
315 | ||
316 | case LIKE: | |
317 | { | |
318 | criteria.addLike(elementName, elementValue); | |
319 | ||
320 | break; | |
321 | } | |
322 | ||
323 | case EQUAL: | |
324 | { | |
325 | criteria.addEqualTo(elementName, elementValue); | |
326 | ||
327 | break; | |
328 | } | |
329 | ||
330 | case NOT_EQUAL: | |
331 | { | |
332 | criteria.addNotEqualTo(elementName, elementValue); | |
333 | ||
334 | break; | |
335 | } | |
336 | ||
337 | case LESS_THAN: | |
338 | { | |
339 | criteria.addLessThan(elementName, elementValue); | |
340 | ||
341 | break; | |
342 | } | |
343 | ||
344 | case GREATER_THAN: | |
345 | { | |
346 | criteria.addGreaterThan(elementName, elementValue); | |
347 | ||
348 | break; | |
349 | } | |
350 | ||
351 | case GREATER_EQUAL: | |
352 | { | |
353 | criteria.addGreaterOrEqualThan(elementName, elementValue); | |
354 | ||
355 | break; | |
356 | } | |
357 | ||
358 | case LESS_EQUAL: | |
359 | { | |
360 | criteria.addLessOrEqualThan(elementName, elementValue); | |
361 | ||
362 | break; | |
363 | } | |
364 | ||
365 | default: | |
366 | { | |
367 | throw new DBException("Unsupported binary operation in OJBSearchFilter!"); | |
368 | } | |
369 | } // end of switch | |
370 | } // end of for | |
371 | } | |
372 | else if (combine_op == OR) | |
373 | { | |
374 | // combine all value pairs by an OR | |
375 | // For each of the elements in the hashtable, create a comparison node for the match | |
376 | for (Enumeration e = elements.keys(); e.hasMoreElements();) | |
377 | { | |
378 | ||
379 | // Get the element name from the enumerator | |
380 | // and its value | |
381 | String elementName = (String) e.nextElement(); | |
382 | String elementValue = (String) elements.get(elementName); | |
383 | ||
384 | switch (compare_op) | |
385 | { | |
386 | ||
387 | case LIKE: | |
388 | { | |
389 | Criteria tempCrit = new Criteria(); | |
390 | ||
391 | tempCrit.addLike(elementName, elementValue); | |
392 | criteria.addOrCriteria(tempCrit); | |
393 | ||
394 | break; | |
395 | } | |
396 | ||
397 | case EQUAL: | |
398 | { | |
399 | Criteria tempCrit = new Criteria(); | |
400 | ||
401 | tempCrit.addEqualTo(elementName, elementValue); | |
402 | criteria.addOrCriteria(tempCrit); | |
403 | ||
404 | break; | |
405 | } | |
406 | ||
407 | case NOT_EQUAL: | |
408 | { | |
409 | Criteria tempCrit = new Criteria(); | |
410 | ||
411 | tempCrit.addNotEqualTo(elementName, elementValue); | |
412 | criteria.addOrCriteria(tempCrit); | |
413 | ||
414 | break; | |
415 | } | |
416 | ||
417 | case LESS_THAN: | |
418 | { | |
419 | Criteria tempCrit = new Criteria(); | |
420 | ||
421 | tempCrit.addLessThan(elementName, elementValue); | |
422 | criteria.addOrCriteria(tempCrit); | |
423 | ||
424 | break; | |
425 | } | |
426 | ||
427 | case GREATER_THAN: | |
428 | { | |
429 | Criteria tempCrit = new Criteria(); | |
430 | ||
431 | tempCrit.addGreaterThan(elementName, elementValue); | |
432 | criteria.addOrCriteria(tempCrit); | |
433 | ||
434 | break; | |
435 | } | |
436 | ||
437 | case GREATER_EQUAL: | |
438 | { | |
439 | Criteria tempCrit = new Criteria(); | |
440 | ||
441 | tempCrit.addGreaterOrEqualThan(elementName, elementValue); | |
442 | criteria.addOrCriteria(tempCrit); | |
443 | ||
444 | break; | |
445 | } | |
446 | ||
447 | case LESS_EQUAL: | |
448 | { | |
449 | Criteria tempCrit = new Criteria(); | |
450 | ||
451 | tempCrit.addLessOrEqualThan(elementName, elementValue); | |
452 | criteria.addOrCriteria(tempCrit); | |
453 | ||
454 | break; | |
455 | } | |
456 | ||
457 | default: | |
458 | { | |
459 | throw new DBException("Unsupported binary operation in OJBSearchFilter!"); | |
460 | } | |
461 | } // end of switch | |
462 | } // end of for | |
463 | ||
464 | } | |
465 | else | |
466 | { | |
467 | ||
468 | // combine_op is not a logical operator, throw an exception | |
469 | throw new DBException(); | |
470 | } | |
471 | } | |
472 | ||
473 | /** | |
474 | * Change the search filter to one that specifies a set of elements and their values | |
475 | * that must match, and the operator to use to combine the elements. | |
476 | * Each element name is compared for an equal match to the value, and all | |
477 | * comparisons are combined by the specified logical operator (OR or AND). | |
478 | * The old search filter is deleted. | |
479 | * | |
480 | * @param elementNames is an array of names of elements to be tested | |
481 | * @param elementValues is an array of values for the corresponding element | |
482 | * @param op is the logical operator to be used to combine the comparisons | |
483 | * @exception DBException | |
484 | */ | |
485 | public void matchSet(String[] elementNames, String[] elementValues, | |
486 | int op) throws DBException | |
487 | { | |
488 | ||
489 | // Delete the old search criteria | |
490 | criteria = new Criteria(); | |
491 | ||
492 | if (op == OR) | |
493 | { | |
494 | // For each of the elements in the array, create a leaf node for the match | |
495 | for (int i = 0; i < elementNames.length; i++) | |
496 | { | |
497 | Criteria tempCrit = new Criteria(); | |
498 | ||
499 | tempCrit.addEqualTo(elementNames[i], elementValues[i]); | |
500 | criteria.addOrCriteria(tempCrit); | |
501 | } | |
502 | } | |
503 | else if (op == AND) | |
504 | { | |
505 | for (int i = 0; i < elementNames.length; i++) | |
506 | { | |
507 | criteria.addEqualTo(elementNames[i], elementValues[i]); | |
508 | } | |
509 | } | |
510 | else | |
511 | { | |
512 | throw new DBException(); | |
513 | } | |
514 | } | |
515 | ||
516 | /** | |
517 | * Combine other search filters with this one, using the specific operator. | |
518 | * | |
519 | * @param new_filters is a vector of SearchFilter classes to be combined | |
520 | * @param op is the logical operator to be used to combine the filters | |
521 | * @exception DBException | |
522 | */ | |
523 | public void combine(Vector new_filters, int op) throws DBException | |
524 | { | |
525 | for (Enumeration elems = new_filters.elements(); elems.hasMoreElements();) | |
526 | { | |
527 | SearchFilter filter = (SearchFilter) elems.nextElement(); | |
528 | ||
529 | combine(filter, op); | |
530 | } | |
531 | } | |
532 | ||
533 | /** | |
534 | * Combine one other search filters with this one, using the specific operator. | |
535 | * | |
536 | * @param new_filter is the SearchFilter class to be combined | |
537 | * @param op is the logical operator to be used to combine the filters | |
538 | * @exception DBException | |
539 | */ | |
540 | public void combine(SearchFilter new_filter, int op) throws DBException | |
541 | { | |
542 | ||
543 | // cast down to OJBSearchFilter | |
544 | OJBSearchFilter ojbFilter = (OJBSearchFilter) new_filter; | |
545 | ||
546 | switch (op) | |
547 | { | |
548 | ||
549 | case OR: | |
550 | { | |
551 | criteria.addOrCriteria(ojbFilter.getCriteria()); | |
552 | break; | |
553 | } | |
554 | ||
555 | case AND: | |
556 | { | |
557 | criteria.addAndCriteria(ojbFilter.getCriteria()); | |
558 | break; | |
559 | } | |
560 | ||
561 | default: | |
562 | { | |
563 | throw new DBException(); | |
564 | } | |
565 | } | |
566 | } | |
567 | ||
568 | /** | |
569 | * Converts this search filter into a search string | |
570 | * Note: | |
571 | * ObJectRelationalBridge can't parse a SQL string yet, the functionality | |
572 | * is therefor not implemented! | |
573 | */ | |
574 | ||
575 | /** | |
576 | * ----------------------------------------------------------- | |
577 | * @return | |
578 | */ | |
579 | public String toString() | |
580 | { | |
581 | ||
582 | // return ""; | |
583 | return criteria.toString(); | |
584 | } | |
585 | ||
586 | /** | |
587 | * Returns the search critera | |
588 | * | |
589 | */ | |
590 | ||
591 | /** | |
592 | * ----------------------------------------------------------- | |
593 | * @return | |
594 | */ | |
595 | protected Criteria getCriteria() | |
596 | { | |
597 | ||
598 | // return the search criteria | |
599 | return criteria; | |
600 | } | |
601 | ||
602 | } |