package org.jboss.seam.test.unit;
import org.jboss.seam.framework.EntityQuery;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
public class QueryTest
{
/**
* These tests verify that the count query is properly extracted from the rendered
* query. There are two points of focus. The first is that "join fetch" is replaced
* with "join" in the where clause. The second is that the subject of the query is
* used in the count() function unless the query does not have an explicit subject,
* in which case a * is used instead.
*/
@Test
public void testCountQuery() {
UnitQuery query = new UnitQuery();
query.setEjbql("from Person p");
query.parseEjbql();
assertEquals(query.getCountEjbql(), "select count(*) from Person p");
query.setEjbql("from Person p where p.location is not null");
query.setOrderColumn("username");
query.parseEjbql();
assertEquals(query.getCountEjbql(), "select count(*) from Person p where p.location is not null");
query.setEjbql("select p from Person p");
query.setOrderColumn("username");
query.parseEjbql();
// TODO this should eventually become count(p)
assertEquals(query.getCountEjbql(), "select count(*) from Person p");
// trying to reproduce bug JBSEAM-4694
query.setUseWildcardAsCountQuerySubject(false);
query.setEjbql("select distinct p from Person p");
query.setOrderColumn("username");
query.parseEjbql();
// TODO this should eventually become count(p)
assertEquals(query.getCountEjbql(), "select count(distinct p) from Person p");
query.setUseWildcardAsCountQuerySubject(true);
query.setEjbql("select v from Vehicle v join fetch v.person");
query.setOrderColumn("make");
query.parseEjbql();
// TODO this should eventually become count(v)
assertEquals(query.getCountEjbql(), "select count(*) from Vehicle v join v.person");
query.setEjbql("select v.person from Vehicle v left join fetch v.person");
query.parseEjbql();
// TODO this should eventually become count(v.person)
assertEquals(query.getCountEjbql(), "select count(*) from Vehicle v left join v.person");
query.setEjbql("select v.person, v.color from Vehicle v");
query.parseEjbql();
assertEquals(query.getCountEjbql(), "select count(*) from Vehicle v");
// query = new CompliantUnitQuery();
query.setUseWildcardAsCountQuerySubject(false);
query.setEjbql("select p from Person p");
query.parseEjbql();
assertEquals(query.getCountEjbql(), "select count(p) from Person p");
}
@Test
public void testCountQueryWithGroupBy()
{
UnitQuery query = new UnitQuery();
query.setEjbql("select min(e.birthYear), count(*) from Person p group by p.birthYear");
query.setGroupBy("p.birthYear");
query.parseEjbql();
assertEquals(query.getCountEjbql() , "select count(*) from Person p");
}
class UnitQuery extends EntityQuery {
@Override
protected void parseEjbql()
{
super.parseEjbql();
}
@Override
protected String getRenderedEjbql()
{
return super.getRenderedEjbql();
}
@Override
protected String getCountEjbql()
{
return super.getCountEjbql();
}
/** Making setter method accessible for reproducing JBSEAM-4694. */
public void setUseWildcardAsCountQuerySubject(boolean useCompliantCountQuerySubject) {
super.setUseWildcardAsCountQuerySubject(useCompliantCountQuerySubject);
}
}
// class CompliantUnitQuery extends UnitQuery {
//
// public CompliantUnitQuery() {
// setUseWildcardAsCountQuerySubject(false);
// }
//
// }
}