1 package org.apache.torque.util;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.io.Serializable;
23 import java.math.BigDecimal;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.GregorianCalendar;
29 import java.util.HashMap;
30 import java.util.Iterator;
31 import java.util.LinkedHashMap;
32 import java.util.List;
33 import java.util.Map;
34 import java.util.Set;
35
36 import org.apache.commons.logging.Log;
37 import org.apache.commons.logging.LogFactory;
38 import org.apache.torque.Column;
39 import org.apache.torque.ColumnImpl;
40 import org.apache.torque.Torque;
41 import org.apache.torque.TorqueException;
42 import org.apache.torque.criteria.CriteriaInterface;
43 import org.apache.torque.criteria.Join;
44 import org.apache.torque.criteria.JoinType;
45 import org.apache.torque.criteria.SqlEnum;
46 import org.apache.torque.om.ObjectKey;
47 import org.apache.torque.sql.OrderBy;
48 import org.apache.torque.sql.Query;
49 import org.apache.torque.sql.SqlBuilder;
50
51 /**
52 * Encapsulates conditions to access rows in database tables.
53 *
54 * @author <a href="mailto:frank.kim@clearink.com">Frank Y. Kim</a>
55 * @author <a href="mailto:jmcnally@collab.net">John D. McNally</a>
56 * @author <a href="mailto:bmclaugh@algx.net">Brett McLaughlin</a>
57 * @author <a href="mailto:eric@dobbse.net">Eric Dobbs</a>
58 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
59 * @author <a href="mailto:sam@neurogrid.com">Sam Joseph</a>
60 * @author <a href="mailto:mpoeschl@marmot.at">Martin Poeschl</a>
61 * @author <a href="mailto:fischer@seitenbau.de">Thomas Fischer</a>
62 * @author <a href="mailto:seade@backstagetech.com.au">Scott Eade</a>
63 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
64 * @version $Id: Criteria.java 1377463 2012-08-26 17:24:02Z tv $
65 *
66 * @deprecated This class will be removed in a future version of Torque.
67 * Use org.apache.torque.criteria.Criteria instead; note that
68 * that class has another semantics of the add.. and or.. methods.
69 */
70 @Deprecated
71 public class Criteria implements Serializable, CriteriaInterface<Criteria>
72 {
73 /** Serial version. */
74 private static final long serialVersionUID = -9001666575933085601L;
75
76 /** Comparison type. */
77 public static final SqlEnum EQUAL = SqlEnum.EQUAL;
78
79 /** Comparison type. */
80 public static final SqlEnum NOT_EQUAL = SqlEnum.NOT_EQUAL;
81
82 /** Comparison type. */
83 public static final SqlEnum ALT_NOT_EQUAL = SqlEnum.ALT_NOT_EQUAL;
84
85 /** Comparison type. */
86 public static final SqlEnum GREATER_THAN = SqlEnum.GREATER_THAN;
87
88 /** Comparison type. */
89 public static final SqlEnum LESS_THAN = SqlEnum.LESS_THAN;
90
91 /** Comparison type. */
92 public static final SqlEnum GREATER_EQUAL = SqlEnum.GREATER_EQUAL;
93
94 /** Comparison type. */
95 public static final SqlEnum LESS_EQUAL = SqlEnum.LESS_EQUAL;
96
97 /** Comparison type. */
98 public static final SqlEnum LIKE = SqlEnum.LIKE;
99
100 /** Comparison type. */
101 public static final SqlEnum NOT_LIKE = SqlEnum.NOT_LIKE;
102
103 /** Comparison type. */
104 public static final SqlEnum ILIKE = SqlEnum.ILIKE;
105
106 /** Comparison type. */
107 public static final SqlEnum NOT_ILIKE = SqlEnum.NOT_ILIKE;
108
109 /** Comparison type. */
110 public static final SqlEnum CUSTOM = SqlEnum.CUSTOM;
111
112 /** Comparison type. */
113 public static final SqlEnum DISTINCT = SqlEnum.DISTINCT;
114
115 /** Comparison type. */
116 public static final SqlEnum IN = SqlEnum.IN;
117
118 /** Comparison type. */
119 public static final SqlEnum NOT_IN = SqlEnum.NOT_IN;
120
121 /** Comparison type. */
122 public static final SqlEnum ALL = SqlEnum.ALL;
123
124 /** Comparison type. */
125 public static final SqlEnum JOIN = SqlEnum.JOIN;
126
127 /** "IS NULL" null comparison */
128 public static final SqlEnum ISNULL = SqlEnum.ISNULL;
129
130 /** "IS NOT NULL" null comparison */
131 public static final SqlEnum ISNOTNULL = SqlEnum.ISNOTNULL;
132
133 /** "CURRENT_DATE" ANSI SQL function */
134 public static final SqlEnum CURRENT_DATE = SqlEnum.CURRENT_DATE;
135
136 /** "CURRENT_TIME" ANSI SQL function */
137 public static final SqlEnum CURRENT_TIME = SqlEnum.CURRENT_TIME;
138
139 /** "LEFT JOIN" SQL statement */
140 public static final JoinType LEFT_JOIN = JoinType.LEFT_JOIN;
141
142 /** "RIGHT JOIN" SQL statement */
143 public static final JoinType RIGHT_JOIN = JoinType.RIGHT_JOIN;
144
145 /** "INNER JOIN" SQL statement */
146 public static final JoinType INNER_JOIN = JoinType.INNER_JOIN;
147
148 /** Whether to ignore the case in all String conditions in the criteria. */
149 private boolean ignoreCase = false;
150
151 /** Whether the result must be a single record. */
152 private boolean singleRecord = false;
153
154 /** List of modifiers like DISTICT. */
155 private final UniqueList<String> selectModifiers = new UniqueList<String>();
156
157 /** List of all columns to select. */
158 private final UniqueColumnList selectColumns = new UniqueColumnList();
159
160 /** All "order by" clauses, containing the order ASC or DESC. */
161 private final UniqueList<OrderBy> orderByColumns = new UniqueList<OrderBy>();
162
163 /** The names of columns to add to a groupBy clause */
164 private final UniqueColumnList groupByColumns = new UniqueColumnList();
165
166 /** The having clause in a query. */
167 private Criterion having = null;
168
169 /** The criterion objects, keyed by the column. */
170 private final Map<Column, Criteria.Criterion> criterionMap
171 = new HashMap<Column, Criteria.Criterion>();
172
173 /**
174 * Maps column alias names to the real column names.
175 * The key of the map is the alias and the value is the real column.
176 */
177 private final Map<String, Column> asColumns
178 = new LinkedHashMap<String, Column>();
179
180 /** Contains all joins. */
181 private final List<Join> joins = new ArrayList<Join>();
182
183 /** The name of the database. */
184 private String dbName;
185
186 /** The name of the database as given in the contructor. */
187 private final String originalDbName;
188
189 /**
190 * To limit the number of rows to return. <code>-1</code> means return all
191 * rows.
192 */
193 private int limit = -1;
194
195 /** To start the results at a row other than the first one. */
196 private long offset = 0;
197
198 /**
199 * Aliases for table names. The key of the map is the alias,
200 * and the value is the real name of the table.
201 */
202 private final Map<String, String> aliases = new HashMap<String, String>();
203
204 /** the log. */
205 private static Log log = LogFactory.getLog(Criteria.class);
206
207 /**
208 * Creates a new instance with the default capacity.
209 */
210 public Criteria()
211 {
212 this(Torque.getDefaultDB());
213 }
214
215 /**
216 * Creates a new instance with the specified capacity.
217 *
218 * @param initialCapacity An int.
219 *
220 * @deprecated initialCapacity is disregarded
221 */
222 @Deprecated
223 public Criteria(int initialCapacity)
224 {
225 this(Torque.getDefaultDB());
226 }
227
228 /**
229 * Creates a new instance with the default capacity which corresponds to
230 * the specified database.
231 *
232 * @param dbName The dabase name.
233 */
234 public Criteria(String dbName)
235 {
236 this.dbName = dbName;
237 this.originalDbName = dbName;
238 }
239
240 /**
241 * Creates a new instance with the specified capacity which corresponds to
242 * the specified database.
243 *
244 * @param dbName The dabase name.
245 * @param initialCapacity The initial capacity.
246 *
247 * @deprecated initialCapacity is disregarded
248 */
249 @Deprecated
250 public Criteria(String dbName, int initialCapacity)
251 {
252 this.dbName = dbName;
253 this.originalDbName = dbName;
254 }
255
256 /**
257 * Brings this criteria back to its initial state, so that it
258 * can be reused as if it was new. Except if the criteria has grown in
259 * capacity, it is left at the current capacity.
260 */
261 public void clear()
262 {
263 criterionMap.clear();
264 ignoreCase = false;
265 singleRecord = false;
266 selectModifiers.clear();
267 selectColumns.clear();
268 orderByColumns.clear();
269 groupByColumns.clear();
270 having = null;
271 asColumns.clear();
272 joins.clear();
273 dbName = originalDbName;
274 offset = 0;
275 limit = -1;
276 aliases.clear();
277 }
278
279 /**
280 * Add an AS clause to the select columns. Usage:
281 * <p>
282 * <code>
283 *
284 * Criteria myCrit = new Criteria();
285 * myCrit.addAsColumn("alias", "ALIAS("+MyPeer.ID+")");
286 *
287 * </code>
288 *
289 * @param name wanted Name of the column
290 * @param clause SQL clause to select from the table
291 *
292 * If the name already exists, it is replaced by the new clause.
293 *
294 * @return A modified Criteria object.
295 */
296 public Criteria addAsColumn(String name, Column clause)
297 {
298 asColumns.put(name, clause);
299 return this;
300 }
301
302 /**
303 * Add an AS clause to the select columns. Usage:
304 * <p>
305 * <code>
306 *
307 * Criteria myCrit = new Criteria();
308 * myCrit.addAsColumn("alias", "ALIAS("+MyPeer.ID+")");
309 *
310 * </code>
311 *
312 * @param name wanted Name of the column
313 * @param clause SQL clause to select from the table
314 *
315 * If the name already exists, it is replaced by the new clause.
316 *
317 * @return A modified Criteria object.
318 */
319 public Criteria addAsColumn(String name, String clause)
320 {
321 asColumns.put(name, new ColumnImpl(clause));
322 return this;
323 }
324
325 /**
326 * Get the column aliases.
327 *
328 * @return A Map which map the column alias names
329 * to the alias clauses.
330 */
331 public Map<String, Column> getAsColumns()
332 {
333 return asColumns;
334 }
335
336 /**
337 * Get the table aliases.
338 *
339 * @return A Map which maps the table alias names to the actual table names.
340 */
341 public Map<String, String> getAliases()
342 {
343 return aliases;
344 }
345
346 /**
347 * Allows one to specify an alias for a table that can
348 * be used in various parts of the SQL.
349 *
350 * @param alias a <code>String</code> value
351 * @param table a <code>String</code> value
352 */
353 public void addAlias(String alias, String table)
354 {
355 aliases.put(alias, table);
356 }
357
358 /**
359 * Returns the table name associated with an alias.
360 *
361 * @param alias a <code>String</code> value
362 * @return a <code>String</code> value
363 */
364 public String getTableForAlias(String alias)
365 {
366 return aliases.get(alias);
367 }
368
369 /**
370 * Does this Criteria Object contain the specified key?
371 *
372 * @param table The name of the table.
373 * @param column The name of the column.
374 * @return True if this Criteria Object contain the specified key.
375 *
376 * @deprecated this method does not check in all cases whether a matching
377 * criterion is contained (e.g. if the criterion has been added
378 * manually with another key).
379 */
380 @Deprecated
381 public boolean containsKey(String table, String column)
382 {
383 return containsTopLevelColumn(new ColumnImpl(table, column));
384 }
385
386 /**
387 * Checks whether a Criteria contains a column with the given column's
388 * SQL expression a a top level Criterion.
389 *
390 * @param column the column to check, not null.
391 *
392 * @return true if a top-level criterion with the same column sql expression
393 * is contained, false otherwise.
394 */
395 private boolean containsTopLevelColumn(Column column)
396 {
397 for (Column candidate : criterionMap.keySet())
398 {
399 if (candidate.getSqlExpression().equals(
400 column.getSqlExpression()))
401 {
402 return true;
403 }
404 }
405 return false;
406 }
407
408 /**
409 * Return the criterion for a column.
410 *
411 * @param column the column to get the criterion for.
412 * @return the Criterion, or null if no criterion is defined
413 * for this column.
414 */
415 public Criterion getCriterion(Column column)
416 {
417 for (Map.Entry<Column, Criterion> mapEntry : criterionMap.entrySet())
418 {
419 if (mapEntry.getKey().getSqlExpression().equals(
420 column.getSqlExpression()))
421 {
422 return mapEntry.getValue();
423 }
424 }
425 return null;
426 }
427
428 /**
429 * Method to return criteria related to a column in a table.
430 *
431 * @param column the column to get the criterion for.
432 * @return A Criterion.
433 */
434 public Criterion getCriterion(String column)
435 {
436 return getCriterion(new ColumnImpl(column));
437 }
438
439 /**
440 * Method to return criteria related to a column in a table.
441 *
442 * @param table String name of table.
443 * @param column String name of column.
444 * @return A Criterion.
445 */
446 public Criterion getCriterion(String table, String column)
447 {
448 return getCriterion(new ColumnImpl(table, column));
449 }
450
451 /**
452 * Method to return criterion that is not added automatically
453 * to this Criteria. This can be used to chain the
454 * Criterions to form a more complex where clause.
455 *
456 * @param column String full name of column (for example TABLE.COLUMN).
457 * @param value The value to compare to.
458 * @param comparison the comparison to use.
459 *
460 * @return A Criterion.
461 */
462 public Criterion getNewCriterion(Column column, Object value,
463 SqlEnum comparison)
464 {
465 return new Criterion(column, value, comparison);
466 }
467
468 /**
469 * Method to return criterion that is not added automatically
470 * to this Criteria. This can be used to chain the
471 * Criterions to form a more complex where clause.
472 *
473 * @param column String full name of column (for example TABLE.COLUMN).
474 * @param value The value to compare to.
475 * @param comparison the comparison to use.
476 *
477 * @return A Criterion.
478 */
479 public Criterion getNewCriterion(String column, Object value,
480 SqlEnum comparison)
481 {
482 return new Criterion(new ColumnImpl(column), value, comparison);
483 }
484
485 /**
486 * Method to return criterion that is not added automatically
487 * to this Criteria. This can be used to chain the
488 * Criterions to form a more complex where clause.
489 *
490 * @param table String name of table.
491 * @param column String name of column.
492 * @return A Criterion.
493 */
494 public Criterion getNewCriterion(String table, String column,
495 Object value, SqlEnum comparison)
496 {
497 return new Criterion(table, column, value, comparison);
498 }
499
500 /**
501 * This method adds a prepared Criterion object to the Criteria.
502 * You can get a new, empty Criterion object with the
503 * getNewCriterion() method. If a criterion for the requested column
504 * already exists, it is replaced. This is used as follows:
505 *
506 * <p>
507 * <code>
508 * Criteria crit = new Criteria();
509 * Criteria.Criterion c = crit
510 * .getNewCriterion(XXXPeer.ID, new Integer(5), Criteria.LESS_THAN);
511 * crit.add(c);
512 * </code>
513 *
514 * @param c A Criterion object
515 *
516 * @return A modified Criteria object.
517 */
518 public Criteria add(Criterion c)
519 {
520 criterionMap.put(c.getColumn(), c);
521 return this;
522 }
523
524 /**
525 * Method to return a comparison String.
526 *
527 * @param key String name of the key.
528 * @return A String with the value of the object at key.
529 */
530 public SqlEnum getComparison(Column key)
531 {
532 return getCriterion(key).getComparison();
533 }
534
535 /**
536 * Method to return a comparison String.
537 *
538 * @param table String name of table.
539 * @param column String name of column.
540 * @return A String with the value of the object at key.
541 */
542 public SqlEnum getComparison(String table, String column)
543 {
544 return getComparison(new ColumnImpl(table, column));
545 }
546
547 /**
548 * Get the Database(Map) name.
549 *
550 * @return A String with the Database(Map) name. By default, this
551 * is PoolBrokerService.DEFAULT.
552 */
553 public String getDbName()
554 {
555 return dbName;
556 }
557
558 /**
559 * Set the DatabaseMap name. If <code>null</code> is supplied, uses value
560 * provided by <code>Torque.getDefaultDB()</code>.
561 *
562 * @param dbName A String with the Database(Map) name.
563 */
564 public void setDbName(String dbName)
565 {
566 this.dbName = (dbName == null ? Torque.getDefaultDB() : dbName.trim());
567 }
568
569 /**
570 * Convenience method to return value as a boolean.
571 *
572 * @param column The column to retrieve the value for.
573 *
574 * @return A boolean.
575 */
576 public boolean getBoolean(Column column)
577 {
578 return ((Boolean) getCriterion(column).getValue()).booleanValue();
579 }
580
581 /**
582 * Convenience method to return value as a boolean.
583 *
584 * @param table String name of table.
585 * @param column String name of column.
586 * @return A boolean.
587 */
588 public boolean getBoolean(String table, String column)
589 {
590 return getBoolean(new ColumnImpl(table, column));
591 }
592
593 /**
594 * Convenience method to return a Date.
595 *
596 * @param column The column to retrieve the value for.
597 *
598 * @return A java.util.Date with the value of object at key.
599 */
600 public java.util.Date getDate(Column column)
601 {
602 return (java.util.Date) getCriterion(column).getValue();
603 }
604
605 /**
606 * Convenience method to return a Date.
607 *
608 * @param table String name of table.
609 * @param column String name of column.
610 * @return A java.util.Date with the value of object at key.
611 */
612 public java.util.Date getDate(String table, String column)
613 {
614 return getDate(new ColumnImpl(table, column));
615 }
616
617 /**
618 * Convenience method to return a double.
619 *
620 * @param column The column to retrieve the value for.
621 *
622 * @return A double with the value of object at key.
623 */
624 public double getDouble(Column column)
625 {
626 Object obj = getCriterion(column).getValue();
627 if (obj instanceof String)
628 {
629 return new Double((String) obj).doubleValue();
630 }
631 return ((Double) obj).doubleValue();
632 }
633
634 /**
635 * Convenience method to return a double.
636 *
637 * @param table String name of table.
638 * @param column String name of column.
639 * @return A double with the value of object at key.
640 */
641 public double getDouble(String table, String column)
642 {
643 return getDouble(new ColumnImpl(table, column));
644 }
645
646 /**
647 * Convenience method to return a float.
648 *
649 * @param column The column to retrieve the value for.
650 *
651 * @return A float with the value of object at key.
652 */
653 public float getFloat(Column column)
654 {
655 Object obj = getCriterion(column).getValue();
656 if (obj instanceof String)
657 {
658 return new Float((String) obj).floatValue();
659 }
660 return ((Float) obj).floatValue();
661 }
662
663 /**
664 * Convenience method to return a float.
665 *
666 * @param table String name of table.
667 * @param column String name of column.
668 * @return A float with the value of object at key.
669 */
670 public float getFloat(String table, String column)
671 {
672 return getFloat(new ColumnImpl(table, column));
673 }
674
675 /**
676 * Convenience method to return an Integer.
677 *
678 * @param column The column to retrieve the value for.
679 *
680 * @return An Integer with the value of object at key.
681 */
682 public Integer getInteger(Column column)
683 {
684 Object obj = getCriterion(column).getValue();
685 if (obj instanceof String)
686 {
687 return new Integer((String) obj);
688 }
689 return ((Integer) obj);
690 }
691
692 /**
693 * Convenience method to return an Integer.
694 *
695 * @param table String name of table.
696 * @param column String name of column.
697 * @return An Integer with the value of object at key.
698 */
699 public Integer getInteger(String table, String column)
700 {
701 return getInteger(new ColumnImpl(table, column));
702 }
703
704 /**
705 * Convenience method to return an int.
706 *
707 * @param column The column to retrieve the value for.
708 *
709 * @return An int with the value of object at key.
710 */
711 public int getInt(Column column)
712 {
713 Object obj = getCriterion(column).getValue();
714 if (obj instanceof String)
715 {
716 return new Integer((String) obj).intValue();
717 }
718 return ((Integer) obj).intValue();
719 }
720
721 /**
722 * Convenience method to return an int.
723 *
724 * @param table String name of table.
725 * @param column String name of column.
726 * @return An int with the value of object at key.
727 */
728 public int getInt(String table, String column)
729 {
730 return getInt(new ColumnImpl(table, column));
731 }
732
733 /**
734 * Convenience method to return a BigDecimal.
735 *
736 * @param column The column to retrieve the value for.
737 *
738 * @return A BigDecimal with the value of object at key.
739 */
740 public BigDecimal getBigDecimal(Column column)
741 {
742 Object obj = getCriterion(column).getValue();
743 if (obj instanceof String)
744 {
745 return new BigDecimal((String) obj);
746 }
747 return (BigDecimal) obj;
748 }
749
750 /**
751 * Convenience method to return a BigDecimal.
752 *
753 * @param table String name of table.
754 * @param column String name of column.
755 * @return A BigDecimal with the value of object at key.
756 */
757 public BigDecimal getBigDecimal(String table, String column)
758 {
759 return getBigDecimal(new ColumnImpl(table, column));
760 }
761
762 /**
763 * Convenience method to return a long.
764 *
765 * @param column The column to retrieve the value for.
766 *
767 * @return A long with the value of object at key.
768 */
769 public long getLong(Column column)
770 {
771 Object obj = getCriterion(column).getValue();
772 if (obj instanceof String)
773 {
774 return new Long((String) obj).longValue();
775 }
776 return ((Long) obj).longValue();
777 }
778
779 /**
780 * Convenience method to return a long.
781 *
782 * @param table String name of table.
783 * @param column String name of column.
784 * @return A long with the value of object at key.
785 */
786 public long getLong(String table, String column)
787 {
788 return getLong(new ColumnImpl(table, column));
789 }
790
791 /**
792 * Convenience method to return a String.
793 *
794 * @param column The column to retrieve the value for.
795 *
796 * @return A String with the value of object at key.
797 */
798 public String getString(Column column)
799 {
800 return (String) getCriterion(column).getValue();
801 }
802
803 /**
804 * Convenience method to return a String.
805 *
806 * @param table String name of table.
807 * @param column String name of column.
808 * @return A String with the value of object at key.
809 */
810 public String getString(String table, String column)
811 {
812 return getString(new ColumnImpl(table, column));
813 }
814
815 /**
816 * Convenience method to return a List.
817 *
818 * @param column The column to retrieve the value for.
819 *
820 * @return A List with the value of object at key.
821 */
822 @SuppressWarnings("unchecked")
823 public List<Object> getList(Column column)
824 {
825 return (List<Object>) getCriterion(column).getValue();
826 }
827
828 /**
829 * Convenience method to return a List.
830 *
831 * @param table String name of table.
832 * @param column String name of column.
833 * @return A List with the value of object at key.
834 */
835 public List<Object> getList(String table, String column)
836 {
837 return getList(new ColumnImpl(table, column));
838 }
839
840 /**
841 * Method to return the value that was added to Criteria.
842 *
843 * @param column The column to retrieve the value for.
844 *
845 * @return An Object with the value of object at key.
846 */
847 public Object getValue(Column column)
848 {
849 return getCriterion(column).getValue();
850 }
851
852 /**
853 * Method to return the value that was added to Criteria.
854 *
855 * @param table String name of table.
856 * @param column String name of column.
857 * @return An Object with the value of object at key.
858 */
859 public Object getValue(String table, String column)
860 {
861 return getValue(new ColumnImpl(table, column));
862 }
863
864 /**
865 * Convenience method to return an ObjectKey.
866 *
867 * @param column The column to retrieve the value for.
868 *
869 * @return An ObjectKey with the value of object at key.
870 */
871 public ObjectKey getObjectKey(Column column)
872 {
873 return (ObjectKey) getCriterion(column).getValue();
874 }
875
876 /**
877 * Convenience method to return an ObjectKey.
878 *
879 * @param table String name of table.
880 * @param column String name of column.
881 * @return A String with the value of object at key.
882 */
883 public ObjectKey getObjectKey(String table, String column)
884 {
885 return getObjectKey(new ColumnImpl(table, column));
886 }
887
888 /**
889 * Returns the value in the top-level criterion for the given key.
890 *
891 * @param key the key for the criterion.
892 *
893 * @return the value of the criterion.
894 *
895 * @throws NullPointerException if no Criterion is stored under the key.
896 *
897 * @deprecated this method only works if a criterion exists for the key.
898 */
899 @Deprecated
900 public Object get(Column key)
901 {
902 return getValue(key);
903 }
904
905 /**
906 * Returns whether there are any criterions in this criteria.
907 *
908 * @return true if there are criterions, false otherwise.
909 */
910 public boolean isEmpty()
911 {
912 return criterionMap.isEmpty();
913 }
914
915 /**
916 * Returns how many top-level criterions are in this criteria.
917 *
918 * @return the number of op-level criterions.
919 *
920 * @deprecated this method counts only top-level criterions, not all.
921 */
922 @Deprecated
923 public int size()
924 {
925 return criterionMap.size();
926 }
927
928 /**
929 * Returns all the top-level Criterions in this criteria
930 * (but not the chained Criterions).
931 *
932 * @return all top-level Criterions, not null.
933 */
934 public Collection<Criterion> values()
935 {
936 return criterionMap.values();
937 }
938
939 /**
940 * Equivalent to add(key, value).
941 *
942 * @param column the column.
943 * @param value An Object to which the column should be equal.
944 *
945 * @return Instance of self.
946 *
947 * @throws NullPointerException if key is null.
948 *
949 * @deprecated use add(String, Object) instead
950 */
951 @Deprecated
952 public Object put(Column column, Object value)
953 {
954 return add(column, value);
955 }
956
957 /**
958 * Copies all of the mappings from the specified Map to this Criteria
959 * These mappings will replace any mappings that this Criteria had for any
960 * of the keys currently in the specified Map.
961 *
962 * @param t Objects to be stored in this criteria.
963 */
964 public synchronized void putAll(Map<Column, Criterion> t)
965 {
966 Iterator<Map.Entry<Column, Criterion>> i = t.entrySet().iterator();
967 while (i.hasNext())
968 {
969 Map.Entry<Column, Criterion> e = i.next();
970 Criterion val = e.getValue();
971 criterionMap.put(e.getKey(), val);
972 }
973 }
974
975 /**
976 * This method adds a new criterion to the list of criterias. If a
977 * criterion for the requested column already exists, it is
978 * replaced. This is used as follows:
979 *
980 * <p>
981 * <code>
982 * Criteria crit = new Criteria().add("column",
983 * "value");
984 * </code>
985 *
986 * An EQUAL comparison is used for column and value.
987 *
988 * The name of the table must be used implicitly in the column name,
989 * so the Column name must be something like 'TABLE.id'. If you
990 * don't like this, you can use the add(table, column, value) method.
991 *
992 * @param column The column to run the comparison on
993 * @param value An Object.
994 *
995 * @return A modified Criteria object.
996 */
997 public Criteria add(Column column, Object value)
998 {
999 add(column, value, EQUAL);
1000 return this;
1001 }
1002
1003 /**
1004 * This method adds a new criterion to the list of criterias.
1005 * If a criterion for the requested column already exists, it is
1006 * replaced. If is used as follow:
1007 *
1008 * <p>
1009 * <code>
1010 * Criteria crit = new Criteria().add("column",
1011 * "value"
1012 * Criteria.GREATER_THAN);
1013 * </code>
1014 *
1015 * Any comparison can be used.
1016 *
1017 * The name of the table must be used implicitly in the column name,
1018 * so the Column name must be something like 'TABLE.id'. If you
1019 * don't like this, you can use the add(table, column, value) method.
1020 *
1021 * @param column The column to run the comparison on
1022 * @param value An Object.
1023 * @param comparison A String.
1024 *
1025 * @return A modified Criteria object.
1026 */
1027 public Criteria add(Column column, Object value, SqlEnum comparison)
1028 {
1029 criterionMap.put(column, new Criterion(column, value, comparison));
1030 return this;
1031 }
1032
1033 /**
1034 * This method adds a new criterion to the list of criterias. If a
1035 * criterion for the requested column already exists, it is
1036 * replaced. This is used as follows:
1037 *
1038 * <p>
1039 * <code>
1040 * Criteria crit = new Criteria().add("column",
1041 * "value");
1042 * </code>
1043 *
1044 * An EQUAL comparison is used for column and value.
1045 *
1046 * The name of the table must be used implicitly in the column name,
1047 * so the Column name must be something like 'TABLE.id'. If you
1048 * don't like this, you can use the add(table, column, value) method.
1049 *
1050 * @param column The column to run the comparison on
1051 * @param value An Object.
1052 *
1053 * @return A modified Criteria object.
1054 */
1055 public Criteria add(String column, Object value)
1056 {
1057 add(column, value, EQUAL);
1058 return this;
1059 }
1060
1061 /**
1062 * This method adds a new criterion to the list of criterias.
1063 * If a criterion for the requested column already exists, it is
1064 * replaced. If is used as follow:
1065 *
1066 * <p>
1067 * <code>
1068 * Criteria crit = new Criteria().add("column",
1069 * "value"
1070 * Criteria.GREATER_THAN);
1071 * </code>
1072 *
1073 * Any comparison can be used.
1074 *
1075 * The name of the table must be used implicitly in the column name,
1076 * so the Column name must be something like 'TABLE.id'. If you
1077 * don't like this, you can use the add(table, column, value) method.
1078 *
1079 * @param column The column to run the comparison on
1080 * @param value An Object.
1081 * @param comparison A String.
1082 *
1083 * @return A modified Criteria object.
1084 */
1085 public Criteria add(String column, Object value, SqlEnum comparison)
1086 {
1087 Column columnImpl = new ColumnImpl(column);
1088 criterionMap.put(
1089 columnImpl,
1090 new Criterion(columnImpl, value, comparison));
1091 return this;
1092 }
1093
1094 /**
1095 * This method adds a new criterion to the list of criterias.
1096 * If a criterion for the requested column already exists, it is
1097 * replaced. If is used as follows:
1098 *
1099 * <p>
1100 * <code>
1101 * Criteria crit = new Criteria().add("table",
1102 * "column",
1103 * "value");
1104 * </code>
1105 *
1106 * An EQUAL comparison is used for column and value.
1107 *
1108 * @param table Name of the table which contains the column
1109 * @param column The column to run the comparison on
1110 * @param value An Object.
1111 *
1112 * @return A modified Criteria object.
1113 */
1114 public Criteria add(String table, String column, Object value)
1115 {
1116 add(table, column, value, EQUAL);
1117 return this;
1118 }
1119
1120 /**
1121 * This method adds a new criterion to the list of criterias.
1122 * If a criterion for the requested column already exists, it is
1123 * replaced. If is used as follows:
1124 *
1125 * <p>
1126 * <code>
1127 * Criteria crit = new Criteria().add("table",
1128 * "column",
1129 * "value",
1130 * Criteria.GREATER_THAN);
1131 * </code>
1132 *
1133 * Any comparison can be used.
1134 *
1135 * @param table Name of table which contains the column
1136 * @param column The column to run the comparison on
1137 * @param value An Object.
1138 * @param comparison String describing how to compare the column with
1139 * the value
1140 * @return A modified Criteria object.
1141 */
1142 public Criteria add(String table,
1143 String column,
1144 Object value,
1145 SqlEnum comparison)
1146 {
1147 Column columnImpl = new ColumnImpl(table, column);
1148 criterionMap.put(columnImpl,
1149 new Criterion(columnImpl, value, comparison));
1150 return this;
1151 }
1152
1153 /**
1154 * Convenience method to add a Date object specified by
1155 * year, month, and date into the Criteria.
1156 * Equal to
1157 *
1158 * <p>
1159 * <code>
1160 * add(column, new GregorianCalendar(year, month,date), EQUAL);
1161 * </code>
1162 *
1163 * @param column A String value to use as column.
1164 * @param year An int with the year.
1165 * @param month An int with the month. Month value is 0-based.
1166 * e.g., 0 for January
1167 * @param day An int with the day.
1168 * @return A modified Criteria object.
1169 */
1170 public Criteria addDate(Column column, int year, int month, int day)
1171 {
1172 add(column, new GregorianCalendar(year, month, day).getTime());
1173 return this;
1174 }
1175
1176 /**
1177 * Convenience method to add a Date object specified by
1178 * year, month, and date into the Criteria.
1179 * Equal to
1180 *
1181 * <p>
1182 * <code>
1183 * add(column, new GregorianCalendar(year, month,date), comparison);
1184 * </code>
1185 *
1186 * @param column The column to run the comparison on
1187 * @param year An int with the year.
1188 * @param month An int with the month. Month value is 0-based.
1189 * e.g., 0 for January
1190 * @param date An int with the date.
1191 * @param comparison String describing how to compare the column with
1192 * the value
1193 * @return A modified Criteria object.
1194 */
1195 public Criteria addDate(Column column, int year, int month, int date,
1196 SqlEnum comparison)
1197 {
1198 add(column, new GregorianCalendar(year, month, date).getTime(),
1199 comparison);
1200 return this;
1201 }
1202
1203 /**
1204 * Convenience method to add a Date object specified by
1205 * year, month, and date into the Criteria.
1206 * Equal to
1207 *
1208 * <p>
1209 * <code>
1210 * add(column, new GregorianCalendar(year, month,date), EQUAL);
1211 * </code>
1212 *
1213 * @param column A String value to use as column.
1214 * @param year An int with the year.
1215 * @param month An int with the month. Month value is 0-based.
1216 * e.g., 0 for January
1217 * @param day An int with the day.
1218 * @return A modified Criteria object.
1219 */
1220 public Criteria addDate(String column, int year, int month, int day)
1221 {
1222 add(column, new GregorianCalendar(year, month, day).getTime());
1223 return this;
1224 }
1225
1226 /**
1227 * Convenience method to add a Date object specified by
1228 * year, month, and date into the Criteria.
1229 * Equal to
1230 *
1231 * <p>
1232 * <code>
1233 * add(column, new GregorianCalendar(year, month,date), comparison);
1234 * </code>
1235 *
1236 * @param column The column to run the comparison on
1237 * @param year An int with the year.
1238 * @param month An int with the month. Month value is 0-based.
1239 * e.g., 0 for January
1240 * @param date An int with the date.
1241 * @param comparison String describing how to compare the column with
1242 * the value
1243 * @return A modified Criteria object.
1244 */
1245 public Criteria addDate(String column, int year, int month, int date,
1246 SqlEnum comparison)
1247 {
1248 add(column, new GregorianCalendar(year, month, date).getTime(),
1249 comparison);
1250 return this;
1251 }
1252
1253 /**
1254 * This is the way that you should add a join of two tables. For
1255 * example:
1256 *
1257 * <p>
1258 * AND PROJECT.PROJECT_ID=FOO.PROJECT_ID
1259 * <p>
1260 *
1261 * left = PROJECT.PROJECT_ID
1262 * right = FOO.PROJECT_ID
1263 *
1264 * @param left A String with the left side of the join.
1265 * @param right A String with the right side of the join.
1266 * @return A modified Criteria object.
1267 */
1268 public Criteria addJoin(Column left, Column right)
1269 {
1270 return addJoin(left, right, null);
1271 }
1272
1273 /**
1274 * This is the way that you should add a join of two tables. For
1275 * example:
1276 *
1277 * <p>
1278 * PROJECT LEFT JOIN FOO ON PROJECT.PROJECT_ID=FOO.PROJECT_ID
1279 * <p>
1280 *
1281 * left = "PROJECT.PROJECT_ID"
1282 * right = "FOO.PROJECT_ID"
1283 * operator = Criteria.LEFT_JOIN
1284 *
1285 * @param left A String with the left side of the join.
1286 * @param right A String with the right side of the join.
1287 * @param operator The operator used for the join: must be one of null,
1288 * Criteria.LEFT_JOIN, Criteria.RIGHT_JOIN, Criteria.INNER_JOIN
1289 * @return A modified Criteria object.
1290 */
1291 public Criteria addJoin(Column left, Column right, JoinType operator)
1292 {
1293 joins.add(new Join(left, right, Criteria.EQUAL, operator));
1294
1295 return this;
1296 }
1297
1298 /**
1299 * This is the way that you should add a join of two tables. For
1300 * example:
1301 *
1302 * <p>
1303 * AND PROJECT.PROJECT_ID=FOO.PROJECT_ID
1304 * <p>
1305 *
1306 * left = PROJECT.PROJECT_ID
1307 * right = FOO.PROJECT_ID
1308 *
1309 * @param left A String with the left side of the join.
1310 * @param right A String with the right side of the join.
1311 * @return A modified Criteria object.
1312 */
1313 public Criteria addJoin(String left, String right)
1314 {
1315 return addJoin(left, right, null);
1316 }
1317
1318 /**
1319 * This is the way that you should add a join of two tables. For
1320 * example:
1321 *
1322 * <p>
1323 * PROJECT LEFT JOIN FOO ON PROJECT.PROJECT_ID=FOO.PROJECT_ID
1324 * <p>
1325 *
1326 * left = "PROJECT.PROJECT_ID"
1327 * right = "FOO.PROJECT_ID"
1328 * operator = Criteria.LEFT_JOIN
1329 *
1330 * @param left A String with the left side of the join.
1331 * @param right A String with the right side of the join.
1332 * @param operator The operator used for the join: must be one of null,
1333 * Criteria.LEFT_JOIN, Criteria.RIGHT_JOIN, Criteria.INNER_JOIN
1334 * @return A modified Criteria object.
1335 */
1336 public Criteria addJoin(String left, String right, JoinType operator)
1337 {
1338 joins.add(new Join(
1339 new ColumnImpl(left),
1340 new ColumnImpl(right),
1341 Criteria.EQUAL,
1342 operator));
1343
1344 return this;
1345 }
1346
1347 /**
1348 * get the List of Joins. This method is meant to
1349 * be called by BasePeerImpl.
1350 * @return a List which contains objects of type Join.
1351 * If the criteria does not contains any joins, the list is empty
1352 */
1353 public List<Join> getJoins()
1354 {
1355 return joins;
1356 }
1357
1358 /**
1359 * Adds an 'IN' clause with the criteria supplied as an Object
1360 * array. For example:
1361 *
1362 * <p>
1363 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
1364 * <p>
1365 *
1366 * where 'values' contains three objects that evaluate to the
1367 * respective strings above when .toString() is called.
1368 *
1369 * If a criterion for the requested column already exists, it is
1370 * replaced.
1371 *
1372 * @param column The column to run the comparison on
1373 * @param values An Object[] with the allowed values.
1374 * @return A modified Criteria object.
1375 */
1376 public Criteria addIn(Column column, Object[] values)
1377 {
1378 add(column, values, Criteria.IN);
1379 return this;
1380 }
1381
1382 /**
1383 * Adds an 'IN' clause with the criteria supplied as an Object
1384 * array. For example:
1385 *
1386 * <p>
1387 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
1388 * <p>
1389 *
1390 * where 'values' contains three objects that evaluate to the
1391 * respective strings above when .toString() is called.
1392 *
1393 * If a criterion for the requested column already exists, it is
1394 * replaced.
1395 *
1396 * @param column The column to run the comparison on
1397 * @param values An Object[] with the allowed values.
1398 * @return A modified Criteria object.
1399 */
1400 public Criteria addIn(String column, Object[] values)
1401 {
1402 add(column, values, Criteria.IN);
1403 return this;
1404 }
1405
1406 /**
1407 * Adds an 'IN' clause with the criteria supplied as a Collection.
1408 * For example:
1409 *
1410 * <p>
1411 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
1412 * <p>
1413 *
1414 * where 'values' contains three Strings "FOO", "BAR" and "ZOW".
1415 *
1416 * If a criterion for the requested column already exists, it is
1417 * replaced.
1418 *
1419 * @param column The column to run the comparison on
1420 * @param values A Collection with the allowed values.
1421 *
1422 * @return A modified Criteria object.
1423 */
1424 public Criteria addIn(Column column, Collection<?> values)
1425 {
1426 add(column, values, Criteria.IN);
1427 return this;
1428 }
1429
1430 /**
1431 * Adds an 'IN' clause with the criteria supplied as a Collection.
1432 * For example:
1433 *
1434 * <p>
1435 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
1436 * <p>
1437 *
1438 * where 'values' contains three Strings "FOO", "BAR" and "ZOW".
1439 *
1440 * If a criterion for the requested column already exists, it is
1441 * replaced.
1442 *
1443 * @param column The column to run the comparison on
1444 * @param values A Collection with the allowed values.
1445 *
1446 * @return A modified Criteria object.
1447 */
1448 public Criteria addIn(String column, Collection<?> values)
1449 {
1450 add(column, values, Criteria.IN);
1451 return this;
1452 }
1453
1454 /**
1455 * Adds a 'NOT IN' clause with the criteria supplied as an Object
1456 * array. For example:
1457 *
1458 * <p>
1459 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
1460 * <p>
1461 *
1462 * where 'values' contains three objects that evaluate to the
1463 * respective strings above when .toString() is called.
1464 *
1465 * If a criterion for the requested column already exists, it is
1466 * replaced.
1467 *
1468 * @param column The column to run the comparison on
1469 * @param values An Object[] with the disallowed values.
1470 * @return A modified Criteria object.
1471 */
1472 public Criteria addNotIn(Column column, Object[] values)
1473 {
1474 add(column, values, Criteria.NOT_IN);
1475 return this;
1476 }
1477
1478 /**
1479 * Adds a 'NOT IN' clause with the criteria supplied as an Object
1480 * array. For example:
1481 *
1482 * <p>
1483 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
1484 * <p>
1485 *
1486 * where 'values' contains three objects that evaluate to the
1487 * respective strings above when .toString() is called.
1488 *
1489 * If a criterion for the requested column already exists, it is
1490 * replaced.
1491 *
1492 * @param column The column to run the comparison on
1493 * @param values An Object[] with the disallowed values.
1494 * @return A modified Criteria object.
1495 */
1496 public Criteria addNotIn(String column, Object[] values)
1497 {
1498 add(column, values, Criteria.NOT_IN);
1499 return this;
1500 }
1501
1502 /**
1503 * Adds a 'NOT IN' clause with the criteria supplied as a Collection.
1504 * For example:
1505 *
1506 * <p>
1507 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
1508 * <p>
1509 *
1510 * where 'values' contains three Strings "FOO", "BAR" and "ZOW".
1511 *
1512 * If a criterion for the requested column already exists, it is
1513 * replaced.
1514 *
1515 * @param column The column to run the comparison on
1516 * @param values A Collection with the disallowed values.
1517 *
1518 * @return A modified Criteria object.
1519 */
1520 public Criteria addNotIn(Column column, Collection<?> values)
1521 {
1522 add(column, values, Criteria.NOT_IN);
1523 return this;
1524 }
1525
1526 /**
1527 * Adds a 'NOT IN' clause with the criteria supplied as a Collection.
1528 * For example:
1529 *
1530 * <p>
1531 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
1532 * <p>
1533 *
1534 * where 'values' contains three Strings "FOO", "BAR" and "ZOW".
1535 *
1536 * If a criterion for the requested column already exists, it is
1537 * replaced.
1538 *
1539 * @param column The column to run the comparison on
1540 * @param values A Collection with the disallowed values.
1541 *
1542 * @return A modified Criteria object.
1543 */
1544 public Criteria addNotIn(String column, Collection<?> values)
1545 {
1546 add(column, values, Criteria.NOT_IN);
1547 return this;
1548 }
1549
1550 /**
1551 * Adds "ALL " to the SQL statement.
1552 */
1553 public void setAll()
1554 {
1555 selectModifiers.add(ALL.toString());
1556 }
1557
1558 /**
1559 * Adds "DISTINCT " to the SQL statement.
1560 */
1561 public void setDistinct()
1562 {
1563 selectModifiers.add(DISTINCT.toString());
1564 }
1565
1566 /**
1567 * Sets whether case should be ignored in where clauses and order by
1568 * whenever String columns are encountered.
1569 *
1570 * @param b True if case should be ignored.
1571 * @return A modified Criteria object.
1572 */
1573 public Criteria setIgnoreCase(boolean b)
1574 {
1575 ignoreCase = b;
1576 return this;
1577 }
1578
1579 /**
1580 * Returns whether case should be ignored in where clauses and order by
1581 * whenever String columns are encountered.
1582 *
1583 * @return True if case is ignored.
1584 */
1585 public boolean isIgnoreCase()
1586 {
1587 return ignoreCase;
1588 }
1589
1590 /**
1591 * Set single record? Set this to <code>true</code> if you expect the query
1592 * to result in only a single result record (the default behaviour is to
1593 * throw a TorqueException if multiple records are returned when the query
1594 * is executed). This should be used in situations where returning multiple
1595 * rows would indicate an error of some sort. If your query might return
1596 * multiple records but you are only interested in the first one then you
1597 * should be using setLimit(1).
1598 *
1599 * @param b set to <code>true</code> if you expect the query to select just
1600 * one record.
1601 * @return A modified Criteria object.
1602 */
1603 public Criteria setSingleRecord(boolean b)
1604 {
1605 singleRecord = b;
1606 return this;
1607 }
1608
1609 /**
1610 * Is single record?
1611 *
1612 * @return True if a single record is being returned.
1613 */
1614 public boolean isSingleRecord()
1615 {
1616 return singleRecord;
1617 }
1618
1619 /**
1620 * Set limit.
1621 *
1622 * @param limit An int with the value for limit.
1623 * @return A modified Criteria object.
1624 */
1625 public Criteria setLimit(int limit)
1626 {
1627 this.limit = limit;
1628 return this;
1629 }
1630
1631 /**
1632 * Get limit.
1633 *
1634 * @return An int with the value for limit.
1635 */
1636 public int getLimit()
1637 {
1638 return limit;
1639 }
1640
1641 /**
1642 * Set offset.
1643 *
1644 * @param offset An int with the value for offset.
1645 * @return A modified Criteria object.
1646 */
1647 public Criteria setOffset(long offset)
1648 {
1649 this.offset = offset;
1650 return this;
1651 }
1652
1653 /**
1654 * Get offset.
1655 *
1656 * @return An int with the value for offset.
1657 */
1658 public long getOffset()
1659 {
1660 return offset;
1661 }
1662
1663 /**
1664 * Add select column.
1665 *
1666 * @param column The select column to add.
1667 * @return A modified Criteria object.
1668 */
1669 public Criteria addSelectColumn(Column column)
1670 {
1671 selectColumns.add(column);
1672 return this;
1673 }
1674
1675 /**
1676 * Add select column.
1677 *
1678 * @param column A String with the name of the select column.
1679 * @return A modified Criteria object.
1680 */
1681 public Criteria addSelectColumn(String column)
1682 {
1683 selectColumns.add(new ColumnImpl(column));
1684 return this;
1685 }
1686
1687 /**
1688 * Get select columns.
1689 *
1690 * @return An List with the names of the select columns.
1691 */
1692 public UniqueColumnList getSelectColumns()
1693 {
1694 return selectColumns;
1695 }
1696
1697 /**
1698 * Get select modifiers.
1699 *
1700 * @return An UniqueList with the select modifiers.
1701 */
1702 public UniqueList<String> getSelectModifiers()
1703 {
1704 return selectModifiers;
1705 }
1706
1707 /**
1708 * Add group by column name.
1709 *
1710 * @param groupBy The name of the column to group by.
1711 * @return A modified Criteria object.
1712 */
1713 public Criteria addGroupByColumn(Column groupBy)
1714 {
1715 groupByColumns.add(groupBy);
1716 return this;
1717 }
1718
1719 /**
1720 * Add group by column name.
1721 *
1722 * @param groupBy The name of the column to group by.
1723 * @return A modified Criteria object.
1724 */
1725 public Criteria addGroupByColumn(String groupBy)
1726 {
1727 groupByColumns.add(new ColumnImpl(groupBy));
1728 return this;
1729 }
1730
1731 /**
1732 * Add order by column name, explicitly specifying ascending.
1733 *
1734 * @param column The column to order by.
1735 * @return A modified Criteria object.
1736 */
1737 public Criteria addAscendingOrderByColumn(Column column)
1738 {
1739 orderByColumns.add(new OrderBy(column, SqlEnum.ASC, false));
1740 return this;
1741 }
1742
1743
1744 /**
1745 * Add order by column name, explicitly specifying ascending.
1746 *
1747 * @param column The column to order by.
1748 * @param ignoreCase whether to ignore case on String columns.
1749 *
1750 * @return A modified Criteria object.
1751 */
1752 public Criteria addAscendingOrderByColumn(Column column, boolean ignoreCase)
1753 {
1754 orderByColumns.add(new OrderBy(column, SqlEnum.ASC, ignoreCase));
1755 return this;
1756 }
1757 /**
1758 * Add order by column name, explicitly specifying ascending.
1759 *
1760 * @param column The column to order by.
1761 * @return A modified Criteria object.
1762 */
1763 public Criteria addAscendingOrderByColumn(String column)
1764 {
1765 orderByColumns.add(
1766 new OrderBy(new ColumnImpl(column), SqlEnum.ASC, false));
1767 return this;
1768 }
1769
1770 /**
1771 * Add order by column name, explicitly specifying descending.
1772 *
1773 * @param column The column to order by.
1774 * @return A modified Criteria object.
1775 */
1776 public Criteria addDescendingOrderByColumn(Column column)
1777 {
1778 orderByColumns.add(new OrderBy(column, SqlEnum.DESC, false));
1779 return this;
1780 }
1781
1782 /**
1783 * Add order by column name, explicitly specifying descending.
1784 *
1785 * @param column The column to order by.
1786 * @param ignoreCase whether to ignore case on String columns.
1787 *
1788 * @return A modified Criteria object.
1789 */
1790 public Criteria addDescendingOrderByColumn(
1791 Column column,
1792 boolean ignoreCase)
1793 {
1794 orderByColumns.add(new OrderBy(column, SqlEnum.DESC, ignoreCase));
1795 return this;
1796 }
1797
1798 /**
1799 * Add order by column name, explicitly specifying descending.
1800 *
1801 * @param column The column to order by.
1802 * @return A modified Criteria object.
1803 */
1804 public Criteria addDescendingOrderByColumn(String column)
1805 {
1806 orderByColumns.add(
1807 new OrderBy(new ColumnImpl(column), SqlEnum.DESC, false));
1808 return this;
1809 }
1810
1811 /**
1812 * Get order by columns.
1813 *
1814 * @return An UniqueList with the name of the order columns, not null.
1815 */
1816 public UniqueList<OrderBy> getOrderByColumns()
1817 {
1818 return orderByColumns;
1819 }
1820
1821 /**
1822 * Get group by columns.
1823 *
1824 * @return An UniqueList with the name of the groupBy clause, not null.
1825 */
1826 public UniqueColumnList getGroupByColumns()
1827 {
1828 return groupByColumns;
1829 }
1830
1831 /**
1832 * Get Having Criterion.
1833 *
1834 * @return A Criterion that is the having clause.
1835 */
1836 public Criterion getHaving()
1837 {
1838 return having;
1839 }
1840
1841 /**
1842 * Remove all objects with the given key from the criteria.
1843 *
1844 * @param key A String with the key to be removed.
1845 * @return The value of the removed criterion, or null.
1846 */
1847 public Object remove(Column key)
1848 {
1849 Iterator<Map.Entry<Column, Criterion>> entryIt
1850 = criterionMap.entrySet().iterator();
1851 while (entryIt.hasNext())
1852 {
1853 Map.Entry<Column, Criterion> entry = entryIt.next();
1854 if (entry.getKey().getSqlExpression().equals(
1855 key.getSqlExpression()))
1856 {
1857 entryIt.remove();
1858 return entry.getValue().getValue();
1859 }
1860 }
1861 return null;
1862 }
1863
1864 /**
1865 * Build a string representation of the Criteria.
1866 *
1867 * @return A String with the representation of the Criteria.
1868 */
1869 @Override
1870 public String toString()
1871 {
1872 StringBuffer sb = new StringBuffer("Criteria:: ");
1873 Iterator<?> it = keySet().iterator();
1874 while (it.hasNext())
1875 {
1876 Object key = it.next();
1877 sb.append(key).append("<=>")
1878 .append(criterionMap.get(key)).append(": ");
1879 }
1880
1881 try
1882 {
1883 Query query = SqlBuilder.buildQuery(this);
1884 sb.append("\nCurrent Query SQL (may not be complete or applicable): ")
1885 .append(query.getDisplayString());
1886 }
1887 catch (Exception exc)
1888 {
1889 log.debug("Exception when evaluating a Criteria", exc);
1890 }
1891
1892 return sb.toString();
1893 }
1894
1895 /**
1896 * Returns all keys in the Criterion map.
1897 *
1898 * @return all keys, not null.
1899 */
1900 public Set<Column> keySet()
1901 {
1902 return criterionMap.keySet();
1903 }
1904
1905 /**
1906 * Checks whether an object is equal to this Criteria.
1907 * This is the case if the other object is also a Criteria and has
1908 * the same attributes and criterions.
1909 *
1910 * @param object the other object to check, can be null.
1911 *
1912 * @return true if the object is equal to this Criteria, false otherwise.
1913 */
1914 @Override
1915 public boolean equals(Object object)
1916 {
1917 if (object == null)
1918 {
1919 return false;
1920 }
1921 if (this == object)
1922 {
1923 return true;
1924 }
1925 if (object.getClass() != this.getClass())
1926 {
1927 return false;
1928 }
1929 Criteria criteria = (Criteria) object;
1930 if (criterionMap.size() != criteria.criterionMap.size())
1931 {
1932 return false;
1933 }
1934 if (this.offset != criteria.getOffset()
1935 || this.limit != criteria.getLimit()
1936 || ignoreCase != criteria.isIgnoreCase()
1937 || singleRecord != criteria.isSingleRecord()
1938 || !dbName.equals(criteria.getDbName())
1939 || !selectModifiers.equals(criteria.getSelectModifiers())
1940 || !selectColumns.equals(criteria.getSelectColumns())
1941 || !orderByColumns.equals(criteria.getOrderByColumns())
1942 || !aliases.equals(criteria.getAliases())
1943 || !asColumns.equals(criteria.getAsColumns())
1944 || !joins.equals(criteria.getJoins())
1945 )
1946 {
1947 return false;
1948 }
1949 for (Iterator<Column> it = criteria.keySet().iterator(); it.hasNext();)
1950 {
1951 Column key = it.next();
1952 if (containsTopLevelColumn(key))
1953 {
1954 Criterion a = this.getCriterion(key);
1955 Criterion b = criteria.getCriterion(key);
1956 if (!a.equals(b))
1957 {
1958 return false;
1959 }
1960 }
1961 else
1962 {
1963 return false;
1964 }
1965 }
1966 return true;
1967 }
1968
1969 /**
1970 * Returns the hash code value for this Join.
1971 *
1972 * @return a hash code value for this object.
1973 */
1974 @Override
1975 public int hashCode()
1976 {
1977 int result = 16;
1978 result = 37 * result + Long.valueOf(offset).hashCode();
1979 result = 37 * result + limit;
1980 result = 37 * result + (ignoreCase ? 0 : 1);
1981 result = 37 * result + (singleRecord ? 0 : 1);
1982 result = 37 * result + dbName.hashCode();
1983 result = 37 * result + selectModifiers.hashCode();
1984 result = 37 * result + selectColumns.hashCode();
1985 result = 37 * result + orderByColumns.hashCode();
1986 result = 37 * result + aliases.hashCode();
1987 result = 37 * result + asColumns.hashCode();
1988 result = 37 * result + joins.hashCode();
1989 result = 37 * result + criterionMap.hashCode();
1990 return result;
1991 }
1992
1993 /*
1994 * ------------------------------------------------------------------------
1995 *
1996 * Start of the "and" methods
1997 *
1998 * ------------------------------------------------------------------------
1999 */
2000
2001 /**
2002 * This method adds a prepared Criterion object to the Criteria as a having
2003 * clause. You can get a new, empty Criterion object with the
2004 * getNewCriterion() method.
2005 *
2006 * <p>
2007 * <code>
2008 * Criteria crit = new Criteria();
2009 * Criteria.Criterion c = crit.getNewCriterion(XXXPeer.ID, new Integer(5),
2010 * Criteria.LESS_THAN);
2011 * crit.addHaving(c);
2012 * </code>
2013 *
2014 * @param having A Criterion object
2015 * @return A modified Criteria object.
2016 */
2017 public Criteria addHaving(Criterion having)
2018 {
2019 this.having = having;
2020 return this;
2021 }
2022
2023 /**
2024 * This method adds a prepared Criterion object to the Criteria.
2025 * You can get a new, empty Criterion object with the
2026 * getNewCriterion() method. If a criterion for the requested column
2027 * already exists, it is "AND"ed to the existing criterion.
2028 * This is used as follows:
2029 *
2030 * <p>
2031 * <code>
2032 * Criteria crit = new Criteria();
2033 * Criteria.Criterion c = crit.getNewCriterion(XXXPeer.ID, new Integer(5),
2034 * Criteria.LESS_THAN);
2035 * crit.and(c);
2036 * </code>
2037 *
2038 * @param c A Criterion object
2039 * @return A modified Criteria object.
2040 */
2041 public Criteria and(Criterion c)
2042 {
2043 Criterion oc = getCriterion(c.getColumn());
2044
2045 if (oc == null)
2046 {
2047 add(c);
2048 }
2049 else
2050 {
2051 oc.and(c);
2052 }
2053 return this;
2054 }
2055
2056 /**
2057 * This method adds a new criterion to the list of criterias. If a
2058 * criterion for the requested column already exists, it is
2059 * "AND"ed to the existing criterion. This is used as follows:
2060 *
2061 * <p>
2062 * <code>
2063 * Criteria crit = new Criteria().and("column",
2064 * "value");
2065 * </code>
2066 *
2067 * An EQUAL comparison is used for column and value.
2068 *
2069 * The name of the table must be used implicitly in the column name,
2070 * so the Column name must be something like 'TABLE.id'. If you
2071 * don't like this, you can use the and(table, column, value) method.
2072 *
2073 * @param column The column to run the comparison on
2074 * @param value An Object.
2075 *
2076 * @return A modified Criteria object.
2077 */
2078 public Criteria and(Column column, Object value)
2079 {
2080 and(column, value, EQUAL);
2081 return this;
2082 }
2083
2084 /**
2085 * This method adds a new criterion to the list of criterias.
2086 * If a criterion for the requested column already exists, it is
2087 * "AND"ed to the existing criterion. If is used as follow:
2088 *
2089 * <p>
2090 * <code>
2091 * Criteria crit = new Criteria().and("column",
2092 * "value"
2093 * Criteria.GREATER_THAN);
2094 * </code>
2095 *
2096 * Any comparison can be used.
2097 *
2098 * The name of the table must be used implicitly in the column name,
2099 * so the Column name must be something like 'TABLE.id'. If you
2100 * don't like this, you can use the and(table, column, value) method.
2101 *
2102 * @param column The column to run the comparison on
2103 * @param value An Object.
2104 * @param comparison A String.
2105 *
2106 * @return A modified Criteria object.
2107 */
2108 public Criteria and(Column column, Object value, SqlEnum comparison)
2109 {
2110 Criterion oc = getCriterion(column);
2111 Criterion nc = new Criterion(column, value, comparison);
2112
2113 if (oc == null)
2114 {
2115 criterionMap.put(column, nc);
2116 }
2117 else
2118 {
2119 oc.and(nc);
2120 }
2121 return this;
2122 }
2123
2124 /**
2125 * This method adds a new criterion to the list of criterias. If a
2126 * criterion for the requested column already exists, it is
2127 * "AND"ed to the existing criterion. This is used as follows:
2128 *
2129 * <p>
2130 * <code>
2131 * Criteria crit = new Criteria().and("column",
2132 * "value");
2133 * </code>
2134 *
2135 * An EQUAL comparison is used for column and value.
2136 *
2137 * The name of the table must be used implicitly in the column name,
2138 * so the Column name must be something like 'TABLE.id'. If you
2139 * don't like this, you can use the and(table, column, value) method.
2140 *
2141 * @param column The column to run the comparison on
2142 * @param value An Object.
2143 *
2144 * @return A modified Criteria object.
2145 */
2146 public Criteria and(String column, Object value)
2147 {
2148 return and(column, value, EQUAL);
2149 }
2150
2151 /**
2152 * This method adds a new criterion to the list of criterias.
2153 * If a criterion for the requested column already exists, it is
2154 * "AND"ed to the existing criterion. If is used as follow:
2155 *
2156 * <p>
2157 * <code>
2158 * Criteria crit = new Criteria().and("column",
2159 * "value"
2160 * Criteria.GREATER_THAN);
2161 * </code>
2162 *
2163 * Any comparison can be used.
2164 *
2165 * The name of the table must be used implicitly in the column name,
2166 * so the Column name must be something like 'TABLE.id'. If you
2167 * don't like this, you can use the and(table, column, value) method.
2168 *
2169 * @param column The column to run the comparison on
2170 * @param value An Object.
2171 * @param comparison A String.
2172 *
2173 * @return A modified Criteria object.
2174 */
2175 public Criteria and(String column, Object value, SqlEnum comparison)
2176 {
2177 ColumnImpl columnImpl = new ColumnImpl(column);
2178 return and(columnImpl, value, comparison);
2179 }
2180
2181 /**
2182 * This method adds a new criterion to the list of criterias.
2183 * If a criterion for the requested column already exists, it is
2184 * "AND"ed to the existing criterion. If is used as follows:
2185 *
2186 * <p>
2187 * <code>
2188 * Criteria crit = new Criteria().and("table",
2189 * "column",
2190 * "value");
2191 * </code>
2192 *
2193 * An EQUAL comparison is used for column and value.
2194 *
2195 * @param table Name of the table which contains the column
2196 * @param column The column to run the comparison on
2197 * @param value An Object.
2198 * @return A modified Criteria object.
2199 *
2200 * @deprecated use and(Column, Object) instead
2201 */
2202 @Deprecated
2203 public Criteria and(String table, String column, Object value)
2204 {
2205 and(table, column, value, EQUAL);
2206 return this;
2207 }
2208
2209 /**
2210 * This method adds a new criterion to the list of criterias.
2211 * If a criterion for the requested column already exists, it is
2212 * "AND"ed to the existing criterion. If is used as follows:
2213 *
2214 * <p>
2215 * <code>
2216 * Criteria crit = new Criteria().and("table",
2217 * "column",
2218 * "value",
2219 * "Criterion.GREATER_THAN");
2220 * </code>
2221 *
2222 * Any comparison can be used.
2223 *
2224 * @param table Name of table which contains the column
2225 * @param column The column to run the comparison on
2226 * @param value An Object.
2227 * @param comparison String describing how to compare the column with
2228 * the value
2229 * @return A modified Criteria object.
2230 *
2231 * @deprecated use and(Column, Object, comparison) instead
2232 */
2233 @Deprecated
2234 public Criteria and(String table, String column, Object value,
2235 SqlEnum comparison)
2236 {
2237 Criterion oc = getCriterion(table, column);
2238 Criterion nc = new Criterion(table, column, value, comparison);
2239
2240 if (oc == null)
2241 {
2242 criterionMap.put(new ColumnImpl(table, column), nc);
2243 }
2244 else
2245 {
2246 oc.and(nc);
2247 }
2248 return this;
2249 }
2250
2251 /**
2252 * Convenience method to add a Date object specified by
2253 * year, month, and date into the Criteria.
2254 * Equal to
2255 *
2256 * <p>
2257 * <code>
2258 * and(column, new GregorianCalendar(year, month,date), EQUAL);
2259 * </code>
2260 *
2261 * @param column A String value to use as column.
2262 * @param year An int with the year.
2263 * @param month An int with the month.
2264 * @param date An int with the date.
2265 * @return A modified Criteria object.
2266 */
2267 public Criteria andDate(Column column, int year, int month, int date)
2268 {
2269 and(column, new GregorianCalendar(year, month, date).getTime());
2270 return this;
2271 }
2272
2273 /**
2274 * Convenience method to add a Date object specified by
2275 * year, month, and date into the Criteria.
2276 * Equal to
2277 *
2278 * <p>
2279 * <code>
2280 * and(column, new GregorianCalendar(year, month,date), comparison);
2281 * </code>
2282 *
2283 * @param column The column to run the comparison on
2284 * @param year An int with the year.
2285 * @param month An int with the month.
2286 * @param date An int with the date.
2287 * @param comparison String describing how to compare the column with
2288 * the value
2289 * @return A modified Criteria object.
2290 */
2291 public Criteria andDate(Column column, int year, int month, int date,
2292 SqlEnum comparison)
2293 {
2294 and(column, new GregorianCalendar(year, month, date).getTime(), comparison);
2295 return this;
2296 }
2297
2298 /**
2299 * Convenience method to add a Date object specified by
2300 * year, month, and date into the Criteria.
2301 * Equal to
2302 *
2303 * <p>
2304 * <code>
2305 * and(column, new GregorianCalendar(year, month,date), EQUAL);
2306 * </code>
2307 *
2308 * @param column A String value to use as column.
2309 * @param year An int with the year.
2310 * @param month An int with the month.
2311 * @param date An int with the date.
2312 * @return A modified Criteria object.
2313 */
2314 public Criteria andDate(String column, int year, int month, int date)
2315 {
2316 and(column, new GregorianCalendar(year, month, date).getTime());
2317 return this;
2318 }
2319
2320 /**
2321 * Convenience method to add a Date object specified by
2322 * year, month, and date into the Criteria.
2323 * Equal to
2324 *
2325 * <p>
2326 * <code>
2327 * and(column, new GregorianCalendar(year, month,date), comparison);
2328 * </code>
2329 *
2330 * @param column The column to run the comparison on
2331 * @param year An int with the year.
2332 * @param month An int with the month.
2333 * @param date An int with the date.
2334 * @param comparison String describing how to compare the column with
2335 * the value
2336 * @return A modified Criteria object.
2337 */
2338 public Criteria andDate(String column, int year, int month, int date,
2339 SqlEnum comparison)
2340 {
2341 and(column, new GregorianCalendar(year, month, date).getTime(), comparison);
2342 return this;
2343 }
2344
2345 /**
2346 * Adds an 'IN' clause with the criteria supplied as an Object array.
2347 * For example:
2348 *
2349 * <p>
2350 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
2351 * <p>
2352 *
2353 * where 'values' contains three objects that evaluate to the
2354 * respective strings above when .toString() is called.
2355 *
2356 * If a criterion for the requested column already exists, it is
2357 * "AND"ed to the existing criterion.
2358 *
2359 * @param column The column to run the comparison on
2360 * @param values An Object[] with the allowed values.
2361 * @return A modified Criteria object.
2362 */
2363 public Criteria andIn(Column column, Object[] values)
2364 {
2365 and(column, values, Criteria.IN);
2366 return this;
2367 }
2368
2369 /**
2370 * Adds an 'IN' clause with the criteria supplied as an Object array.
2371 * For example:
2372 *
2373 * <p>
2374 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
2375 * <p>
2376 *
2377 * where 'values' contains three objects that evaluate to the
2378 * respective strings above when .toString() is called.
2379 *
2380 * If a criterion for the requested column already exists, it is
2381 * "AND"ed to the existing criterion.
2382 *
2383 * @param column The column to run the comparison on
2384 * @param values An Object[] with the allowed values.
2385 * @return A modified Criteria object.
2386 */
2387 public Criteria andIn(String column, Object[] values)
2388 {
2389 return and(column, values, Criteria.IN);
2390 }
2391
2392 /**
2393 * Adds an 'IN' clause with the criteria supplied as a List.
2394 * For example:
2395 *
2396 * <p>
2397 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
2398 * <p>
2399 *
2400 * where 'values' contains three objects that evaluate to the
2401 * respective strings above when .toString() is called.
2402 *
2403 * If a criterion for the requested column already exists, it is
2404 * "AND"ed to the existing criterion.
2405 *
2406 * @param column The column to run the comparison on
2407 * @param values A List with the allowed values.
2408 * @return A modified Criteria object.
2409 */
2410 public Criteria andIn(Column column, Collection<?> values)
2411 {
2412 and(column, values, Criteria.IN);
2413 return this;
2414 }
2415
2416 /**
2417 * Adds an 'IN' clause with the criteria supplied as a List.
2418 * For example:
2419 *
2420 * <p>
2421 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
2422 * <p>
2423 *
2424 * where 'values' contains three objects that evaluate to the
2425 * respective strings above when .toString() is called.
2426 *
2427 * If a criterion for the requested column already exists, it is
2428 * "AND"ed to the existing criterion.
2429 *
2430 * @param column The column to run the comparison on
2431 * @param values A List with the allowed values.
2432 * @return A modified Criteria object.
2433 */
2434 public Criteria andIn(String column, Collection<?> values)
2435 {
2436 return and(column, values, Criteria.IN);
2437 }
2438
2439 /**
2440 * Adds a 'NOT IN' clause with the criteria supplied as an Object
2441 * array. For example:
2442 *
2443 * <p>
2444 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
2445 * <p>
2446 *
2447 * where 'values' contains three objects that evaluate to the
2448 * respective strings above when .toString() is called.
2449 *
2450 * If a criterion for the requested column already exists, it is
2451 * "AND"ed to the existing criterion.
2452 *
2453 * @param column The column to run the comparison on
2454 * @param values An Object[] with the disallowed values.
2455 * @return A modified Criteria object.
2456 */
2457 public Criteria andNotIn(Column column, Object[] values)
2458 {
2459 and(column, values, Criteria.NOT_IN);
2460 return this;
2461 }
2462
2463 /**
2464 * Adds a 'NOT IN' clause with the criteria supplied as an Object
2465 * array. For example:
2466 *
2467 * <p>
2468 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
2469 * <p>
2470 *
2471 * where 'values' contains three objects that evaluate to the
2472 * respective strings above when .toString() is called.
2473 *
2474 * If a criterion for the requested column already exists, it is
2475 * "AND"ed to the existing criterion.
2476 *
2477 * @param column The column to run the comparison on
2478 * @param values An Object[] with the disallowed values.
2479 * @return A modified Criteria object.
2480 */
2481 public Criteria andNotIn(String column, Object[] values)
2482 {
2483 ColumnImpl columnImpl = new ColumnImpl(column);
2484 return and(columnImpl, values, Criteria.NOT_IN);
2485 }
2486
2487 /**
2488 * Adds a 'NOT IN' clause with the criteria supplied as a List.
2489 * For example:
2490 *
2491 * <p>
2492 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
2493 * <p>
2494 *
2495 * where 'values' contains three objects that evaluate to the
2496 * respective strings above when .toString() is called.
2497 *
2498 * If a criterion for the requested column already exists, it is
2499 * "AND"ed to the existing criterion.
2500 *
2501 * @param column The column to run the comparison on
2502 * @param values A List with the disallowed values.
2503 * @return A modified Criteria object.
2504 */
2505 public Criteria andNotIn(Column column, Collection<?> values)
2506 {
2507 and(column, values, Criteria.NOT_IN);
2508 return this;
2509 }
2510
2511 /**
2512 * Adds a 'NOT IN' clause with the criteria supplied as a List.
2513 * For example:
2514 *
2515 * <p>
2516 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
2517 * <p>
2518 *
2519 * where 'values' contains three objects that evaluate to the
2520 * respective strings above when .toString() is called.
2521 *
2522 * If a criterion for the requested column already exists, it is
2523 * "AND"ed to the existing criterion.
2524 *
2525 * @param column The column to run the comparison on
2526 * @param values A List with the disallowed values.
2527 * @return A modified Criteria object.
2528 */
2529 public Criteria andNotIn(String column, Collection<?> values)
2530 {
2531 return and(column, values, Criteria.NOT_IN);
2532 }
2533
2534 /*
2535 * ------------------------------------------------------------------------
2536 *
2537 * Start of the "or" methods
2538 *
2539 * ------------------------------------------------------------------------
2540 */
2541
2542 /**
2543 * This method adds a prepared Criterion object to the Criteria.
2544 * You can get a new, empty Criterion object with the
2545 * getNewCriterion() method. If a criterion for the requested column
2546 * already exists, it is "OR"ed to the existing criterion.
2547 * This is used as follows:
2548 *
2549 * <p>
2550 * <code>
2551 * Criteria crit = new Criteria();
2552 * Criteria.Criterion c = crit.getNewCriterion(XXXPeer.ID, new Integer(5), Criteria.LESS_THAN);
2553 * crit.or(c);
2554 * </code>
2555 *
2556 * @param c A Criterion object
2557 * @return A modified Criteria object.
2558 */
2559 public Criteria or(Criterion c)
2560 {
2561 Criterion oc = getCriterion(c.getColumn());
2562
2563 if (oc == null)
2564 {
2565 add(c);
2566 }
2567 else
2568 {
2569 oc.or(c);
2570 }
2571 return this;
2572 }
2573
2574 /**
2575 * This method adds a new criterion to the list of criterias. If a
2576 * criterion for the requested column already exists, it is
2577 * "OR"ed to the existing criterion. This is used as follows:
2578 *
2579 * <p>
2580 * <code>
2581 * Criteria crit = new Criteria().or("column",
2582 * "value");
2583 * </code>
2584 *
2585 * An EQUAL comparison is used for column and value.
2586 *
2587 * The name of the table must be used implicitly in the column name,
2588 * so the Column name must be something like 'TABLE.id'. If you
2589 * don't like this, you can use the or(table, column, value) method.
2590 *
2591 * @param column The column to run the comparison on
2592 * @param value An Object.
2593 *
2594 * @return A modified Criteria object.
2595 */
2596 public Criteria or(Column column, Object value)
2597 {
2598 or(column, value, EQUAL);
2599 return this;
2600 }
2601
2602 /**
2603 * This method adds a new criterion to the list of criterias. If a
2604 * criterion for the requested column already exists, it is
2605 * "OR"ed to the existing criterion. This is used as follows:
2606 *
2607 * <p>
2608 * <code>
2609 * Criteria crit = new Criteria().or("column",
2610 * "value");
2611 * </code>
2612 *
2613 * An EQUAL comparison is used for column and value.
2614 *
2615 * The name of the table must be used implicitly in the column name,
2616 * so the Column name must be something like 'TABLE.id'. If you
2617 * don't like this, you can use the or(table, column, value) method.
2618 *
2619 * @param column The column to run the comparison on
2620 * @param value An Object.
2621 *
2622 * @return A modified Criteria object.
2623 */
2624 public Criteria or(String column, Object value)
2625 {
2626 or(column, value, EQUAL);
2627 return this;
2628 }
2629
2630 /**
2631 * This method adds a new criterion to the list of criterias.
2632 * If a criterion for the requested column already exists, it is
2633 * "OR"ed to the existing criterion. If is used as follow:
2634 *
2635 * <p>
2636 * <code>
2637 * Criteria crit = new Criteria().or("column",
2638 * "value"
2639 * "Criterion.GREATER_THAN");
2640 * </code>
2641 *
2642 * Any comparison can be used.
2643 *
2644 * The name of the table must be used implicitly in the column name,
2645 * so the Column name must be something like 'TABLE.id'. If you
2646 * don't like this, you can use the or(table, column, value) method.
2647 *
2648 * @param column The column to run the comparison on
2649 * @param value An Object.
2650 * @param comparison A String.
2651 * @return A modified Criteria object.
2652 */
2653 public Criteria or(Column column, Object value, SqlEnum comparison)
2654 {
2655 Criterion oc = getCriterion(column);
2656 Criterion nc = new Criterion(column, value, comparison);
2657
2658 if (oc == null)
2659 {
2660 criterionMap.put(column, nc);
2661 }
2662 else
2663 {
2664 oc.or(nc);
2665 }
2666 return this;
2667 }
2668
2669 /**
2670 * This method adds a new criterion to the list of criterias.
2671 * If a criterion for the requested column already exists, it is
2672 * "OR"ed to the existing criterion. If is used as follow:
2673 *
2674 * <p>
2675 * <code>
2676 * Criteria crit = new Criteria().or("column",
2677 * "value"
2678 * "Criterion.GREATER_THAN");
2679 * </code>
2680 *
2681 * Any comparison can be used.
2682 *
2683 * The name of the table must be used implicitly in the column name,
2684 * so the Column name must be something like 'TABLE.id'. If you
2685 * don't like this, you can use the or(table, column, value) method.
2686 *
2687 * @param column The column to run the comparison on
2688 * @param value An Object.
2689 * @param comparison A String.
2690 * @return A modified Criteria object.
2691 */
2692 public Criteria or(String column, Object value, SqlEnum comparison)
2693 {
2694 return or(new ColumnImpl(column), value, comparison);
2695 }
2696
2697 /**
2698 * This method adds a new criterion to the list of criterias.
2699 * If a criterion for the requested column already exists, it is
2700 * "OR"ed to the existing criterion. If is used as follows:
2701 *
2702 * <p>
2703 * <code>
2704 * Criteria crit = new Criteria().or("table",
2705 * "column",
2706 * "value");
2707 * </code>
2708 *
2709 * An EQUAL comparison is used for column and value.
2710 *
2711 * @param table Name of the table which contains the column
2712 * @param column The column to run the comparison on
2713 * @param value An Object.
2714 * @return A modified Criteria object.
2715 *
2716 * @deprecated use or(Column, Object) instead
2717 */
2718 @Deprecated
2719 public Criteria or(String table, String column, Object value)
2720 {
2721 or(table, column, value, EQUAL);
2722 return this;
2723 }
2724
2725 /**
2726 * This method adds a new criterion to the list of criterias.
2727 * If a criterion for the requested column already exists, it is
2728 * "OR"ed to the existing criterion. If is used as follows:
2729 *
2730 * <p>
2731 * <code>
2732 * Criteria crit = new Criteria().or("table",
2733 * "column",
2734 * "value",
2735 * "Criterion.GREATER_THAN");
2736 * </code>
2737 *
2738 * Any comparison can be used.
2739 *
2740 * @param table Name of table which contains the column
2741 * @param column The column to run the comparison on
2742 * @param value An Object.
2743 * @param comparison String describing how to compare the column with the value
2744 * @return A modified Criteria object.
2745 *
2746 * @deprecated use or(Column, Object, SqlEnum) instead
2747 */
2748 @Deprecated
2749 public Criteria or(String table, String column, Object value,
2750 SqlEnum comparison)
2751 {
2752 Criterion oc = getCriterion(table, column);
2753 Criterion nc = new Criterion(table, column, value, comparison);
2754 if (oc == null)
2755 {
2756 criterionMap.put(new ColumnImpl(table, column), nc);
2757 }
2758 else
2759 {
2760 oc.or(nc);
2761 }
2762 return this;
2763 }
2764
2765 /**
2766 * Convenience method to add a Date object specified by
2767 * year, month, and date into the Criteria.
2768 * Equal to
2769 *
2770 * <p>
2771 * <code>
2772 * or(column, new GregorianCalendar(year, month,date), EQUAL);
2773 * </code>
2774 *
2775 * @param column A String value to use as column.
2776 * @param year An int with the year.
2777 * @param month An int with the month.
2778 * @param date An int with the date.
2779 * @return A modified Criteria object.
2780 */
2781 public Criteria orDate(Column column, int year, int month, int date)
2782 {
2783 or(column, new GregorianCalendar(year, month, date));
2784 return this;
2785 }
2786
2787 /**
2788 * Convenience method to add a Date object specified by
2789 * year, month, and date into the Criteria.
2790 * Equal to
2791 *
2792 * <p>
2793 * <code>
2794 * or(column, new GregorianCalendar(year, month,date), EQUAL);
2795 * </code>
2796 *
2797 * @param column A String value to use as column.
2798 * @param year An int with the year.
2799 * @param month An int with the month.
2800 * @param date An int with the date.
2801 * @return A modified Criteria object.
2802 */
2803 public Criteria orDate(String column, int year, int month, int date)
2804 {
2805 return or(column, new GregorianCalendar(year, month, date));
2806 }
2807
2808 /**
2809 * Convenience method to add a Date object specified by
2810 * year, month, and date into the Criteria.
2811 * Equal to
2812 *
2813 * <p>
2814 * <code>
2815 * or(column, new GregorianCalendar(year, month,date), comparison);
2816 * </code>
2817 *
2818 * @param column The column to run the comparison on
2819 * @param year An int with the year.
2820 * @param month An int with the month.
2821 * @param date An int with the date.
2822 * @param comparison String describing how to compare the column
2823 * with the value
2824 * @return A modified Criteria object.
2825 */
2826 public Criteria orDate(Column column, int year, int month, int date,
2827 SqlEnum comparison)
2828 {
2829 or(column, new GregorianCalendar(year, month, date), comparison);
2830 return this;
2831 }
2832
2833 /**
2834 * Convenience method to add a Date object specified by
2835 * year, month, and date into the Criteria.
2836 * Equal to
2837 *
2838 * <p>
2839 * <code>
2840 * or(column, new GregorianCalendar(year, month,date), comparison);
2841 * </code>
2842 *
2843 * @param column The column to run the comparison on
2844 * @param year An int with the year.
2845 * @param month An int with the month.
2846 * @param date An int with the date.
2847 * @param comparison String describing how to compare the column
2848 * with the value
2849 * @return A modified Criteria object.
2850 */
2851 public Criteria orDate(String column, int year, int month, int date,
2852 SqlEnum comparison)
2853 {
2854 return or(column, new GregorianCalendar(year, month, date), comparison);
2855 }
2856
2857 /**
2858 * Adds an 'IN' clause with the criteria supplied as an Object
2859 * array. For example:
2860 *
2861 * <p>
2862 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
2863 * <p>
2864 *
2865 * where 'values' contains three objects that evaluate to the
2866 * respective strings above when .toString() is called.
2867 *
2868 * If a criterion for the requested column already exists, it is
2869 * "OR"ed to the existing criterion.
2870 *
2871 * @param column The column to run the comparison on
2872 * @param values An Object[] with the allowed values.
2873 * @return A modified Criteria object.
2874 */
2875 public Criteria orIn(Column column, Object[] values)
2876 {
2877 or(column, values, Criteria.IN);
2878 return this;
2879 }
2880
2881 /**
2882 * Adds an 'IN' clause with the criteria supplied as an Object
2883 * array. For example:
2884 *
2885 * <p>
2886 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
2887 * <p>
2888 *
2889 * where 'values' contains three objects that evaluate to the
2890 * respective strings above when .toString() is called.
2891 *
2892 * If a criterion for the requested column already exists, it is
2893 * "OR"ed to the existing criterion.
2894 *
2895 * @param column The column to run the comparison on
2896 * @param values An Object[] with the allowed values.
2897 * @return A modified Criteria object.
2898 */
2899 public Criteria orIn(String column, Object[] values)
2900 {
2901 return or(column, values, Criteria.IN);
2902 }
2903
2904 /**
2905 * Adds an 'IN' clause with the criteria supplied as a List.
2906 * For example:
2907 *
2908 * <p>
2909 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
2910 * <p>
2911 *
2912 * where 'values' contains three objects that evaluate to the
2913 * respective strings above when .toString() is called.
2914 *
2915 * If a criterion for the requested column already exists, it is
2916 * "OR"ed to the existing criterion.
2917 *
2918 * @param column The column to run the comparison on
2919 * @param values A List with the allowed values.
2920 * @return A modified Criteria object.
2921 */
2922 public Criteria orIn(Column column, Collection<?> values)
2923 {
2924 or(column, values, Criteria.IN);
2925 return this;
2926 }
2927
2928 /**
2929 * Adds an 'IN' clause with the criteria supplied as a List.
2930 * For example:
2931 *
2932 * <p>
2933 * FOO.NAME IN ('FOO', 'BAR', 'ZOW')
2934 * <p>
2935 *
2936 * where 'values' contains three objects that evaluate to the
2937 * respective strings above when .toString() is called.
2938 *
2939 * If a criterion for the requested column already exists, it is
2940 * "OR"ed to the existing criterion.
2941 *
2942 * @param column The column to run the comparison on
2943 * @param values A List with the allowed values.
2944 * @return A modified Criteria object.
2945 */
2946 public Criteria orIn(String column, Collection<?> values)
2947 {
2948 return or(column, values, Criteria.IN);
2949 }
2950
2951 /**
2952 * Adds a 'NOT IN' clause with the criteria supplied as an Object
2953 * array. For example:
2954 *
2955 * <p>
2956 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
2957 * <p>
2958 *
2959 * where 'values' contains three objects that evaluate to the
2960 * respective strings above when .toString() is called.
2961 *
2962 * If a criterion for the requested column already exists, it is
2963 * "OR"ed to the existing criterion.
2964 *
2965 * @param column The column to run the comparison on
2966 * @param values An Object[] with the disallowed values.
2967 * @return A modified Criteria object.
2968 */
2969 public Criteria orNotIn(Column column, Object[] values)
2970 {
2971 or(column, values, Criteria.NOT_IN);
2972 return this;
2973 }
2974
2975 /**
2976 * Adds a 'NOT IN' clause with the criteria supplied as an Object
2977 * array. For example:
2978 *
2979 * <p>
2980 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
2981 * <p>
2982 *
2983 * where 'values' contains three objects that evaluate to the
2984 * respective strings above when .toString() is called.
2985 *
2986 * If a criterion for the requested column already exists, it is
2987 * "OR"ed to the existing criterion.
2988 *
2989 * @param column The column to run the comparison on
2990 * @param values An Object[] with the disallowed values.
2991 * @return A modified Criteria object.
2992 */
2993 public Criteria orNotIn(String column, Object[] values)
2994 {
2995 return or(column, values, Criteria.NOT_IN);
2996 }
2997
2998 /**
2999 * Adds a 'NOT IN' clause with the criteria supplied as a List.
3000 * For example:
3001 *
3002 * <p>
3003 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
3004 * <p>
3005 *
3006 * where 'values' contains three objects that evaluate to the
3007 * respective strings above when .toString() is called.
3008 *
3009 * If a criterion for the requested column already exists, it is
3010 * "OR"ed to the existing criterion.
3011 *
3012 * @param column The column to run the comparison on
3013 * @param values A List with the disallowed values.
3014 * @return A modified Criteria object.
3015 */
3016 public Criteria orNotIn(Column column, Collection<?> values)
3017 {
3018 or(column, values, Criteria.NOT_IN);
3019 return this;
3020 }
3021
3022 /**
3023 * Adds a 'NOT IN' clause with the criteria supplied as a List.
3024 * For example:
3025 *
3026 * <p>
3027 * FOO.NAME NOT IN ('FOO', 'BAR', 'ZOW')
3028 * <p>
3029 *
3030 * where 'values' contains three objects that evaluate to the
3031 * respective strings above when .toString() is called.
3032 *
3033 * If a criterion for the requested column already exists, it is
3034 * "OR"ed to the existing criterion.
3035 *
3036 * @param column The column to run the comparison on
3037 * @param values A List with the disallowed values.
3038 * @return A modified Criteria object.
3039 */
3040 public Criteria orNotIn(String column, Collection<?> values)
3041 {
3042 return or(column, values, Criteria.NOT_IN);
3043 }
3044
3045 /**
3046 * This is an inner class that describes an object in the criteria.
3047 */
3048 public final class Criterion implements Serializable
3049 {
3050 /** Serial version. */
3051 private static final long serialVersionUID = 7157097965404611710L;
3052
3053 /** Constant for thze operator " AND ". */
3054 public static final String AND = " AND ";
3055
3056 /** Constant for thze operator " OR ". */
3057 public static final String OR = " OR ";
3058
3059 /** Value of the CO. */
3060 private Object value;
3061
3062 /** Comparison value. */
3063 private SqlEnum comparison;
3064
3065 /** Column. */
3066 private Column column;
3067
3068 /** flag to ignore case in comparision */
3069 private boolean ignoreStringCase = false;
3070
3071 /**
3072 * other connected criteria.
3073 */
3074 private final List<Criterion> clauses = new ArrayList<Criterion>();
3075
3076 /** The operators (AND, OR...) how the other Criteria are connected. */
3077 private final List<String> conjunctions = new ArrayList<String>();
3078
3079 /**
3080 * Create a new instance.
3081 *
3082 * @param table A String with the name of the table,
3083 * not null or blank.
3084 * @param column A String with the name of the column,
3085 * not null or blank.
3086 * @param val An Object with the value for the Criteria.
3087 * @param comp A String with the comparison value.
3088 *
3089 * @throws NullPointerException if columnName or tableName are null.
3090 * @throws IllegalArgumentException if columnName or tableName are
3091 * blank.
3092 */
3093 Criterion(String table, String column, Object val, SqlEnum comp)
3094 {
3095 this.value = val;
3096 setComparison(comp);
3097 this.column = new ColumnImpl(table, column);
3098 }
3099
3100 /**
3101 * Create a new instance.
3102 *
3103 * @param column the column description, not null.
3104 * @param val An Object with the value for the Criteria, may be null.
3105 * @param comp A String with the comparison value, not null.
3106 *
3107 * @throws NullPointerException if column is null.
3108 */
3109 Criterion(Column column, Object val, SqlEnum comp)
3110 {
3111 this.value = val;
3112 setComparison(comp);
3113 setColumn(column);
3114 }
3115
3116 /**
3117 * Create a new instance.
3118 *
3119 * @param table A String with the name of the table.
3120 * @param column A String with the name of the column.
3121 * @param val An Object with the value for the Criteria.
3122 */
3123 Criterion(String table, String column, Object val)
3124 {
3125 this(table, column, val, EQUAL);
3126 }
3127
3128 /**
3129 * Create a new instance.
3130 *
3131 * @param tableColumn the column description.
3132 * @param val An Object with the value for the Criteria.
3133 */
3134 Criterion(Column column, Object val)
3135 {
3136 this(column, val, EQUAL);
3137 }
3138
3139 /**
3140 * Sets the column.
3141 *
3142 * @param column the column, not null.
3143 *
3144 * @throws NullPointerException if column is null.
3145 */
3146 private void setColumn(Column column)
3147 {
3148 if (column == null)
3149 {
3150 throw new NullPointerException("column must not be null");
3151 }
3152 this.column = column;
3153 }
3154
3155 /**
3156 * Get the column.
3157 *
3158 * @return the column.
3159 */
3160 public Column getColumn()
3161 {
3162 return this.column;
3163 }
3164
3165 /**
3166 * Sets the comparison.
3167 *
3168 * @param comparison the comparison, not null.
3169 *
3170 * @throws NullPointerException if comparison is null.
3171 */
3172 private void setComparison(SqlEnum comparison)
3173 {
3174 if (comparison == null)
3175 {
3176 throw new NullPointerException("comparison must not be null");
3177 }
3178 this.comparison = comparison;
3179 }
3180 /**
3181 * Get the comparison.
3182 *
3183 * @return A String with the comparison.
3184 */
3185 public SqlEnum getComparison()
3186 {
3187 return this.comparison;
3188 }
3189
3190 /**
3191 * Get the value.
3192 *
3193 * @return An Object with the value.
3194 */
3195 public Object getValue()
3196 {
3197 return this.value;
3198 }
3199
3200 /**
3201 * Set the value of the criterion.
3202 *
3203 * @param value the new value.
3204 */
3205 public void setValue(Object value)
3206 {
3207 this.value = value;
3208 }
3209
3210 /**
3211 * Sets ignore case.
3212 *
3213 * @param b True if case should be ignored.
3214 * @return A modified Criteria object.
3215 */
3216 public Criterion setIgnoreCase(boolean b)
3217 {
3218 ignoreStringCase = b;
3219 return this;
3220 }
3221
3222 /**
3223 * Is ignore case on or off?
3224 *
3225 * @return True if case is ignored.
3226 */
3227 public boolean isIgnoreCase()
3228 {
3229 return ignoreStringCase;
3230 }
3231
3232 /**
3233 * Returns the list of clauses in this Criterion.
3234 *
3235 * @return an unmodifiable list of the clauses, not null.
3236 */
3237 public List<Criterion> getClauses()
3238 {
3239 return Collections.unmodifiableList(clauses);
3240 }
3241
3242 /**
3243 * Returns the list of conjunctions in this Criterion
3244 *
3245 * @return an unmodifiable list of the conjunctions, not null.
3246 */
3247 public List<String> getConjunctions()
3248 {
3249 return Collections.unmodifiableList(conjunctions);
3250 }
3251
3252 /**
3253 * Append an AND Criterion onto this Criterion's list.
3254 */
3255 public Criterion and(Criterion criterion)
3256 {
3257 this.clauses.add(criterion);
3258 this.conjunctions.add(AND);
3259 return this;
3260 }
3261
3262 /**
3263 * Append an OR Criterion onto this Criterion's list.
3264 */
3265 public Criterion or(Criterion criterion)
3266 {
3267 this.clauses.add(criterion);
3268 this.conjunctions.add(OR);
3269 return this;
3270 }
3271
3272 /**
3273 * Appends a representation of the Criterion onto the buffer.
3274 */
3275 public void appendTo(StringBuffer sb) throws TorqueException
3276 {
3277 //
3278 // it is alright if value == null
3279 //
3280
3281 if (column == null)
3282 {
3283 return;
3284 }
3285
3286 Criterion clause = null;
3287 for (int j = 0; j < this.clauses.size(); j++)
3288 {
3289 sb.append('(');
3290 }
3291 if (CUSTOM == comparison)
3292 {
3293 if (value != null && !"".equals(value))
3294 {
3295 sb.append((String) value);
3296 }
3297 }
3298 else
3299 {
3300 String field = column.getSqlExpression();
3301 sb.append(field).append(comparison).append(value);
3302 }
3303
3304 for (int i = 0; i < this.clauses.size(); i++)
3305 {
3306 sb.append(this.conjunctions.get(i));
3307 clause = this.clauses.get(i);
3308 clause.appendTo(sb);
3309 sb.append(')');
3310 }
3311 }
3312
3313 /**
3314 * Build a string representation of the Criterion.
3315 *
3316 * @return A String with the representation of the Criterion.
3317 */
3318 @Override
3319 public String toString()
3320 {
3321 //
3322 // it is alright if value == null
3323 //
3324 if (column == null)
3325 {
3326 return "";
3327 }
3328
3329 StringBuffer expr = new StringBuffer();
3330 try
3331 {
3332 appendTo(expr);
3333 }
3334 catch (TorqueException e)
3335 {
3336 return "Criterion cannot be evaluated";
3337 }
3338 return expr.toString();
3339 }
3340
3341 /**
3342 * This method checks another Criteria.Criterion to see if they contain
3343 * the same attributes.
3344 */
3345 @Override
3346 public boolean equals(Object obj)
3347 {
3348 if (this == obj)
3349 {
3350 return true;
3351 }
3352
3353 if ((obj == null) || !(obj instanceof Criterion))
3354 {
3355 return false;
3356 }
3357
3358 Criterion crit = (Criterion) obj;
3359
3360 boolean isEquiv = column.getSqlExpression().equals(
3361 crit.getColumn().getSqlExpression())
3362 && comparison.equals(crit.getComparison());
3363
3364 // we need to check for value equality
3365 if (isEquiv)
3366 {
3367 Object b = crit.getValue();
3368 if (value instanceof Object[] && b instanceof Object[])
3369 {
3370 isEquiv &= Arrays.equals((Object[]) value, (Object[]) b);
3371 }
3372 else if (value instanceof int[] && b instanceof int[])
3373 {
3374 isEquiv &= Arrays.equals((int[]) value, (int[]) b);
3375 }
3376 else
3377 {
3378 isEquiv &= value.equals(b);
3379 }
3380 }
3381
3382 // check chained criterion
3383
3384 isEquiv &= this.clauses.size() == crit.getClauses().size();
3385 for (int i = 0; i < this.clauses.size(); i++)
3386 {
3387 isEquiv &= conjunctions.get(i)
3388 .equals((crit.getConjunctions().get(i)));
3389 isEquiv &= clauses.get(i)
3390 .equals(crit.getClauses().get(i));
3391 }
3392
3393 return isEquiv;
3394 }
3395
3396 /**
3397 * Returns a hash code value for the object.
3398 */
3399 @Override
3400 public int hashCode()
3401 {
3402 int h = value.hashCode() ^ comparison.hashCode();
3403
3404 h ^= column.getSqlExpression().hashCode();
3405
3406 for (int i = 0; i < this.clauses.size(); i++)
3407 {
3408 h ^= (clauses.get(i)).hashCode();
3409 }
3410
3411 return h;
3412 }
3413
3414 /**
3415 * Get the name of all tables from nested criterion objects
3416 *
3417 * @return the list of tables
3418 */
3419 public List<String> getAllTables()
3420 {
3421 UniqueList<String> tables = new UniqueList<String>();
3422 addCriterionTable(this, tables);
3423 return tables;
3424 }
3425
3426 /**
3427 * method supporting recursion through all criterions to give
3428 * us a StringStack of tables from each criterion
3429 */
3430 private void addCriterionTable(Criterion c, UniqueList<String> s)
3431 {
3432 if (c != null)
3433 {
3434 s.add(c.getColumn().getTableName());
3435 for (int i = 0; i < c.getClauses().size(); i++)
3436 {
3437 addCriterionTable((c.getClauses().get(i)), s);
3438 }
3439 }
3440 }
3441
3442 /**
3443 * get an array of all criterion attached to this
3444 * recursing through all sub criterion
3445 */
3446 public Criterion[] getAttachedCriterion()
3447 {
3448 ArrayList<Criterion> crits = new ArrayList<Criterion>();
3449 traverseCriterion(this, crits);
3450 Criterion[] crita = new Criterion[crits.size()];
3451 for (int i = 0; i < crits.size(); i++)
3452 {
3453 crita[i] = crits.get(i);
3454 }
3455
3456 return crita;
3457 }
3458
3459 /**
3460 * method supporting recursion through all criterions to give
3461 * us an ArrayList of them
3462 */
3463 private void traverseCriterion(Criterion c, List<Criterion> a)
3464 {
3465 if (c != null)
3466 {
3467 a.add(c);
3468 for (int i = 0; i < c.getClauses().size(); i++)
3469 {
3470 traverseCriterion(c.getClauses().get(i), a);
3471 }
3472 }
3473 }
3474 } // end of inner class Criterion
3475 }