From 760f09a0595bc29d52ff38f7eaac6075b36ca4f1 Mon Sep 17 00:00:00 2001 From: Michael Cramer Date: Fri, 10 Mar 2017 16:54:47 +0100 Subject: [PATCH] DATACMNS-1007 - Added IsEmpty and IsNotEmpty keywords to query parser. The query derivation mechanism now detects IsEmpty and NotIsEmpty as keywords and exposes them in the PartTree. Original pull request: #203. --- .../repository-query-keywords-reference.adoc | 2 ++ .../data/repository/query/parser/Part.java | 9 ++++++--- .../repository/query/parser/PartTreeUnitTests.java | 12 ++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/asciidoc/repository-query-keywords-reference.adoc b/src/main/asciidoc/repository-query-keywords-reference.adoc index 0e16bd572..8d1ffef53 100644 --- a/src/main/asciidoc/repository-query-keywords-reference.adoc +++ b/src/main/asciidoc/repository-query-keywords-reference.adoc @@ -22,6 +22,8 @@ The following table lists the keywords generally supported by the Spring Data re |`GREATER_THAN_EQUALS`|`GreaterThanEqual`, `IsGreaterThanEqual` |`IN`|`In`, `IsIn` |`IS`|`Is`, `Equals`, (or no keyword) +|`IS_EMPTY`|`IsEmpty`, `Empty` +|`IS_NOT_EMPTY`|`IsNotEmpty`, `NotEmpty` |`IS_NOT_NULL`|`NotNull`, `IsNotNull` |`IS_NULL`|`Null`, `IsNull` |`LESS_THAN`|`LessThan`, `IsLessThan` diff --git a/src/main/java/org/springframework/data/repository/query/parser/Part.java b/src/main/java/org/springframework/data/repository/query/parser/Part.java index f90b468fb..3127aacdb 100644 --- a/src/main/java/org/springframework/data/repository/query/parser/Part.java +++ b/src/main/java/org/springframework/data/repository/query/parser/Part.java @@ -34,6 +34,7 @@ import org.springframework.util.StringUtils; * * @author Oliver Gierke * @author Martin Baumgartner + * @author Michael Cramer */ public class Part { @@ -188,13 +189,15 @@ public class Part { "IsNotContaining", "NotContaining", "NotContains"), CONTAINING("IsContaining", "Containing", "Contains"), NOT_IN( "IsNotIn", "NotIn"), IN("IsIn", "In"), NEAR("IsNear", "Near"), WITHIN("IsWithin", "Within"), REGEX( "MatchesRegex", "Matches", "Regex"), EXISTS(0, "Exists"), TRUE(0, "IsTrue", "True"), FALSE(0, "IsFalse", - "False"), NEGATING_SIMPLE_PROPERTY("IsNot", "Not"), SIMPLE_PROPERTY("Is", "Equals"); + "False"), NEGATING_SIMPLE_PROPERTY("IsNot", "Not"), SIMPLE_PROPERTY("Is", "Equals"), IS_NOT_EMPTY(0, "IsNotEmpty", + "NotEmpty"), IS_EMPTY(0, "IsEmpty", "Empty"); // Need to list them again explicitly as the order is important // (esp. for IS_NULL, IS_NOT_NULL) private static final List ALL = Arrays.asList(IS_NOT_NULL, IS_NULL, BETWEEN, LESS_THAN, LESS_THAN_EQUAL, - GREATER_THAN, GREATER_THAN_EQUAL, BEFORE, AFTER, NOT_LIKE, LIKE, STARTING_WITH, ENDING_WITH, NOT_CONTAINING, - CONTAINING, NOT_IN, IN, NEAR, WITHIN, REGEX, EXISTS, TRUE, FALSE, NEGATING_SIMPLE_PROPERTY, SIMPLE_PROPERTY); + GREATER_THAN, GREATER_THAN_EQUAL, BEFORE, AFTER, NOT_LIKE, LIKE, STARTING_WITH, ENDING_WITH, IS_NOT_EMPTY, + IS_EMPTY, NOT_CONTAINING, CONTAINING, NOT_IN, IN, NEAR, WITHIN, REGEX, EXISTS, TRUE, FALSE, + NEGATING_SIMPLE_PROPERTY, SIMPLE_PROPERTY); public static final Collection ALL_KEYWORDS; diff --git a/src/test/java/org/springframework/data/repository/query/parser/PartTreeUnitTests.java b/src/test/java/org/springframework/data/repository/query/parser/PartTreeUnitTests.java index 8e3454270..d374ebfd9 100644 --- a/src/test/java/org/springframework/data/repository/query/parser/PartTreeUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/parser/PartTreeUnitTests.java @@ -45,6 +45,7 @@ import org.springframework.data.repository.query.parser.PartTree.OrPart; * @author Martin Baumgartner * @author Christoph Strobl * @author Mark Paluch + * @author Michael Cramer */ public class PartTreeUnitTests { @@ -221,6 +222,16 @@ public class PartTreeUnitTests { assertThat(parts, is(hasSize(1))); } + @Test // DATACMNS-1007 + public void parsesEmptyKeywordCorrectly() { + assertType(asList("friendsIsEmpty", "friendsEmpty"), IS_EMPTY, "friends", 0, false); + } + + @Test // DATACMNS-1007 + public void parsesNotEmptyKeywordCorrectly() { + assertType(asList("friendsIsNotEmpty", "friendsNotEmpty"), IS_NOT_EMPTY, "friends", 0, false); + } + @Test // DATACMNS-94 public void parsesExistsKeywordCorrectly() { assertType(asList("lastnameExists"), EXISTS, "lastname", 0, false); @@ -651,6 +662,7 @@ public class PartTreeUnitTests { double[] location; boolean active; Date birthday; + List friends; } class Organization {