From 192a946cf63e151082cb12483dfc30f53afe98d2 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Mon, 11 Feb 2019 22:59:47 +1300 Subject: [PATCH] #1634 ENH: Add convenience expressions "equal to or null" eqOrNull() --- src/main/java/io/ebean/ExpressionFactory.java | 5 +++++ src/main/java/io/ebean/ExpressionList.java | 5 +++++ .../expression/DefaultExpressionFactory.java | 5 +++++ .../server/expression/DefaultExpressionList.java | 6 ++++++ .../server/expression/JunctionExpression.java | 5 +++++ .../org/tests/basic/TestQueryWhereInRange.java | 16 ++++++++++++++++ 6 files changed, 42 insertions(+) diff --git a/src/main/java/io/ebean/ExpressionFactory.java b/src/main/java/io/ebean/ExpressionFactory.java index 873d82dd1..c37ef6e78 100644 --- a/src/main/java/io/ebean/ExpressionFactory.java +++ b/src/main/java/io/ebean/ExpressionFactory.java @@ -122,6 +122,11 @@ public interface ExpressionFactory { */ Expression eq(String propertyName, Object value); + /** + * Equal To or Null - property equal to the given value or null. + */ + Expression eqOrNull(String propertyName, Object value); + /** * Not Equal To - property not equal to the given value. */ diff --git a/src/main/java/io/ebean/ExpressionList.java b/src/main/java/io/ebean/ExpressionList.java index 9759a9028..94d6b3f1d 100644 --- a/src/main/java/io/ebean/ExpressionList.java +++ b/src/main/java/io/ebean/ExpressionList.java @@ -785,6 +785,11 @@ public interface ExpressionList { */ ExpressionList eq(String propertyName, Object value); + /** + * Equal To or Null - property is equal to a given value or null. + */ + ExpressionList eqOrNull(String propertyName, Object value); + /** * Not Equal To - property not equal to the given value. */ diff --git a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionFactory.java b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionFactory.java index e952b63d4..968cc881e 100644 --- a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionFactory.java +++ b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionFactory.java @@ -162,6 +162,11 @@ public class DefaultExpressionFactory implements SpiExpressionFactory { return new SimpleExpression(propertyName, Op.EQ, value); } + @Override + public Expression eqOrNull(String propertyName, Object value) { + return or(eq(propertyName, value), isNull(propertyName)); + } + /** * Not Equal To - property not equal to the given value. */ diff --git a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java index e0b6215d7..1c57f28ab 100644 --- a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java +++ b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java @@ -764,6 +764,12 @@ public class DefaultExpressionList implements SpiExpressionList { return this; } + @Override + public ExpressionList eqOrNull(String propertyName, Object value) { + add(expr.eqOrNull(propertyName, value)); + return this; + } + @Override public ExpressionList ieq(String propertyName, String value) { add(expr.ieq(propertyName, value)); diff --git a/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java b/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java index dc251f07c..59d00dfe7 100644 --- a/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java @@ -315,6 +315,11 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression return exprList.eq(propertyName, value); } + @Override + public ExpressionList eqOrNull(String propertyName, Object value) { + return exprList.eqOrNull(propertyName, value); + } + @Override public ExpressionList exampleLike(Object example) { return exprList.exampleLike(example); diff --git a/src/test/java/org/tests/basic/TestQueryWhereInRange.java b/src/test/java/org/tests/basic/TestQueryWhereInRange.java index e32831496..30f89eddc 100644 --- a/src/test/java/org/tests/basic/TestQueryWhereInRange.java +++ b/src/test/java/org/tests/basic/TestQueryWhereInRange.java @@ -30,6 +30,22 @@ public class TestQueryWhereInRange extends BaseTestCase { assertThat(sqlOf(query)).contains("where (t0.order_date >= ? and t0.order_date < ?) and "); } + @Test + public void eqOrNull() { + + ResetBasicData.reset(); + + LocalDate today = LocalDate.now(); + + Query query = DB.find(Order.class) + .where().eqOrNull("orderDate", today) + .query(); + + query.findList(); + + assertThat(query.getGeneratedSql()).contains("where (t0.order_date = ? or t0.order_date is null)"); + } + @Test public void gtOrNull() {