diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/AbstractJPQLSubQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/AbstractJPQLSubQuery.java index 4b85a71be..d4ddc8f7e 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/AbstractJPQLSubQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/AbstractJPQLSubQuery.java @@ -6,6 +6,8 @@ package com.mysema.query.jpa; import com.mysema.query.DefaultQueryMetadata; +import com.mysema.query.JoinExpression; +import com.mysema.query.JoinType; import com.mysema.query.QueryMetadata; import com.mysema.query.support.DetachableQuery; import com.mysema.query.types.CollectionExpression; @@ -13,6 +15,8 @@ import com.mysema.query.types.EntityPath; import com.mysema.query.types.MapExpression; import com.mysema.query.types.Path; import com.mysema.query.types.Predicate; +import com.mysema.query.types.query.NumberSubQuery; +import com.mysema.query.types.template.NumberTemplate; /** * Abstract superclass for SubQuery implementations @@ -35,6 +39,19 @@ public class AbstractJPQLSubQuery> extends Det super.queryMixin.setSelf((Q)this); this.queryMixin = (JPQLQueryMixin) super.queryMixin; } + + @Override + public NumberSubQuery count(){ + StringBuilder count = new StringBuilder(); + for (JoinExpression join : queryMixin.getMetadata().getJoins()){ + if (join.getType() == JoinType.DEFAULT){ + count.append(count.length() == 0 ? "count(" : ", "); + count.append(join.getTarget().toString()); + } + } + count.append(")"); + return unique(NumberTemplate.create(Long.class, count.toString())); + } public Q from(EntityPath... o) { return queryMixin.from(o); 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 8d0a69e3e..213492fec 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 @@ -37,8 +37,6 @@ public class JPQLSerializer extends SerializerBase { Ops.LT, Ops.LOE, Ops.GT, Ops.GOE, Ops.BETWEEN, Ops.BEFORE, Ops.AFTER, Ops.BOE, Ops.AOE)); - private static final String SELECT_COUNT_DISTINCT = "select count(distinct "; - private static final String COMMA = ", "; private static final String DELETE = "delete "; @@ -55,6 +53,8 @@ public class JPQLSerializer extends SerializerBase { private static final String SELECT_COUNT = "select count("; + private static final String SELECT_COUNT_DISTINCT = "select count(distinct "; + private static final String SELECT_DISTINCT = "select distinct "; private static final String SET = "\nset "; diff --git a/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java b/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java index b1910f07e..0e50c50fb 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java @@ -208,25 +208,35 @@ public abstract class AbstractStandardTest { } @Test - public void Any_And(){ + public void Any_And_Lt(){ assertEquals(1, catQuery().where(cat.kittens.any().name.eq("Ruth123"), cat.kittens.any().bodyWeight.lt(10.0)).count()); + } + + @Test + public void Any_And_Gt(){ assertEquals(0, catQuery().where(cat.kittens.any().name.eq("Ruth123"), cat.kittens.any().bodyWeight.gt(10.0)).count()); } @Test - public void Aggregates_UniqueResult(){ - // uniqueResult + public void Aggregates_UniqueResult_Min(){ assertEquals(Integer.valueOf(1), catQuery().uniqueResult(cat.id.min())); - assertEquals(Integer.valueOf(6), catQuery().uniqueResult(cat.id.max())); } @Test - public void Aggregates_List(){ - // list + public void Aggregates_UniqueResult_Max(){ + assertEquals(Integer.valueOf(6), catQuery().uniqueResult(cat.id.max())); + } + + @Test + public void Aggregates_List_Min(){ assertEquals(Integer.valueOf(1), catQuery().list(cat.id.min()).get(0)); - assertEquals(Integer.valueOf(6), catQuery().list(cat.id.max()).get(0)); } + @Test + public void Aggregates_List_Max(){ + assertEquals(Integer.valueOf(6), catQuery().list(cat.id.max()).get(0)); + } + @Test public void DistinctResults(){ System.out.println("-- list results"); @@ -245,21 +255,6 @@ public abstract class AbstractStandardTest { assertEquals(1, catQuery().listDistinct(cat.birthdate).size()); } - @Test - public void DistinctResults2(){ - SearchResults res = catQuery().limit(2).listResults(cat.birthdate); - assertEquals(2, res.getResults().size()); - assertEquals(6l, res.getTotal()); - System.out.println(); - - res = catQuery().limit(2).distinct().listResults(cat.birthdate); - assertEquals(1, res.getResults().size()); - assertEquals(1l, res.getTotal()); - System.out.println(); - - assertEquals(1, catQuery().distinct().list(cat.birthdate).size()); - } - @Test public void In(){ catQuery().where(cat.id.in(Arrays.asList(1,2,3))).count(); @@ -268,7 +263,6 @@ public abstract class AbstractStandardTest { @Test public void StartsWith(){ - // startsWith assertEquals(1, catQuery().where(cat.name.startsWith("R")).count()); assertEquals(0, catQuery().where(cat.name.startsWith("X")).count()); assertEquals(1, catQuery().where(cat.name.startsWithIgnoreCase("r")).count()); @@ -276,7 +270,6 @@ public abstract class AbstractStandardTest { @Test public void EndsWith(){ - // endsWith assertEquals(1, catQuery().where(cat.name.endsWith("h123")).count()); assertEquals(0, catQuery().where(cat.name.endsWith("X")).count()); assertEquals(1, catQuery().where(cat.name.endsWithIgnoreCase("H123")).count()); @@ -284,7 +277,6 @@ public abstract class AbstractStandardTest { @Test public void Contains1(){ - // contains assertEquals(1, catQuery().where(cat.name.contains("eli")).count()); } @@ -295,20 +287,17 @@ public abstract class AbstractStandardTest { @Test public void Length(){ - // length assertEquals(6, catQuery().where(cat.name.length().gt(0)).count()); } @Test public void IndexOf(){ - // indexOf assertEquals(Integer.valueOf(0), catQuery().where(cat.name.eq("Bob123")).uniqueResult(cat.name.indexOf("B"))); assertEquals(Integer.valueOf(1), catQuery().where(cat.name.eq("Bob123")).uniqueResult(cat.name.indexOf("o"))); } @Test public void StringOperations(){ - // case-sensitivity if (!getTarget().equals(Target.MYSQL)){ // NOTE : locate in MYSQL is case-insensitive assertEquals(0, catQuery().where(cat.name.startsWith("r")).count()); assertEquals(0, catQuery().where(cat.name.endsWith("H123")).count()); @@ -318,27 +307,23 @@ public abstract class AbstractStandardTest { @Test public void Limit(){ - // limit List names1 = Arrays.asList("Allen123","Bob123"); assertEquals(names1, catQuery().orderBy(cat.name.asc()).limit(2).list(cat.name)); } @Test public void Limit2(){ - // limit assertEquals(Collections.singletonList("Allen123"), catQuery().orderBy(cat.name.asc()).limit(1).list(cat.name)); } @Test public void Offset(){ - // offset List names2 = Arrays.asList("Felix123","Mary123","Ruth123","Some"); assertEquals(names2, catQuery().orderBy(cat.name.asc()).offset(2).list(cat.name)); } @Test public void Limit_and_offset(){ - // limit + offset List names3 = Arrays.asList("Felix123","Mary123"); assertEquals(names3, catQuery().orderBy(cat.name.asc()).limit(2).offset(2).list(cat.name)); } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/CastTest.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/CastTest.java index 8636b6918..93a27cf01 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/CastTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/CastTest.java @@ -17,12 +17,32 @@ public class CastTest extends AbstractQueryTest { private static NumberExpression expr = new NumberPath(Integer.class,"int"); @Test - public void NumericCast() { + public void Byte() { assertEquals(Byte.class, expr.byteValue().getType()); + } + + @Test + public void Double() { assertEquals(Double.class, expr.doubleValue().getType()); + } + + @Test + public void Float() { assertEquals(Float.class, expr.floatValue().getType()); + } + + @Test + public void Integer() { assertEquals(Integer.class, expr.intValue().getType()); + } + + @Test + public void Long() { assertEquals(Long.class, expr.longValue().getType()); + } + + @Test + public void Short() { assertEquals(Short.class, expr.shortValue().getType()); } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/CollectionTest.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/CollectionTest.java index 086991cb8..e8419f8fd 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/CollectionTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/CollectionTest.java @@ -12,14 +12,18 @@ import com.mysema.query.jpa.domain.Cat; public class CollectionTest extends AbstractQueryTest{ @Test - public void InElements(){ + public void Constant_InElements(){ assertToString(":a1 in elements(cat.kittensSet)", cat.kittensSet.contains(new Cat())); assertToString(":a1 in elements(cat.kittens)", cat.kittens.contains(new Cat())); + } + @Test + public void Path_InElements(){ assertToString("cat in elements(cat1.kittens)", cat.in(cat1.kittens)); assertToString("cat in elements(cat1.kittensSet)", cat.in(cat1.kittensSet)); } + @Test public void CollectionOperations() { // HQL functions that take collection-valued path expressions: size(), diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/SubQueryTest.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/SubQueryTest.java index b9fdf6998..8c33820db 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/SubQueryTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/SubQueryTest.java @@ -9,6 +9,8 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; +import com.mysema.query.domain.QCat; + public class SubQueryTest extends AbstractQueryTest{ @Test(expected=IllegalArgumentException.class) @@ -17,21 +19,37 @@ public class SubQueryTest extends AbstractQueryTest{ } @Test - public void Serialization(){ + public void Single_Source(){ JPQLSubQuery query = sub(); - query.from(cat); assertEquals("from Cat cat", query.toString()); - + } + + @Test + public void Multiple_Sources(){ + JPQLSubQuery query = sub(); + query.from(cat); query.from(fatcat); assertEquals("from Cat cat, Cat fatcat", query.toString()); } @Test - public void Joins(){ + public void InnerJoin(){ assertEquals("from Cat cat\n inner join cat.mate", sub().from(cat).innerJoin(cat.mate).toString()); + } + + @Test + public void LeftJoin(){ assertEquals("from Cat cat\n left join cat.mate", sub().from(cat).leftJoin(cat.mate).toString()); + } + + @Test + public void FullJoin(){ assertEquals("from Cat cat\n full join cat.mate", sub().from(cat).fullJoin(cat.mate).toString()); + } + + @Test + public void Join(){ assertEquals("from Cat cat\n join cat.mate", sub().from(cat).join(cat.mate).toString()); } @@ -64,4 +82,31 @@ public class SubQueryTest extends AbstractQueryTest{ assertToString("not exists (select 1 from Cat cat where cat.weight < :a1)", sub().from(cat).where(cat.weight.lt(1)).unique(cat).notExists()); } + @Test + public void Count() { + assertToString("(select count(cat) from Cat cat)", sub().from(cat).count()); + } + + @Test + public void Count_Via_List(){ + assertToString("(select count(cat) from Cat cat)", sub().from(cat).list(cat).count()); + } + + @Test + public void Count_Name() { + assertToString("(select count(cat.name) from Cat cat)", sub().from(cat).list(cat.name).count()); + } + + @Test + public void Count_Multiple_Sources() { + QCat other = new QCat("other"); + assertToString("(select count(cat, other) from Cat cat, Cat other)", sub().from(cat, other).count()); + } + + @Test + public void Count_Multiple_Sources_Via_List() { + QCat other = new QCat("other"); + assertToString("(select count(cat, other) from Cat cat, Cat other)", sub().from(cat, other).list(cat, other).count()); + } + } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/hibernate/sql/DerbySQLTest.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/hibernate/sql/DerbySQLTest.java index 44c1d82ae..4a675eafb 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/hibernate/sql/DerbySQLTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/hibernate/sql/DerbySQLTest.java @@ -31,6 +31,8 @@ import com.mysema.testutil.HibernateTestRunner; @HibernateConfig("derby.properties") public class DerbySQLTest { + private SAnimal cat = new SAnimal("cat"); + private static final SQLTemplates derbyTemplates = new DerbyTemplates(); private Session session; @@ -55,45 +57,65 @@ public class DerbySQLTest { } @Test - public void ScalarQueries(){ - SAnimal cat = new SAnimal("cat"); - - // count + public void Count(){ assertEquals(6l, query().from(cat).where(cat.dtype.eq("C")).count()); - - // countDistinct + } + + @Test + public void CountDistinct(){ assertEquals(6l, query().from(cat).where(cat.dtype.eq("C")).countDistinct()); - - // list + } + + @Test + public void List(){ assertEquals(6, query().from(cat).where(cat.dtype.eq("C")).list(cat.id).size()); - - // list with limit + } + + @Test + public void List_With_Limit(){ assertEquals(3, query().from(cat).limit(3).list(cat.id).size()); + } + + @Test + public void List_With_Offset(){ + assertEquals(3, query().from(cat).offset(3).list(cat.id).size()); + } - // list with offset - assertEquals(3, query().from(cat).offset(3).list(cat.id).size()); - - // list with limit and offset - assertEquals(3, query().from(cat).offset(3).limit(3).list(cat.id).size()); - - // list multiple - print(query().from(cat).where(cat.dtype.eq("C")).list(cat.id, cat.name, cat.bodyweight)); - - // listResults + @Test + public void List_Limit_And_Offset(){ + assertEquals(3, query().from(cat).offset(3).limit(3).list(cat.id).size()); + } + + @Test + public void List_Multiple(){ + print(query().from(cat).where(cat.dtype.eq("C")).list(cat.id, cat.name, cat.bodyweight)); + } + + @Test + public void List_Results(){ SearchResults results = query().from(cat).limit(3).orderBy(cat.name.asc()).listResults(cat.name); assertEquals(Arrays.asList("Beck","Bobby","Harold"), results.getResults()); - assertEquals(6l, results.getTotal()); - - // unique Result - query().from(cat).limit(1).uniqueResult(cat.id); - - query().from(cat).limit(1).uniqueResult(new Expression[]{cat.id}); - - // single Result - query().from(cat).singleResult(cat.id); - - query().from(cat).singleResult(new Expression[]{cat.id}); + assertEquals(6l, results.getTotal()); + } + + @Test + public void Unique_Result(){ + query().from(cat).limit(1).uniqueResult(cat.id); + } + + @Test + public void Unique_Result_Multiple(){ + query().from(cat).limit(1).uniqueResult(new Expression[]{cat.id}); + } + @Test + public void Single_Result(){ + query().from(cat).singleResult(cat.id); + } + + @Test + public void Single_Result_Multiple(){ + query().from(cat).singleResult(new Expression[]{cat.id}); } @Test diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/sql/JPADerbySQLTest.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/sql/JPADerbySQLTest.java index 7a93c7ac1..9a341edac 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/sql/JPADerbySQLTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/sql/JPADerbySQLTest.java @@ -35,6 +35,8 @@ import com.mysema.testutil.JPATestRunner; @JPAConfig("derby") public class JPADerbySQLTest { + private SAnimal cat = new SAnimal("cat"); + private static final SQLTemplates derbyTemplates = new DerbyTemplates(); private EntityManager entityManager; @@ -59,47 +61,67 @@ public class JPADerbySQLTest { } @Test - public void ScalarQueries(){ - SAnimal cat = new SAnimal("cat"); - - // count + public void Count(){ assertEquals(6l, query().from(cat).where(cat.dtype.eq("C")).count()); - - // countDistinct + } + + @Test + public void CountDistinct(){ assertEquals(6l, query().from(cat).where(cat.dtype.eq("C")).countDistinct()); - - // list + } + + @Test + public void List(){ assertEquals(6, query().from(cat).where(cat.dtype.eq("C")).list(cat.id).size()); - - // list with limit + } + + @Test + public void List_With_Limit(){ assertEquals(3, query().from(cat).limit(3).list(cat.id).size()); - - // list with offset - assertEquals(3, query().from(cat).offset(3).list(cat.id).size()); - - // list with limit and offset - assertEquals(3, query().from(cat).offset(3).limit(3).list(cat.id).size()); - - // list multiple - print(query().from(cat).where(cat.dtype.eq("C")).list(cat.id, cat.name, cat.bodyweight)); - - // listResults - SearchResults results = query().from(cat).limit(3).orderBy(cat.name.asc()).listResults(cat.name); - assertEquals(Arrays.asList("Beck","Bobby","Harold"), results.getResults()); - assertEquals(6l, results.getTotal()); - - // unique Result - query().from(cat).limit(1).uniqueResult(cat.id); - - query().from(cat).limit(1).uniqueResult(new Expression[]{cat.id}); - - // single Result - query().from(cat).singleResult(cat.id); - - query().from(cat).singleResult(new Expression[]{cat.id}); - + } + + @Test + public void List_With_Offset(){ + assertEquals(3, query().from(cat).offset(3).list(cat.id).size()); } + @Test + public void List_Limit_And_Offset(){ + assertEquals(3, query().from(cat).offset(3).limit(3).list(cat.id).size()); + } + + @Test + public void List_Multiple(){ + print(query().from(cat).where(cat.dtype.eq("C")).list(cat.id, cat.name, cat.bodyweight)); + } + + @Test + public void List_Results(){ + SearchResults results = query().from(cat).limit(3).orderBy(cat.name.asc()).listResults(cat.name); + assertEquals(Arrays.asList("Beck","Bobby","Harold"), results.getResults()); + assertEquals(6l, results.getTotal()); + } + + @Test + public void Unique_Result(){ + query().from(cat).limit(1).uniqueResult(cat.id); + } + + @Test + public void Unique_Result_Multiple(){ + query().from(cat).limit(1).uniqueResult(new Expression[]{cat.id}); + } + + @Test + public void Single_Result(){ + query().from(cat).singleResult(cat.id); + } + + @Test + public void Single_Result_Multiple(){ + query().from(cat).singleResult(new Expression[]{cat.id}); + } + @Test public void EntityQueries(){ SAnimal cat = new SAnimal("cat");