Merge pull request #1059 from querydsl/groupby-count

Fix groupBy/count handling
This commit is contained in:
Ruben Dijkstra 2014-11-30 16:07:33 +01:00
commit 7aa9a1f97a
4 changed files with 76 additions and 4 deletions

View File

@ -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<Integer> ids = query().from(cat).groupBy(cat.id).list(cat.id);
long count = query().from(cat).groupBy(cat.id).count();
SearchResults<Integer> 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<Integer> ids = query().from(cat).groupBy(cat.id).distinct().list(NumberTemplate.ONE);
SearchResults<Integer> 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());

View File

@ -379,7 +379,8 @@ public abstract class AbstractSQLQuery<Q extends AbstractSQLQuery<Q>> extends Pr
public <RT> SearchResults<RT> listResults(Expression<RT> expr) {
QueryModifiers originalModifiers = queryMixin.getMetadata().getModifiers();
try {
if (configuration.getTemplates().isCountViaAnalytics()) {
if (configuration.getTemplates().isCountViaAnalytics()
&& queryMixin.getMetadata().getGroupBy().isEmpty()) {
List<RT> results;
try {
queryMixin.addFlag(rowCountFlag);

View File

@ -264,6 +264,14 @@ public class SQLSerializer extends SerializerBase<SQLSerializer> {
if (!metadata.isDistinct()) {
append(templates.getCountStar());
if (!groupBy.isEmpty()) {
append(templates.getFrom());
append("(");
append(templates.getSelect());
append("1 ");
suffix = ") internal";
}
} else {
List<? extends Expression<?>> columns;
if (sqlSelect.isEmpty()) {
@ -271,7 +279,15 @@ public class SQLSerializer extends SerializerBase<SQLSerializer> {
} 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());

View File

@ -611,6 +611,33 @@ public class SelectBase extends AbstractBaseTest {
}
@Test
@ExcludeIn({FIREBIRD})
public void GroupBy_Count() {
List<Integer> ids = query().from(employee).groupBy(employee.id).list(employee.id);
long count = query().from(employee).groupBy(employee.id).count();
SearchResults<Integer> 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<Integer> ids = query().from(employee).groupBy(employee.id).distinct().list(NumberTemplate.ONE);
SearchResults<Integer> 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)