package org.tests.query.orderby; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.Query; import org.tests.model.basic.Order; import org.tests.model.basic.OrderDetail; import org.tests.model.basic.ResetBasicData; import org.ebeantest.LoggedSqlCollector; import org.junit.Assert; import org.junit.Test; import java.util.List; public class TestOrderByWithMany extends BaseTestCase { @Test public void test() { ResetBasicData.reset(); checkWithLazyLoadingOnBuiltInMany(); checkWithBuiltInManyBasic(); checkWithBuiltInMany(); checkAppendId(); checkNone(); checkBoth(); checkPrepend(); checkAlreadyIncluded(); checkAlreadyIncluded2(); } private void checkWithLazyLoadingOnBuiltInMany() { LoggedSqlCollector.start(); Query<Order> query = Ebean.find(Order.class); // a query that ensures we are going to lazy load on the details List<Order> orders = query.findList(); for (Order order : orders) { // invoke lazy loading List<OrderDetail> details = order.getDetails(); details.size(); } // first one is the main query and others are lazy loading queries List<String> loggedSql = LoggedSqlCollector.stop(); Assert.assertTrue(loggedSql.size() > 1); String lazyLoadSql = loggedSql.get(1); // contains the foreign key back to the parent bean (t0.order_id) Assert.assertTrue(lazyLoadSql, trimSql(lazyLoadSql, 2).contains("select t0.order_id, t0.id")); Assert.assertTrue(lazyLoadSql.contains("order by t0.order_id, t0.id, t0.order_qty, t0.cretime desc")); } private void checkWithBuiltInManyBasic() { Query<Order> query = Ebean.find(Order.class).fetch("details"); query.findList(); String sql = query.getGeneratedSql(); Assert.assertTrue(sql.contains("order by t0.id, t1.id asc, t1.order_qty asc, t1.cretime desc")); } private void checkWithBuiltInMany() { Query<Order> query = Ebean.find(Order.class).fetch("details").order().desc("customer.name"); query.findList(); String sql = query.getGeneratedSql(); // t0.id inserted into the middle of the order by Assert.assertTrue(sql.contains("order by t1.name desc, t0.id, t2.id asc")); Assert.assertTrue(sql.contains("t2.id asc, t2.order_qty asc, t2.cretime desc")); } private void checkAppendId() { Query<Order> query = Ebean.find(Order.class).fetch("shipments").order().desc("customer.name"); query.findList(); String sql = query.getGeneratedSql(); // append the id to ensure ordering of root level objects Assert.assertTrue(sql.contains("order by t1.name desc, t0.id")); } private void checkNone() { Query<Order> query = Ebean.find(Order.class).order().desc("customer.name"); query.findList(); String sql = query.getGeneratedSql(); // no need to append id to order by as there is no 'many' included in the // query Assert.assertTrue(sql.contains("order by t1.name desc")); Assert.assertTrue(!sql.contains("order by t1.name desc,")); } private void checkBoth() { Query<Order> query = Ebean.find(Order.class).fetch("shipments").order() .desc("customer.name, shipments.shipTime"); query.findList(); String sql = query.getGeneratedSql(); // insert id into the middle of the order by Assert.assertTrue(sql.contains("order by t1.name, t0.id, t2.ship_time desc")); } private void checkPrepend() { Query<Order> query = Ebean.find(Order.class).fetch("shipments").order() .desc("shipments.shipTime"); query.findList(); String sql = query.getGeneratedSql(); // prepend id in order by Assert.assertTrue(sql.contains("order by t0.id, t1.ship_time desc")); } private void checkAlreadyIncluded() { Query<Order> query = Ebean.find(Order.class).fetch("shipments").order() .desc("id, shipments.shipTime"); query.findList(); String sql = query.getGeneratedSql(); // prepend id in order by Assert.assertTrue(sql.contains("order by t0.id, t1.ship_time desc")); } private void checkAlreadyIncluded2() { Query<Order> query = Ebean.find(Order.class).fetch("shipments").order() .desc("orderDate, id, shipments.shipTime"); query.findList(); String sql = query.getGeneratedSql(); // prepend id in order by Assert.assertTrue(sql.contains("order by t0.order_date, t0.id, t1.ship_time desc")); } }