From 11cd526892baea8ad35571dd7153b7474f14315c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 23 Sep 2014 22:30:49 +0300 Subject: [PATCH 1/4] Improve in-operation handling --- .../com/mysema/query/jpa/JPQLSerializer.java | 28 +++++++------------ .../com/mysema/query/AbstractJPATest.java | 6 ++++ 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java index b92feff66..d0372da53 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java @@ -13,24 +13,12 @@ */ package com.mysema.query.jpa; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import javax.annotation.Nullable; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; -import javax.persistence.EntityManager; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.PersistenceUnitUtil; +import javax.persistence.*; import javax.persistence.metamodel.EntityType; import javax.persistence.metamodel.Metamodel; import javax.persistence.metamodel.SingularAttribute; +import java.util.*; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -39,6 +27,7 @@ import com.mysema.query.JoinType; import com.mysema.query.QueryMetadata; import com.mysema.query.support.SerializerBase; import com.mysema.query.types.*; +import com.mysema.query.types.template.NumberTemplate; import com.mysema.util.MathUtils; /** @@ -427,10 +416,12 @@ public class JPQLSerializer extends SerializerBase { @SuppressWarnings({ "rawtypes", "unchecked" }) private void visitPathInCollection(Class type, Operator operator, List> args) { - // NOTE turns entityPath in collection into entityPath.id in (collection of ids) - if (entityManager != null && !templates.isPathInEntitiesSupported() && args.get(0).getType().isAnnotationPresent(Entity.class)) { - Path lhs = (Path) args.get(0); - Constant rhs = (Constant) args.get(1); + Path lhs = (Path) args.get(0); + Constant rhs = (Constant) args.get(1); + if (((Collection)rhs.getConstant()).isEmpty()) { + operator = Ops.EQ; + args = ImmutableList.of(NumberTemplate.ONE, NumberTemplate.TWO); + } else if (entityManager != null && !templates.isPathInEntitiesSupported() && args.get(0).getType().isAnnotationPresent(Entity.class)) { final Metamodel metamodel = entityManager.getMetamodel(); final PersistenceUnitUtil util = entityManager.getEntityManagerFactory().getPersistenceUnitUtil(); final EntityType entityType = metamodel.entity(args.get(0).getType()); @@ -447,6 +438,7 @@ public class JPQLSerializer extends SerializerBase { args = ImmutableList.of(lhs, rhs); } } + super.visitOperation(type, operator, args); } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java index ee5942429..61c6615a0 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java @@ -21,6 +21,7 @@ import java.util.Map.Entry; import antlr.RecognitionException; import antlr.TokenStreamException; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.mysema.commons.lang.Pair; import com.mysema.query.group.Group; @@ -708,6 +709,11 @@ public abstract class AbstractJPATest { query().from(cat).where(cat.kittens.any().in(savedCats)).count(); } + @Test + public void In8() { + assertEquals(0, query().from(cat).where(cat.name.in(ImmutableList.of())).count()); + } + @Test @IncludeIn(Target.H2) @NoBatooJPA From 681db3880fe6b27b11d0b30fec7af6fe59f14620 Mon Sep 17 00:00:00 2001 From: Ruben Dijkstra Date: Thu, 25 Sep 2014 09:59:53 +0200 Subject: [PATCH 2/4] Use the right generic type to reduce the amount of casts --- .../main/java/com/mysema/query/jpa/JPQLSerializer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java index d0372da53..94662c237 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java @@ -417,8 +417,8 @@ public class JPQLSerializer extends SerializerBase { private void visitPathInCollection(Class type, Operator operator, List> args) { Path lhs = (Path) args.get(0); - Constant rhs = (Constant) args.get(1); - if (((Collection)rhs.getConstant()).isEmpty()) { + Constant> rhs = (Constant>) args.get(1); + if (rhs.getConstant().isEmpty()) { operator = Ops.EQ; args = ImmutableList.of(NumberTemplate.ONE, NumberTemplate.TWO); } else if (entityManager != null && !templates.isPathInEntitiesSupported() && args.get(0).getType().isAnnotationPresent(Entity.class)) { @@ -430,8 +430,8 @@ public class JPQLSerializer extends SerializerBase { // turn lhs into id path lhs = new PathImpl(id.getJavaType(), lhs, id.getName()); // turn rhs into id collection - Set ids = new HashSet(); - for (Object entity : (Collection)rhs.getConstant()) { + Set ids = new HashSet(); + for (Object entity : rhs.getConstant()) { ids.add(util.getIdentifier(entity)); } rhs = ConstantImpl.create(ids); From 3208ac46c27d1ae2bfa97a3d80fc51873852d908 Mon Sep 17 00:00:00 2001 From: Ruben Dijkstra Date: Thu, 25 Sep 2014 10:14:51 +0200 Subject: [PATCH 3/4] Move the SuppressWarnings to a smaller scope --- .../src/main/java/com/mysema/query/jpa/JPQLSerializer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java index 94662c237..136fe2bba 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java @@ -413,10 +413,10 @@ public class JPQLSerializer extends SerializerBase { } } - @SuppressWarnings({ "rawtypes", "unchecked" }) private void visitPathInCollection(Class type, Operator operator, List> args) { Path lhs = (Path) args.get(0); + @SuppressWarnings("unchecked") Constant> rhs = (Constant>) args.get(1); if (rhs.getConstant().isEmpty()) { operator = Ops.EQ; @@ -428,7 +428,7 @@ public class JPQLSerializer extends SerializerBase { if (entityType.hasSingleIdAttribute()) { SingularAttribute id = getIdProperty(entityType); // turn lhs into id path - lhs = new PathImpl(id.getJavaType(), lhs, id.getName()); + lhs = new PathImpl(id.getJavaType(), lhs, id.getName()); // turn rhs into id collection Set ids = new HashSet(); for (Object entity : rhs.getConstant()) { From 40206e13a8f5b2c0260cbcf93e11b6e6cc0de216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Thu, 25 Sep 2014 17:35:12 +0300 Subject: [PATCH 4/4] Update test --- .../src/test/java/com/mysema/query/AbstractJPATest.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java index 61c6615a0..024932a16 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java @@ -710,15 +710,8 @@ public abstract class AbstractJPATest { } @Test - public void In8() { - assertEquals(0, query().from(cat).where(cat.name.in(ImmutableList.of())).count()); - } - - @Test - @IncludeIn(Target.H2) - @NoBatooJPA public void In_Empty() { - query().from(cat).where(cat.name.in(Collections.emptyList())).count(); + assertEquals(0, query().from(cat).where(cat.name.in(ImmutableList.of())).count()); } @Test