mirror of
https://github.com/querydsl/querydsl.git
synced 2026-07-03 21:07:49 +08:00
Merge pull request #1059 from querydsl/groupby-count
Fix groupBy/count handling
This commit is contained in:
commit
7aa9a1f97a
@ -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());
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user