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 d69b57e55..e335f8874 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java @@ -39,6 +39,7 @@ import com.mysema.query.support.Expressions; import com.mysema.query.types.*; import com.mysema.query.types.expr.*; import com.mysema.query.types.path.*; +import com.mysema.query.types.template.NumberTemplate; import com.mysema.testutil.ExcludeIn; import org.junit.Before; import org.junit.Ignore; @@ -312,8 +313,8 @@ public abstract class AbstractJPATest { public void Case2() { query().from(cat) .list(Expressions.cases().when(cat.toes.eq(2)).then(cat.id.multiply(2)) - .when(cat.toes.eq(3)).then(cat.id.multiply(3)) - .otherwise(4)); + .when(cat.toes.eq(3)).then(cat.id.multiply(3)) + .otherwise(4)); } @Test @@ -664,6 +665,33 @@ public abstract class AbstractJPATest { .list(cat.id.count()); } + @Test + @Ignore // FIXME + public void GroupBy_Count() { + List ids = query().from(cat).groupBy(cat.id).list(cat.id); + long count = query().from(cat).groupBy(cat.id).count(); + SearchResults results = query().from(cat).groupBy(cat.id) + .limit(1).listResults(cat.id); + + long catCount = query().from(cat).count(); + assertEquals(catCount, ids.size()); + assertEquals(catCount, count); + assertEquals(catCount, results.getResults().size()); + assertEquals(catCount, results.getTotal()); + } + + @Test + @Ignore // FIXME + public void GroupBy_Distinct_Count() { + List ids = query().from(cat).groupBy(cat.id).distinct().list(NumberTemplate.ONE); + SearchResults results = query().from(cat).groupBy(cat.id) + .limit(1).distinct().listResults(NumberTemplate.ONE); + + assertEquals(1, ids.size()); + assertEquals(1, results.getResults().size()); + assertEquals(1, results.getTotal()); + } + @Test public void In() { assertEquals(3l, query().from(cat).where(cat.name.in("Bob123", "Ruth123", "Felix123")).count()); diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java b/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java index 0855b0522..71f47c7ec 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java @@ -379,7 +379,8 @@ public abstract class AbstractSQLQuery> extends Pr public SearchResults listResults(Expression expr) { QueryModifiers originalModifiers = queryMixin.getMetadata().getModifiers(); try { - if (configuration.getTemplates().isCountViaAnalytics()) { + if (configuration.getTemplates().isCountViaAnalytics() + && queryMixin.getMetadata().getGroupBy().isEmpty()) { List results; try { queryMixin.addFlag(rowCountFlag); diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java index 2e9906b6f..fdb806727 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java @@ -264,6 +264,14 @@ public class SQLSerializer extends SerializerBase { if (!metadata.isDistinct()) { append(templates.getCountStar()); + if (!groupBy.isEmpty()) { + append(templates.getFrom()); + append("("); + append(templates.getSelect()); + append("1 "); + suffix = ") internal"; + } + } else { List> columns; if (sqlSelect.isEmpty()) { @@ -271,7 +279,15 @@ public class SQLSerializer extends SerializerBase { } else { columns = sqlSelect; } - if (columns.size() == 1) { + if (!groupBy.isEmpty()) { + // select count(*) from (select distinct ...) + append(templates.getCountStar()); + append(templates.getFrom()); + append("("); + append(templates.getSelectDistinct()); + handle(COMMA, columns); + suffix = ") internal"; + } else if (columns.size() == 1) { append(templates.getDistinctCountStart()); handle(columns.get(0)); append(templates.getDistinctCountEnd()); diff --git a/querydsl-sql/src/test/java/com/mysema/query/SelectBase.java b/querydsl-sql/src/test/java/com/mysema/query/SelectBase.java index 26b527240..dc5e28a94 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/SelectBase.java +++ b/querydsl-sql/src/test/java/com/mysema/query/SelectBase.java @@ -611,6 +611,33 @@ public class SelectBase extends AbstractBaseTest { } @Test + @ExcludeIn({FIREBIRD}) + public void GroupBy_Count() { + List ids = query().from(employee).groupBy(employee.id).list(employee.id); + long count = query().from(employee).groupBy(employee.id).count(); + SearchResults results = query().from(employee).groupBy(employee.id) + .limit(1).listResults(employee.id); + + assertEquals(10, ids.size()); + assertEquals(10, count); + assertEquals(1, results.getResults().size()); + assertEquals(10, results.getTotal()); + } + + @Test + @ExcludeIn({FIREBIRD}) + public void GroupBy_Distinct_Count() { + List ids = query().from(employee).groupBy(employee.id).distinct().list(NumberTemplate.ONE); + SearchResults results = query().from(employee).groupBy(employee.id) + .limit(1).distinct().listResults(NumberTemplate.ONE); + + assertEquals(1, ids.size()); + assertEquals(1, results.getResults().size()); + assertEquals(1, results.getTotal()); + } + + @Test + @ExcludeIn({FIREBIRD}) public void Having_Count() { //Produces empty resultset https://github.com/querydsl/querydsl/issues/1055 query().from(employee)