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();