From c3f43d503f4a111fe54d24ed42aee2699437cec1 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Sat, 15 Oct 2016 14:37:36 +1300 Subject: [PATCH] #832 - Refactor: Change generated SQL to use "left join" rather than "left outer join" - change tests --- .../com/avaje/ebean/EbeanServer_eqlTest.java | 4 +- .../java/com/avaje/ebean/UpdateQueryTest.java | 2 +- .../com/avaje/tests/basic/TestLimitQuery.java | 2 +- .../batchload/TestQueryJoinToAssocOne.java | 8 +- .../tests/batchload/TestSecondaryQueries.java | 4 +- .../avaje/tests/delete/TestDeleteByQuery.java | 2 +- .../tests/inheritance/TestInheritInsert.java | 2 +- .../TestMediaInheritanceJoinToMany.java | 8 +- .../TestOneToOneOptionalRelationship.java | 6 +- .../avaje/tests/model/pview/TestPview.java | 2 +- .../tests/model/view/TestViewBaseEntity.java | 2 +- .../TestImplicitJoinOnParentRelationship.java | 4 +- .../tests/query/TestJoinOptOneCascade.java | 6 +- .../avaje/tests/query/TestManyWhereJoin.java | 10 +- .../tests/query/TestManyWhereJoinM2M.java | 2 +- .../query/TestQueryFetchManyTwoDeep.java | 28 +- .../tests/query/TestQueryMultiManyOrder.java | 6 +- .../com/avaje/tests/query/TestSubQuery.java | 280 +++++++-------- .../joins/TestDisjunctWhereOuterJoin.java | 2 +- .../joins/TestDisjunctWhereOuterOnMany.java | 4 +- .../query/joins/TestQueryJoinManyNonRoot.java | 16 +- .../TestQueryManyToOneWhereClauseJoin.java | 4 +- .../orderby/TestOrderByWithDistinct.java | 4 +- .../other/TestQueryConversationRowCount.java | 8 +- .../other/TestQueryRawExpressionMany.java | 2 +- .../other/TestQueryRowCountWithMany.java | 6 +- .../query/other/TestQuerySingleAttribute.java | 2 +- .../TestInheritQuery.java | 333 +++++++++--------- 28 files changed, 380 insertions(+), 379 deletions(-) diff --git a/src/test/java/com/avaje/ebean/EbeanServer_eqlTest.java b/src/test/java/com/avaje/ebean/EbeanServer_eqlTest.java index a4f0897ee..5113cd7c7 100644 --- a/src/test/java/com/avaje/ebean/EbeanServer_eqlTest.java +++ b/src/test/java/com/avaje/ebean/EbeanServer_eqlTest.java @@ -103,7 +103,7 @@ public class EbeanServer_eqlTest extends BaseTestCase { query.setUseCache(false); query.findUnique(); - assertThat(query.getGeneratedSql()).contains("from o_customer t0 left outer join contact t1 on t1.customer_id = t0.id "); + assertThat(query.getGeneratedSql()).contains("from o_customer t0 left join contact t1 on t1.customer_id = t0.id "); } @Test @@ -118,6 +118,6 @@ public class EbeanServer_eqlTest extends BaseTestCase { query.setUseCache(false); query.findUnique(); - assertThat(query.getGeneratedSql()).contains("from o_customer t0 left outer join contact t1 on t1.customer_id = t0.id "); + assertThat(query.getGeneratedSql()).contains("from o_customer t0 left join contact t1 on t1.customer_id = t0.id "); } } \ No newline at end of file diff --git a/src/test/java/com/avaje/ebean/UpdateQueryTest.java b/src/test/java/com/avaje/ebean/UpdateQueryTest.java index 522f4f20a..4f52d1866 100644 --- a/src/test/java/com/avaje/ebean/UpdateQueryTest.java +++ b/src/test/java/com/avaje/ebean/UpdateQueryTest.java @@ -53,7 +53,7 @@ public class UpdateQueryTest extends BaseTestCase { query.update(); - assertThat(sqlOf(query)).contains("update o_customer set status=?, updtime=? where id in (select t0.id from o_customer t0 left outer join o_address t1 on t1.id = t0.billing_address_id where t0.status = ? and t1.country_code = ? and t0.id > ? )"); + assertThat(sqlOf(query)).contains("update o_customer set status=?, updtime=? where id in (select t0.id from o_customer t0 left join o_address t1 on t1.id = t0.billing_address_id where t0.status = ? and t1.country_code = ? and t0.id > ? )"); } @Test diff --git a/src/test/java/com/avaje/tests/basic/TestLimitQuery.java b/src/test/java/com/avaje/tests/basic/TestLimitQuery.java index ecf87ccf8..39b97989c 100644 --- a/src/test/java/com/avaje/tests/basic/TestLimitQuery.java +++ b/src/test/java/com/avaje/tests/basic/TestLimitQuery.java @@ -124,7 +124,7 @@ public class TestLimitQuery extends BaseTestCase { query.findList(); sql = query.getGeneratedSql(); - hasDetailsJoin = sql.contains("left outer join o_order_detail"); + hasDetailsJoin = sql.contains("left join o_order_detail"); hasLimit = sql.contains("limit 10"); hasSelectedDetails = sql.contains("od.id"); hasDistinct = sql.contains("select distinct"); diff --git a/src/test/java/com/avaje/tests/batchload/TestQueryJoinToAssocOne.java b/src/test/java/com/avaje/tests/batchload/TestQueryJoinToAssocOne.java index 2377fb61a..b4aadb6d5 100644 --- a/src/test/java/com/avaje/tests/batchload/TestQueryJoinToAssocOne.java +++ b/src/test/java/com/avaje/tests/batchload/TestQueryJoinToAssocOne.java @@ -35,7 +35,7 @@ public class TestQueryJoinToAssocOne extends BaseTestCase { String secondaryQuery = trimSql(loggedSql.get(1), 1); assertThat(secondaryQuery).contains("select t0.order_id, t0.id,"); - assertThat(secondaryQuery).contains(" from o_order_detail t0 left outer join o_product t1"); + assertThat(secondaryQuery).contains(" from o_order_detail t0 left join o_product t1"); assertThat(secondaryQuery).contains(" (t0.order_id) in (?"); assertThat(secondaryQuery).contains(" order by t0.order_id, t0.id"); } @@ -62,7 +62,7 @@ public class TestQueryJoinToAssocOne extends BaseTestCase { String secondaryQuery = trimSql(loggedSql.get(1), 1); assertThat(secondaryQuery).contains("select t0.order_id, t0.id,"); - assertThat(secondaryQuery).contains(" from o_order_detail t0 left outer join o_product t1"); + assertThat(secondaryQuery).contains(" from o_order_detail t0 left join o_product t1"); assertThat(secondaryQuery).contains(" (t0.order_id) in (?"); assertThat(secondaryQuery).contains(" order by t0.order_id, t0.id"); } @@ -102,7 +102,7 @@ public class TestQueryJoinToAssocOne extends BaseTestCase { String secondaryQuery = trimSql(loggedSql.get(1), 1); assertThat(secondaryQuery).contains("select t0.order_id, t0.id,"); - assertThat(secondaryQuery).contains(" from o_order_detail t0 left outer join o_product t1"); + assertThat(secondaryQuery).contains(" from o_order_detail t0 left join o_product t1"); assertThat(secondaryQuery).contains(" (t0.order_id) in (?"); assertThat(secondaryQuery).contains(" order by t0.order_id, t0.id"); } @@ -138,6 +138,6 @@ public class TestQueryJoinToAssocOne extends BaseTestCase { String originQuery = trimSql(loggedSql.get(0), 5); assertThat(originQuery).contains("select t0.id, t0.status, t0.ship_date, t1.id, t1.order_qty, t1.unit_price"); - assertThat(originQuery).contains(" from o_order t0 left outer join o_order_detail t1 "); + assertThat(originQuery).contains(" from o_order t0 left join o_order_detail t1 "); } } diff --git a/src/test/java/com/avaje/tests/batchload/TestSecondaryQueries.java b/src/test/java/com/avaje/tests/batchload/TestSecondaryQueries.java index 97ef59762..9cd1d4055 100644 --- a/src/test/java/com/avaje/tests/batchload/TestSecondaryQueries.java +++ b/src/test/java/com/avaje/tests/batchload/TestSecondaryQueries.java @@ -141,11 +141,11 @@ public class TestSecondaryQueries extends BaseTestCase { // select t0.id c0, t0.name c1, t0.status c2, // t1.id c3, t1.first_name c4, t1.last_name c5, t1.phone c6, t1.mobile c7, t1.email c8, t1.cretime c9, t1.updtime c10, t1.customer_id c11, t1.group_id c12 // from o_customer t0 - // left outer join contact t1 on t1.customer_id = t0.id + // left join contact t1 on t1.customer_id = t0.id // where t0.id = ? order by t0.id; --bind(1) Assert.assertTrue(custSecondarySql.contains("from o_customer t0 ")); - Assert.assertTrue(custSecondarySql.contains("left outer join contact t1 on t1.customer_id = t0.id ")); + Assert.assertTrue(custSecondarySql.contains("left join contact t1 on t1.customer_id = t0.id ")); Assert.assertTrue(custSecondarySql.contains("where t0.id ")); diff --git a/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java b/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java index 76e104a15..b1963b0ba 100644 --- a/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java +++ b/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java @@ -32,7 +32,7 @@ public class TestDeleteByQuery extends BaseTestCase { List loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(1); - assertThat(trimSql(loggedSql.get(0), 1)).contains("delete from contact where id in (select t0.id from contact t0 left outer join"); + assertThat(trimSql(loggedSql.get(0), 1)).contains("delete from contact where id in (select t0.id from contact t0 left join"); Query query2 = server.find(Contact.class).where().eq("firstName", "NotARealFirstName").query(); diff --git a/src/test/java/com/avaje/tests/inheritance/TestInheritInsert.java b/src/test/java/com/avaje/tests/inheritance/TestInheritInsert.java index c5f6e47da..d66f2d2c4 100644 --- a/src/test/java/com/avaje/tests/inheritance/TestInheritInsert.java +++ b/src/test/java/com/avaje/tests/inheritance/TestInheritInsert.java @@ -117,7 +117,7 @@ public class TestInheritInsert extends BaseTestCase { Car result = query.findUnique(); assertThat(query.getGeneratedSql()).contains("order by t0.id, t2.location_code"); - assertThat(query.getGeneratedSql()).contains("left outer join car_fuse t2 on t2.id = t1.fuse_id"); + assertThat(query.getGeneratedSql()).contains("left join car_fuse t2 on t2.id = t1.fuse_id"); assertNotNull(result); } diff --git a/src/test/java/com/avaje/tests/model/inheritmany/TestMediaInheritanceJoinToMany.java b/src/test/java/com/avaje/tests/model/inheritmany/TestMediaInheritanceJoinToMany.java index bef447b13..3f020aefd 100644 --- a/src/test/java/com/avaje/tests/model/inheritmany/TestMediaInheritanceJoinToMany.java +++ b/src/test/java/com/avaje/tests/model/inheritmany/TestMediaInheritanceJoinToMany.java @@ -9,6 +9,8 @@ import com.avaje.ebean.Query; import java.util.Random; +import static org.assertj.core.api.Assertions.assertThat; + public class TestMediaInheritanceJoinToMany extends BaseTestCase { @Test @@ -30,14 +32,14 @@ public class TestMediaInheritanceJoinToMany extends BaseTestCase { // select t0.id c0, t0.name c1, t1.type c2, t1.id c3, t1.url c4, t1.note c5 // from profile t0 - // left outer join media t1 on t1.id = t0.picture_id and t1.type = 'Picture' + // left join media t1 on t1.id = t0.picture_id and t1.type = 'Picture' // where t0.name = ? ; --bind(nopic) // specifically t1.type = 'Picture' ... on on the join and not in the where String generatedSql = query.getGeneratedSql(); - Assert.assertTrue(generatedSql.contains("from mprofile t0 left outer join mmedia t1 on t1.id = t0.picture_id and t1.type = 'Picture' ")); - Assert.assertTrue(generatedSql.contains("where t0.name = ? ")); + assertThat(generatedSql).contains("from mprofile t0 left join mmedia t1 on t1.id = t0.picture_id and t1.type = 'Picture' "); + assertThat(generatedSql).contains("where t0.name = ? "); } diff --git a/src/test/java/com/avaje/tests/model/onetoone/TestOneToOneOptionalRelationship.java b/src/test/java/com/avaje/tests/model/onetoone/TestOneToOneOptionalRelationship.java index d87f1d1b1..14ef7f009 100644 --- a/src/test/java/com/avaje/tests/model/onetoone/TestOneToOneOptionalRelationship.java +++ b/src/test/java/com/avaje/tests/model/onetoone/TestOneToOneOptionalRelationship.java @@ -31,7 +31,7 @@ public class TestOneToOneOptionalRelationship extends BaseTestCase { String sql = trimSql(loggedSql.get(0), 1); Assert.assertTrue(sql.contains("select t0.id, t0.name")); - Assert.assertTrue(sql.contains(" from oto_account t0 left outer join oto_user t1 on t1.account_id = t0.id where t0.id = ?")); + Assert.assertTrue(sql.contains(" from oto_account t0 left join oto_user t1 on t1.account_id = t0.id where t0.id = ?")); } @@ -66,7 +66,7 @@ public class TestOneToOneOptionalRelationship extends BaseTestCase { String sql = trimSql(loggedSql.get(0), 1); Assert.assertTrue(sql.contains("select t0.id, t0.name")); - Assert.assertTrue(sql.contains(" from oto_account t0 left outer join oto_user t1 on t1.account_id = t0.id where t0.id = ?")); + Assert.assertTrue(sql.contains(" from oto_account t0 left join oto_user t1 on t1.account_id = t0.id where t0.id = ?")); String lazyLoadSql = trimSql(loggedSql.get(1), 5); Assert.assertTrue(lazyLoadSql.contains("select t0.id, t0.name, t0.version, t0.when_created, t0.when_modified, t0.account_id from oto_user t0 where t0.id = ?")); @@ -104,6 +104,6 @@ public class TestOneToOneOptionalRelationship extends BaseTestCase { String sql = trimSql(loggedSql.get(0), 1); Assert.assertTrue(sql.contains("select t0.id, t0.name")); - Assert.assertTrue(sql.contains(" from oto_account t0 left outer join oto_user t1 on t1.account_id = t0.id where t0.id = ?")); + Assert.assertTrue(sql.contains(" from oto_account t0 left join oto_user t1 on t1.account_id = t0.id where t0.id = ?")); } } diff --git a/src/test/java/com/avaje/tests/model/pview/TestPview.java b/src/test/java/com/avaje/tests/model/pview/TestPview.java index caf3d330a..28e809efd 100644 --- a/src/test/java/com/avaje/tests/model/pview/TestPview.java +++ b/src/test/java/com/avaje/tests/model/pview/TestPview.java @@ -22,7 +22,7 @@ public class TestPview extends BaseTestCase { query.findList(); String generatedSql = sqlOf(query, 1); - Assert.assertTrue(generatedSql.contains("select distinct t0.amount, t1.value from paggview t0 join pp u1 on u1.id = t0.pview_id join pp_to_ww u2z_ on u2z_.pp_id = u1.id join wview u2 on u2.id = u2z_.ww_id left outer join pp t1 on t1.id = t0.pview_id where u2.id = ? order by t1.value")); + Assert.assertTrue(generatedSql.contains("select distinct t0.amount, t1.value from paggview t0 join pp u1 on u1.id = t0.pview_id join pp_to_ww u2z_ on u2z_.pp_id = u1.id join wview u2 on u2.id = u2z_.ww_id left join pp t1 on t1.id = t0.pview_id where u2.id = ? order by t1.value")); } diff --git a/src/test/java/com/avaje/tests/model/view/TestViewBaseEntity.java b/src/test/java/com/avaje/tests/model/view/TestViewBaseEntity.java index 115537fa9..32ba8db6f 100644 --- a/src/test/java/com/avaje/tests/model/view/TestViewBaseEntity.java +++ b/src/test/java/com/avaje/tests/model/view/TestViewBaseEntity.java @@ -65,6 +65,6 @@ public class TestViewBaseEntity extends BaseTestCase { assertThat(details).isNotEmpty(); } - assertThat(query.getGeneratedSql()).contains("from order_agg_vw t0 left outer join o_order t1 on t1.id = t0.order_id left outer join o_customer t3 on t3.id = t1.kcustomer_id left outer join o_order_detail t2 on t2.order_id = t1.id where t2.id > 0 and t0.order_total > ?"); + assertThat(query.getGeneratedSql()).contains("from order_agg_vw t0 left join o_order t1 on t1.id = t0.order_id left join o_customer t3 on t3.id = t1.kcustomer_id left join o_order_detail t2 on t2.order_id = t1.id where t2.id > 0 and t0.order_total > ?"); } } diff --git a/src/test/java/com/avaje/tests/query/TestImplicitJoinOnParentRelationship.java b/src/test/java/com/avaje/tests/query/TestImplicitJoinOnParentRelationship.java index 118a4fec9..2168aa808 100644 --- a/src/test/java/com/avaje/tests/query/TestImplicitJoinOnParentRelationship.java +++ b/src/test/java/com/avaje/tests/query/TestImplicitJoinOnParentRelationship.java @@ -48,7 +48,7 @@ public class TestImplicitJoinOnParentRelationship extends BaseTestCase { query.findList(); - String expectedSql = "select distinct t0.id, t0.name from o_customer t0 left outer join o_order u1 on u1.kcustomer_id = t0.id left outer join o_order_detail u2 on u2.order_id = u1.id left outer join o_product u3 on u3.id = u2.product_id where (u3.name = ? or t0.id = ? ) "; + String expectedSql = "select distinct t0.id, t0.name from o_customer t0 left join o_order u1 on u1.kcustomer_id = t0.id left join o_order_detail u2 on u2.order_id = u1.id left join o_product u3 on u3.id = u2.product_id where (u3.name = ? or t0.id = ? ) "; Assert.assertEquals(expectedSql, sqlOf(query, 1)); } @@ -64,7 +64,7 @@ public class TestImplicitJoinOnParentRelationship extends BaseTestCase { query.findList(); - String expectedSql = "select distinct t0.id, t0.name from o_customer t0 left outer join o_order u1 on u1.kcustomer_id = t0.id left outer join o_order_detail u2 on u2.order_id = u1.id left outer join o_product u3 on u3.id = u2.product_id where (u3.name = ? or t0.id = ? ) "; + String expectedSql = "select distinct t0.id, t0.name from o_customer t0 left join o_order u1 on u1.kcustomer_id = t0.id left join o_order_detail u2 on u2.order_id = u1.id left join o_product u3 on u3.id = u2.product_id where (u3.name = ? or t0.id = ? ) "; Assert.assertEquals(expectedSql, sqlOf(query, 1)); } } diff --git a/src/test/java/com/avaje/tests/query/TestJoinOptOneCascade.java b/src/test/java/com/avaje/tests/query/TestJoinOptOneCascade.java index 95db810f9..f7711bd80 100644 --- a/src/test/java/com/avaje/tests/query/TestJoinOptOneCascade.java +++ b/src/test/java/com/avaje/tests/query/TestJoinOptOneCascade.java @@ -13,14 +13,14 @@ public class TestJoinOptOneCascade extends BaseTestCase { @Test public void test() { - // the left outer join cascades to the join for c + // the left join cascades to the join for c Query query = Ebean.find(EOptOneA.class).fetch("b").fetch("b.c"); query.findList(); String sql = query.getGeneratedSql(); - Assert.assertTrue(sql.contains("left outer join eopt_one_b ")); - Assert.assertTrue(sql.contains("left outer join eopt_one_c ")); + Assert.assertTrue(sql.contains("left join eopt_one_b ")); + Assert.assertTrue(sql.contains("left join eopt_one_c ")); } } diff --git a/src/test/java/com/avaje/tests/query/TestManyWhereJoin.java b/src/test/java/com/avaje/tests/query/TestManyWhereJoin.java index 1dbf0142d..310fa03f1 100644 --- a/src/test/java/com/avaje/tests/query/TestManyWhereJoin.java +++ b/src/test/java/com/avaje/tests/query/TestManyWhereJoin.java @@ -60,14 +60,14 @@ public class TestManyWhereJoin extends BaseTestCase { // select distinct t0.id c0, t0.status c1, // t1.id c2, t1.status c3, t1.order_date c4, t1.ship_date c5, t2.name c6, t1.cretime c7, t1.updtime c8, t1.kcustomer_id c9, t0.id // from o_customer t0 - // left outer join o_order t1 on t1.kcustomer_id = t0.id - // left outer join o_customer t2 on t2.id = t1.kcustomer_id + // left join o_order t1 on t1.kcustomer_id = t0.id + // left join o_customer t2 on t2.id = t1.kcustomer_id // join o_order u1 on u1.kcustomer_id = t0.id // where t1.order_date is not null and u1.status = ? // order by t0.id; --bind(NEW) Assert.assertTrue(sql.contains("select distinct t0.id, t0.status, t1.id, t1.status,")); - Assert.assertTrue(sql.contains("left outer join o_order t1 on ")); + Assert.assertTrue(sql.contains("left join o_order t1 on ")); Assert.assertTrue(sql.contains("join o_order u1 on ")); Assert.assertTrue(sql.contains(" u1.status = ?")); } @@ -150,7 +150,7 @@ public class TestManyWhereJoin extends BaseTestCase { // t1.id c8, t1.order_qty c9, t1.ship_qty c10, t1.unit_price c11, t1.cretime c12, t1.updtime c13, t1.order_id c14, t1.product_id c15, t0.cretime, t0.id, t1.id, t1.order_qty, t1.cretime // from o_order t0 // join o_customer t2 on t2.id = t0.kcustomer_id - // left outer join o_order_detail t1 on t1.order_id = t0.id + // left join o_order_detail t1 on t1.order_id = t0.id // join o_order_detail u1 on u1.order_id = t0.id // where t1.id > 0 and u1.product_id = ? // order by t0.cretime, t0.id, t1.id asc, t1.order_qty asc, t1.cretime desc; --bind(1) @@ -160,6 +160,6 @@ public class TestManyWhereJoin extends BaseTestCase { Assert.assertTrue(sql.contains(" u1.product_id = ?")); // additional join for fetching the many details - Assert.assertTrue(sql.contains(" left outer join o_order_detail t1 on t1.order_id = t0.id")); + Assert.assertTrue(sql.contains(" left join o_order_detail t1 on t1.order_id = t0.id")); } } diff --git a/src/test/java/com/avaje/tests/query/TestManyWhereJoinM2M.java b/src/test/java/com/avaje/tests/query/TestManyWhereJoinM2M.java index 75c294f77..7ba3316df 100644 --- a/src/test/java/com/avaje/tests/query/TestManyWhereJoinM2M.java +++ b/src/test/java/com/avaje/tests/query/TestManyWhereJoinM2M.java @@ -61,7 +61,7 @@ public class TestManyWhereJoinM2M extends BaseTestCase { String sql = query.getGeneratedSql(); Assert.assertTrue(sql.contains("select distinct")); - Assert.assertTrue(sql.contains("left outer join mrole ")); + Assert.assertTrue(sql.contains("left join mrole ")); Assert.assertTrue(sql.contains("join mrole ")); Assert.assertTrue(sql.contains(".role_name = ?")); diff --git a/src/test/java/com/avaje/tests/query/TestQueryFetchManyTwoDeep.java b/src/test/java/com/avaje/tests/query/TestQueryFetchManyTwoDeep.java index d094bdf7b..af0148973 100644 --- a/src/test/java/com/avaje/tests/query/TestQueryFetchManyTwoDeep.java +++ b/src/test/java/com/avaje/tests/query/TestQueryFetchManyTwoDeep.java @@ -33,15 +33,15 @@ public class TestQueryFetchManyTwoDeep extends BaseTestCase { List list = query.findList(); Assert.assertTrue("has rows", !list.isEmpty()); Assert.assertTrue(query.getGeneratedSql().contains("from o_customer t0 ")); - Assert.assertTrue(query.getGeneratedSql().contains("left outer join o_order t1 on t1.kcustomer_id = t0.id")); - Assert.assertTrue(query.getGeneratedSql().contains("left outer join o_customer t2 on t2.id = t1.kcustomer_id")); + Assert.assertTrue(query.getGeneratedSql().contains("left join o_order t1 on t1.kcustomer_id = t0.id")); + Assert.assertTrue(query.getGeneratedSql().contains("left join o_customer t2 on t2.id = t1.kcustomer_id")); Assert.assertFalse(query.getGeneratedSql().contains("join or_order_ship")); //select t0.id c0, t0.status c1, t0.name c2, t0.smallnote c3, t0.anniversary c4, t0.cretime c5, t0.updtime c6, t0.billing_address_id c7, t0.shipping_address_id c8, t1.id c9, t1.status c10, t1.order_date c11, t1.ship_date c12, // t2.name c13, t1.cretime c14, t1.updtime c15, t1.kcustomer_id c16 // from o_customer t0 - // left outer join o_order t1 on t1.kcustomer_id = t0.id - // left outer join o_customer t2 on t2.id = t1.kcustomer_id + // left join o_order t1 on t1.kcustomer_id = t0.id + // left join o_customer t2 on t2.id = t1.kcustomer_id // where t1.order_date is not null order by t0.id; --bind() @@ -77,16 +77,16 @@ public class TestQueryFetchManyTwoDeep extends BaseTestCase { // select ... // from or_order_ship t0 - // left outer join o_order t1 on t1.id = t0.order_id - // left outer join o_customer t3 on t3.id = t1.kcustomer_id - // left outer join o_order_detail t2 on t2.order_id = t1.id + // left join o_order t1 on t1.id = t0.order_id + // left join o_customer t3 on t3.id = t1.kcustomer_id + // left join o_order_detail t2 on t2.order_id = t1.id // where t2.id > 0 ; --bind() Assert.assertTrue(generatedSql.contains("from or_order_ship t0")); // Relationship from OrderShipment to Order is optional so outer join here - Assert.assertTrue(generatedSql.contains("left outer join o_order t1 on t1.id = t0.order_id")); - Assert.assertTrue(generatedSql.contains("left outer join o_customer t3 on t3.id = t1.kcustomer_id")); - Assert.assertTrue(generatedSql.contains("left outer join o_order_detail t2 on t2.order_id = t1.id")); + Assert.assertTrue(generatedSql.contains("left join o_order t1 on t1.id = t0.order_id")); + Assert.assertTrue(generatedSql.contains("left join o_customer t3 on t3.id = t1.kcustomer_id")); + Assert.assertTrue(generatedSql.contains("left join o_order_detail t2 on t2.order_id = t1.id")); // If OrderShipment to Order is not optional you get inner joins up to o_order_detail (which is a many) @@ -95,7 +95,7 @@ public class TestQueryFetchManyTwoDeep extends BaseTestCase { // from or_order_ship t0 // join o_order t1 on t1.id = t0.order_id // join o_customer t3 on t3.id = t1.kcustomer_id - // left outer join o_order_detail t2 on t2.order_id = t1.id + // left join o_order_detail t2 on t2.order_id = t1.id // where t2.id > 0 ; --bind() } @@ -119,15 +119,15 @@ public class TestQueryFetchManyTwoDeep extends BaseTestCase { // select ... // from contact t0 // join o_customer t1 on t1.id = t0.customer_id - // left outer join o_order t2 on t2.kcustomer_id = t1.id - // left outer join o_customer t3 on t3.id = t2.kcustomer_id + // left join o_order t2 on t2.kcustomer_id = t1.id + // left join o_customer t3 on t3.id = t2.kcustomer_id // where t2.order_date is not null ; --bind() Assert.assertTrue(generatedSql.contains("from contact t0 ")); // Relationship from Contact to Customer is mandatory so inner join here Assert.assertTrue(generatedSql.contains("join o_customer t1 on t1.id = t0.customer_id")); // outer join on many relationship 'orders' - Assert.assertTrue(generatedSql.contains("left outer join o_order t2 on t2.kcustomer_id = t1.id")); + Assert.assertTrue(generatedSql.contains("left join o_order t2 on t2.kcustomer_id = t1.id")); } diff --git a/src/test/java/com/avaje/tests/query/TestQueryMultiManyOrder.java b/src/test/java/com/avaje/tests/query/TestQueryMultiManyOrder.java index 5786e992c..4525c0a37 100644 --- a/src/test/java/com/avaje/tests/query/TestQueryMultiManyOrder.java +++ b/src/test/java/com/avaje/tests/query/TestQueryMultiManyOrder.java @@ -27,9 +27,9 @@ public class TestQueryMultiManyOrder extends BaseTestCase { Assert.assertTrue(!list.isEmpty()); Assert.assertTrue(sql.contains("join o_customer ")); - Assert.assertFalse(sql.contains("left outer join contact ")); - Assert.assertFalse(sql.contains("left outer join o_order_detail ")); - Assert.assertFalse(sql.contains("left outer join o_product ")); + Assert.assertFalse(sql.contains("left join contact ")); + Assert.assertFalse(sql.contains("left join o_order_detail ")); + Assert.assertFalse(sql.contains("left join o_product ")); } } diff --git a/src/test/java/com/avaje/tests/query/TestSubQuery.java b/src/test/java/com/avaje/tests/query/TestSubQuery.java index ec2bfa5d6..ccb7dfff5 100644 --- a/src/test/java/com/avaje/tests/query/TestSubQuery.java +++ b/src/test/java/com/avaje/tests/query/TestSubQuery.java @@ -1,140 +1,140 @@ -package com.avaje.tests.query; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Assert; -import org.junit.Test; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebean.Ebean; -import com.avaje.ebean.Query; -import com.avaje.tests.model.basic.CKeyParent; -import com.avaje.tests.model.basic.Order; -import com.avaje.tests.model.basic.ResetBasicData; -import com.avaje.tests.model.basic.Vehicle; -import com.avaje.tests.model.basic.VehicleDriver; - -import static org.assertj.core.api.StrictAssertions.assertThat; - -public class TestSubQuery extends BaseTestCase { - - @Test - public void testId() { - - ResetBasicData.reset(); - - List productIds = new ArrayList(); - productIds.add(3); - - Query sq = Ebean.createQuery(Order.class).select("id").where() - .in("details.product.id", productIds).query(); - - Ebean.find(Order.class).where().in("id", sq).findList(); - } - - public void testCompositeKey() { - ResetBasicData.reset(); - - Query sq = Ebean.createQuery(CKeyParent.class).select("id.oneKey") - .setAutoTune(false).where().query(); - - Query pq = Ebean.find(CKeyParent.class).where().in("id.oneKey", sq).query(); - - pq.findList(); - - String sql = pq.getGeneratedSql(); - - String golden = "(t0.one_key) in (select t0.one_key from ckey_parent t0) "; - - assertThat(sql).contains(golden); - } - - /** - * show that ebean is not using the correct table name in the subquery (sq) - * - * public void testInheritance1() { ResetBasicData.reset(); - * - * Query sq = Ebean.createQuery(Vehicle.class) .select("id") - * .setAutoTune(false) .where() .query(); - * - * Query pq = Ebean.find(VehicleDriver.class) - * .where().in("vehicle.id", sq) .query(); - * - * pq.findList(); - * - * String sql = pq.getGeneratedSql(); System.err.println(sql); - * - * String golden = "(t0.vehicle_id) in (select t0.id from t0.vehicle t0)"; if - * (sql.indexOf(golden) < 0) { System.out.println("failed sql:"+sql); - * fail("golden string not found"); } - * - * } - */ - - /** - * show that ebean is adding the discriminator to the list of columns in the - * subquery - */ - public void testInheritance2() { - ResetBasicData.reset(); - - Query sq = Ebean.createQuery(VehicleDriver.class).select("vehicle") - .setAutoTune(false).where().query(); - - Query pq = Ebean.find(Vehicle.class).where().in("id", sq).query(); - - pq.findList(); - - String sql = pq.getGeneratedSql(); - - // TODO: If, after bugfixing, the system still join against vehicle I do not - // know now, in our case, it is not necessary if not - // using it in the where clause - String golden = "(t0.id) in (select t0.vehicle_id from vehicle_driver t0 left outer join vehicle t1 on t1.id = t0.vehicle_id )"; - assertThat(sql).contains(golden); - - } - - /** - * show that ebean is adding the discriminator to the list of columns in the - * subquery. Second test to make sure that joining is still possible after - * bugfixing testInheritance2. - */ - public void testInheritance3() { - ResetBasicData.reset(); - - Query sq = Ebean.createQuery(VehicleDriver.class).select("vehicle") - .setAutoTune(false).where().eq("vehicle.licenseNumber", "abc").query(); - - Query pq = Ebean.find(Vehicle.class).where().in("id", sq).query(); - - pq.findList(); - - String sql = pq.getGeneratedSql(); - String golden = "(t0.id) in (select t0.vehicle_id from vehicle_driver t0 left outer join vehicle t1 on t1.id = t0.vehicle_id where t1.license_number = ? )"; - assertThat(sql).contains(golden); - } - - /** - * show that ebean is using the wrong column (from the vehicle_driver table - * instead of vehicle) for the selected column in the subquery. In contrast to - * testInheritance2+3 this test forces ebean to "drill down" to the key of the - * relation. - */ - public void testInheritance4() { - ResetBasicData.reset(); - - Query sq = Ebean.createQuery(VehicleDriver.class).select("vehicle.id") - .setAutoTune(false).where().query(); - - Query pq = Ebean.find(Vehicle.class).where().in("id", sq).query(); - - pq.findList(); - - String sql = pq.getGeneratedSql(); - - String golden = "(t0.id) in (select t0.vehicle_id from vehicle_driver t0 left outer join vehicle t1 on t1.id = t0.vehicle_id )"; - assertThat(sql).contains(golden); - } -} +package com.avaje.tests.query; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.Ebean; +import com.avaje.ebean.Query; +import com.avaje.tests.model.basic.CKeyParent; +import com.avaje.tests.model.basic.Order; +import com.avaje.tests.model.basic.ResetBasicData; +import com.avaje.tests.model.basic.Vehicle; +import com.avaje.tests.model.basic.VehicleDriver; + +import static org.assertj.core.api.StrictAssertions.assertThat; + +public class TestSubQuery extends BaseTestCase { + + @Test + public void testId() { + + ResetBasicData.reset(); + + List productIds = new ArrayList(); + productIds.add(3); + + Query sq = Ebean.createQuery(Order.class).select("id").where() + .in("details.product.id", productIds).query(); + + Ebean.find(Order.class).where().in("id", sq).findList(); + } + + public void testCompositeKey() { + ResetBasicData.reset(); + + Query sq = Ebean.createQuery(CKeyParent.class).select("id.oneKey") + .setAutoTune(false).where().query(); + + Query pq = Ebean.find(CKeyParent.class).where().in("id.oneKey", sq).query(); + + pq.findList(); + + String sql = pq.getGeneratedSql(); + + String golden = "(t0.one_key) in (select t0.one_key from ckey_parent t0) "; + + assertThat(sql).contains(golden); + } + + /** + * show that ebean is not using the correct table name in the subquery (sq) + * + * public void testInheritance1() { ResetBasicData.reset(); + * + * Query sq = Ebean.createQuery(Vehicle.class) .select("id") + * .setAutoTune(false) .where() .query(); + * + * Query pq = Ebean.find(VehicleDriver.class) + * .where().in("vehicle.id", sq) .query(); + * + * pq.findList(); + * + * String sql = pq.getGeneratedSql(); System.err.println(sql); + * + * String golden = "(t0.vehicle_id) in (select t0.id from t0.vehicle t0)"; if + * (sql.indexOf(golden) < 0) { System.out.println("failed sql:"+sql); + * fail("golden string not found"); } + * + * } + */ + + /** + * show that ebean is adding the discriminator to the list of columns in the + * subquery + */ + public void testInheritance2() { + ResetBasicData.reset(); + + Query sq = Ebean.createQuery(VehicleDriver.class).select("vehicle") + .setAutoTune(false).where().query(); + + Query pq = Ebean.find(Vehicle.class).where().in("id", sq).query(); + + pq.findList(); + + String sql = pq.getGeneratedSql(); + + // TODO: If, after bugfixing, the system still join against vehicle I do not + // know now, in our case, it is not necessary if not + // using it in the where clause + String golden = "(t0.id) in (select t0.vehicle_id from vehicle_driver t0 left join vehicle t1 on t1.id = t0.vehicle_id )"; + assertThat(sql).contains(golden); + + } + + /** + * show that ebean is adding the discriminator to the list of columns in the + * subquery. Second test to make sure that joining is still possible after + * bugfixing testInheritance2. + */ + public void testInheritance3() { + ResetBasicData.reset(); + + Query sq = Ebean.createQuery(VehicleDriver.class).select("vehicle") + .setAutoTune(false).where().eq("vehicle.licenseNumber", "abc").query(); + + Query pq = Ebean.find(Vehicle.class).where().in("id", sq).query(); + + pq.findList(); + + String sql = pq.getGeneratedSql(); + String golden = "(t0.id) in (select t0.vehicle_id from vehicle_driver t0 left join vehicle t1 on t1.id = t0.vehicle_id where t1.license_number = ? )"; + assertThat(sql).contains(golden); + } + + /** + * show that ebean is using the wrong column (from the vehicle_driver table + * instead of vehicle) for the selected column in the subquery. In contrast to + * testInheritance2+3 this test forces ebean to "drill down" to the key of the + * relation. + */ + public void testInheritance4() { + ResetBasicData.reset(); + + Query sq = Ebean.createQuery(VehicleDriver.class).select("vehicle.id") + .setAutoTune(false).where().query(); + + Query pq = Ebean.find(Vehicle.class).where().in("id", sq).query(); + + pq.findList(); + + String sql = pq.getGeneratedSql(); + + String golden = "(t0.id) in (select t0.vehicle_id from vehicle_driver t0 left join vehicle t1 on t1.id = t0.vehicle_id )"; + assertThat(sql).contains(golden); + } +} diff --git a/src/test/java/com/avaje/tests/query/joins/TestDisjunctWhereOuterJoin.java b/src/test/java/com/avaje/tests/query/joins/TestDisjunctWhereOuterJoin.java index 0496a10fc..8e49dbc3c 100644 --- a/src/test/java/com/avaje/tests/query/joins/TestDisjunctWhereOuterJoin.java +++ b/src/test/java/com/avaje/tests/query/joins/TestDisjunctWhereOuterJoin.java @@ -57,7 +57,7 @@ public class TestDisjunctWhereOuterJoin extends BaseTestCase { String sql = query.getGeneratedSql(); Assert.assertTrue(sql.contains("select distinct")); - Assert.assertTrue(sql.contains("outer join mrole ")); + Assert.assertTrue(sql.contains("left join mrole ")); Assert.assertTrue(sql.contains(".role_name = ?")); } finally { diff --git a/src/test/java/com/avaje/tests/query/joins/TestDisjunctWhereOuterOnMany.java b/src/test/java/com/avaje/tests/query/joins/TestDisjunctWhereOuterOnMany.java index ed0eb49c8..bc1a1abed 100644 --- a/src/test/java/com/avaje/tests/query/joins/TestDisjunctWhereOuterOnMany.java +++ b/src/test/java/com/avaje/tests/query/joins/TestDisjunctWhereOuterOnMany.java @@ -49,14 +49,14 @@ public class TestDisjunctWhereOuterOnMany extends BaseTestCase { // select distinct t0.id c0, t0.name c1 // from uuone t0 // join uutwo u1 on u1.master_id = t0.id - // left outer join uutwo t1 on t1.master_id = t0.id + // left join uutwo t1 on t1.master_id = t0.id // where (t0.name = ? or u1.name = ? ) ; // --bind(testDisjOuter_2_name,testDisjOuter_CHILD_1) Assert.assertEquals(2, list.size()); Assert.assertEquals(2, rowCount); - String expectedSql = "select distinct t0.id, t0.name from uuone t0 left outer join uutwo u1 on u1.master_id = t0.id where (t0.name = ? or u1.name = ? ) "; + String expectedSql = "select distinct t0.id, t0.name from uuone t0 left join uutwo u1 on u1.master_id = t0.id where (t0.name = ? or u1.name = ? ) "; Assert.assertEquals(expectedSql, sqlOf(query, 1)); } diff --git a/src/test/java/com/avaje/tests/query/joins/TestQueryJoinManyNonRoot.java b/src/test/java/com/avaje/tests/query/joins/TestQueryJoinManyNonRoot.java index e09143ce1..aaa39ebca 100644 --- a/src/test/java/com/avaje/tests/query/joins/TestQueryJoinManyNonRoot.java +++ b/src/test/java/com/avaje/tests/query/joins/TestQueryJoinManyNonRoot.java @@ -50,14 +50,14 @@ public class TestQueryJoinManyNonRoot extends BaseTestCase { assertTrue(!list.isEmpty()); assertTrue(sql.contains("join o_customer t1 on t1.id ")); - assertTrue(sql.contains("left outer join contact t2 on")); + assertTrue(sql.contains("left join contact t2 on")); // select t0.id c0, t0.status c1, t0.order_date c2, t0.ship_date c3, t1.name c4, t0.cretime c5, t0.updtime c6, // t1.id c7, t1.status c8, t1.name c9, t1.smallnote c10, t1.anniversary c11, t1.cretime c12, t1.updtime c13, t1.billing_address_id c14, t1.shipping_address_id c15, // t2.id c16, t2.first_name c17, t2.last_name c18, t2.phone c19, t2.mobile c20, t2.email c21, t2.cretime c22, t2.updtime c23, t2.customer_id c24, t2.group_id c25 // from o_order t0 // join o_customer t1 on t1.id = t0.kcustomer_id - // left outer join contact t2 on t2.customer_id = t1.id + // left join contact t2 on t2.customer_id = t1.id // where t0.id > ? ; --bind(0) } @@ -79,10 +79,10 @@ public class TestQueryJoinManyNonRoot extends BaseTestCase { assertTrue(!list.isEmpty()); assertTrue(sql.contains("join o_customer t1 on t1.id ")); - assertTrue(sql.contains("left outer join o_order_detail ")); - assertTrue(sql.contains("left outer join o_product ")); + assertTrue(sql.contains("left join o_order_detail ")); + assertTrue(sql.contains("left join o_product ")); - Assert.assertFalse(sql.contains("left outer join contact")); + Assert.assertFalse(sql.contains("left join contact")); } @@ -107,10 +107,10 @@ public class TestQueryJoinManyNonRoot extends BaseTestCase { assertTrue(!list.isEmpty()); assertTrue(sql.contains("join o_customer t1 on t1.id ")); - assertTrue(sql.contains("left outer join contact ")); + assertTrue(sql.contains("left join contact ")); - Assert.assertFalse(sql.contains("left outer join o_order_detail ")); - Assert.assertFalse(sql.contains("left outer join o_product ")); + Assert.assertFalse(sql.contains("left join o_order_detail ")); + Assert.assertFalse(sql.contains("left join o_product ")); } diff --git a/src/test/java/com/avaje/tests/query/joins/TestQueryManyToOneWhereClauseJoin.java b/src/test/java/com/avaje/tests/query/joins/TestQueryManyToOneWhereClauseJoin.java index 00cc967d7..ab0ee7d70 100644 --- a/src/test/java/com/avaje/tests/query/joins/TestQueryManyToOneWhereClauseJoin.java +++ b/src/test/java/com/avaje/tests/query/joins/TestQueryManyToOneWhereClauseJoin.java @@ -80,7 +80,7 @@ public class TestQueryManyToOneWhereClauseJoin extends BaseTestCase { String generatedSql = query.getGeneratedSql(); Assert.assertTrue(generatedSql.contains("from o_order t0 join o_customer t1 on t1.id = t0.kcustomer_id")); - Assert.assertTrue(generatedSql.contains("left outer join contact t2 on t2.customer_id = t1.id")); + Assert.assertTrue(generatedSql.contains("left join contact t2 on t2.customer_id = t1.id")); Assert.assertTrue(generatedSql.contains("where lower(t1.name) like ?")); // select t0.id c0, t0.status c1, t0.order_date c2, t0.ship_date c3, t1.name c4, t0.cretime c5, t0.updtime c6, @@ -88,7 +88,7 @@ public class TestQueryManyToOneWhereClauseJoin extends BaseTestCase { // t2.id c16, t2.first_name c17, t2.last_name c18, t2.phone c19, t2.mobile c20, t2.email c21, t2.cretime c22, t2.updtime c23, t2.customer_id c24, t2.group_id c25 // from o_order t0 // join o_customer t1 on t1.id = t0.kcustomer_id - // left outer join contact t2 on t2.customer_id = t1.id + // left join contact t2 on t2.customer_id = t1.id // where lower(t1.name) like ? ; --bind(rob%) } } diff --git a/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithDistinct.java b/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithDistinct.java index 896b4c26c..4e94b3b33 100644 --- a/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithDistinct.java +++ b/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithDistinct.java @@ -76,7 +76,7 @@ public class TestOrderByWithDistinct extends BaseTestCase { // select distinct t0.userid c0, t0.user_name c1, t1.id c2, t1.name c3 // from muser t0 - // left outer join muser_type t1 on t1.id = t0.user_type_id + // left join muser_type t1 on t1.id = t0.user_type_id // join mrole_muser u1z_ on u1z_.muser_userid = t0.userid // join mrole u1 on u1.roleid = u1z_.mrole_roleid // where u1.role_name = ? @@ -109,7 +109,7 @@ public class TestOrderByWithDistinct extends BaseTestCase { // select distinct t0.userid c0, t0.user_name c1, t1.id c2, t1.name c3 // from muser t0 - // left outer join muser_type t1 on t1.id = t0.user_type_id + // left join muser_type t1 on t1.id = t0.user_type_id // join mrole_muser u1z_ on u1z_.muser_userid = t0.userid // join mrole u1 on u1.roleid = u1z_.mrole_roleid // where u1.role_name = ? diff --git a/src/test/java/com/avaje/tests/query/other/TestQueryConversationRowCount.java b/src/test/java/com/avaje/tests/query/other/TestQueryConversationRowCount.java index a453905b3..e93fa3617 100644 --- a/src/test/java/com/avaje/tests/query/other/TestQueryConversationRowCount.java +++ b/src/test/java/com/avaje/tests/query/other/TestQueryConversationRowCount.java @@ -37,12 +37,12 @@ public class TestQueryConversationRowCount extends BaseTestCase { // select distinct t0.id c0, t0.title c1, t0.open c2, t0.version c3, t0.when_created c4, t0.when_updated c5, t0.group_id c6, t0.when_created // from c_conversation t0 - // left outer join c_participation u1 on u1.conversation_id = t0.id + // left join c_participation u1 on u1.conversation_id = t0.id // where t0.group_id = ? and ((t0.open = ? and u1.user_id = ? ) or t0.open = ? ) // order by t0.when_created desc; Assert.assertTrue(generatedSql.contains("select distinct t0.id, t0.title, t0.isopen")); - Assert.assertTrue(generatedSql.contains("left outer join c_participation u1 on u1.conversation_id = t0.id")); + Assert.assertTrue(generatedSql.contains("left join c_participation u1 on u1.conversation_id = t0.id")); Assert.assertTrue(generatedSql.contains("where t0.group_id = ? and ((t0.isopen = ? and u1.user_id = ? ) or t0.isopen = ? )")); @@ -52,7 +52,7 @@ public class TestQueryConversationRowCount extends BaseTestCase { // select count(*) from ( // select distinct t0.id c0 // from c_conversation t0 - // left outer join c_participation u1 on u1.conversation_id = t0.id + // left join c_participation u1 on u1.conversation_id = t0.id // where t0.group_id = ? and ((t0.open = ? and u1.user_id = ? ) or t0.open = ? ) // ); --bind(1,true,1,true) @@ -60,7 +60,7 @@ public class TestQueryConversationRowCount extends BaseTestCase { Assert.assertEquals(1, loggedSql.size()); String countSql = trimSql(loggedSql.get(0), 0); - Assert.assertTrue(countSql.contains("select count(*) from ( select distinct t0.id from c_conversation t0 left outer join c_participation u1 on u1.conversation_id = t0.id where t0.group_id = ? and ((t0.isopen = ? and u1.user_id = ? ) or t0.isopen = ? )")); + Assert.assertTrue(countSql.contains("select count(*) from ( select distinct t0.id from c_conversation t0 left join c_participation u1 on u1.conversation_id = t0.id where t0.group_id = ? and ((t0.isopen = ? and u1.user_id = ? ) or t0.isopen = ? )")); } } diff --git a/src/test/java/com/avaje/tests/query/other/TestQueryRawExpressionMany.java b/src/test/java/com/avaje/tests/query/other/TestQueryRawExpressionMany.java index 4a406f59f..e55e5606e 100644 --- a/src/test/java/com/avaje/tests/query/other/TestQueryRawExpressionMany.java +++ b/src/test/java/com/avaje/tests/query/other/TestQueryRawExpressionMany.java @@ -30,6 +30,6 @@ public class TestQueryRawExpressionMany extends BaseTestCase { query.findCount(); List sql = LoggedSqlCollector.stop(); - assertThat(trimSql(sql.get(0), 1)).contains("select count(*) from ( select distinct t0.id from o_order t0 left outer join o_order_detail t1 on t1.order_id = t0.id where t1.order_qty = ?)"); + assertThat(trimSql(sql.get(0), 1)).contains("select count(*) from ( select distinct t0.id from o_order t0 left join o_order_detail t1 on t1.order_id = t0.id where t1.order_qty = ?)"); } } diff --git a/src/test/java/com/avaje/tests/query/other/TestQueryRowCountWithMany.java b/src/test/java/com/avaje/tests/query/other/TestQueryRowCountWithMany.java index 0823c86b2..5885d196a 100644 --- a/src/test/java/com/avaje/tests/query/other/TestQueryRowCountWithMany.java +++ b/src/test/java/com/avaje/tests/query/other/TestQueryRowCountWithMany.java @@ -34,14 +34,14 @@ public class TestQueryRowCountWithMany extends BaseTestCase { // t1.id c8, t1.order_qty c9, t1.ship_qty c10, t1.unit_price c11, t1.cretime c12, t1.updtime c13, t1.order_id c14, t1.product_id c15, t0.cretime, t0.id, t1.id, t1.order_qty, t1.cretime // from o_order t0 // join o_customer t2 on t2.id = t0.kcustomer_id - // left outer join o_order_detail t1 on t1.order_id = t0.id + // left join o_order_detail t1 on t1.order_id = t0.id // join o_order_detail u1 on u1.order_id = t0.id // where t1.id > 0 and u1.product_id = ? // order by t0.cretime, t0.id, t1.id asc, t1.order_qty asc, t1.cretime desc; --bind(1) String generatedSql = sqlOf(query, 1); Assert.assertTrue(generatedSql.contains("select distinct t0.id, t0.status,")); // need the distinct - Assert.assertTrue(generatedSql.contains("left outer join o_order_detail t1 on t1.order_id = t0.id")); //fetch join + Assert.assertTrue(generatedSql.contains("left join o_order_detail t1 on t1.order_id = t0.id")); //fetch join Assert.assertTrue(generatedSql.contains("join o_order_detail u1 on u1.order_id = t0.id")); //predicate join Assert.assertTrue(generatedSql.contains(" u1.product_id = ?")); // u1 as predicate alias Assert.assertTrue(generatedSql.contains(" order by t0.cretime")); @@ -50,7 +50,7 @@ public class TestQueryRowCountWithMany extends BaseTestCase { int rowCount = query.findCount(); // select count(*) from o_order t0 - // left outer join o_order_detail t1 on t1.order_id = t0.id + // left join o_order_detail t1 on t1.order_id = t0.id // where t1.product_id = ? ; --bind(1) // select count(*) from ( diff --git a/src/test/java/com/avaje/tests/query/other/TestQuerySingleAttribute.java b/src/test/java/com/avaje/tests/query/other/TestQuerySingleAttribute.java index 7e12facc6..f6103f1d4 100644 --- a/src/test/java/com/avaje/tests/query/other/TestQuerySingleAttribute.java +++ b/src/test/java/com/avaje/tests/query/other/TestQuerySingleAttribute.java @@ -107,7 +107,7 @@ public class TestQuerySingleAttribute extends BaseTestCase { List names = query.findSingleAttributeList(); - assertThat(sqlOf(query)).contains("select distinct t0.name from o_customer t0 left outer join o_address t1 on t1.id = t0.billing_address_id where t0.status = ? and lower(t1.city) like ?"); + assertThat(sqlOf(query)).contains("select distinct t0.name from o_customer t0 left join o_address t1 on t1.id = t0.billing_address_id where t0.status = ? and lower(t1.city) like ?"); assertThat(names).isNotNull(); } diff --git a/src/test/java/com/avaje/tests/singleTableInheritance/TestInheritQuery.java b/src/test/java/com/avaje/tests/singleTableInheritance/TestInheritQuery.java index bc063e977..5afb69e61 100644 --- a/src/test/java/com/avaje/tests/singleTableInheritance/TestInheritQuery.java +++ b/src/test/java/com/avaje/tests/singleTableInheritance/TestInheritQuery.java @@ -1,168 +1,167 @@ -package com.avaje.tests.singleTableInheritance; - -import java.util.List; - -import org.junit.Assert; -import org.junit.Test; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebean.Ebean; -import com.avaje.tests.singleTableInheritance.model.*; - -public class TestInheritQuery extends BaseTestCase { - - @Test - public void test() { - ZoneExternal zone = new ZoneExternal(); - zone.setAttribute("ABC"); - Ebean.save(zone); - - PalletLocationExternal location = new PalletLocationExternal(); - location.setZone(zone); - location.setAttribute("123"); - Ebean.save(location); - - // This line should work too: - List locations = Ebean.find(PalletLocation.class).where().eq("zone", zone) - .findList(); - // List locations = - // Ebean.find(PalletLocation.class).where().eq("zone.id", - // zone.getId()).findList(); - - Assert.assertNotNull(locations); - Assert.assertEquals(1, locations.size()); - PalletLocation rereadLoc = locations.get(0); - Assert.assertTrue(rereadLoc instanceof PalletLocation); - Zone rereadZone = rereadLoc.getZone(); - Assert.assertNotNull(rereadZone); - Assert.assertTrue(rereadZone instanceof ZoneExternal); - } - - @Test - public void testDiscriminator_bug417() { - - - Ebean.deleteAll(Ebean.find(Warehouse.class).findList()); - Ebean.deleteAll(Ebean.find(PalletLocation.class).findList()); - Ebean.deleteAll(Ebean.find(Zone.class).findList()); - Ebean.deleteAll(Ebean.find(ZoneInternal.class).findList()); - Ebean.deleteAll(Ebean.find(ZoneInternal.class).findList()); - - ZoneInternal zoneInt = new ZoneInternal(); - zoneInt.setAttribute("some zone 1"); - Ebean.save(zoneInt); - - ZoneExternal zoneExt = new ZoneExternal(); - zoneExt.setAttribute("some zone 2"); - Ebean.save(zoneExt); - - // queries of Zone and subclasses as root node of query - - // query abstract class on attribute (root of heirarchy) - List zones = Ebean.find(Zone.class).where().startsWith("attribute", "some zone").findList(); - // select t0.type c0, t0.ID c1, t0.attribute c2, t0.attribute c3 from zones t0 where t0.attribute like ? ; --bind(some zone%) - Assert.assertEquals(2, zones.size()); - Assert.assertTrue(zones.contains(zoneInt)); - Assert.assertTrue(zones.contains(zoneExt)); - - // query internal zones only - // discriminator is in WHERE clause where it belongs - List internalZones = Ebean.find(ZoneInternal.class).where().startsWith("attribute", "some zone").findList(); - // select t0.type c0, t0.ID c1, t0.attribute c2 from zones t0 where t0.type = 'INT' and t0.attribute like ? ; --bind(some zone%) - Assert.assertEquals(1, internalZones.size()); - Assert.assertTrue(internalZones.contains(zoneInt)); - Assert.assertFalse(internalZones.contains(zoneExt)); - Assert.assertTrue(internalZones.get(0) instanceof ZoneInternal); - - // query external zones only - List externalZones = Ebean.find(ZoneExternal.class).where().startsWith("attribute", "some zone").findList(); - // select t0.type c0, t0.ID c1, t0.attribute c2 from zones t0 where t0.type = 'EXT' and t0.attribute like ? ; --bind(some zone%) - Assert.assertEquals(1, externalZones.size()); - Assert.assertTrue(externalZones.contains(zoneExt)); - Assert.assertFalse(externalZones.contains(zoneInt)); - Assert.assertTrue(externalZones.get(0) instanceof ZoneExternal); - - // parents with children of Zones and subclasses - - Warehouse wh = new Warehouse(); - wh.setOfficeZone(zoneInt); // many-to-one - wh.getShippingZones().add(zoneExt); // many-to-many - Ebean.save(wh); - - // JOIN clause, no discriminator - // parent with many-to-one, doesn't put in discriminator, why not, PK sufficient? - // eager join - Warehouse wh2 = Ebean.find(Warehouse.class, wh.getId()); - // select t0.ID c0, t1.type c1, t0.officeZoneId c2 from warehouses t0 left outer join zones t1 on t1.ID = t0.officeZoneId where t0.ID = ? ; --bind(1) - Assert.assertNotNull(wh2); - Assert.assertEquals(wh.getId(), wh2.getId()); - Assert.assertEquals(wh.getOfficeZone(), wh2.getOfficeZone()); - Assert.assertEquals(wh.getOfficeZone().getAttribute(), wh2.getOfficeZone().getAttribute()); - - // before the fix, next assertion runs this lazy query: - - // select t0.ID c0, t1.type c1, t1.ID c2 from warehouses t0 - // left outer join WarehousesShippingZones t1z_ on t1z_.warehouseId = t0.ID - // left outer join zones t1 on t1.ID = t1z_.shippingZoneId - // where t1.type = 'EXT' // this should be in the join clause - // and t0.ID = ? - // order by t0.ID; --bind(1) - - // this works here because we have at least one shipping zone - - Assert.assertEquals(1, wh2.getShippingZones().size()); - Assert.assertTrue(wh2.getShippingZones().contains(zoneExt)); - - // set optional concrete to null to set stage for failure - wh.setOfficeZone(null); - Ebean.save(wh); - - // no discriminator here - wh2 = Ebean.find(Warehouse.class) - .where().eq("id", wh.getId()) - .findUnique(); - - Assert.assertNotNull(wh2); - // discriminator is used here, should be in join - // assuming this "manual" fetch is equivalent to autofetch (i.e., autofetch should work the same way) - // before Daryl's fix - // select t0.ID c0, t1.type c1, t1.ID c2, t1.attribute c3 from warehouses t0 left outer join zones t1 on t1.ID = t0.officeZoneId where t1.type = 'INT' and t0.ID = ? - // todo: after Daryl's fix, not sure if this is proper, no discriminator at all, isn't PK/FK sufficient? - // select t0.ID c0, t1.type c1, t1.ID c2, t1.attribute c3 from warehouses t0 left outer join zones t1 on t1.ID = t0.officeZoneId where t0.ID = ? ; --bind(1) - wh2 = Ebean.find(Warehouse.class) - .fetch("officeZone") - .where().eq("id", wh.getId()) - .findUnique(); - // key assertion #1 - fails due to left join with discriminator in WHERE - Assert.assertNotNull(wh2); - - // clear children to set the stage for left join failure - wh.getShippingZones().clear(); - Ebean.save(wh); - - wh2 = Ebean.find(Warehouse.class, wh.getId()); - Assert.assertNotNull(wh2); - Assert.assertEquals(wh.getId(), wh2.getId()); - Assert.assertEquals(0, wh.getShippingZones().size()); - - // query with lazy load of abstract children - wh = Ebean.find(Warehouse.class) - .where().eq("id", wh.getId()) - .findUnique(); - Assert.assertNotNull(wh); - Assert.assertEquals(wh.getId(), wh2.getId()); - Assert.assertEquals(0, wh.getShippingZones().size()); - - // query with fetch of abstract children - wh = Ebean.find(Warehouse.class) - .fetch("shippingZones") - .where().eq("id", wh.getId()) - .findUnique(); - // key assertion #2 - fails due to left join with discriminator in WHERE - Assert.assertNotNull(wh); - Assert.assertEquals(wh.getId(), wh2.getId()); - Assert.assertEquals(0, wh.getShippingZones().size()); - - - } +package com.avaje.tests.singleTableInheritance; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.Ebean; +import com.avaje.tests.singleTableInheritance.model.*; + +public class TestInheritQuery extends BaseTestCase { + + @Test + public void test() { + ZoneExternal zone = new ZoneExternal(); + zone.setAttribute("ABC"); + Ebean.save(zone); + + PalletLocationExternal location = new PalletLocationExternal(); + location.setZone(zone); + location.setAttribute("123"); + Ebean.save(location); + + // This line should work too: + List locations = Ebean.find(PalletLocation.class).where().eq("zone", zone) + .findList(); + // List locations = + // Ebean.find(PalletLocation.class).where().eq("zone.id", + // zone.getId()).findList(); + + Assert.assertNotNull(locations); + Assert.assertEquals(1, locations.size()); + PalletLocation rereadLoc = locations.get(0); + Assert.assertTrue(rereadLoc instanceof PalletLocation); + Zone rereadZone = rereadLoc.getZone(); + Assert.assertNotNull(rereadZone); + Assert.assertTrue(rereadZone instanceof ZoneExternal); + } + + @Test + public void testDiscriminator_bug417() { + + + Ebean.deleteAll(Ebean.find(Warehouse.class).findList()); + Ebean.deleteAll(Ebean.find(PalletLocation.class).findList()); + Ebean.deleteAll(Ebean.find(Zone.class).findList()); + Ebean.deleteAll(Ebean.find(ZoneInternal.class).findList()); + Ebean.deleteAll(Ebean.find(ZoneInternal.class).findList()); + + ZoneInternal zoneInt = new ZoneInternal(); + zoneInt.setAttribute("some zone 1"); + Ebean.save(zoneInt); + + ZoneExternal zoneExt = new ZoneExternal(); + zoneExt.setAttribute("some zone 2"); + Ebean.save(zoneExt); + + // queries of Zone and subclasses as root node of query + + // query abstract class on attribute (root of heirarchy) + List zones = Ebean.find(Zone.class).where().startsWith("attribute", "some zone").findList(); + // select t0.type c0, t0.ID c1, t0.attribute c2, t0.attribute c3 from zones t0 where t0.attribute like ? ; --bind(some zone%) + Assert.assertEquals(2, zones.size()); + Assert.assertTrue(zones.contains(zoneInt)); + Assert.assertTrue(zones.contains(zoneExt)); + + // query internal zones only + // discriminator is in WHERE clause where it belongs + List internalZones = Ebean.find(ZoneInternal.class).where().startsWith("attribute", "some zone").findList(); + // select t0.type c0, t0.ID c1, t0.attribute c2 from zones t0 where t0.type = 'INT' and t0.attribute like ? ; --bind(some zone%) + Assert.assertEquals(1, internalZones.size()); + Assert.assertTrue(internalZones.contains(zoneInt)); + Assert.assertFalse(internalZones.contains(zoneExt)); + Assert.assertTrue(internalZones.get(0) instanceof ZoneInternal); + + // query external zones only + List externalZones = Ebean.find(ZoneExternal.class).where().startsWith("attribute", "some zone").findList(); + // select t0.type c0, t0.ID c1, t0.attribute c2 from zones t0 where t0.type = 'EXT' and t0.attribute like ? ; --bind(some zone%) + Assert.assertEquals(1, externalZones.size()); + Assert.assertTrue(externalZones.contains(zoneExt)); + Assert.assertFalse(externalZones.contains(zoneInt)); + Assert.assertTrue(externalZones.get(0) instanceof ZoneExternal); + + // parents with children of Zones and subclasses + + Warehouse wh = new Warehouse(); + wh.setOfficeZone(zoneInt); // many-to-one + wh.getShippingZones().add(zoneExt); // many-to-many + Ebean.save(wh); + + // JOIN clause, no discriminator + // parent with many-to-one, doesn't put in discriminator, why not, PK sufficient? + // eager join + Warehouse wh2 = Ebean.find(Warehouse.class, wh.getId()); + Assert.assertNotNull(wh2); + Assert.assertEquals(wh.getId(), wh2.getId()); + Assert.assertEquals(wh.getOfficeZone(), wh2.getOfficeZone()); + Assert.assertEquals(wh.getOfficeZone().getAttribute(), wh2.getOfficeZone().getAttribute()); + + // before the fix, next assertion runs this lazy query: + + // select t0.ID c0, t1.type c1, t1.ID c2 from warehouses t0 + // left join WarehousesShippingZones t1z_ on t1z_.warehouseId = t0.ID + // left join zones t1 on t1.ID = t1z_.shippingZoneId + // where t1.type = 'EXT' // this should be in the join clause + // and t0.ID = ? + // order by t0.ID; --bind(1) + + // this works here because we have at least one shipping zone + + Assert.assertEquals(1, wh2.getShippingZones().size()); + Assert.assertTrue(wh2.getShippingZones().contains(zoneExt)); + + // set optional concrete to null to set stage for failure + wh.setOfficeZone(null); + Ebean.save(wh); + + // no discriminator here + wh2 = Ebean.find(Warehouse.class) + .where().eq("id", wh.getId()) + .findUnique(); + + Assert.assertNotNull(wh2); + // discriminator is used here, should be in join + // assuming this "manual" fetch is equivalent to autofetch (i.e., autofetch should work the same way) + // before Daryl's fix + // select t0.ID c0, t1.type c1, t1.ID c2, t1.attribute c3 from warehouses t0 left join zones t1 on t1.ID = t0.officeZoneId where t1.type = 'INT' and t0.ID = ? + // todo: after Daryl's fix, not sure if this is proper, no discriminator at all, isn't PK/FK sufficient? + // select t0.ID c0, t1.type c1, t1.ID c2, t1.attribute c3 from warehouses t0 left join zones t1 on t1.ID = t0.officeZoneId where t0.ID = ? ; --bind(1) + wh2 = Ebean.find(Warehouse.class) + .fetch("officeZone") + .where().eq("id", wh.getId()) + .findUnique(); + // key assertion #1 - fails due to left join with discriminator in WHERE + Assert.assertNotNull(wh2); + + // clear children to set the stage for left join failure + wh.getShippingZones().clear(); + Ebean.save(wh); + + wh2 = Ebean.find(Warehouse.class, wh.getId()); + Assert.assertNotNull(wh2); + Assert.assertEquals(wh.getId(), wh2.getId()); + Assert.assertEquals(0, wh.getShippingZones().size()); + + // query with lazy load of abstract children + wh = Ebean.find(Warehouse.class) + .where().eq("id", wh.getId()) + .findUnique(); + Assert.assertNotNull(wh); + Assert.assertEquals(wh.getId(), wh2.getId()); + Assert.assertEquals(0, wh.getShippingZones().size()); + + // query with fetch of abstract children + wh = Ebean.find(Warehouse.class) + .fetch("shippingZones") + .where().eq("id", wh.getId()) + .findUnique(); + // key assertion #2 - fails due to left join with discriminator in WHERE + Assert.assertNotNull(wh); + Assert.assertEquals(wh.getId(), wh2.getId()); + Assert.assertEquals(0, wh.getShippingZones().size()); + + + } } \ No newline at end of file