From ea734ef136ea4d7b54ed6347686b588fd1b1e89e Mon Sep 17 00:00:00 2001 From: Alexandr Ivanitskyi <6saaanchik6@gmail.com> Date: Thu, 10 Aug 2023 17:28:11 +0300 Subject: [PATCH] GetCollection Method --- .../AzureTablesDatabase.cs | 2 ++ .../AzureTablesDatabaseCollection.cs | 5 +++++ .../BaseDatabaseCollection.cs | 7 +++++++ ManagedCode.Database.Core/IDatabase.cs | 1 + .../IDatabaseCollection.cs | 3 ++- .../InMemory/InMemoryDatabaseCollection.cs | 7 +++++++ ManagedCode.Database.Cosmos/CosmosCollection.cs | 5 +++++ .../DynamoDBCollection.cs | 5 +++++ ManagedCode.Database.LiteDB/LiteDBCollection.cs | 5 +++++ .../MongoDBCollection.cs | 9 +++++++++ .../SQLiteDatabaseCollection.cs | 5 +++++ .../BaseTests/BaseCollectionTests.cs | 17 +++++++++++++++++ .../ZoneTreeCollection.cs | 6 ++++++ 13 files changed, 76 insertions(+), 1 deletion(-) diff --git a/ManagedCode.Database.AzureTables/AzureTablesDatabase.cs b/ManagedCode.Database.AzureTables/AzureTablesDatabase.cs index 166ed60..a71df8a 100644 --- a/ManagedCode.Database.AzureTables/AzureTablesDatabase.cs +++ b/ManagedCode.Database.AzureTables/AzureTablesDatabase.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; +using System.Xml.Linq; using Azure.Data.Tables; using Humanizer; using ManagedCode.Database.Core; diff --git a/ManagedCode.Database.AzureTables/AzureTablesDatabaseCollection.cs b/ManagedCode.Database.AzureTables/AzureTablesDatabaseCollection.cs index 237bec7..5d36524 100644 --- a/ManagedCode.Database.AzureTables/AzureTablesDatabaseCollection.cs +++ b/ManagedCode.Database.AzureTables/AzureTablesDatabaseCollection.cs @@ -34,6 +34,11 @@ public override ValueTask DisposeAsync() #region Get + protected override async Task> GetCollectionInternalAsync(CancellationToken cancellationToken = default) + { + return await _tableClient.QueryAsync().ToListAsync(cancellationToken); + } + protected override async Task GetInternalAsync(TableId id, CancellationToken cancellationToken = default) { try diff --git a/ManagedCode.Database.Core/BaseDatabaseCollection.cs b/ManagedCode.Database.Core/BaseDatabaseCollection.cs index b583539..26c99f7 100644 --- a/ManagedCode.Database.Core/BaseDatabaseCollection.cs +++ b/ManagedCode.Database.Core/BaseDatabaseCollection.cs @@ -15,6 +15,11 @@ public abstract class BaseDatabaseCollection : IDatabaseCollection> GetCollection(CancellationToken cancellationToken = default) + { + return ExecuteAsync(GetCollectionInternalAsync(cancellationToken)); + } + public Task InsertAsync(TItem item, CancellationToken cancellationToken = default) { return ExecuteAsync(InsertInternalAsync(item, cancellationToken)); @@ -107,6 +112,8 @@ protected abstract Task DeleteInternalAsync(IEnumerable items, CancellationToken cancellationToken = default); protected abstract Task DeleteCollectionInternalAsync(CancellationToken cancellationToken = default); + + protected abstract Task> GetCollectionInternalAsync(CancellationToken cancellationToken = default); protected abstract Task GetInternalAsync(TId id, CancellationToken cancellationToken = default); diff --git a/ManagedCode.Database.Core/IDatabase.cs b/ManagedCode.Database.Core/IDatabase.cs index b11efb8..71b4fd2 100644 --- a/ManagedCode.Database.Core/IDatabase.cs +++ b/ManagedCode.Database.Core/IDatabase.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; diff --git a/ManagedCode.Database.Core/IDatabaseCollection.cs b/ManagedCode.Database.Core/IDatabaseCollection.cs index 1f4be8d..3cf991e 100644 --- a/ManagedCode.Database.Core/IDatabaseCollection.cs +++ b/ManagedCode.Database.Core/IDatabaseCollection.cs @@ -8,7 +8,8 @@ namespace ManagedCode.Database.Core; public interface IDatabaseCollection : IDisposable, IAsyncDisposable where TItem : IItem { ICollectionQueryable Query { get; } - + + Task> GetCollection(CancellationToken cancellationToken = default); Task InsertAsync(TItem item, CancellationToken cancellationToken = default); Task InsertAsync(IEnumerable items, CancellationToken cancellationToken = default); diff --git a/ManagedCode.Database.Core/InMemory/InMemoryDatabaseCollection.cs b/ManagedCode.Database.Core/InMemory/InMemoryDatabaseCollection.cs index 7f9eaef..f4153f6 100644 --- a/ManagedCode.Database.Core/InMemory/InMemoryDatabaseCollection.cs +++ b/ManagedCode.Database.Core/InMemory/InMemoryDatabaseCollection.cs @@ -148,9 +148,16 @@ protected override Task DeleteCollectionInternalAsync(CancellationToken ca return Task.FromResult(_storage.Count == 0); } + + #endregion #region Get + + protected override Task> GetCollectionInternalAsync(CancellationToken cancellationToken = default) + { + return Task.FromResult(_storage.Values.ToList()); + } protected override Task GetInternalAsync(TId id, CancellationToken cancellationToken = default) { diff --git a/ManagedCode.Database.Cosmos/CosmosCollection.cs b/ManagedCode.Database.Cosmos/CosmosCollection.cs index 04675e3..0bc434e 100644 --- a/ManagedCode.Database.Cosmos/CosmosCollection.cs +++ b/ManagedCode.Database.Cosmos/CosmosCollection.cs @@ -49,6 +49,11 @@ public override ValueTask DisposeAsync() #region Get + protected override Task> GetCollectionInternalAsync(CancellationToken cancellationToken = default) + { + return Task.FromResult(_container.GetItemLinqQueryable().ToList()); + } + protected override async Task GetInternalAsync(string id, CancellationToken cancellationToken = default) { using var queryIterator = _container.GetItemLinqQueryable().Where(w => w.Id == id).ToFeedIterator(); diff --git a/ManagedCode.Database.DynamoDB/DynamoDBCollection.cs b/ManagedCode.Database.DynamoDB/DynamoDBCollection.cs index f431bb8..919b695 100644 --- a/ManagedCode.Database.DynamoDB/DynamoDBCollection.cs +++ b/ManagedCode.Database.DynamoDB/DynamoDBCollection.cs @@ -88,6 +88,11 @@ public override ValueTask DisposeAsync() #region Get + protected override async Task> GetCollectionInternalAsync(CancellationToken cancellationToken = default) + { + return await _dynamoDBContext.ScanAsync(null, _config).GetRemainingAsync(cancellationToken); + } + protected override async Task GetInternalAsync(string hashKey, CancellationToken cancellationToken = default) { var data = await _dynamoDBContext.ScanAsync(GetScanConditions(hashKey), _config).GetRemainingAsync(cancellationToken); diff --git a/ManagedCode.Database.LiteDB/LiteDBCollection.cs b/ManagedCode.Database.LiteDB/LiteDBCollection.cs index aefdadc..dfbde41 100644 --- a/ManagedCode.Database.LiteDB/LiteDBCollection.cs +++ b/ManagedCode.Database.LiteDB/LiteDBCollection.cs @@ -31,6 +31,11 @@ public override void Dispose() #region Get + protected override Task> GetCollectionInternalAsync(CancellationToken cancellationToken = default) + { + return Task.FromResult(_collection.FindAll().ToList()); + } + protected override async Task GetInternalAsync(TId id, CancellationToken cancellationToken = default) { await Task.Yield(); diff --git a/ManagedCode.Database.MongoDB/MongoDBCollection.cs b/ManagedCode.Database.MongoDB/MongoDBCollection.cs index 99cdc75..470c4bd 100644 --- a/ManagedCode.Database.MongoDB/MongoDBCollection.cs +++ b/ManagedCode.Database.MongoDB/MongoDBCollection.cs @@ -33,6 +33,15 @@ public override ValueTask DisposeAsync() #region Get + protected override async Task> GetCollectionInternalAsync(CancellationToken cancellationToken = default) + { + var collectionName = _collection.CollectionNamespace.CollectionName; + + var collection = await _collection.Database.GetCollection(collectionName).Find(_ => true).ToListAsync(); + + return collection; + } + protected override async Task GetInternalAsync(ObjectId id, CancellationToken cancellationToken = default) { var cursor = await _collection.FindAsync(w => w.Id == id, cancellationToken: cancellationToken); diff --git a/ManagedCode.Database.SQLite/SQLiteDatabaseCollection.cs b/ManagedCode.Database.SQLite/SQLiteDatabaseCollection.cs index 4803e32..597b69e 100644 --- a/ManagedCode.Database.SQLite/SQLiteDatabaseCollection.cs +++ b/ManagedCode.Database.SQLite/SQLiteDatabaseCollection.cs @@ -31,6 +31,11 @@ public override void Dispose() #region Get + protected override Task> GetCollectionInternalAsync(CancellationToken cancellationToken = default) + { + return Task.FromResult(_database.Query(null)); + } + protected override async Task GetInternalAsync(TId id, CancellationToken cancellationToken = default) { await Task.Yield(); diff --git a/ManagedCode.Database.Tests/BaseTests/BaseCollectionTests.cs b/ManagedCode.Database.Tests/BaseTests/BaseCollectionTests.cs index ea0afe5..70c6ec5 100644 --- a/ManagedCode.Database.Tests/BaseTests/BaseCollectionTests.cs +++ b/ManagedCode.Database.Tests/BaseTests/BaseCollectionTests.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Threading.Tasks; using ManagedCode.Database.Tests.TestContainers; +using Microsoft.Azure.Cosmos; using Xunit; namespace ManagedCode.Database.Tests.BaseTests; @@ -368,6 +369,22 @@ public virtual async Task Count() #region Get + [Fact] + public virtual async Task GetAll_ReturnOk() + { + // Arrange + await Collection.InsertAsync(CreateNewItem()); + await Collection.InsertAsync(CreateNewItem()); + await Collection.InsertAsync(CreateNewItem()); + + // Act + var getItemResult = await Collection.GetCollection(); + + // Assert + getItemResult.Count.Should().Be(3); + } + + [Fact] public virtual async Task GetById_ReturnOk() { diff --git a/ManagedCode.Database.ZoneTree/ZoneTreeCollection.cs b/ManagedCode.Database.ZoneTree/ZoneTreeCollection.cs index d659f71..bd6670c 100644 --- a/ManagedCode.Database.ZoneTree/ZoneTreeCollection.cs +++ b/ManagedCode.Database.ZoneTree/ZoneTreeCollection.cs @@ -92,6 +92,12 @@ protected override Task DeleteCollectionInternalAsync(CancellationToken ca return Task.FromResult(true); } + protected override Task> GetCollectionInternalAsync(CancellationToken cancellationToken = default) + { + var collection = _zoneTree.Enumerate().ToList(); + return Task.FromResult(collection.Count == 0 ? null : collection)!; + } + protected override async Task InsertOrUpdateInternalAsync(TItem item, CancellationToken cancellationToken = default) {