From 8c32f0ae6d6f0e6ca841643f35ad2100ad3c1e20 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 23 Jul 2021 07:02:04 +0200 Subject: [PATCH] Add support for executing derived existsBy queries. Closes: #385 Original pull request: #386. --- .../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 78eac68..97f0707 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 @@ public class KeyValuePartTreeQuery implements RepositoryQuery { 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 3987aea..6b35c3f 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 @@ class KeyValuePartTreeQueryUnitTests { 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();