From ddf3c753d6be2e73d017baa99b7e5f60eac724fc Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Tue, 3 Mar 2020 22:27:55 +1300 Subject: [PATCH] Ability to use order() on filterMany() (related to #1943) #1964 --- src/main/java/io/ebean/ExpressionList.java | 2 +- .../expression/DefaultExpressionList.java | 5 +-- .../expression/FilterExpressionList.java | 35 +++++++++++-------- .../server/expression/JunctionExpression.java | 2 +- .../softdelete/TestM2MSoftDeleteExists.java | 2 +- .../org/tests/query/TestManyWhereJoin.java | 6 ++-- .../org/tests/query/TestQueryFilterMany.java | 6 ++-- .../org/tests/query/TestQueryFindEach.java | 4 +-- .../tests/query/TestQueryFindEachWhile.java | 4 +-- .../org/tests/query/TestQueryFindVisit.java | 7 ++-- .../java/org/tests/query/TestRowCount.java | 2 +- .../orderby/TestOrderByWithDistinct.java | 8 ++--- .../orderby/TestOrderByWithDistinctTake2.java | 4 +-- .../other/TestQueryConversationRowCount.java | 2 +- .../other/TestQueryRowCountWithMany.java | 2 +- 15 files changed, 49 insertions(+), 42 deletions(-) diff --git a/src/main/java/io/ebean/ExpressionList.java b/src/main/java/io/ebean/ExpressionList.java index d30ea9944..b3e3f8b6c 100644 --- a/src/main/java/io/ebean/ExpressionList.java +++ b/src/main/java/io/ebean/ExpressionList.java @@ -68,7 +68,7 @@ public interface ExpressionList { * optional asc and desc keywords representing ascending and descending order * respectively. */ - Query order(String orderByClause); + ExpressionList order(String orderByClause); /** * Return the OrderBy so that you can append an ascending or descending diff --git a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java index e4b5aadfd..fe8235202 100644 --- a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java +++ b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java @@ -340,8 +340,9 @@ public class DefaultExpressionList implements SpiExpressionList { } @Override - public Query order(String orderByClause) { - return query.order(orderByClause); + public ExpressionList order(String orderByClause) { + query.order(orderByClause); + return this; } @Override diff --git a/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java b/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java index 081cc9793..823c26c55 100644 --- a/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java +++ b/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java @@ -28,6 +28,7 @@ public class FilterExpressionList extends DefaultExpressionList { private int firstRow; private int maxRows; + private String orderByClause; public FilterExpressionList(FilterExprPath pathPrefix, FilterExpressionList original) { super(null, original.expr, null, original.getUnderlyingList()); @@ -123,21 +124,6 @@ public class FilterExpressionList extends DefaultExpressionList { throw new PersistenceException(notAllowedMessage); } - @Override - public OrderBy order() { - return rootQuery.order(); - } - - @Override - public Query order(String orderByClause) { - return rootQuery.order(orderByClause); - } - - @Override - public Query orderBy(String orderBy) { - return rootQuery.orderBy(orderBy); - } - @Override public Query query() { return rootQuery; @@ -153,6 +139,22 @@ public class FilterExpressionList extends DefaultExpressionList { return rootQuery.setMapKey(mapKey); } + @Override + public OrderBy order() { + return rootQuery.order(); + } + + @Override + public Query orderBy(String orderBy) { + return rootQuery.orderBy(orderBy); + } + + @Override + public ExpressionList order(String orderByClause) { + this.orderByClause = orderByClause; + return this; + } + @Override public ExpressionList setMaxRows(int maxRows) { this.maxRows = maxRows; @@ -183,6 +185,9 @@ public class FilterExpressionList extends DefaultExpressionList { if (maxRows > 0) { query.setMaxRows(maxRows); } + if (orderByClause != null) { + query.order(orderByClause); + } } } diff --git a/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java b/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java index 1126f04d6..bb1855037 100644 --- a/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java @@ -799,7 +799,7 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression } @Override - public Query order(String orderByClause) { + public ExpressionList order(String orderByClause) { return exprList.order(orderByClause); } diff --git a/src/test/java/org/tests/m2m/softdelete/TestM2MSoftDeleteExists.java b/src/test/java/org/tests/m2m/softdelete/TestM2MSoftDeleteExists.java index 3b70d92a6..2dbd07c90 100644 --- a/src/test/java/org/tests/m2m/softdelete/TestM2MSoftDeleteExists.java +++ b/src/test/java/org/tests/m2m/softdelete/TestM2MSoftDeleteExists.java @@ -23,7 +23,7 @@ public class TestM2MSoftDeleteExists extends BaseTestCase { Query query = Ebean.find(MsManyA.class) .where().isNotEmpty("manybs") - .order("aid"); + .order("aid").query(); List list = query.findList(); diff --git a/src/test/java/org/tests/query/TestManyWhereJoin.java b/src/test/java/org/tests/query/TestManyWhereJoin.java index a0f38d43a..1d1870663 100644 --- a/src/test/java/org/tests/query/TestManyWhereJoin.java +++ b/src/test/java/org/tests/query/TestManyWhereJoin.java @@ -89,7 +89,7 @@ public class TestManyWhereJoin extends BaseTestCase { Query query = Ebean.find(Order.class) .where().eq("details.product.id", productId) - .order("cretime asc"); + .order("cretime asc").query(); query.findList(); String sql = sqlOf(query, 3); @@ -123,7 +123,7 @@ public class TestManyWhereJoin extends BaseTestCase { Query query = Ebean.find(Order.class) //.fetch("details") .where().eq("details.product", product) - .order("cretime asc"); + .order("cretime asc").query(); query.findList(); String sql = sqlOf(query, 3); @@ -157,7 +157,7 @@ public class TestManyWhereJoin extends BaseTestCase { Query query = Ebean.find(Order.class) .fetch("details") .where().eq("details.product", product) - .order("cretime asc"); + .order("cretime asc").query(); query.findList(); String sql = sqlOf(query, 3); diff --git a/src/test/java/org/tests/query/TestQueryFilterMany.java b/src/test/java/org/tests/query/TestQueryFilterMany.java index 3e1e3cef0..3132c2381 100644 --- a/src/test/java/org/tests/query/TestQueryFilterMany.java +++ b/src/test/java/org/tests/query/TestQueryFilterMany.java @@ -116,7 +116,8 @@ public class TestQueryFilterMany extends BaseTestCase { final Query query = DB.find(Customer.class) .where().ieq("name", "Rob") // use expression + fluid style adding maxRows/firstRow to filterMany - .filterMany("orders", "status = ?", Order.Status.NEW).setMaxRows(100).setFirstRow(3) + .filterMany("orders", "status = ?", Order.Status.NEW) + .setMaxRows(100).setFirstRow(3).order("orderDate desc, id") .order().asc("id").setMaxRows(5); final List customers = query.findList(); @@ -129,8 +130,7 @@ public class TestQueryFilterMany extends BaseTestCase { if (isH2() || isPostgres()) { assertThat(sqlList.get(0)).doesNotContain("offset"); assertThat(sqlList.get(0)).contains(" limit 5"); - assertThat(sqlList.get(1)).contains(" offset 3"); - assertThat(sqlList.get(1)).contains(" limit 100"); + assertThat(sqlList.get(1)).contains(" order by t0.order_date desc, t0.id limit 100 offset 3"); } } diff --git a/src/test/java/org/tests/query/TestQueryFindEach.java b/src/test/java/org/tests/query/TestQueryFindEach.java index 8dbee220b..247b77d17 100644 --- a/src/test/java/org/tests/query/TestQueryFindEach.java +++ b/src/test/java/org/tests/query/TestQueryFindEach.java @@ -25,7 +25,7 @@ public class TestQueryFindEach extends BaseTestCase { = server.find(Customer.class) .setAutoTune(false) .fetch("contacts", new FetchConfig().query(2)).where().gt("id", 0).order("id") - .setMaxRows(2); + .setMaxRows(2).query(); final AtomicInteger counter = new AtomicInteger(0); @@ -49,7 +49,7 @@ public class TestQueryFindEach extends BaseTestCase { Query query = server.find(Customer.class).setAutoTune(false) .fetch("contacts", new FetchConfig().query(2)).where().gt("id", 0).order("id") - .setMaxRows(2); + .setMaxRows(2).query(); final AtomicInteger counter = new AtomicInteger(0); diff --git a/src/test/java/org/tests/query/TestQueryFindEachWhile.java b/src/test/java/org/tests/query/TestQueryFindEachWhile.java index e36580983..51b431dcd 100644 --- a/src/test/java/org/tests/query/TestQueryFindEachWhile.java +++ b/src/test/java/org/tests/query/TestQueryFindEachWhile.java @@ -25,7 +25,7 @@ public class TestQueryFindEachWhile extends BaseTestCase { = server.find(Customer.class) .setAutoTune(false) .fetch("contacts", new FetchConfig().query(2)).where().gt("id", 0).order("id") - .setMaxRows(2); + .setMaxRows(2).query(); final AtomicInteger counter = new AtomicInteger(0); @@ -50,7 +50,7 @@ public class TestQueryFindEachWhile extends BaseTestCase { Query query = server.find(Customer.class).setAutoTune(false) .fetch("contacts", new FetchConfig().query(2)).where().gt("id", 0).order("id") - .setMaxRows(2); + .setMaxRows(2).query(); final AtomicInteger counter = new AtomicInteger(0); diff --git a/src/test/java/org/tests/query/TestQueryFindVisit.java b/src/test/java/org/tests/query/TestQueryFindVisit.java index 20de64f10..151a358ea 100644 --- a/src/test/java/org/tests/query/TestQueryFindVisit.java +++ b/src/test/java/org/tests/query/TestQueryFindVisit.java @@ -22,8 +22,9 @@ public class TestQueryFindVisit extends BaseTestCase { EbeanServer server = Ebean.getServer(null); Query query = server.find(Customer.class).setAutoTune(false) - .fetch("contacts", new FetchConfig().query(2)).where().gt("id", 0).order("id") - .setMaxRows(2); + .fetch("contacts", new FetchConfig().query(2)).where().gt("id", 0) + .order("id") + .setMaxRows(2).query(); final AtomicInteger counter = new AtomicInteger(0); @@ -44,7 +45,7 @@ public class TestQueryFindVisit extends BaseTestCase { Query query = server.find(Customer.class).setAutoTune(false) .fetch("contacts", new FetchConfig().query(2)).where().gt("id", 0).order("id") - .setMaxRows(2); + .setMaxRows(2).query(); final AtomicInteger counter = new AtomicInteger(0); diff --git a/src/test/java/org/tests/query/TestRowCount.java b/src/test/java/org/tests/query/TestRowCount.java index ba27f2b5e..d0c058a38 100644 --- a/src/test/java/org/tests/query/TestRowCount.java +++ b/src/test/java/org/tests/query/TestRowCount.java @@ -25,7 +25,7 @@ public class TestRowCount extends BaseTestCase { .where() .gt("id", 1) .gt("details.id", 1) - .order("id desc"); + .order("id desc").query(); int rc = query.findCount(); diff --git a/src/test/java/org/tests/query/orderby/TestOrderByWithDistinct.java b/src/test/java/org/tests/query/orderby/TestOrderByWithDistinct.java index 36864865d..72a2bd691 100644 --- a/src/test/java/org/tests/query/orderby/TestOrderByWithDistinct.java +++ b/src/test/java/org/tests/query/orderby/TestOrderByWithDistinct.java @@ -31,7 +31,7 @@ public class TestOrderByWithDistinct extends BaseTestCase { .where() .eq("junk", "blah") .eq("name", "jim") - .order("id desc,path.that.does.not.exist,contacts.group.name asc"); + .order("id desc,path.that.does.not.exist,contacts.group.name asc").query(); Set unknownProperties = query.validate(); assertThat(unknownProperties).isNotEmpty(); @@ -49,7 +49,7 @@ public class TestOrderByWithDistinct extends BaseTestCase { Query query = Ebean.find(MUser.class) .where() .eq("roles", role) - .order("userName asc nulls first"); + .order("userName asc nulls first").query(); query.findList(); @@ -124,7 +124,7 @@ public class TestOrderByWithDistinct extends BaseTestCase { .fetch("userType", "name") .where() .eq("roles.roleName", "A") - .order("userType.name, userName"); + .order("userType.name, userName").query(); List list = query.findList(); // select distinct t0.userid c0, t0.user_name c1, t1.id c2, t1.name c3 @@ -158,7 +158,7 @@ public class TestOrderByWithDistinct extends BaseTestCase { .fetch("userType", "name") .where() .eq("roles.roleName", "A") - .order("userType.name"); + .order("userType.name").query(); list = query.findList(); Assert.assertEquals(1, list.size()); diff --git a/src/test/java/org/tests/query/orderby/TestOrderByWithDistinctTake2.java b/src/test/java/org/tests/query/orderby/TestOrderByWithDistinctTake2.java index 0f0123d0d..196001bab 100644 --- a/src/test/java/org/tests/query/orderby/TestOrderByWithDistinctTake2.java +++ b/src/test/java/org/tests/query/orderby/TestOrderByWithDistinctTake2.java @@ -27,7 +27,7 @@ public class TestOrderByWithDistinctTake2 extends BaseTestCase { Query query = Ebean.find(Customer.class) .select("id, name") .where().ilike("contacts.firstName", "R%") - .order("name desc"); + .order("name desc").query(); query.findList(); @@ -55,7 +55,7 @@ public class TestOrderByWithDistinctTake2 extends BaseTestCase { Query query = Ebean.find(Customer.class) .select("id") .where().ilike("contacts.firstName", "R%") - .order("name asc,id desc"); + .order("name asc,id desc").query(); query.findList(); diff --git a/src/test/java/org/tests/query/other/TestQueryConversationRowCount.java b/src/test/java/org/tests/query/other/TestQueryConversationRowCount.java index 05291d3d9..fa97b1de6 100644 --- a/src/test/java/org/tests/query/other/TestQueryConversationRowCount.java +++ b/src/test/java/org/tests/query/other/TestQueryConversationRowCount.java @@ -31,7 +31,7 @@ public class TestQueryConversationRowCount extends BaseTestCase { .endJunction() .eq("open", true) .endJunction() - .order("whenCreated desc"); + .order("whenCreated desc").query(); query.findList(); String generatedSql = sqlOf(query, 1); diff --git a/src/test/java/org/tests/query/other/TestQueryRowCountWithMany.java b/src/test/java/org/tests/query/other/TestQueryRowCountWithMany.java index 9d837d6b8..3895275eb 100644 --- a/src/test/java/org/tests/query/other/TestQueryRowCountWithMany.java +++ b/src/test/java/org/tests/query/other/TestQueryRowCountWithMany.java @@ -27,7 +27,7 @@ public class TestQueryRowCountWithMany extends BaseTestCase { Query query = Ebean.find(Order.class) .fetch("details") .where().eq("details.product.id", productId) - .order("cretime asc"); + .order("cretime asc").query(); List list = query.findList();