| 1 package org.apache.torque.util; 2 3 21 22 import java.io.IOException ; 23 import java.io.ObjectInputStream ; 24 import java.io.ObjectOutputStream ; 25 import java.io.Serializable ; 26 import java.lang.reflect.Array ; 27 import java.math.BigDecimal ; 28 import java.util.ArrayList ; 29 import java.util.Arrays ; 30 import java.util.GregorianCalendar ; 31 import java.util.HashMap ; 32 import java.util.Hashtable ; 33 import java.util.Iterator ; 34 import java.util.List ; 35 import java.util.Map ; 36 37 import org.apache.commons.collections.OrderedMap; 38 import org.apache.commons.collections.map.ListOrderedMap; 39 import org.apache.commons.lang.ObjectUtils; 40 import org.apache.commons.lang.StringUtils; 41 import org.apache.commons.logging.Log; 42 import org.apache.commons.logging.LogFactory; 43 import org.apache.torque.Torque; 44 import org.apache.torque.TorqueException; 45 import org.apache.torque.adapter.DB; 46 import org.apache.torque.om.DateKey; 47 import org.apache.torque.om.ObjectKey; 48 49 69 public class Criteria extends Hashtable  70 { 71 72 private static final long serialVersionUID = -9001666575933085601L; 73 74 75 public static final SqlEnum EQUAL = SqlEnum.EQUAL; 76 77 78 public static final SqlEnum NOT_EQUAL = SqlEnum.NOT_EQUAL; 79 80 81 public static final SqlEnum ALT_NOT_EQUAL = SqlEnum.ALT_NOT_EQUAL; 82 83 84 public static final SqlEnum GREATER_THAN = SqlEnum.GREATER_THAN; 85 86 87 public static final SqlEnum LESS_THAN = SqlEnum.LESS_THAN; 88 89 90 public static final SqlEnum GREATER_EQUAL = SqlEnum.GREATER_EQUAL; 91 92 93 public static final SqlEnum LESS_EQUAL = SqlEnum.LESS_EQUAL; 94 95 96 public static final SqlEnum LIKE = SqlEnum.LIKE; 97 98 99 public static final SqlEnum NOT_LIKE = SqlEnum.NOT_LIKE; 100 101 102 public static final SqlEnum ILIKE = SqlEnum.ILIKE; 103 104 105 public static final SqlEnum NOT_ILIKE = SqlEnum.NOT_ILIKE; 106 107 108 public static final SqlEnum CUSTOM = SqlEnum.CUSTOM; 109 110 111 public static final SqlEnum DISTINCT = SqlEnum.DISTINCT; 112 113 114 public static final SqlEnum IN = SqlEnum.IN; 115 116 117 public static final SqlEnum NOT_IN = SqlEnum.NOT_IN; 118 119 120 public static final SqlEnum ALL = SqlEnum.ALL; 121 122 123 public static final SqlEnum JOIN = SqlEnum.JOIN; 124 125 126 private static final SqlEnum ASC = SqlEnum.ASC; 127 128 129 private static final SqlEnum DESC = SqlEnum.DESC; 130 131 132 public static final SqlEnum ISNULL = SqlEnum.ISNULL; 133 134 135 public static final SqlEnum ISNOTNULL = SqlEnum.ISNOTNULL; 136 137 138 public static final SqlEnum CURRENT_DATE = SqlEnum.CURRENT_DATE; 139 140 141 public static final SqlEnum CURRENT_TIME = SqlEnum.CURRENT_TIME; 142 143 144 public static final SqlEnum LEFT_JOIN = SqlEnum.LEFT_JOIN; 145 146 147 public static final SqlEnum RIGHT_JOIN = SqlEnum.RIGHT_JOIN; 148 149 150 public static final SqlEnum INNER_JOIN = SqlEnum.INNER_JOIN; 151 152 private static final int DEFAULT_CAPACITY = 10; 153 154 private boolean ignoreCase = false; 155 private boolean singleRecord = false; 156 private boolean cascade = false; 157 private UniqueList selectModifiers = new UniqueList(); 158 private UniqueList selectColumns = new UniqueList(); 159 private UniqueList orderByColumns = new UniqueList(); 160 private UniqueList groupByColumns = new UniqueList(); 161 private Criterion having = null; 162 private OrderedMap asColumns = ListOrderedMap.decorate(new HashMap ()); 163 private transient List joins = null; 164 165 166 private String dbName; 167 168 169 private String originalDbName; 170 171 175 private int limit = -1; 176 177 178 private int offset = 0; 179 180 private HashMap aliases = null; 181 182 private boolean useTransaction = false; 183 184 185 private static Log log = LogFactory.getLog(Criteria.class); 186 187 190 public Criteria() 191 { 192 this(DEFAULT_CAPACITY); 193 } 194 195 200 public Criteria(int initialCapacity) 201 { 202 this(Torque.getDefaultDB(), initialCapacity); 203 } 204 205 211 public Criteria(String dbName) 212 { 213 this(dbName, DEFAULT_CAPACITY); 214 } 215 216 223 public Criteria(String dbName, int initialCapacity) 224 { 225 super(initialCapacity); 226 this.dbName = dbName; 227 this.originalDbName = dbName; 228 } 229 230 235 public void clear() 236 { 237 super.clear(); 238 ignoreCase = false; 239 singleRecord = false; 240 cascade = false; 241 selectModifiers.clear(); 242 selectColumns.clear(); 243 orderByColumns.clear(); 244 groupByColumns.clear(); 245 having = null; 246 asColumns.clear(); 247 joins = null; 248 dbName = originalDbName; 249 offset = 0; 250 limit = -1; 251 aliases = null; 252 useTransaction = false; 253 } 254 255 272 public Criteria addAsColumn(String name, String clause) 273 { 274 asColumns.put(name, clause); 275 return this; 276 } 277 278 284 public Map getAsColumns() 285 { 286 return asColumns; 287 } 288 289 294 public Map getAliases() 295 { 296 return aliases; 297 } 298 299 306 public void addAlias(String alias, String table) 307 { 308 if (aliases == null) 309 { 310 aliases = new HashMap (8); 311 } 312 aliases.put(alias, table); 313 } 314 315 321 public String getTableForAlias(String alias) 322 { 323 if (aliases == null) 324 { 325 return null; 326 } 327 return (String ) aliases.get(alias); 328 } 329 330 337 public boolean containsKey(String table, String column) 338 { 339 return containsKey(table + '.' + column); 340 } 341 342 348 public boolean getBoolean(String column) 349 { 350 return ((Boolean ) getCriterion(column).getValue()).booleanValue(); 351 } 352 353 360 public boolean getBoolean(String table, String column) 361 { 362 return getBoolean(new StringBuffer (table.length() + column.length() + 1) 363 .append(table).append('.').append(column) 364 .toString()); 365 } 366 367 373 public void setUseTransaction(boolean v) 374 { 375 useTransaction = v; 376 } 377 378 384 protected boolean isUseTransaction() 385 { 386 return useTransaction; 387 } 388 389 395 public Criterion getCriterion(String column) 396 { 397 return (Criterion) super.get(column); 398 } 399 400 407 public Criterion getCriterion(String table, String column) 408 { 409 return getCriterion( 410 new StringBuffer (table.length() + column.length() + 1) 411 .append(table).append('.').append(column) 412 .toString()); 413 } 414 415 423 public Criterion getNewCriterion(String column, Object value, 424 SqlEnum comparison) 425 { 426 return new Criterion(column, value, comparison); 427 } 428 429 438 public Criterion getNewCriterion(String table, String column, 439 Object value, SqlEnum comparison) 440 { 441 return new Criterion(table, column, value, comparison); 442 } 443 444 462 public Criteria add(Criterion c) 463 { 464 StringBuffer sb = new StringBuffer (c.getTable().length() 465 + c.getColumn().length() + 1); 466 sb.append(c.getTable()); 467 sb.append('.'); 468 sb.append(c.getColumn()); 469 super.put(sb.toString(), c); 470 return this; 471 } 472 473 479 public String getColumnName(String name) 480 { 481 return getCriterion(name).getColumn(); 482 } 483 484 490 public SqlEnum getComparison(String key) 491 { 492 return getCriterion(key).getComparison(); 493 } 494 495 502 public SqlEnum getComparison(String table, String column) 503 { 504 return getComparison( 505 new StringBuffer (table.length() + column.length() + 1) 506 .append(table).append('.').append(column) 507 .toString()); 508 } 509 510 516 public java.util.Date getDate(String name) 517 { 518 return (java.util.Date ) getCriterion(name).getValue(); 519 } 520 521 528 public java.util.Date getDate(String table, String column) 529 { 530 return getDate( 531 new StringBuffer (table.length() + column.length() + 1) 532 .append(table).append('.').append(column) 533 .toString()); 534 } 535 536 542 public String getDbName() 543 { 544 return dbName; 545 } 546 547 553 public void setDbName(String dbName) 554 { 555 this.dbName = (dbName == null ? Torque.getDefaultDB() : dbName.trim()); 556 } 557 558 564 public double getDouble(String name) 565 { 566 Object obj = getCriterion(name).getValue(); 567 if (obj instanceof String ) 568 { 569 return new Double ((String ) obj).doubleValue(); 570 } 571 return ((Double ) obj).doubleValue(); 572 } 573 574 581 public double getDouble(String table, String column) 582 { 583 return getDouble(new StringBuffer (table.length() + column.length() + 1) 584 .append(table).append('.').append(column) 585 .toString()); 586 } 587 588 594 public float getFloat(String name) 595 { 596 Object obj = getCriterion(name).getValue(); 597 if (obj instanceof String ) 598 { 599 return new Float ((String ) obj).floatValue(); 600 } 601 return ((Float ) obj).floatValue(); 602 } 603 604 611 public float getFloat(String table, String column) 612 { 613 return getFloat(new StringBuffer (table.length() + column.length() + 1) 614 .append(table).append('.').append(column) 615 .toString()); 616 } 617 618 624 public Integer getInteger(String name) 625 { 626 Object obj = getCriterion(name).getValue(); 627 if (obj instanceof String ) 628 { 629 return new Integer ((String ) obj); 630 } 631 return ((Integer ) obj); 632 } 633 634 641 public Integer getInteger(String table, String column) 642 { 643 return getInteger( 644 new StringBuffer (table.length() + column.length() + 1) 645 .append(table).append('.').append(column) 646 .toString()); 647 } 648 649 655 public int getInt(String name) 656 { 657 Object obj = getCriterion(name).getValue(); 658 if (obj instanceof String ) 659 { 660 return new Integer ((String ) obj).intValue(); 661 } 662 return ((Integer ) obj).intValue(); 663 } 664 665 672 public int getInt(String table, String column) 673 { 674 return getInt( 675 new StringBuffer (table.length() + column.length() + 1) 676 .append(table).append('.').append(column) 677 .toString()); 678 } 679 680 686 public BigDecimal getBigDecimal(String name) 687 { 688 Object obj = getCriterion(name).getValue(); 689 if (obj instanceof String ) 690 { 691 return new BigDecimal ((String ) obj); 692 } 693 return (BigDecimal ) obj; 694 } 695 696 703 public BigDecimal getBigDecimal(String table, String column) 704 { 705 return getBigDecimal( 706 new StringBuffer (table.length() + column.length() + 1) 707 .append(table).append('.').append(column) 708 .toString()); 709 } 710 711 717 public long getLong(String name) 718 { 719 Object obj = getCriterion(name).getValue(); 720 if (obj instanceof String ) 721 { 722 return new Long ((String ) obj).longValue(); 723 } 724 return ((Long ) obj).longValue(); 725 } 726 727 734 public long getLong(String table, String column) 735 { 736 return getLong( 737 new StringBuffer (table.length() + column.length() + 1) 738 .append(table).append('.').append(column) 739 .toString()); 740 } 741 742 748 public String getString(String name) 749 { 750 return (String ) getCriterion(name).getValue(); 751 } 752 753 760 public String getString(String table, String column) 761 { 762 return getString( 763 new StringBuffer (table.length() + column.length() + 1) 764 .append(table).append('.').append(column) 765 .toString()); 766 } 767 768 774 public String getTableName(String name) 775 { 776 return getCriterion(name).getTable(); 777 } 778 779 785 public List getList(String name) 786 { 787 return (List ) getCriterion(name).getValue(); 788 } 789 790 797 public List getList(String table, String column) 798 { 799 return getList( 800 new StringBuffer (table.length() + column.length() + 1) 801 .append(table).append('.').append(column) 802 .toString()); 803 } 804 805 811 public Object getValue(String name) 812 { 813 return getCriterion(name).getValue(); 814 } 815 816 823 public Object getValue(String table, String column) 824 { 825 return getValue( 826 new StringBuffer (table.length() + column.length() + 1) 827 .append(table).append('.').append(column) 828 .toString()); 829 } 830 831 837 public ObjectKey getObjectKey(String name) 838 { 839 return (ObjectKey) getCriterion(name).getValue(); 840 } 841 842 849 public ObjectKey getObjectKey(String table, String column) 850 { 851 return getObjectKey( 852 new StringBuffer (table.length() + column.length() + 1) 853 .append(table).append('.').append(column) 854 .toString()); 855 } 856 857 864 public Object get(Object key) 865 { 866 return getValue((String ) key); 867 } 868 869 |