From 95ec0c1eab565856ab5602a9ef05a4adfd6c96d8 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 20 Feb 2024 11:16:22 +0100 Subject: [PATCH] Enable `KeyValuePartTreeQuery` usage for projections. Closes #563 --- .../query/KeyValuePartTreeQuery.java | 8 +++--- .../query/KeyValuePartTreeQueryUnitTests.java | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) 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 8780ffa..bffef1b 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 @@ -134,15 +134,13 @@ public class KeyValuePartTreeQuery implements RepositoryQuery { } else if (queryMethod.isCollectionQuery()) { return this.keyValueOperations.find(query, queryMethod.getEntityInformation().getJavaType()); - } else if (queryMethod.isQueryForEntity()) { + } else if (partTree.get().isExistsProjection()) { + return keyValueOperations.exists(query, queryMethod.getEntityInformation().getJavaType()); + } else { Iterable result = this.keyValueOperations.find(query, queryMethod.getEntityInformation().getJavaType()); return result.iterator().hasNext() ? result.iterator().next() : null; - } else if (partTree.get().isExistsProjection()) { - return keyValueOperations.exists(query, queryMethod.getEntityInformation().getJavaType()); } - - throw new UnsupportedOperationException("Query method not supported"); } protected KeyValueQuery prepareQuery(Object[] parameters) { 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 0dcad51..b4f85d5 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 @@ -93,6 +93,27 @@ class KeyValuePartTreeQueryUnitTests { assertThat(query.getRows()).isEqualTo(3); } + @Test // GH-563 + @SuppressWarnings({ "unchecked", "rawtypes" }) + void shouldAllowProjectionQueries() throws SecurityException, NoSuchMethodException { + + when(metadataMock.getDomainType()).thenReturn((Class) Person.class); + when(metadataMock.getDomainTypeInformation()).thenReturn((TypeInformation) TypeInformation.of(Person.class)); + when(metadataMock.getReturnType(any(Method.class))).thenReturn((TypeInformation) TypeInformation.of(List.class)); + when(metadataMock.getReturnedDomainClass(any(Method.class))).thenReturn((Class) Person.class); + + QueryMethod qm = new QueryMethod(Repo.class.getMethod("findProjectionByFirstname",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).find(eq(query), eq(Person.class)); + } + @Test // DATAKV-142 @SuppressWarnings({ "unchecked", "rawtypes" }) void shouldApplyDerivedMaxResultsToQuery() throws SecurityException, NoSuchMethodException { @@ -166,5 +187,11 @@ class KeyValuePartTreeQueryUnitTests { List findTop3By(); List findTop3ByFirstname(String firstname); + + PersonProjection findProjectionByFirstname(String firstname); + } + + interface PersonProjection { + String getFirstname(); } }