From 6cea815908786f4f508de2856902de5392110406 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 12 May 2015 13:23:45 +0200 Subject: [PATCH 1/2] DATAKV-102 - Add possibility to iterate over available keys. Prepare issue branch. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2917aeb0..716a32c8 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-keyvalue - 0.1.0.BUILD-SNAPSHOT + 0.1.0.DATAKV-102-SNAPSHOT Spring Data KeyValue From f8e01a293de0dde14c8d0b2b5461a792cb08493a Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 12 May 2015 13:37:11 +0200 Subject: [PATCH 2/2] DATAKV-102 - Add possibility to iterate over available keys. Adapter now exposes keys(Serializable keyspace) which allows to retrieve all keys contained in that specific region. Fixed false test names (scan vs. entries (see DATAKV-99)) along the way. --- .../data/keyvalue/core/KeyValueAdapter.java | 12 +++++- .../data/map/MapKeyValueAdapter.java | 10 ++++- .../data/map/MapKeyValueAdapterUnitTests.java | 43 +++++++++++++++++-- 3 files changed, 59 insertions(+), 6 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 14a0477a..c347cb04 100644 --- a/src/main/java/org/springframework/data/keyvalue/core/KeyValueAdapter.java +++ b/src/main/java/org/springframework/data/keyvalue/core/KeyValueAdapter.java @@ -74,13 +74,21 @@ public interface KeyValueAdapter extends DisposableBean { Iterable getAllOf(Serializable keyspace); /** - * Returns a {@link KeyValueIterator} that iterates over all entries. + * Returns a {@link KeyValueIterator} that iterates over all entries. * - * @param keyspace + * @param keyspace must not be {@literal null}. * @return */ KeyValueIterator entries(Serializable keyspace); + /** + * Returns all keys available in {@literal keyspace}. + * + * @param keyspace must not be {@literal null}. + * @return empty {@link Iterable} if no keys available or keyspace unknown. + */ + Iterable keys(Serializable keyspace); + /** * Remove all objects of given type. * diff --git a/src/main/java/org/springframework/data/map/MapKeyValueAdapter.java b/src/main/java/org/springframework/data/map/MapKeyValueAdapter.java index 4c0acc85..4bf08c88 100644 --- a/src/main/java/org/springframework/data/map/MapKeyValueAdapter.java +++ b/src/main/java/org/springframework/data/map/MapKeyValueAdapter.java @@ -104,7 +104,6 @@ public boolean contains(Serializable id, Serializable keyspace) { return get(id, keyspace) != null; } - /* (non-Javadoc) * @see org.springframework.data.keyvalue.core.KeyValueAdapter#count(java.io.Serializable) */ @@ -153,6 +152,15 @@ public Collection getAllOf(Serializable keyspace) { return new ForwardingKeyValueIterator(getKeySpaceMap(keyspace).entrySet().iterator()); } + /* + * (non-Javadoc) + * @see org.springframework.data.keyvalue.core.KeyValueAdapter#keys(java.io.Serializable) + */ + @Override + public Iterable keys(Serializable keyspace) { + return getKeySpaceMap(keyspace).keySet(); + } + /* * (non-Javadoc) * @see org.springframework.data.keyvalue.core.KeyValueAdapter#deleteAllOf(java.io.Serializable) diff --git a/src/test/java/org/springframework/data/map/MapKeyValueAdapterUnitTests.java b/src/test/java/org/springframework/data/map/MapKeyValueAdapterUnitTests.java index e36d640e..1a89288e 100644 --- a/src/test/java/org/springframework/data/map/MapKeyValueAdapterUnitTests.java +++ b/src/test/java/org/springframework/data/map/MapKeyValueAdapterUnitTests.java @@ -15,6 +15,7 @@ */ package org.springframework.data.map; +import static org.hamcrest.collection.IsEmptyIterable.*; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.*; import static org.hamcrest.core.Is.*; import static org.hamcrest.core.IsEqual.*; @@ -24,6 +25,8 @@ import java.io.Serializable; +import org.hamcrest.collection.IsIterableContainingInAnyOrder; +import org.hamcrest.collection.IsIterableWithSize; import org.junit.Before; import org.junit.Test; import org.springframework.data.keyvalue.core.KeyValueIterator; @@ -193,7 +196,7 @@ public void deleteShouldReturnDeletedObject() { * @see DATAKV-99 */ @Test - public void scanShouldIterateOverAvailableEntries() { + public void entriesShouldIterateOverAvailableEntries() { adapter.put("1", object1, COLLECTION_1); adapter.put("2", object2, COLLECTION_1); @@ -209,7 +212,7 @@ public void scanShouldIterateOverAvailableEntries() { * @see DATAKV-99 */ @Test - public void scanShouldReturnEmptyIteratorWhenNoElementsAvailable() { + public void entriesShouldReturnEmptyIteratorWhenNoElementsAvailable() { assertThat(adapter.entries(COLLECTION_1).hasNext(), is(false)); } @@ -217,7 +220,7 @@ public void scanShouldReturnEmptyIteratorWhenNoElementsAvailable() { * @see DATAKV-99 */ @Test - public void scanDoesNotMixResultsFromMultipleKeyspaces() { + public void entriesShouldNotMixResultsFromMultipleKeyspaces() { adapter.put("1", object1, COLLECTION_1); adapter.put("2", object2, COLLECTION_2); @@ -228,6 +231,40 @@ public void scanDoesNotMixResultsFromMultipleKeyspaces() { assertThat(iterator.hasNext(), is(false)); } + /** + * @see DATAKV-102 + */ + @Test + public void keysShouldReturnAvailableKeys() { + + adapter.put("1", object1, COLLECTION_1); + adapter.put("2", object2, COLLECTION_1); + + Iterable iterable = adapter.keys(COLLECTION_1); + + assertThat(iterable, IsIterableContainingInAnyOrder. containsInAnyOrder("1", "2")); + } + + /** + * @see DATAKV-102 + */ + @Test + public void keyShouldReturnEmptyIterableWhenNoElementsAvailable() { + assertThat(adapter.keys(COLLECTION_1), emptyIterable()); + } + + /** + * @see DATAKV-102 + */ + @Test + public void keysShouldNotMixResultsFromMultipleKeyspaces() { + + adapter.put("1", object1, COLLECTION_1); + adapter.put("2", object2, COLLECTION_2); + + assertThat(adapter.keys(COLLECTION_1), IsIterableWithSize. iterableWithSize(1)); + } + static class SimpleObject { protected String stringValue;