Java tutorial
package org.apache.torque.criteria; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.Map; import org.apache.commons.lang.SerializationUtils; import org.apache.torque.BaseTestCase; import org.apache.torque.Column; import org.apache.torque.ColumnImpl; import org.apache.torque.Torque; import org.apache.torque.TorqueException; import org.apache.torque.map.ColumnMap; import org.apache.torque.map.DatabaseMap; import org.apache.torque.map.TableMap; import org.apache.torque.sql.OrderBy; import org.apache.torque.sql.Query; import org.apache.torque.sql.SqlBuilder; import org.apache.torque.util.UniqueList; /** * Test class for Criteria. * * @author <a href="mailto:celkins@scardini.com">Christopher Elkins</a> * @author <a href="mailto:sam@neurogrid.com">Sam Joseph</a> * @author <a href="mailto:seade@backstagetech.com.au">Scott Eade</a> * @version $Id: CriteriaTest.java 1448414 2013-02-20 21:06:35Z tfischer $ */ public class CriteriaTest extends BaseTestCase { /** The criteria to use in the test. */ private Criteria c; /** * Initializes the criteria. */ @Override public void setUp() throws Exception { super.setUp(); c = new Criteria(); DatabaseMap databaseMap = Torque.getDatabaseMap("postgresql"); if (!databaseMap.containsTable("TABLE")) { TableMap tableMap = databaseMap.addTable("TABLE"); { ColumnMap columnMap1 = new ColumnMap("COLUMN1", tableMap); columnMap1.setType(new String("")); columnMap1.setJavaType("String"); tableMap.addColumn(columnMap1); } { ColumnMap columnMap2 = new ColumnMap("COLUMN2", tableMap); columnMap2.setType(new String("")); columnMap2.setJavaType("String"); tableMap.addColumn(columnMap2); } { ColumnMap columnMap3 = new ColumnMap("COLUMN3", tableMap); columnMap3.setType(new String("")); columnMap3.setJavaType("String"); tableMap.addColumn(columnMap3); } { ColumnMap columnMap4 = new ColumnMap("COLUMN4", tableMap); columnMap4.setType(new Integer(0)); columnMap4.setJavaType("Integer"); tableMap.addColumn(columnMap4); } } } /** * Test basic where condition on a string. */ public void testWhereString() { final Column column = new ColumnImpl("myTable", "myColumn"); final String value = "myValue"; c.where(column, value); // Verify that the Criterion is not composite assertFalse(c.getTopLevelCriterion().isComposite()); // Verify that what we get out is what we put in assertEquals(column, c.getTopLevelCriterion().getLValue()); assertEquals(value, c.getTopLevelCriterion().getRValue()); assertEquals(Criteria.EQUAL, c.getTopLevelCriterion().getComparison()); } /** * Test basic where condition on a string. The condition is reversed, i.e * the String preceeds the column. */ public void testWhereStringReversed() { final Column column = new ColumnImpl("myTable", "myColumn"); final String value = "myValue"; c.where(value, column); // Verify that the Criterion is not composite assertFalse(c.getTopLevelCriterion().isComposite()); // Verify that what we get out is what we put in assertEquals(value, c.getTopLevelCriterion().getLValue()); assertEquals(column, c.getTopLevelCriterion().getRValue()); assertEquals(Criteria.EQUAL, c.getTopLevelCriterion().getComparison()); } /** * Test basic where condition on a string with a non-equal. * comparison operator. */ public void testWhereNotEqual() { final Column column = new ColumnImpl("myTable", "myColumn"); final String value = "myValue"; // Add the string c.where(column, value, Criteria.NOT_EQUAL); // Verify that the Criterion is not composite assertFalse(c.getTopLevelCriterion().isComposite()); // Verify that what we get out is what we put in assertEquals(column, c.getTopLevelCriterion().getLValue()); assertEquals(value, c.getTopLevelCriterion().getRValue()); assertEquals(Criteria.NOT_EQUAL, c.getTopLevelCriterion().getComparison()); } /** * Tests that unary operators as rValue are interpreted * as comparison operator in the two-arg where method. */ public void testWhereUnaryOperator() { // prepare final Column column = new ColumnImpl("myTable", "myColumn"); final SqlEnum operator = SqlEnum.ISNOTNULL; // execute c.where(column, operator); // Verify that what we get out is what we put in assertEquals(column, c.getTopLevelCriterion().getLValue()); assertEquals(null, c.getTopLevelCriterion().getRValue()); assertEquals(operator, c.getTopLevelCriterion().getComparison()); } /** * Tests that unary operators as rValue are interpreted * as comparison operator in the two-arg or method. */ public void testOrUnaryOperator() { // prepare final Column column = new ColumnImpl("myTable", "myColumn"); final SqlEnum operator = SqlEnum.ISNOTNULL; // execute c.or(column, operator); // Verify that what we get out is what we put in assertEquals(column, c.getTopLevelCriterion().getLValue()); assertEquals(null, c.getTopLevelCriterion().getRValue()); assertEquals(operator, c.getTopLevelCriterion().getComparison()); } /** * Test where condition with several ANDs compairing against Strings. */ public void testAndString() { final Column column1 = new ColumnImpl("myTable", "myColumn1"); final Column column2 = new ColumnImpl("myTable", "myColumn2"); final String value1a = "1a"; final String value1b = "1b"; final String value2a = "2a"; final String value2b = "2b"; // Add the string c.where(column1, value1a).and(column1, value1b).and(column2, value2a).and(column2, value2b); // Verify that the Criterion is a composite assertTrue(c.getTopLevelCriterion().isComposite()); // Verify that what we get out is what we put in assertEquals(column1, c.getTopLevelCriterion().getParts().get(0).getLValue()); assertEquals(value1a, c.getTopLevelCriterion().getParts().get(0).getRValue()); assertEquals(Criteria.EQUAL, c.getTopLevelCriterion().getParts().get(0).getComparison()); assertEquals(column1, c.getTopLevelCriterion().getParts().get(1).getLValue()); assertEquals(value1b, c.getTopLevelCriterion().getParts().get(1).getRValue()); assertEquals(Criteria.EQUAL, c.getTopLevelCriterion().getParts().get(1).getComparison()); assertEquals(column2, c.getTopLevelCriterion().getParts().get(2).getLValue()); assertEquals(value2a, c.getTopLevelCriterion().getParts().get(2).getRValue()); assertEquals(Criteria.EQUAL, c.getTopLevelCriterion().getParts().get(2).getComparison()); assertEquals(column2, c.getTopLevelCriterion().getParts().get(3).getLValue()); assertEquals(value2b, c.getTopLevelCriterion().getParts().get(3).getRValue()); assertEquals(Criteria.EQUAL, c.getTopLevelCriterion().getParts().get(3).getComparison()); } /** * Tests that a criterion is copied when being added as top level criterion * using where (also tests and). * checks TORQUE-243. */ public void testCriteriaTopLevelCriterionGetsCopiedWhere() { Criterion criterion = new Criterion(stringColumnMap, "abc"); Criteria criteria = new Criteria().where(criterion); assertNotSame(criterion, criteria.getTopLevelCriterion()); } /** * Tests that a criterion is copied when being added as top level criterion * using where (also tests and). * checks TORQUE-243. */ public void testCriteriaTopLevelCriterionGetsCopiedOr() { Criterion criterion = new Criterion(stringColumnMap, "abc"); Criteria criteria = new Criteria().or(criterion); assertNotSame(criterion, criteria.getTopLevelCriterion()); } /** * Tests that a criterion is copied when being added as top level criterion * using where (also tests and). * checks TORQUE-243. */ public void testCriteriaCriterionGetsCopiedWhere() { Criteria criteria = new Criteria().where(stringColumnMap, "def"); Criterion criterion = new Criterion(stringColumnMap, "abc"); criteria.where(criterion); assertNotSame(criterion, criteria.getTopLevelCriterion().getParts().get(0)); assertNotSame(criterion, criteria.getTopLevelCriterion().getParts().get(1)); } /** * Tests that a criterion is copied when being added as top level criterion * using where (also tests and). * checks TORQUE-243. */ public void testCriteriaCriterionGetsCopiedOr() { Criteria criteria = new Criteria().where(stringColumnMap, "def"); Criterion criterion = new Criterion(stringColumnMap, "abc"); criteria.or(criterion); assertNotSame(criterion, criteria.getTopLevelCriterion().getParts().get(0)); assertNotSame(criterion, criteria.getTopLevelCriterion().getParts().get(1)); } /** * Tests that a criterion does not get changed if it is added as * root criterion to a criteria which is afterwards changed. * checks TORQUE-243. */ public void testCriterionDoesNotGetChangedByCriteriaOr() { Criterion criterion = new Criterion(stringColumnMap, "abc"); Criteria criteria = new Criteria().where(criterion); criteria.or(stringColumnMap, "def"); assertFalse(criterion.isComposite()); assertEquals(stringColumnMap, criterion.getLValue()); assertEquals("abc", criterion.getRValue()); } /** * Tests that a criterion does not get changed if it is added as * root criterion to a criteria which is afterwards changed. * checks TORQUE-243. */ public void testCriterionDoesNotGetChangedByCriteriaAnd() { Criterion criterion = new Criterion(stringColumnMap, "abc"); Criteria criteria = new Criteria().where(criterion); criteria.and(stringColumnMap, "def"); assertFalse(criterion.isComposite()); assertEquals(stringColumnMap, criterion.getLValue()); assertEquals("abc", criterion.getRValue()); } /** * Test that nesting Criterions works for equals comparison. */ public void testNestedCriterionComparisonEqual() throws TorqueException { final Column column2 = new ColumnImpl("myTable2", "myColumn2"); final String value2 = "myValue2"; final Column column3 = new ColumnImpl("myTable3", "myColumn3"); final String value3 = "myValue3"; final Column column4 = new ColumnImpl("myTable4", "myColumn4"); final String value4 = "myValue4"; final Column column5 = new ColumnImpl("myTable5", "myColumn5"); final String value5 = "myValue5"; Criterion crit2 = new Criterion(column2, value2, Criteria.EQUAL); Criterion crit3 = new Criterion(column3, value3, Criteria.EQUAL); Criterion crit4 = new Criterion(column4, value4, Criteria.EQUAL); Criterion crit5 = new Criterion(column5, value5, Criteria.EQUAL); crit2.and(crit3).or(crit4.and(crit5)); c.where(crit2); c.addSelectColumn(new ColumnImpl(null, "myTable2", null, "*")); String expect = "SELECT * FROM myTable2, myTable3, myTable4, myTable5 WHERE " + "((myTable2.myColumn2=? " + "AND myTable3.myColumn3=?) " + "OR (myTable4.myColumn4=? " + "AND myTable5.myColumn5=?))"; Query result = SqlBuilder.buildQuery(c); assertEquals(expect, result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(4, preparedStatementReplacements.size()); assertEquals("myValue2", preparedStatementReplacements.get(0)); assertEquals("myValue3", preparedStatementReplacements.get(1)); assertEquals("myValue4", preparedStatementReplacements.get(2)); assertEquals("myValue5", preparedStatementReplacements.get(3)); } /** * Test that nesting Criterions works for other comparisons than equal. */ public void testNestedCriterionComparisonLessGreaterThan() throws TorqueException { final Column column2 = new ColumnImpl("myTable2", "myColumn2"); final String value2 = "myValue2"; final Column column3 = new ColumnImpl("myTable3", "myColumn3"); final String value3 = "myValue3"; final Column column4 = new ColumnImpl("myTable4", "myColumn4"); final String value4 = "myValue4"; final Column column5 = new ColumnImpl("myTable5", "myColumn5"); final String value5 = "myValue5"; c = new Criteria(); Criterion crit2 = new Criterion(column2, value2, Criteria.LESS_THAN); Criterion crit3 = new Criterion(column3, value3, Criteria.LESS_EQUAL); Criterion crit4 = new Criterion(column4, value4, Criteria.GREATER_THAN); Criterion crit5 = new Criterion(column5, value5, Criteria.GREATER_EQUAL); crit2.and(crit3).or(crit4).and(crit5); c.where(crit2); c.addSelectColumn(new ColumnImpl(null, "myTable2", null, "*")); String expect = "SELECT * FROM myTable2, myTable3, myTable4, myTable5 WHERE " + "(((myTable2.myColumn2<? " + "AND myTable3.myColumn3<=?) " + "OR myTable4.myColumn4>?) " + "AND myTable5.myColumn5>=?)"; Query result = SqlBuilder.buildQuery(c); assertEquals(expect, result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(4, preparedStatementReplacements.size()); assertEquals("myValue2", preparedStatementReplacements.get(0)); assertEquals("myValue3", preparedStatementReplacements.get(1)); assertEquals("myValue4", preparedStatementReplacements.get(2)); assertEquals("myValue5", preparedStatementReplacements.get(3)); } /** * Tests <= and =>. */ public void testBetweenCriterion() throws TorqueException { Criterion cn1 = new Criterion(new ColumnImpl("INVOICE", "COST"), -1, Criteria.GREATER_EQUAL); Criterion cn2 = new Criterion(new ColumnImpl("INVOICE", "COST"), 1, Criteria.LESS_EQUAL); c.where(cn1).and(cn2); String expect = "SELECT FROM INVOICE WHERE " + "(INVOICE.COST>=? AND INVOICE.COST<=?)"; Query result = SqlBuilder.buildQuery(c); assertEquals(expect, result.toString()); assertEquals(2, result.getPreparedStatementReplacements().size()); assertEquals(-1, result.getPreparedStatementReplacements().get(0)); assertEquals(1, result.getPreparedStatementReplacements().get(1)); } /** * Test Criterion.setIgnoreCase(). */ public void testCriterionIgnoreCase() throws TorqueException { Criterion criterion1 = new Criterion(new ColumnImpl("TABLE", "COLUMN1"), "FoObAr1", Criteria.LIKE); criterion1.setIgnoreCase(true); Criterion criterion2 = new Criterion(new ColumnImpl("TABLE", "COLUMN2"), "FoObAr2", Criteria.EQUAL); criterion2.setIgnoreCase(true); Criterion criterion3 = new Criterion(new ColumnImpl("TABLE", "COLUMN3"), "FoObAr3", Criteria.EQUAL); Criterion criterion4 = new Criterion(new ColumnImpl("TABLE", "COLUMN4"), new Integer(1), Criteria.EQUAL); criterion4.setIgnoreCase(true); c.where(criterion1.and(criterion2).and(criterion3).and(criterion4)); c.addSelectColumn(new ColumnImpl(null, "TABLE", null, "*")); c.setDbName("postgresql"); Query result = SqlBuilder.buildQuery(c); String expect = "SELECT * FROM TABLE WHERE " + "(UPPER(TABLE.COLUMN1)=UPPER(?)" + " AND UPPER(TABLE.COLUMN2)=UPPER(?)" + " AND TABLE.COLUMN3=? AND TABLE.COLUMN4=?)"; assertEquals(expect, result.toString()); List<Object> replacements = result.getPreparedStatementReplacements(); assertEquals(4, replacements.size()); assertEquals("FoObAr1", replacements.get(0)); assertEquals("FoObAr2", replacements.get(1)); assertEquals("FoObAr3", replacements.get(2)); assertEquals(new Integer(1), replacements.get(3)); } /** * Test that true is evaluated correctly in Mysql. */ public void testBooleanMysql() throws TorqueException { c.where(new ColumnImpl("TABLE", "COLUMN"), true); c.setDbName("mysql"); Query result = SqlBuilder.buildQuery(c); assertEquals("SELECT FROM TABLE WHERE TABLE.COLUMN=?", result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(1, preparedStatementReplacements.size()); assertEquals(Boolean.TRUE, preparedStatementReplacements.get(0)); } /** * Test that true is evaluated correctly in Postgresql. */ public void testBooleanPostgresql() throws TorqueException { // test the postgresql variation c.where(new ColumnImpl("TABLE", "COLUMN"), true); c.setDbName("postgresql"); Query result = SqlBuilder.buildQuery(c); assertEquals("SELECT FROM TABLE WHERE TABLE.COLUMN=?", result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(1, preparedStatementReplacements.size()); assertEquals(Boolean.TRUE, preparedStatementReplacements.get(0)); } /** * Testcase for whereDate() */ public void testWhereDate() throws TorqueException { c.whereDate(new ColumnImpl("TABLE", "DATE_COLUMN"), 2003, 0, 22); Query result = SqlBuilder.buildQuery(c); assertEquals("SELECT FROM TABLE WHERE TABLE.DATE_COLUMN=?", result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(1, preparedStatementReplacements.size()); assertEquals(new GregorianCalendar(2003, 0, 22).getTime(), preparedStatementReplacements.get(0)); } /** * Testcase for andDate(). */ public void testAndDate() throws TorqueException { c.whereDate(new ColumnImpl("TABLE", "DATE_COLUMN"), 2003, 0, 22, Criteria.GREATER_THAN); c.andDate(new ColumnImpl("TABLE", "DATE_COLUMN"), 2004, 2, 24, Criteria.LESS_THAN); Query result = SqlBuilder.buildQuery(c); assertEquals("SELECT FROM TABLE WHERE " + "(TABLE.DATE_COLUMN>? AND TABLE.DATE_COLUMN<?)", result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(2, preparedStatementReplacements.size()); assertEquals(new GregorianCalendar(2003, 0, 22).getTime(), preparedStatementReplacements.get(0)); assertEquals(new GregorianCalendar(2004, 2, 24).getTime(), preparedStatementReplacements.get(1)); } /** * testcase for where(Date) */ public void testDateWhere() throws TorqueException { Calendar cal = new GregorianCalendar(2003, 0, 22); Date date = cal.getTime(); c.where(new ColumnImpl("TABLE", "DATE_COLUMN"), date); Query result = SqlBuilder.buildQuery(c); assertEquals("SELECT FROM TABLE WHERE " + "TABLE.DATE_COLUMN=?", result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(1, preparedStatementReplacements.size()); assertEquals(new GregorianCalendar(2003, 0, 22).getTime(), preparedStatementReplacements.get(0)); } public void testAndCurrentDate() throws TorqueException { c.where(new ColumnImpl("TABLE", "DATE_COLUMN"), Criteria.CURRENT_DATE); c.addSelectColumn(new ColumnImpl(null, "TABLE", null, "COUNT(*)")); Query result = SqlBuilder.buildQuery(c); assertEquals("SELECT COUNT(*) FROM TABLE WHERE " + "TABLE.DATE_COLUMN=CURRENT_DATE", result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(0, preparedStatementReplacements.size()); } public void testAndCurrentTime() throws TorqueException { c.where(new ColumnImpl("TABLE", "TIME_COLUMN"), Criteria.CURRENT_TIME); c.addSelectColumn(new ColumnImpl(null, "TABLE", null, "COUNT(*)")); Query result = SqlBuilder.buildQuery(c); assertEquals("SELECT COUNT(*) FROM TABLE WHERE " + "TABLE.TIME_COLUMN=CURRENT_TIME", result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(0, preparedStatementReplacements.size()); } public void testCriteriaOffsetLimit() throws TorqueException { c.whereDate(new ColumnImpl("TABLE", "DATE_COLUMN"), 2003, 0, 22); c.setOffset(3).setLimit(5); c.addSelectColumn(new ColumnImpl(null, "TABLE", null, "COUNT(*)")); Query result = SqlBuilder.buildQuery(c); String expect = "SELECT COUNT(*) FROM TABLE WHERE TABLE.DATE_COLUMN=?" + " LIMIT 5 OFFSET 3"; assertEquals(expect, result.toString()); } public void testCriteriaWithOffsetNoLimitPostgresql() throws TorqueException { c.whereDate(new ColumnImpl("TABLE", "DATE_COLUMN"), 2003, 0, 22); c.setOffset(3); c.addSelectColumn(new ColumnImpl(null, "TABLE", null, "COUNT(*)")); Query result = SqlBuilder.buildQuery(c); String expect = "SELECT COUNT(*) FROM TABLE WHERE TABLE.DATE_COLUMN=?" + " OFFSET 3"; assertEquals(expect, result.toString()); } /** * TORQUE-87 */ public void testCriteriaWithOffsetNoLimitMysql() throws TorqueException { c.whereDate(new ColumnImpl("TABLE", "DATE_COLUMN"), 2003, 0, 22); c.setOffset(3); c.addSelectColumn(new ColumnImpl(null, "TABLE", null, "COUNT(*)")); c.setDbName("mysql"); Query result = SqlBuilder.buildQuery(c); String expect = "SELECT COUNT(*) FROM TABLE WHERE TABLE.DATE_COLUMN=?" + " LIMIT 18446744073709551615 OFFSET 3"; assertEquals(expect, result.toString()); } public void testCriteriaToStringLimit() throws TorqueException { c.whereDate(new ColumnImpl("TABLE", "DATE_COLUMN"), 2003, 0, 22); c.setLimit(5); c.addSelectColumn(new ColumnImpl(null, "TABLE", null, "COUNT(*)")); Query result = SqlBuilder.buildQuery(c); String expect = "SELECT COUNT(*) FROM TABLE WHERE TABLE.DATE_COLUMN=?" + " LIMIT 5"; assertEquals(expect, result.toString()); } /** * This test case verifies if the Criteria.LIKE comparison type will * get replaced through Criteria.EQUAL if there are no SQL wildcards * in the given value. */ public void testLikeWithoutWildcards() throws TorqueException { c.where(new ColumnImpl("TABLE", "COLUMN"), "no wildcards", Criteria.LIKE); Query result = SqlBuilder.buildQuery(c); assertEquals("SELECT FROM TABLE WHERE " + "TABLE.COLUMN=?", result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(1, preparedStatementReplacements.size()); assertEquals("no wildcards", preparedStatementReplacements.get(0)); } /** * This test case verifies if the Criteria.NOT_LIKE comparison type will * get replaced through Criteria.NOT_EQUAL if there are no SQL wildcards * in the given value. */ public void testNotLikeWithoutWildcards() { c.where(new ColumnImpl("TABLE", "COLUMN"), "no wildcards", Criteria.NOT_LIKE); String firstExpect = "SELECT FROM TABLE WHERE TABLE.COLUMN!=?"; String secondExpect = "SELECT FROM TABLE WHERE TABLE.COLUMN<>?"; Query result = null; try { result = SqlBuilder.buildQuery(c); } catch (TorqueException e) { e.printStackTrace(); fail("TorqueException thrown in SqlBuilder.buildQuery()"); } assertTrue(result.toString().equals(firstExpect) || result.toString().equals(secondExpect)); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(1, preparedStatementReplacements.size()); assertEquals("no wildcards", preparedStatementReplacements.get(0)); } /** * Test that serialization works. */ public void testSerialization() { c.setOffset(10); c.setLimit(11); c.setIgnoreCase(true); c.setSingleRecord(true); c.setDbName("myDB"); c.setAll(); c.setDistinct(); c.addSelectColumn(new ColumnImpl("Author", "NAME")); c.addSelectColumn(new ColumnImpl("Author", "AUTHOR_ID")); c.addDescendingOrderByColumn(new ColumnImpl("Author", "NAME")); c.addAscendingOrderByColumn(new ColumnImpl("Author", "AUTHOR_ID")); c.addAlias("Writer", "Author"); c.addAsColumn("AUTHOR_NAME", new ColumnImpl("Author", "NAME")); c.addJoin(new ColumnImpl("Author", "AUTHOR_ID"), new ColumnImpl("Book", "AUTHOR_ID"), Criteria.INNER_JOIN); c.where(new ColumnImpl("Author", "NAME"), "author%", Criteria.LIKE); c.addFrom(new FromElement("Author")); // Some direct Criterion checks Criterion cn = c.getTopLevelCriterion(); cn.setIgnoreCase(true); assertEquals("author%", cn.getRValue()); assertEquals(Criteria.LIKE, cn.getComparison()); Criterion cnDirectClone = (Criterion) SerializationUtils.clone(cn); assertEquals(cn, cnDirectClone); // Clone the object Criteria cClone = (Criteria) SerializationUtils.clone(c); // Check the clone assertEquals(c.getTopLevelCriterion(), cClone.getTopLevelCriterion()); assertEquals(10, cClone.getOffset()); assertEquals(c.getOffset(), cClone.getOffset()); assertEquals(11, cClone.getLimit()); assertEquals(c.getLimit(), cClone.getLimit()); assertEquals(true, cClone.isIgnoreCase()); assertEquals(c.isIgnoreCase(), cClone.isIgnoreCase()); assertEquals(true, cClone.isSingleRecord()); assertEquals(c.isSingleRecord(), cClone.isSingleRecord()); assertEquals("myDB", cClone.getDbName()); assertEquals(c.getDbName(), cClone.getDbName()); List<String> selectModifiersClone = cClone.getSelectModifiers(); assertTrue(selectModifiersClone.contains(Criteria.ALL.toString())); assertTrue(selectModifiersClone.contains(Criteria.DISTINCT.toString())); assertEquals(c.getSelectModifiers(), cClone.getSelectModifiers()); List<Column> selectColumnsClone = cClone.getSelectColumns(); assertTrue(selectColumnsClone.contains(new ColumnImpl("Author", "NAME"))); assertTrue(selectColumnsClone.contains(new ColumnImpl("Author", "AUTHOR_ID"))); assertEquals(c.getSelectColumns(), cClone.getSelectColumns()); List<OrderBy> orderByColumnsClone = cClone.getOrderByColumns(); assertTrue(orderByColumnsClone.contains(new OrderBy(new ColumnImpl("Author.NAME"), SqlEnum.DESC, false))); assertTrue( orderByColumnsClone.contains(new OrderBy(new ColumnImpl("Author.AUTHOR_ID"), SqlEnum.ASC, false))); assertEquals(c.getOrderByColumns(), cClone.getOrderByColumns()); Map<String, Object> aliasesClone = cClone.getAliases(); assertTrue(aliasesClone.containsKey("Writer")); assertEquals("Author", aliasesClone.get("Writer")); assertEquals(c.getAliases(), cClone.getAliases()); Map<String, Column> asColumnsClone = cClone.getAsColumns(); assertTrue(asColumnsClone.containsKey("AUTHOR_NAME")); assertEquals(new ColumnImpl("Author", "NAME"), asColumnsClone.get("AUTHOR_NAME")); assertEquals(c.getAsColumns(), cClone.getAsColumns()); List<FromElement> fromElementsClone = new UniqueList<FromElement>(); fromElementsClone.add(new FromElement("Author")); assertEquals(c.getFromElements(), fromElementsClone); // Check Joins List<Join> joinsClone = cClone.getJoins(); Join joinClone = joinsClone.get(0); assertEquals(new ColumnImpl("Author", "AUTHOR_ID"), joinClone.getJoinCondition().getLValue()); assertEquals(new ColumnImpl("Book", "AUTHOR_ID"), joinClone.getJoinCondition().getRValue()); assertEquals(Criteria.INNER_JOIN, joinClone.getJoinType()); assertEquals(c.getJoins(), cClone.getJoins()); // Some Criterion checks Criterion cnClone = cClone.getTopLevelCriterion(); assertEquals("author%", cnClone.getRValue()); assertEquals(Criteria.LIKE, cnClone.getComparison()); assertEquals(cn.isIgnoreCase(), cnClone.isIgnoreCase()); // Confirm that equals() checks all of the above. assertEquals(c, cClone); // Check hashCode() too. assertEquals(c.hashCode(), cClone.hashCode()); } /** * Test that cloning works. */ public void testClone() { c.setOffset(10); c.setLimit(11); c.setIgnoreCase(true); c.setSingleRecord(true); c.setDbName("myDB"); c.setAll(); c.setDistinct(); c.addSelectColumn(new ColumnImpl("Author", "NAME")); c.addSelectColumn(new ColumnImpl("Author", "AUTHOR_ID")); c.addDescendingOrderByColumn(new ColumnImpl("Author", "NAME")); c.addAscendingOrderByColumn(new ColumnImpl("Author", "AUTHOR_ID")); c.addAlias("Writer", "Author"); c.addAsColumn("AUTHOR_NAME", new ColumnImpl("Author", "NAME")); c.addJoin(new ColumnImpl("Author", "AUTHOR_ID"), new ColumnImpl("Book", "AUTHOR_ID"), Criteria.INNER_JOIN); c.where(new ColumnImpl("Author", "NAME"), "author%", Criteria.LIKE); // Clone the object Criteria cClone = (Criteria) c.clone(); // Check the clone assertEquals(c.getTopLevelCriterion(), cClone.getTopLevelCriterion()); assertEquals(10, cClone.getOffset()); assertEquals(c.getOffset(), cClone.getOffset()); assertEquals(11, cClone.getLimit()); assertEquals(c.getLimit(), cClone.getLimit()); assertEquals(true, cClone.isIgnoreCase()); assertEquals(c.isIgnoreCase(), cClone.isIgnoreCase()); assertEquals(true, cClone.isSingleRecord()); assertEquals(c.isSingleRecord(), cClone.isSingleRecord()); assertEquals("myDB", cClone.getDbName()); assertEquals(c.getDbName(), cClone.getDbName()); List<String> selectModifiersClone = cClone.getSelectModifiers(); assertTrue(selectModifiersClone.contains(Criteria.ALL.toString())); assertTrue(selectModifiersClone.contains(Criteria.DISTINCT.toString())); assertEquals(c.getSelectModifiers(), cClone.getSelectModifiers()); List<Column> selectColumnsClone = cClone.getSelectColumns(); assertTrue(selectColumnsClone.contains(new ColumnImpl("Author", "NAME"))); assertTrue(selectColumnsClone.contains(new ColumnImpl("Author", "AUTHOR_ID"))); assertEquals(c.getSelectColumns(), cClone.getSelectColumns()); List<OrderBy> orderByColumnsClone = cClone.getOrderByColumns(); assertTrue(orderByColumnsClone.contains(new OrderBy(new ColumnImpl("Author.NAME"), SqlEnum.DESC, false))); assertTrue( orderByColumnsClone.contains(new OrderBy(new ColumnImpl("Author.AUTHOR_ID"), SqlEnum.ASC, false))); assertEquals(c.getOrderByColumns(), cClone.getOrderByColumns()); Map<String, Object> aliasesClone = cClone.getAliases(); assertTrue(aliasesClone.containsKey("Writer")); assertEquals("Author", aliasesClone.get("Writer")); assertEquals(c.getAliases(), cClone.getAliases()); Map<String, Column> asColumnsClone = cClone.getAsColumns(); assertTrue(asColumnsClone.containsKey("AUTHOR_NAME")); assertEquals(new ColumnImpl("Author", "NAME"), asColumnsClone.get("AUTHOR_NAME")); assertEquals(c.getAsColumns(), cClone.getAsColumns()); // Check Joins List<Join> joinsClone = cClone.getJoins(); Join joinClone = joinsClone.get(0); assertEquals(new ColumnImpl("Author", "AUTHOR_ID"), joinClone.getJoinCondition().getLValue()); assertEquals(new ColumnImpl("Book", "AUTHOR_ID"), joinClone.getJoinCondition().getRValue()); assertEquals(Criteria.INNER_JOIN, joinClone.getJoinType()); assertEquals(c.getJoins(), cClone.getJoins()); // Some Criterion checks Criterion cnClone = cClone.getTopLevelCriterion(); assertEquals("author%", cnClone.getRValue()); assertEquals(Criteria.LIKE, cnClone.getComparison()); assertEquals(c.getTopLevelCriterion().isIgnoreCase(), cnClone.isIgnoreCase()); // Confirm that equals() checks all of the above. assertEquals(c, cClone); // Check hashCode() too. assertEquals(c.hashCode(), cClone.hashCode()); } /** * Test that {@link Criteria#equals(Object)} works correctly for a simple * Criteria object. * @throws TorqueException */ public void testEquals() throws TorqueException { c.addSelectColumn(new ColumnImpl("Author", "NAME")); c.addSelectColumn(new ColumnImpl("Author", "AUTHOR_ID")); c.where(new ColumnImpl("Author", "NAME"), "foobar"); Criteria cClone = (Criteria) SerializationUtils.clone(c); assertTrue(c.equals(cClone)); } /** * Checks whether orderBy works. */ public void testOrderBy() throws TorqueException { // we need a rudimentary databaseMap for this test case to work DatabaseMap dbMap = Torque.getDatabaseMap(Torque.getDefaultDB()); TableMap tableMap = dbMap.addTable("AUTHOR"); ColumnMap columnMap = new ColumnMap("NAME", tableMap); columnMap.setType(""); tableMap.addColumn(columnMap); columnMap = new ColumnMap("AUTHOR_ID", tableMap); columnMap.setType(new Integer(0)); tableMap.addColumn(columnMap); // check that alias'ed tables are referenced by their alias // name when added to the select clause. c.addSelectColumn(new ColumnImpl("AUTHOR", "NAME")); c.addAlias("a", "AUTHOR"); c.addJoin(new ColumnImpl("AUTHOR", "AUTHOR_ID"), new ColumnImpl("a", "AUTHOR_ID")); c.addAscendingOrderByColumn(new ColumnImpl("a", "NAME")); Query result = SqlBuilder.buildQuery(c); assertEquals("SELECT AUTHOR.NAME, a.NAME " + "FROM AUTHOR, AUTHOR a " + "WHERE AUTHOR.AUTHOR_ID=a.AUTHOR_ID " + "ORDER BY a.NAME ASC", result.toString()); List<Object> preparedStatementReplacements = result.getPreparedStatementReplacements(); assertEquals(0, preparedStatementReplacements.size()); } }