From 768d0a8a6745d62180fc95000227d3650ba384db Mon Sep 17 00:00:00 2001 From: Tom Van Wemmel Date: Tue, 12 Nov 2024 12:46:52 +0100 Subject: [PATCH] Add query derivation support for `NOT_IN`, `NOT_LIKE` and `NEGATING_SIMPLE_PROPERTY` predicates. Closes #603 Original pull request: #604 --- .../query/PredicateQueryCreator.java | 7 ++ .../repository/query/SpelQueryCreator.java | 18 ++++- .../query/AbstractQueryCreatorTestBase.java | 78 +++++++++++++++++++ 3 files changed, 101 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/keyvalue/repository/query/PredicateQueryCreator.java b/src/main/java/org/springframework/data/keyvalue/repository/query/PredicateQueryCreator.java index 1be00e9..81f3ef9 100644 --- a/src/main/java/org/springframework/data/keyvalue/repository/query/PredicateQueryCreator.java +++ b/src/main/java/org/springframework/data/keyvalue/repository/query/PredicateQueryCreator.java @@ -41,6 +41,7 @@ import org.springframework.util.ObjectUtils; * {@link AbstractQueryCreator} to create {@link Predicate}-based {@link KeyValueQuery}s. * * @author Christoph Strobl + * @author Tom Van Wemmel * @since 3.3 */ public class PredicateQueryCreator extends AbstractQueryCreator>, Predicate> { @@ -61,12 +62,16 @@ public class PredicateQueryCreator extends AbstractQueryCreator, String> { @@ -120,6 +121,9 @@ public class SpelQueryCreator extends AbstractQueryCreator, ?>, CRITERIA> { @@ -70,6 +71,17 @@ public abstract class AbstractQueryCreatorTestBase list = new ArrayList<>(); + list.add(ROBB.firstname); + + assertThat(evaluate("findByFirstnameNotIn", list).against(JON)).isTrue(); + } + + @Test // GH-603 + void notInNotMatchingReturnsCorrectly() { + + ArrayList list = new ArrayList<>(); + list.add(ROBB.firstname); + + assertThat(evaluate("findByFirstnameNotIn", list).against(ROBB)).isFalse(); + } + + @Test // GH-603 + void notInWithNullCompareValuesCorrectly() { + + ArrayList list = new ArrayList<>(); + list.add(null); + + assertThat(evaluate("findByFirstnameNotIn", list).against(JON)).isTrue(); + } + + @Test // GH-603 + void notInWithNullSourceValuesMatchesCorrectly() { + + ArrayList list = new ArrayList<>(); + list.add(ROBB.firstname); + + assertThat(evaluate("findByFirstnameNotIn", list).against(new PredicateQueryCreatorUnitTests.Person(null, 10))) + .isTrue(); + } + + @Test // GH-603 + void notInMatchesNullValuesCorrectly() { + + ArrayList list = new ArrayList<>(); + list.add(null); + + assertThat(evaluate("findByFirstnameNotIn", list).against(new PredicateQueryCreatorUnitTests.Person(null, 10))) + .isFalse(); + } + @Test // DATAKV-185 void noDerivedQueryArgumentsMatchesAlways() { @@ -363,6 +432,9 @@ public abstract class AbstractQueryCreatorTestBase in); + // Type.NOT_IN + Person findByFirstnameNotIn(ArrayList in); + } public interface Evaluation {