From 71f70c01aeb97f00d49073bde3f3dca146ce0f59 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Wed, 1 Jun 2016 16:03:30 +1200 Subject: [PATCH] #727 - ENH: Add endOr(), endAnd(), endNot() ... to ExpressionList as synonym for endJunction() --- .../java/com/avaje/ebean/ExpressionList.java | 33 ++++++++---- .../expression/DefaultExpressionList.java | 15 ++++++ .../server/expression/JunctionExpression.java | 14 +++++ .../query/TestExprNestedDisjunction.java | 52 +++++++++++++------ 4 files changed, 90 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/avaje/ebean/ExpressionList.java b/src/main/java/com/avaje/ebean/ExpressionList.java index 31cbfdc49..34f4c441a 100644 --- a/src/main/java/com/avaje/ebean/ExpressionList.java +++ b/src/main/java/com/avaje/ebean/ExpressionList.java @@ -925,7 +925,7 @@ public interface ExpressionList { * This is exactly the same as conjunction(); *

*

- * Use endJunction() to end the AND junction. + * Use endAnd() or endJunction() to end the AND junction. *

*

* Note that a where() clause defaults to an AND junction so @@ -943,11 +943,11 @@ public interface ExpressionList { * .and() // nested and * .startsWith("name", "r") * .eq("anniversary", onAfter) - * .endJunction() // end AND junction + * .endAnd() * .and() * .eq("status", Customer.Status.ACTIVE) * .gt("id", 0) - * .endJunction() // end AND junction + * .endAnd() * .orderBy().asc("name") * .findList(); * } @@ -959,7 +959,7 @@ public interface ExpressionList { * This is exactly the same as disjunction(); * *

- * Use endJunction() to end the OR junction. + * Use endOr() or endJunction() to end the OR junction. *

* *
{@code
@@ -973,11 +973,11 @@ public interface ExpressionList {
    *      .and()
    *        .startsWith("name", "r")
    *        .eq("anniversary", onAfter)
-   *        .endJunction() // end AND junction
+   *        .endAnd()
    *      .and()
    *        .eq("status", Customer.Status.ACTIVE)
    *        .gt("id", 0)
-   *        .endJunction() // end AND junction
+   *        .endAnd()
    *      .orderBy().asc("name")
    *      .findList();
    *
@@ -988,7 +988,7 @@ public interface ExpressionList {
   /**
    * Return a list of expressions that will be wrapped by NOT.
    * 

- * Use endJunction() to end expressions being added to the + * Use endNot() or endJunction() to end expressions being added to the * NOT expression list. *

* @@ -998,7 +998,7 @@ public interface ExpressionList { * .not() * .gt("id", 1) * .eq("anniversary", onAfter) - * .endJunction() // end the not expressions + * .endNot() * * }
* @@ -1012,7 +1012,7 @@ public interface ExpressionList { * .not() * .gt("id", 1) * .eq("anniversary", onAfter) - * .endJunction() // end the not expressions + * .endNot() * .orderBy() * .asc("name") * .findList(); @@ -1085,4 +1085,19 @@ public interface ExpressionList { */ ExpressionList endJunction(); + /** + * End a AND junction - synonym for endJunction(). + */ + ExpressionList endAnd(); + + /** + * End a AND junction - synonym for endJunction(). + */ + ExpressionList endOr(); + + /** + * End a NOT junction - synonym for endJunction(). + */ + ExpressionList endNot(); + } diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/DefaultExpressionList.java b/src/main/java/com/avaje/ebeaninternal/server/expression/DefaultExpressionList.java index d6fd82fa4..8417a3092 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/DefaultExpressionList.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/DefaultExpressionList.java @@ -925,6 +925,21 @@ public class DefaultExpressionList implements SpiExpressionList { return parentExprList == null ? this : parentExprList; } + @Override + public ExpressionList endAnd() { + return endJunction(); + } + + @Override + public ExpressionList endOr() { + return endJunction(); + } + + @Override + public ExpressionList endNot() { + return endJunction(); + } + @Override public Junction and() { return conjunction(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/JunctionExpression.java b/src/main/java/com/avaje/ebeaninternal/server/expression/JunctionExpression.java index b1541b3f8..47f1631f0 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/JunctionExpression.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/JunctionExpression.java @@ -776,4 +776,18 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression return exprList.endJunction(); } + @Override + public ExpressionList endAnd() { + return endJunction(); + } + + @Override + public ExpressionList endOr() { + return endJunction(); + } + + @Override + public ExpressionList endNot() { + return endJunction(); + } } diff --git a/src/test/java/com/avaje/tests/query/TestExprNestedDisjunction.java b/src/test/java/com/avaje/tests/query/TestExprNestedDisjunction.java index eea82841e..402879b28 100644 --- a/src/test/java/com/avaje/tests/query/TestExprNestedDisjunction.java +++ b/src/test/java/com/avaje/tests/query/TestExprNestedDisjunction.java @@ -1,13 +1,11 @@ package com.avaje.tests.query; -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.Customer; import com.avaje.tests.model.basic.ResetBasicData; +import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -20,16 +18,17 @@ public class TestExprNestedDisjunction extends BaseTestCase { java.sql.Date onAfter = java.sql.Date.valueOf("2009-08-31"); - Query q = Ebean.find(Customer.class).where().disjunction() - .conjunction().startsWith("name", "r").eq("anniversary", onAfter).endJunction() - .conjunction().eq("status", Customer.Status.ACTIVE).gt("id", 0).endJunction().orderBy() - .asc("name"); + Query q = Ebean.find(Customer.class).where() + .disjunction() + .conjunction().startsWith("name", "r").eq("anniversary", onAfter).endJunction() + .conjunction().eq("status", Customer.Status.ACTIVE).gt("id", 0).endJunction() + .orderBy().asc("name"); q.findList(); String s = q.getGeneratedSql(); - Assert.assertTrue(s.contains("(t0.name like ? ")); - Assert.assertTrue(s.contains(" and t0.anniversary = ? ) or (t0.status = ? and t0.id > ? )")); + assertThat(s).contains("(t0.name like ? "); + assertThat(s).contains(" and t0.anniversary = ? ) or (t0.status = ? and t0.id > ? )"); } @@ -44,16 +43,16 @@ public class TestExprNestedDisjunction extends BaseTestCase { .where() .or() .and() - .startsWith("name", "r").eq("anniversary", onAfter).endJunction() + .startsWith("name", "r").eq("anniversary", onAfter).endAnd() .and() - .eq("status", Customer.Status.ACTIVE).gt("id", 0).endJunction() + .eq("status", Customer.Status.ACTIVE).gt("id", 0).endAnd() .orderBy().asc("name"); q.findList(); String s = q.getGeneratedSql(); - Assert.assertTrue(s.contains("(t0.name like ? ")); - Assert.assertTrue(s.contains(" and t0.anniversary = ? ) or (t0.status = ? and t0.id > ? )")); + assertThat(s).contains("(t0.name like ? "); + assertThat(s).contains(" and t0.anniversary = ? ) or (t0.status = ? and t0.id > ? )"); } @Test @@ -68,7 +67,7 @@ public class TestExprNestedDisjunction extends BaseTestCase { .not() .gt("id", 1) .eq("anniversary", onAfter) - .endJunction() + .endNot() .orderBy().asc("name"); q.findList(); @@ -91,7 +90,30 @@ public class TestExprNestedDisjunction extends BaseTestCase { .not() .gt("id", 1) .eq("anniversary", onAfter) - //.endNot() + .orderBy().asc("name"); + + q.findList(); + String s = q.getGeneratedSql(); + + assertThat(s).contains("where (t0.status = ? or not (t0.id > ? and t0.anniversary = ? ) )"); + } + + @Test + public void test_not_nested_with_endNot() { + + ResetBasicData.reset(); + + java.sql.Date onAfter = java.sql.Date.valueOf("2009-08-31"); + + Query q = Ebean.find(Customer.class) + .where() + .or() + .eq("status", Customer.Status.ACTIVE) + .not() + .gt("id", 1) + .eq("anniversary", onAfter) + .endNot() + .endOr() .orderBy().asc("name"); q.findList();