diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java index d73458791..24953e857 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java @@ -265,9 +265,8 @@ class CQueryBuilder { if (!countDistinct) { // minimise select clause for standard count if (manyWhereJoins.isFormulaWithJoin()) { - // FIXME: we join the strings here and on the other side we split them again - // this is not yet optimal - query.select(String.join(",",manyWhereJoins.getFormulaJoinProperties())); + // Note that this is not yet optimal (split and join) + query.select(String.join(",", manyWhereJoins.getFormulaJoinProperties())); } else { query.setSelectId(); } diff --git a/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java b/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java index 6983de938..a0c17d128 100644 --- a/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java +++ b/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java @@ -299,8 +299,7 @@ public final class SqlTreeBuilder { if (manyWhereJoins.isFormulaWithJoin()) { for (String property: manyWhereJoins.getFormulaJoinProperties()) { STreeProperty beanProperty = desc.findPropertyFromPath(property); - SqlTreeNodeFormulaWhereJoin nodeJoin = new SqlTreeNodeFormulaWhereJoin(beanProperty, SqlJoinType.OUTER); - myJoinList.add(nodeJoin); + myJoinList.add(new SqlTreeNodeFormulaWhereJoin(beanProperty, SqlJoinType.OUTER)); } } } diff --git a/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java b/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java index 4ec6708b9..5eca4ed7a 100644 --- a/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java +++ b/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java @@ -67,18 +67,15 @@ class SqlTreeNodeFormulaWhereJoin implements SqlTreeNode { */ @Override public void appendFrom(DbSqlContext ctx, SqlJoinType currentJoinType) { - // always use the join type as per this many where join // (OUTER for disjunction and otherwise INNER) nodeBeanProp.appendFrom(ctx, manyJoinType); } - - @Override public void dependentTables(Set tables) { - //FIXME: we cannot easily determine the dependent tables, this would require an enhancement - //of the @Formula(dependentTables=...) annotation + // FIXME: we cannot easily determine the dependent tables this would require an enhancement + // of the @Formula(dependentTables=...) annotation } @Override diff --git a/src/test/java/org/tests/query/joins/TestQueryJoinOnFormula.java b/src/test/java/org/tests/query/joins/TestQueryJoinOnFormula.java index 3ce0e6051..4171f8d58 100644 --- a/src/test/java/org/tests/query/joins/TestQueryJoinOnFormula.java +++ b/src/test/java/org/tests/query/joins/TestQueryJoinOnFormula.java @@ -67,6 +67,25 @@ public class TestQueryJoinOnFormula extends BaseTestCase { List loggedSql = LoggedSqlCollector.stop(); assertEquals(1, loggedSql.size()); assertThat(loggedSql.get(0)).contains("join (select order_id, count(*) as total_items,"); + assertThat(loggedSql.get(0)).contains("elect count(*) from ( select t0.id, z_bt0.total_items from o_order t0 join (select order_id,"); + } + + @Test + public void test_OrderFindCount_multiFormula() { + + LoggedSqlCollector.start(); + + int orders = Ebean.find(Order.class) + .where() + .eq("totalItems", 3) + .gt("totalAmount", 10) + .findCount(); + + assertThat(orders).isEqualTo(2); + + List loggedSql = LoggedSqlCollector.stop(); + assertEquals(1, loggedSql.size()); + assertThat(loggedSql.get(0)).contains("select count(*) from ( select t0.id, z_bt0.total_items, z_bt0.total_amount from o_order t0 join (select order_id,"); } @Test @@ -83,6 +102,7 @@ public class TestQueryJoinOnFormula extends BaseTestCase { List loggedSql = LoggedSqlCollector.stop(); assertEquals(1, loggedSql.size()); assertThat(loggedSql.get(0)).contains("join (select order_id, count(*) as total_items,"); + assertThat(loggedSql.get(0)).contains("select t0.order_date from o_order t0"); } @Test @@ -102,6 +122,7 @@ public class TestQueryJoinOnFormula extends BaseTestCase { List loggedSql = LoggedSqlCollector.stop(); assertEquals(1, loggedSql.size()); assertThat(loggedSql.get(0)).contains("join (select order_id, count(*) as total_items,"); + assertThat(loggedSql.get(0)).contains("select t0.id, z_bt0.total_items from o_order t0 join (select order_id"); } @Test @@ -112,10 +133,10 @@ public class TestQueryJoinOnFormula extends BaseTestCase { List orderIds = Ebean.find(ParentPerson.class) .where().eq("totalAge", 3) .findIds(); - // TODO: There are no beans in database, so for now only the query must run. List loggedSql = LoggedSqlCollector.stop(); assertEquals(1, loggedSql.size()); + assertThat(loggedSql.get(0)).contains("where coalesce(f2.child_age, 0) = ?; --bind(3)"); } @Test @@ -128,10 +149,10 @@ public class TestQueryJoinOnFormula extends BaseTestCase { //.where().eq("totalAge", 3) .where().eq("familyName", "foo") .findList(); - // TODO: There are no beans in database, so for now only the query must run. List loggedSql = LoggedSqlCollector.stop(); assertEquals(1, loggedSql.size()); + assertThat(loggedSql.get(0)).contains("select t0.identifier from parent_person t0 where t0.family_name = ?"); } @Test @@ -142,10 +163,11 @@ public class TestQueryJoinOnFormula extends BaseTestCase { Ebean.find(ParentPerson.class) .where().eq("totalAge", 3) .findCount(); - // TODO: There are no beans in database, so for now only the query must run. List loggedSql = LoggedSqlCollector.stop(); assertEquals(1, loggedSql.size()); + assertThat(loggedSql.get(0)).contains("where coalesce(f2.child_age, 0) = ?)"); + assertThat(loggedSql.get(0)).contains("select count(*) from ( select t0.identifier, coalesce(f2.child_age, 0) from parent_person t0"); } @Test @@ -154,13 +176,14 @@ public class TestQueryJoinOnFormula extends BaseTestCase { LoggedSqlCollector.start(); Ebean.find(ParentPerson.class) - .select("address") // .select("address, totalAge") would work + .select("address") .where().eq("totalAge", 3) .findSingleAttributeList(); - // TODO: There are no beans in database, so for now only the query must run. List loggedSql = LoggedSqlCollector.stop(); assertEquals(1, loggedSql.size()); + assertThat(loggedSql.get(0)).contains("select t0.address from parent_person t0 left join (select i2.parent_identifier"); + assertThat(loggedSql.get(0)).contains("where coalesce(f2.child_age, 0) = ?; --bind(3)"); } @Test @@ -173,10 +196,10 @@ public class TestQueryJoinOnFormula extends BaseTestCase { .setMaxRows(1) .orderById(true) .findOne(); - // TODO: There are no beans in database, so for now only the query must run. List loggedSql = LoggedSqlCollector.stop(); assertEquals(1, loggedSql.size()); + assertThat(loggedSql.get(0)).contains("where coalesce(f2.child_age, 0) = ? order by t0.identifier"); } @Test @@ -187,10 +210,11 @@ public class TestQueryJoinOnFormula extends BaseTestCase { Ebean.find(ChildPerson.class) .where().eq("parent.totalAge", 3) .findIds(); - // TODO: There are no beans in database, so for now only the query must run. List loggedSql = LoggedSqlCollector.stop(); assertEquals(1, loggedSql.size()); + assertThat(loggedSql.get(0)).contains("select t0.identifier from child_person t0 left join (select i2.parent_identifier"); + assertThat(loggedSql.get(0)).contains("where coalesce(f2.child_age, 0) = ?"); } @Test @@ -201,9 +225,10 @@ public class TestQueryJoinOnFormula extends BaseTestCase { Ebean.find(ChildPerson.class) .where().eq("parent.totalAge", 3) .findCount(); - // TODO: There are no beans in database, so for now only the query must run. List loggedSql = LoggedSqlCollector.stop(); assertEquals(1, loggedSql.size()); + assertThat(loggedSql.get(0)).contains("select count(*) from ( select t0.identifier"); + assertThat(loggedSql.get(0)).contains("where coalesce(f2.child_age, 0) = ?"); } }