#765731 : fixed count

This commit is contained in:
Timo Westkämper 2011-04-20 16:54:06 +00:00
parent cc63060050
commit 49b9895d59
8 changed files with 221 additions and 106 deletions

View File

@ -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<Q extends AbstractJPQLSubQuery<Q>> extends Det
super.queryMixin.setSelf((Q)this);
this.queryMixin = (JPQLQueryMixin<Q>) super.queryMixin;
}
@Override
public NumberSubQuery<Long> 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);

View File

@ -37,8 +37,6 @@ public class JPQLSerializer extends SerializerBase<JPQLSerializer> {
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<JPQLSerializer> {
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 ";

View File

@ -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<Date> 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<String> 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<String> 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<String> names3 = Arrays.asList("Felix123","Mary123");
assertEquals(names3, catQuery().orderBy(cat.name.asc()).limit(2).offset(2).list(cat.name));
}

View File

@ -17,12 +17,32 @@ public class CastTest extends AbstractQueryTest {
private static NumberExpression<Integer> expr = new NumberPath<Integer>(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());
}

View File

@ -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(),

View File

@ -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());
}
}

View File

@ -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<String> 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

View File

@ -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<String> 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<String> 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");