diff --git a/store/iavlstore.go b/store/iavlstore.go index e63585a16b..87b0863884 100644 --- a/store/iavlstore.go +++ b/store/iavlstore.go @@ -119,6 +119,13 @@ func (st *iavlStore) Iterator(start, end []byte) Iterator { return newIAVLIterator(st.tree.Tree(), start, end, true) } +func (st *iavlStore) Subspace(prefix []byte) Iterator { + end := make([]byte, len(prefix)) + copy(end, prefix) + end[len(end)-1]++ + return st.Iterator(prefix, end) +} + // Implements IterKVStore. func (st *iavlStore) ReverseIterator(start, end []byte) Iterator { return newIAVLIterator(st.tree.Tree(), start, end, false) diff --git a/store/iavlstore_test.go b/store/iavlstore_test.go index c426e4d8a8..7adae625ea 100644 --- a/store/iavlstore_test.go +++ b/store/iavlstore_test.go @@ -82,6 +82,26 @@ func TestIAVLIterator(t *testing.T) { } } +func TestIAVLSubspace(t *testing.T) { + db := dbm.NewMemDB() + tree, _ := newTree(t, db) + iavlStore := newIAVLStore(tree, numHistory) + + iavlStore.Set([]byte("test1"), []byte("test1")) + iavlStore.Set([]byte("test2"), []byte("test2")) + iavlStore.Set([]byte("test3"), []byte("test3")) + + iter := iavlStore.Subspace([]byte("test")) + expected := []string{"test1", "test2", "test3"} + for i := 0; iter.Valid(); iter.Next() { + expectedKey := expected[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, expectedKey) + i += 1 + } +} + func TestIAVLStoreQuery(t *testing.T) { db := dbm.NewMemDB() tree := iavl.NewVersionedTree(db, cacheSize)