From ad5d2268ec14434a5bbdc78a89d30682a645fb5c Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 11 Mar 2021 15:12:29 +0100 Subject: [PATCH] =?UTF-8?q?Accept=20target=20type=20in=20KeyValueAdapter.e?= =?UTF-8?q?ntries(=E2=80=A6)=20and=20getAllOf(=E2=80=A6).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now accept the target type in both methods to retain type hints so that the underlying adapter implementation can use this type when materializing object instances. Original Pull Request: #356 --- .../data/keyvalue/core/KeyValueAdapter.java | 30 ++++++++++++++++++- .../data/keyvalue/core/KeyValueTemplate.java | 2 +- .../core/KeyValueTemplateUnitTests.java | 4 +-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/data/keyvalue/core/KeyValueAdapter.java b/src/main/java/org/springframework/data/keyvalue/core/KeyValueAdapter.java index 1e7bf14..3cbbe9d 100644 --- a/src/main/java/org/springframework/data/keyvalue/core/KeyValueAdapter.java +++ b/src/main/java/org/springframework/data/keyvalue/core/KeyValueAdapter.java @@ -102,6 +102,19 @@ public interface KeyValueAdapter extends DisposableBean { */ Iterable getAllOf(String keyspace); + /** + * Get all elements for given keyspace. + * + * @param type must not be {@literal null}. + * @param keyspace must not be {@literal null}. + * @return empty {@link Collection} if nothing found. + * @since 2.5 + */ + @SuppressWarnings("unchecked") + default Iterable getAllOf(String keyspace, Class type) { + return (Iterable) getAllOf(keyspace); + } + /** * Returns a {@link CloseableIterator} that iterates over all entries. * @@ -110,6 +123,19 @@ public interface KeyValueAdapter extends DisposableBean { */ CloseableIterator> entries(String keyspace); + /** + * Returns a {@link CloseableIterator} that iterates over all entries. + * + * @param type must not be {@literal null}. + * @param keyspace must not be {@literal null}. + * @return + * @since 2.5 + */ + @SuppressWarnings("unchecked") + default CloseableIterator> entries(String keyspace, Class type) { + return (CloseableIterator) entries(keyspace); + } + /** * Remove all objects of given type. * @@ -129,7 +155,9 @@ public interface KeyValueAdapter extends DisposableBean { * @param keyspace must not be {@literal null}. * @return empty {@link Collection} if no match found. */ - Iterable find(KeyValueQuery query, String keyspace); + default Iterable find(KeyValueQuery query, String keyspace) { + return find(query, keyspace, Object.class); + } /** * @param query must not be {@literal null}. diff --git a/src/main/java/org/springframework/data/keyvalue/core/KeyValueTemplate.java b/src/main/java/org/springframework/data/keyvalue/core/KeyValueTemplate.java index 28517b7..bfef5cd 100644 --- a/src/main/java/org/springframework/data/keyvalue/core/KeyValueTemplate.java +++ b/src/main/java/org/springframework/data/keyvalue/core/KeyValueTemplate.java @@ -237,7 +237,7 @@ public class KeyValueTemplate implements KeyValueOperations, ApplicationEventPub return executeRequired(adapter -> { - Iterable values = adapter.getAllOf(resolveKeySpace(type)); + Iterable values = adapter.getAllOf(resolveKeySpace(type), type); ArrayList filtered = new ArrayList<>(); for (Object candidate : values) { diff --git a/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateUnitTests.java b/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateUnitTests.java index d3dc44c..fe030ed 100644 --- a/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateUnitTests.java +++ b/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateUnitTests.java @@ -190,7 +190,7 @@ class KeyValueTemplateUnitTests { template.findAll(Foo.class); - verify(adapterMock, times(1)).getAllOf(Foo.class.getName()); + verify(adapterMock, times(1)).getAllOf(Foo.class.getName(), Foo.class); } @Test // DATACMNS-525 @@ -327,7 +327,7 @@ class KeyValueTemplateUnitTests { void findAllOfShouldRespectTypeAliasAndFilterNonMatchingTypes() { Collection foo = Arrays.asList(ALIASED_USING_ALIAS_FOR, SUBCLASS_OF_ALIASED_USING_ALIAS_FOR); - when(adapterMock.getAllOf("aliased")).thenReturn(foo); + when(adapterMock.getAllOf("aliased", SUBCLASS_OF_ALIASED_USING_ALIAS_FOR.getClass())).thenReturn(foo); assertThat((Iterable) template.findAll(SUBCLASS_OF_ALIASED_USING_ALIAS_FOR.getClass())) .contains(SUBCLASS_OF_ALIASED_USING_ALIAS_FOR);