From 4ac28a0666371adb63e19e3897d59be24c3a3e15 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 23 Jul 2021 07:01:32 +0200 Subject: [PATCH 1/2] Prepare issue branch. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1b887099..b0a1daf2 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-keyvalue - 2.6.0-SNAPSHOT + 2.6.0-GH-385-SNAPSHOT Spring Data KeyValue From 1001e15404b4f9e2844ae98092783bfa88d74975 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 23 Jul 2021 07:02:04 +0200 Subject: [PATCH 2/2] Add support for executing derived existsBy queries. Closes: #385 --- .../query/KeyValuePartTreeQuery.java | 2 ++ .../query/KeyValuePartTreeQueryUnitTests.java | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQuery.java b/src/main/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQuery.java index 78eac68c..97f07073 100644 --- a/src/main/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQuery.java +++ b/src/main/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQuery.java @@ -139,6 +139,8 @@ protected Object doExecute(Object[] parameters, KeyValueQuery query) { Iterable result = this.keyValueOperations.find(query, queryMethod.getEntityInformation().getJavaType()); return result.iterator().hasNext() ? result.iterator().next() : null; + } else if (new PartTree(queryMethod.getName(), queryMethod.getEntityInformation().getJavaType()).isExistsProjection()) { + return keyValueOperations.count(query, queryMethod.getEntityInformation().getJavaType()) > 0; } throw new UnsupportedOperationException("Query method not supported."); diff --git a/src/test/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQueryUnitTests.java b/src/test/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQueryUnitTests.java index 3987aea2..6b35c3f2 100644 --- a/src/test/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQueryUnitTests.java +++ b/src/test/java/org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQueryUnitTests.java @@ -137,10 +137,32 @@ void shouldApplyDerivedMaxResultsToQueryWithParameters() throws SecurityExceptio assertThat(query.getRows()).isEqualTo(3); } + @Test // GH-385 + void shouldUseCountForExists() throws NoSuchMethodException { + + when(metadataMock.getDomainType()).thenReturn((Class) Person.class); + when(metadataMock.getReturnType(any(Method.class))) + .thenReturn((TypeInformation) ClassTypeInformation.from(Boolean.class)); + when(metadataMock.getReturnedDomainClass(any(Method.class))).thenReturn((Class) Boolean.class); + + QueryMethod qm = new QueryMethod(Repo.class.getMethod("existsByFirstname", String.class), metadataMock, + projectionFactoryMock); + + KeyValuePartTreeQuery partTreeQuery = new KeyValuePartTreeQuery(qm, QueryMethodEvaluationContextProvider.DEFAULT, + kvOpsMock, SpelQueryCreator.class); + + KeyValueQuery query = partTreeQuery.prepareQuery(new Object[] { "firstname" }); + partTreeQuery.doExecute(new Object[] { "firstname" }, query); + + verify(kvOpsMock).count(eq(query), eq(Person.class)); + } + interface Repo { List findByFirstname(String firstname); + boolean existsByFirstname(String firstname); + List findBy(Pageable page); List findTop3By();