diff --git a/examples/RocksDb.Extensions.Examples.AspNetCore/UsersController.cs b/examples/RocksDb.Extensions.Examples.AspNetCore/UsersController.cs index 05b5ca5..5e0b4f7 100644 --- a/examples/RocksDb.Extensions.Examples.AspNetCore/UsersController.cs +++ b/examples/RocksDb.Extensions.Examples.AspNetCore/UsersController.cs @@ -25,7 +25,7 @@ public IActionResult Post([FromBody] User user) [HttpGet] public IEnumerable Get() { - return _usersStore.GetAll(); + return _usersStore.GetAllValues(); } [HttpDelete] diff --git a/src/RocksDb.Extensions/IRocksDbAccessor.cs b/src/RocksDb.Extensions/IRocksDbAccessor.cs index c3ddc88..e3c0b3f 100644 --- a/src/RocksDb.Extensions/IRocksDbAccessor.cs +++ b/src/RocksDb.Extensions/IRocksDbAccessor.cs @@ -18,7 +18,8 @@ public interface IRocksDbAccessor void PutRange(ReadOnlySpan keys, ReadOnlySpan values); void PutRange(ReadOnlySpan values, Func keySelector); void PutRange(IReadOnlyList<(TKey key, TValue value)> items); - IEnumerable GetAll(); + IEnumerable GetAllValues(); + IEnumerable GetAllKeys(); bool HasKey(TKey key); void Clear(); int Count(); diff --git a/src/RocksDb.Extensions/IRocksDbStore.cs b/src/RocksDb.Extensions/IRocksDbStore.cs index cc8df45..c39f6b9 100644 --- a/src/RocksDb.Extensions/IRocksDbStore.cs +++ b/src/RocksDb.Extensions/IRocksDbStore.cs @@ -62,7 +62,14 @@ public abstract class RocksDbStore /// Gets all the values in the store. /// /// An enumerable collection of all the values in the store. - public IEnumerable GetAll() => _rocksDbAccessor.GetAll(); + public IEnumerable GetAllValues() => _rocksDbAccessor.GetAllValues(); + + /// + /// Gets all the values in the store. (Obsolete, use GetAllValues instead) + /// + /// An enumerable collection of all the values in the store. + [Obsolete("Use GetAllValues() instead.")] + public IEnumerable GetAll() => GetAllValues(); /// /// Determines whether the store contains a value for a specific key. @@ -94,4 +101,10 @@ public abstract class RocksDbStore /// /// The total count of items in the store. public int Count() => _rocksDbAccessor.Count(); + + /// + /// Gets all the keys in the store. + /// + /// An enumerable collection of all the keys in the store. + public IEnumerable GetAllKeys() => _rocksDbAccessor.GetAllKeys(); } diff --git a/src/RocksDb.Extensions/RocksDbAccessor.cs b/src/RocksDb.Extensions/RocksDbAccessor.cs index 02c4199..8ad8fe5 100644 --- a/src/RocksDb.Extensions/RocksDbAccessor.cs +++ b/src/RocksDb.Extensions/RocksDbAccessor.cs @@ -184,7 +184,7 @@ public bool TryGet(TKey key, [MaybeNullWhen(false)] out TValue value) } } - public TValue Deserialize(ReadOnlySpan buffer) + TValue ISpanDeserializer.Deserialize(ReadOnlySpan buffer) { return _valueSerializer.Deserialize(buffer); } @@ -298,8 +298,19 @@ private void AddToBatch(TKey key, TValue value, WriteBatch batch) } } } + + public IEnumerable GetAllKeys() + { + using var iterator = _rocksDbContext.Db.NewIterator(_columnFamily.Handle); + _ = iterator.SeekToFirst(); + while (iterator.Valid()) + { + yield return _keySerializer.Deserialize(iterator.Key()); + _ = iterator.Next(); + } + } - public IEnumerable GetAll() + public IEnumerable GetAllValues() { using var iterator = _rocksDbContext.Db.NewIterator(_columnFamily.Handle); _ = iterator.SeekToFirst(); diff --git a/test/RocksDb.Extensions.Tests/RocksDbStoreWithProtoBufNetSerializerTests.cs b/test/RocksDb.Extensions.Tests/RocksDbStoreWithProtoBufNetSerializerTests.cs index 3196a8d..09c5f82 100644 --- a/test/RocksDb.Extensions.Tests/RocksDbStoreWithProtoBufNetSerializerTests.cs +++ b/test/RocksDb.Extensions.Tests/RocksDbStoreWithProtoBufNetSerializerTests.cs @@ -140,6 +140,52 @@ public void should_put_and_retrieve_data_with_lists_from_store() value.ShouldBeEquivalentTo(cacheValue); } + [Test] + public void should_return_all_keys_from_store() + { + // Arrange + using var testFixture = CreateTestFixture(); + var store = testFixture.GetStore>(); + var cacheKeys = Enumerable.Range(0, 10) + .Select(x => new ProtoNetCacheKey { Id = x }) + .ToArray(); + var cacheValues = cacheKeys.Select(k => new ProtoNetCacheValue { Id = k.Id, Value = $"value-{k.Id}" }).ToArray(); + store.PutRange(cacheKeys, cacheValues); + + // Act + var keysFromStore = store.GetAllKeys().ToList(); + + // Assert + keysFromStore.Count.ShouldBe(cacheKeys.Length); + foreach (var key in cacheKeys) + { + keysFromStore.ShouldContain(k => k.Id == key.Id); + } + } + + [Test] + public void should_return_all_values_from_store() + { + // Arrange + using var testFixture = CreateTestFixture(); + var store = testFixture.GetStore>(); + var cacheKeys = Enumerable.Range(0, 10) + .Select(x => new ProtoNetCacheKey { Id = x }) + .ToArray(); + var cacheValues = cacheKeys.Select(k => new ProtoNetCacheValue { Id = k.Id, Value = $"value-{k.Id}" }).ToArray(); + store.PutRange(cacheKeys, cacheValues); + + // Act + var valuesFromStore = store.GetAllValues().ToList(); + + // Assert + valuesFromStore.Count.ShouldBe(cacheValues.Length); + foreach (var value in cacheValues) + { + valuesFromStore.ShouldContain(v => v.Id == value.Id && v.Value == value.Value); + } + } + private static TestFixture CreateTestFixture() { var testFixture = TestFixture.Create(rockDb => diff --git a/test/RocksDb.Extensions.Tests/RocksDbStoreWithProtobufSerializerTests.cs b/test/RocksDb.Extensions.Tests/RocksDbStoreWithProtobufSerializerTests.cs index d8afcc6..2d5d02e 100644 --- a/test/RocksDb.Extensions.Tests/RocksDbStoreWithProtobufSerializerTests.cs +++ b/test/RocksDb.Extensions.Tests/RocksDbStoreWithProtobufSerializerTests.cs @@ -110,7 +110,7 @@ public void should_retrieve_all_elements_from_store() store.PutRange(cacheKeys, cacheValues); // Act - var values = store.GetAll().ToList(); + var values = store.GetAllValues().ToList(); // Assert values.Count.ShouldBe(cacheKeys.Length);