Author: fdesbois Date: 2010-03-25 11:53:03 +0100 (Thu, 25 Mar 2010) New Revision: 1856 Log: Evo #418 : Add method 'add(String paramName, Object... paramValue)' Added: trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaQueryTest.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaQuery.java trunk/topia-persistence/src/test/xmi/topiatest.zargo Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaQuery.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaQuery.java 2010-03-25 09:07:09 UTC (rev 1855) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaQuery.java 2010-03-25 10:53:03 UTC (rev 1856) @@ -87,22 +87,21 @@ * * String query = "FROM " + Person.class.getName(); * List<Object> params = new ArrayList<Object>(); - * boolean filtered = false; + * String separator = " WHERE "; * // company parameter can be null * if (company != null) { - * query += " WHERE company = :company"; + * query += separator + "company = :company"; * params.add("company"); * params.add(company); - * filtered = true; + * separator = " AND "; * } * * // contact paramater can be null * if (contact != null) { - * query += filtered ? " AND " : " WHERE " - * query += " contact = :contact"; + * query += separator + "contact = :contact"; * params.add("contact"); * params.add(contact); - * filtered = true; + * separator = " AND "; * } * * context.find(query, params.toArray()); @@ -129,7 +128,7 @@ * * HQL : "FROM PersonImpl AS P WHERE (P.company IS NULL OR P.company = :company) AND P.firstName LIKE :firstName" * - * Using TopiaQuery and an Alias : + * Using TopiaQuery and an Alias (these different queries are equivalent) : * query = TopiaQuery.createQuery(Person.class, "P"); * 1- query.add("(P.company IS NULL OR P.company = :company") AND P.firstName LIKE :firstName") * .addParam("company", company).addParam("firstName",firstName + "%"); @@ -139,6 +138,8 @@ * 3- query.add("P.company IS NULL OR P.company = :company") * .add("P.firstName", Op.LIKE, firstName + "%") * .addParam("company", company); + * 4- query.addNullOr("P.company", Op.EQ, company). + * add("P.firstName", Op.LIKE, firstName + "%"); * * You can use TopiaQuery to create a subquery in an other TopiaQuery, you have * to use the method {@link #fullQuery() } to get the full query in HQL and give @@ -649,6 +650,9 @@ */ public TopiaQuery add(String paramName, Op constraint, Object paramValue) { StringBuilder result = new StringBuilder(paramName).append(' '); + if (log.isInfoEnabled()) { + log.info("paramValue = " + paramValue); + } if (paramValue == null) { result.append(Op.NULL); } else { @@ -710,29 +714,64 @@ * Add an element to the query. The parameter will be automatically added. * The default constrainst operation is Op.EQ for EQUALS. * Ex : add("boat", boat) means -> boat = :boat. + * If you add more than one values, the statement IN will be used. You + * can also have a null value in the {@code paramValue} list (except if it's + * the only one value, it's ambiguous). + * Note : this method do nothing if the {@code paramValue} is not defined. * * @param paramName name of the parameter in the query - * @param paramValue value of the parameter + * @param paramValue values of the parameter * @return the TopiaQuery * @see TopiaQuery#add(String, TopiaQuery.Op, Object) + * @since 2.3.1 */ - public TopiaQuery add(String paramName, Object paramValue) { - return add(paramName, Op.EQ, paramValue); + public TopiaQuery add(String paramName, Object... paramValue) { + int length = paramValue.length; + // Do nothing if there is no value defined + if (length == 0) { + return this; + } + // Only one paramValue + if (length == 1) { + if (log.isInfoEnabled()) { + log.info("Only one value " + Arrays.toString(paramValue)); + } + return add(paramName, Op.EQ, paramValue[0]); + } + // Multiple values is defined + StringBuilder values = new StringBuilder(); + int count = 1; + // Used if one of the value is null + boolean addNull = false; + for (Object value : paramValue) { + if (value != null) { + // Add the valueName to the values list for IN statement + String valueName = getValueName(paramName + count); + if (count != 1) { + values.append(", "); + } + values.append(':').append(valueName); + addParam(valueName, value); + count++; + } else { + addNull = true; + } + } + // Create buffer for IN statement with values + StringBuilder buffer = new StringBuilder(); + buffer.append(paramName).append(" IN(").append(values).append(")"); + // Add the OR statement for null value if needed + if (addNull) { + buffer.append(" OR "). + append(paramName).append(' ').append(Op.NULL.toString()); + } else { + // no parentheses needed in this case (no OR statement) + parentheses = false; + } + return add(buffer.toString()); } /** - * Add an element to the query with a list of different possible values. - * - * @param paramName name of the parameter in the query - * @param values different values for this parameter - * @return the TopiaQuery - * @see #add(java.lang.String, java.util.Collection, boolean) - */ - public TopiaQuery add(String paramName, Collection<Object> values) { - return add(paramName, values, false); - } - - /** * Add an element to the query with a list of different values. The IN key * word will be used to set the different values. An other constraint on * nullity can be set with isNull argument. @@ -744,32 +783,16 @@ * @param isNull use it to test the nullity of parameter * @return the TopiaQuery * @see #add(java.lang.String) + * @deprecated use {@link #add(java.lang.String, java.lang.Object[]) } + * with a null or not */ - public TopiaQuery add(String paramName, Collection<Object> values, boolean isNull) { - StringBuilder queryIn = new StringBuilder(); - if (!values.isEmpty()) { - queryIn.append(paramName).append(" IN ("); - int count = 1; - for (Object value : values) { - String valueName = getValueName(paramName + count); - if (count != 1) { - queryIn.append(", "); - } - queryIn.append(':').append(valueName); - addParam(valueName, value); - count++; - } - queryIn.append(')'); - } + @Deprecated + public TopiaQuery add(String paramName, Collection<Object> values, + boolean isNull) { if (isNull) { - if (!values.isEmpty()) { - queryIn.append(" OR "); - } - queryIn.append(paramName).append(' ').append(Op.NULL); - //queryIn += values.isNotEmpty() ? " OR " : ""; - //queryIn += paramName + " IS NULL"; + values.add(null); } - return add(queryIn.toString()); + return add(paramName, values.toArray()); } /** Added: trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaQueryTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaQueryTest.java (rev 0) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaQueryTest.java 2010-03-25 10:53:03 UTC (rev 1856) @@ -0,0 +1,76 @@ + +package org.nuiton.topia.framework; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.nuiton.topiatest.QueriedEntity; + +/** + * + * @author fdesbois + */ +public class TopiaQueryTest { + + public TopiaQueryTest() { + } + + @BeforeClass + public static void setUpClass() throws Exception { + } + + @AfterClass + public static void tearDownClass() throws Exception { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Test + public void testAdd() { + + // Test with one paramValue + String value = "topia"; + TopiaQuery query = new TopiaQuery(QueriedEntity.class); + query.add(QueriedEntity.TEST_ADD, value); + Assert.assertEquals( + "FROM org.nuiton.topiatest.QueriedEntity " + + "WHERE testAdd = :testAdd", + query.fullQuery()); + + // Test with null paramValue + String nullValue = null; + query = new TopiaQuery(QueriedEntity.class); + query.add(QueriedEntity.TEST_ADD, nullValue); + Assert.assertEquals( + "FROM org.nuiton.topiatest.QueriedEntity " + + "WHERE testAdd IS NULL", + query.fullQuery()); + + // Test with two paramValues + String value2 = "eugene"; + query = new TopiaQuery(QueriedEntity.class); + query.add(QueriedEntity.TEST_ADD, value, value2); + Assert.assertEquals( + "FROM org.nuiton.topiatest.QueriedEntity " + + "WHERE testAdd IN(:testAdd1, :testAdd2)", + query.fullQuery()); + + // Test with two paramValues + null + query = new TopiaQuery(QueriedEntity.class); + query.add(QueriedEntity.TEST_ADD, value, value2, null); + Assert.assertEquals( + "FROM org.nuiton.topiatest.QueriedEntity " + + "WHERE (testAdd IN(:testAdd1, :testAdd2) OR testAdd IS NULL)", + query.fullQuery()); + } + +} \ No newline at end of file Property changes on: trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaQueryTest.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: trunk/topia-persistence/src/test/xmi/topiatest.zargo =================================================================== (Binary files differ)
participants (1)
-
fdesbois@users.nuiton.org