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 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;