r3016 - in trunk: topia-persistence/src/main/java/org/nuiton/topia/persistence topia-persistence/src/main/java/org/nuiton/topia/persistence/internal topia-persistence/src/test/java/org/nuiton/topia/persistence topia-templates/src/main/java/org/nuiton/topia/templates
Author: bleny Date: 2014-02-26 16:18:05 +0100 (Wed, 26 Feb 2014) New Revision: 3016 Url: http://nuiton.org/projects/topia/repository/revisions/3016 Log: fixes #3098 refactor generation of hql for addIn and addNotIn refs #2894 Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderAddCriteriaStep.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/HqlAndParametersBuilderTest.java trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java 2014-02-26 14:57:21 UTC (rev 3015) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java 2014-02-26 15:18:05 UTC (rev 3016) @@ -24,18 +24,17 @@ * #L% */ -import java.util.Arrays; -import java.util.Map; -import java.util.Set; - +import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.WordUtils; -import com.google.common.base.Preconditions; -import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Set; /** * A builder to create syntactically correct HQL and associated parameters given properties or after various constraint @@ -100,66 +99,26 @@ } } - public void addIn(String property, Iterable<?> values) { - addInOrNotIn(property, values, true); + public void addIn(String property, Collection<?> values) { + Preconditions.checkArgument(StringUtils.isNotEmpty(property)); + Preconditions.checkNotNull(values); + // TODO brendan 02/10/13 if value is intanceof TopiaEntity, we can check type + // TODO brendan 02/10/13 do not use HQL parameters of Object are primitive + String aliasedProperty = alias + "." + property; + String hqlParameterName = putHqlParameterWithAvailableName(property, values); + String whereClause = aliasedProperty + " in (:" + hqlParameterName + ")"; + whereClauses.add(whereClause); } - public void addNotIn(String property, Iterable<?> values) { - addInOrNotIn(property, values, false); - } - - /** - * @param in true if property value must be in given collection, false if value must not be in given collection - */ - protected void addInOrNotIn(String property, Iterable<?> values, boolean in) { + public void addNotIn(String property, Collection<?> values) { Preconditions.checkArgument(StringUtils.isNotEmpty(property)); Preconditions.checkNotNull(values); // TODO brendan 02/10/13 if value is intanceof TopiaEntity, we can check type // TODO brendan 02/10/13 do not use HQL parameters of Object are primitive String aliasedProperty = alias + "." + property; - if (Iterables.size(values) == 1) { - // if there is only one possible value, replace "in" clause by a "=" clause - Object onlyElement = Iterables.getOnlyElement(values); - if (in) { - addEquals(property, onlyElement); - } else { - addNotEquals(property, onlyElement); - } - } else { - boolean propertyMayBeNull = false; // true if values contains null - Set<String> hqlParameterNames = Sets.newLinkedHashSet(); - for (Object value : values) { - if (value == null) { - propertyMayBeNull = true; - } else { - String hqlParameterName = putHqlParameterWithAvailableName(property, value); - hqlParameterNames.add(hqlParameterName); - } - } - String whereClause; - String inClauseValues; - if (hqlParameterNames.isEmpty()) { - inClauseValues = ""; - } else { - inClauseValues = ":" + StringUtils.join(hqlParameterNames, ", :"); - } - if (in) { - String inClause = aliasedProperty + " in (" + inClauseValues + ")"; - if (propertyMayBeNull) { - whereClause = aliasedProperty + " is null or " + inClause; - } else { - whereClause = inClause; - } - } else { - String inClause = aliasedProperty + " not in (" + inClauseValues + ")"; - if (propertyMayBeNull) { - whereClause = aliasedProperty + " is not null and " + inClause; - } else { - whereClause = inClause; - } - } - whereClauses.add(whereClause); - } + String hqlParameterName = putHqlParameterWithAvailableName(property, values); + String whereClause = aliasedProperty + " not in (:" + hqlParameterName + ")"; + whereClauses.add(whereClause); } public void addTopiaIdEquals(String property, String topiaId) { @@ -167,7 +126,7 @@ addEquals(property + "." + TopiaEntity.PROPERTY_TOPIA_ID, topiaId); } - public void addTopiaIdIn(String property, Iterable<String> topiaIds) { + public void addTopiaIdIn(String property, Collection<String> topiaIds) { addIn(property + "." + TopiaEntity.PROPERTY_TOPIA_ID, topiaIds); } @@ -176,8 +135,8 @@ addNotEquals(property + "." + TopiaEntity.PROPERTY_TOPIA_ID, topiaId); } - public void addTopiaIdNotIn(String property, Iterable<String> topiaIds) { - addNotIn(property + "." + TopiaEntity.PROPERTY_TOPIA_ID, (Iterable) topiaIds); + public void addTopiaIdNotIn(String property, Collection<String> topiaIds) { + addNotIn(property + "." + TopiaEntity.PROPERTY_TOPIA_ID, (Collection) topiaIds); } public void addContains(String property, Object value) { Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java 2014-02-26 14:57:21 UTC (rev 3015) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java 2014-02-26 15:18:05 UTC (rev 3016) @@ -24,14 +24,14 @@ * #L% */ -import java.util.List; -import java.util.Map; - +import com.google.common.base.Optional; import org.nuiton.topia.persistence.event.TopiaEntityListener; import org.nuiton.topia.persistence.event.TopiaEntityVetoable; import org.nuiton.topia.persistence.pager.TopiaPagerBean; -import com.google.common.base.Optional; +import java.util.Collection; +import java.util.List; +import java.util.Map; /** * This contract represents the common operations any Dao should be able to provide as API. @@ -222,7 +222,7 @@ /** * @since 3.0 */ - TopiaQueryBuilderRunQueryStep<E> forIn(String propertyName, Iterable<?> propertyValues); + TopiaQueryBuilderRunQueryStep<E> forIn(String propertyName, Collection<?> propertyValues); /** * @since 3.0 @@ -255,7 +255,7 @@ /** * @since 3.0 */ - TopiaQueryBuilderRunQueryStep<E> forTopiaIdIn(Iterable<String> topiaIds); + TopiaQueryBuilderRunQueryStep<E> forTopiaIdIn(Collection<String> topiaIds); void addTopiaEntityListener(TopiaEntityListener listener); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderAddCriteriaStep.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderAddCriteriaStep.java 2014-02-26 14:57:21 UTC (rev 3015) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderAddCriteriaStep.java 2014-02-26 15:18:05 UTC (rev 3016) @@ -24,6 +24,7 @@ * #L% */ +import java.util.Collection; import java.util.Set; /** @@ -55,14 +56,14 @@ * a one-to-one or a many-to-one property * @param values the value the field of the entity must be equals to one of the given values */ - TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addIn(String property, Iterable<?> values); + TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addIn(String property, Collection<?> values); /** * @param property the name of a field of the queried entity, must be * a one-to-one or a many-to-one property * @param values the value the field of the entity must not be equals to any of the given values */ - TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotIn(String property, Iterable<?> values); + TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotIn(String property, Collection<?> values); /** * @param property the name of a field of the queried entity, must be @@ -100,11 +101,11 @@ */ TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addTopiaIdEquals(String property, String topiaId); - TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addTopiaIdIn(String property, Iterable<String> topiaIds); + TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addTopiaIdIn(String property, Collection<String> topiaIds); TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addTopiaIdNotEquals(String property, String topiaId); - TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addTopiaIdNotIn(String property, Iterable<String> topiaIds); + TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addTopiaIdNotIn(String property, Collection<String> topiaIds); TopiaQueryBuilderRunQueryStep<E> setOrderByArguments(Set<String> orderByArguments); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java 2014-02-26 14:57:21 UTC (rev 3015) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java 2014-02-26 15:18:05 UTC (rev 3016) @@ -57,6 +57,7 @@ import org.nuiton.util.PagerBeanUtil; import java.lang.reflect.InvocationTargetException; +import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -400,7 +401,7 @@ } @Override - public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> forIn(String propertyName, Iterable<?> propertyValues) { + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> forIn(String propertyName, Collection<?> propertyValues) { TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> result = newQueryBuilder().addIn(propertyName, propertyValues); return result; } @@ -561,9 +562,9 @@ } @Override - public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> forTopiaIdIn(Iterable<String> topiaIds) { + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> forTopiaIdIn(Collection<String> topiaIds) { Preconditions.checkNotNull(topiaIds, "given topiaIds is null"); - TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> result = forIn(TopiaEntity.PROPERTY_TOPIA_ID, (Iterable) topiaIds); + TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> result = forIn(TopiaEntity.PROPERTY_TOPIA_ID, (Collection) topiaIds); return result; } @@ -749,13 +750,13 @@ } @Override - public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addIn(String property, Iterable<?> values) { + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addIn(String property, Collection<?> values) { hqlAndParametersBuilder.addIn(property, values); return this; } @Override - public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotIn(String property, Iterable<?> values) { + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotIn(String property, Collection<?> values) { hqlAndParametersBuilder.addNotIn(property, values); return this; } @@ -791,7 +792,7 @@ } @Override - public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addTopiaIdIn(String property, Iterable<String> topiaIds) { + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addTopiaIdIn(String property, Collection<String> topiaIds) { hqlAndParametersBuilder.addTopiaIdIn(property, topiaIds); return this; } @@ -803,7 +804,7 @@ } @Override - public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addTopiaIdNotIn(String property, Iterable<String> topiaIds) { + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addTopiaIdNotIn(String property, Collection<String> topiaIds) { hqlAndParametersBuilder.addTopiaIdNotIn(property, topiaIds); return this; } Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/HqlAndParametersBuilderTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/HqlAndParametersBuilderTest.java 2014-02-26 14:57:21 UTC (rev 3015) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/HqlAndParametersBuilderTest.java 2014-02-26 15:18:05 UTC (rev 3016) @@ -81,20 +81,6 @@ } @Test - public void testAddInWithNull() { - - hqlAndParametersBuilder.addIn("myProp", SOME_VALUES_WITH_NULL); - - String actualHql = hqlAndParametersBuilder.getHql(); - - Assert.assertTrue(actualHql.contains("myProp is null or topiaEntity_.myProp in (")); - Assert.assertEquals( - SOME_VALUES_WITH_NULL.size() - 1, // there should be as many argument as in collection minus 1 because null is removed - hqlAndParametersBuilder.getHqlParameters().size()); - - } - - @Test public void testAddNotEqualsToValue() { hqlAndParametersBuilder.addNotEquals("myProp", "value"); @@ -118,17 +104,6 @@ } @Test - public void testAddNotInWithNull() { - - hqlAndParametersBuilder.addNotIn("myProp", SOME_VALUES_WITH_NULL); - - String actualHql = hqlAndParametersBuilder.getHql(); - - Assert.assertTrue(actualHql.contains("myProp is not null and ")); - - } - - @Test public void testAddInWithEmptyValues() { hqlAndParametersBuilder.addIn("myProp", Collections.emptyList()); @@ -136,28 +111,11 @@ String actualHql = hqlAndParametersBuilder.getHql(); Assert.assertFalse(actualHql.contains("myProp in (:)")); - Assert.assertTrue(actualHql.contains("myProp in ()")); + Assert.assertFalse(actualHql.contains("myProp in ()")); } - /** - * Check that the final joining on where clauses (with "and") isn't - * broken by a where clause containing a "or". - */ @Test - public void testPreventOrKillsAnd() { - - hqlAndParametersBuilder.addEquals("myProp1", "myValue1"); - hqlAndParametersBuilder.addIn("myProp2", SOME_VALUES_WITH_NULL); - - String actualHql = hqlAndParametersBuilder.getHql(); - - Assert.assertFalse(actualHql.contains("topiaEntity_.myProp1 = :myProp1 and topiaEntity_.myProp2 is null or topiaEntity_.myProp2 in (:myProp2, :myProp21, :myProp22)")); - Assert.assertTrue(actualHql.contains("(topiaEntity_.myProp1 = :myProp1) and (topiaEntity_.myProp2 is null or topiaEntity_.myProp2 in (:myProp2, :myProp21, :myProp22))")); - - } - - @Test public void testGetParameterName() { String actualParameterName = hqlAndParametersBuilder.getParameterName("yearlyDeclaration.survey.topiaId"); Modified: trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java =================================================================== --- trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java 2014-02-26 14:57:21 UTC (rev 3015) +++ trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java 2014-02-26 15:18:05 UTC (rev 3016) @@ -878,15 +878,17 @@ assocClassName + '.' + getConstantName(attrName); } + addImport(result, Collection.class); + ObjectModelOperation op; op = addOperation(result, getJavaBeanMethodName("for", attrName, "In"), "TopiaQueryBuilderAddCriteriaOrRunQueryStep<E>", ObjectModelJavaModifier.PUBLIC); - addParameter(op, "Iterable<" + attrTypeForGeneric + ">", "v"); + addParameter(op, "Collection<" + attrTypeForGeneric + ">", "v"); setOperationBody(op, "" /*{ - TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> result = forIn(<%=propertyName%>, (Iterable) v); + TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> result = forIn(<%=propertyName%>, (Collection) v); return result; }*/ );
participants (1)
-
bleny@users.nuiton.org