package org.tests.query.aggregation; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.Query; import org.tests.model.tevent.TEventMany; import org.tests.model.tevent.TEventOne; import org.junit.BeforeClass; import org.junit.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; public class TestAggregationCount extends BaseTestCase { @BeforeClass public static void setup() { TEventOne one = new TEventOne("first"); one.getLogs().add(new TEventMany("all", 1, 10)); one.getLogs().add(new TEventMany("be", 2, 12.2)); one.getLogs().add(new TEventMany("add", 3, 13)); Ebean.save(one); TEventOne two = new TEventOne("second"); two.getLogs().add(new TEventMany("at", 10, 10)); two.getLogs().add(new TEventMany("add", 30, 13)); two.getLogs().add(new TEventMany("alf", 30, 13)); Ebean.save(two); } @Test public void testBaseSelect() { Query<TEventOne> query = Ebean.find(TEventOne.class); List<TEventOne> list = query.findList(); String sql = sqlOf(query, 5); assertThat(sql).contains("select t0.id, t0.name, t0.version, t0.event_id from tevent_one t0"); for (TEventOne eventOne : list) { // lazy loading on Aggregation properties // is not expected to work at this stage Double totalAmount = eventOne.getTotalAmount(); assertThat(totalAmount).isNull(); } } @Test public void testNonAggregationLazyLoading() { Query<TEventOne> query = Ebean.find(TEventOne.class).select("id"); List<TEventOne> list = query.findList(); String sql = sqlOf(query, 5); assertThat(sql).contains("select t0.id from tevent_one t0"); for (TEventOne eventOne : list) { String name = eventOne.getName(); assertThat(name).isNotNull(); } } @Test public void testFull() { Query<TEventOne> query2 = Ebean.find(TEventOne.class) .select("name, count, totalUnits, totalAmount") .where() .startsWith("logs.description", "a") .having() .ge("count", 1) .orderBy().asc("name"); List<TEventOne> list = query2.findList(); for (TEventOne eventOne : list) { System.out.println(eventOne.getId() + " " + eventOne.getName() + " count:" + eventOne.getCount() + " units:" + eventOne.getTotalUnits() + " amount:" + eventOne.getTotalAmount()); } assertThat(list).isNotEmpty(); String sql = sqlOf(query2, 5); assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.units), sum(u1.units * u1.amount) from tevent_one t0"); assertThat(sql).contains("from tevent_one t0 join tevent_many u1 on u1.event_id = t0.id "); assertThat(sql).contains("where u1.description like ? "); assertThat(sql).contains(" group by t0.id, t0.name having count(u1.id) >= ? order by t0.name"); // invoke lazy loading Long version = list.get(0).getVersion(); assertThat(version).isNotNull(); } @Test public void testSelectOnly() { Query<TEventOne> query0 = Ebean.find(TEventOne.class) .select("name, count, totalUnits, totalAmount"); query0.findList(); String sql = sqlOf(query0, 5); assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.units), sum(u1.units * u1.amount) from tevent_one t0"); assertThat(sql).contains("group by t0.id, t0.name"); } @Test public void testSelectWhere() { Query<TEventOne> query0 = Ebean.find(TEventOne.class) .select("name, count, totalUnits, totalAmount") .where().gt("logs.description", "a").query(); query0.findList(); String sql = sqlOf(query0, 5); assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.units), sum(u1.units * u1.amount) from tevent_one t0"); assertThat(sql).contains("group by t0.id, t0.name"); } @Test public void testSelectHavingOrderBy() { Query<TEventOne> query1 = Ebean.find(TEventOne.class) .select("name, count, totalUnits, totalAmount") .having().ge("count", 1) .orderBy().asc("name"); query1.findList(); assertThat(query1.getGeneratedSql()).contains("having count(u1.id) >= ? order by t0.name"); } @Test public void testSelectWithFetch() { Query<TEventOne> query0 = Ebean.find(TEventOne.class) .select("name, count") .fetch("event", "name"); query0.findList(); String sql = sqlOf(query0, 5); assertThat(sql).contains("select t0.id, t0.name, count(u1.id), t1.id, t1.name from tevent_one t0 left join tevent t1 on t1.id = t0.event_id join tevent_many u1 on u1.event_id = t0.id "); assertThat(sql).contains("group by t0.id, t0.name, t1.id, t1.name"); } }