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 extends Serializable, ?> 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 extends Serializable> 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;