diff --git a/src/Cosmonaut/Cosmonaut.csproj b/src/Cosmonaut/Cosmonaut.csproj
index e109286..d298165 100644
--- a/src/Cosmonaut/Cosmonaut.csproj
+++ b/src/Cosmonaut/Cosmonaut.csproj
@@ -1,7 +1,7 @@
- netstandard1.6
+ netstandard2.0
Nick Chapsas
A supercharged .NET SDK for Azure CosmosDB with ORM support
A powerful and easy to use SDK for Azure CosmosDB.
@@ -12,24 +12,16 @@
https://github.com/Elfocrash/Cosmonaut
azure entitystore entity db orm microsoft cosmos cosmosdb documentdb docdb nosql azureofficial dotnetcore netcore netstandard
Please report any issues on Github.
- 2.11.3
-
+ 3.0
Nick Chapsas
https://raw.githubusercontent.com/Elfocrash/Cosmonaut/develop/logo.png
- 2.11.3
-
-
-
- latest
-
-
-
- latest
+ 3.0
-
+
+
diff --git a/src/Cosmonaut/Cosmonaut.csproj.DotSettings b/src/Cosmonaut/Cosmonaut.csproj.DotSettings
deleted file mode 100644
index 58ad6c8..0000000
--- a/src/Cosmonaut/Cosmonaut.csproj.DotSettings
+++ /dev/null
@@ -1,2 +0,0 @@
-
- CSharp71
\ No newline at end of file
diff --git a/src/Cosmonaut/CosmonautClient.cs b/src/Cosmonaut/CosmonautClient.cs
index 68bcc29..7dac4f4 100644
--- a/src/Cosmonaut/CosmonautClient.cs
+++ b/src/Cosmonaut/CosmonautClient.cs
@@ -2,382 +2,114 @@
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
-using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
-using Cosmonaut.Diagnostics;
using Cosmonaut.Extensions;
using Cosmonaut.Factories;
-using Cosmonaut.Response;
-using Microsoft.Azure.Documents;
-using Microsoft.Azure.Documents.Client;
-using Newtonsoft.Json;
+using Microsoft.Azure.Cosmos;
namespace Cosmonaut
{
public class CosmonautClient : ICosmonautClient
{
- private readonly JsonSerializerSettings _serializerSettings;
+ private readonly CosmosSerializer _serializerSettings;
- public CosmonautClient(IDocumentClient documentClient, bool infiniteRetrying = true)
+ public CosmonautClient(CosmosClient cosmosClient, bool infiniteRetrying = true)
{
- DocumentClient = documentClient;
+ CosmosClient = cosmosClient;
if (infiniteRetrying)
- DocumentClient.SetupInfiniteRetries();
+ CosmosClient.SetupInfiniteRetries();
- _serializerSettings = DocumentClient.GetJsonSerializerSettingsFromClient();
+ _serializerSettings = CosmosClient.ClientOptions.Serializer;
}
- public CosmonautClient(Func documentClientFunc, bool infiniteRetrying = true)
+ public CosmonautClient(Func cosmosClientFunc, bool infiniteRetrying = true)
{
- DocumentClient = documentClientFunc();
+ CosmosClient = cosmosClientFunc();
if (infiniteRetrying)
- DocumentClient.SetupInfiniteRetries();
+ CosmosClient.SetupInfiniteRetries();
- _serializerSettings = DocumentClient.GetJsonSerializerSettingsFromClient();
+ _serializerSettings = CosmosClient.ClientOptions.Serializer;
}
public CosmonautClient(
Uri endpoint,
string authKeyOrResourceToken,
- ConnectionPolicy connectionPolicy = null,
- ConsistencyLevel? desiredConsistencyLevel = null,
+ CosmosClientOptions clientOptions = null,
bool infiniteRetrying = true)
{
- DocumentClient = DocumentClientFactory.CreateDocumentClient(endpoint, authKeyOrResourceToken, connectionPolicy, desiredConsistencyLevel);
+ CosmosClient = new CosmosClient(endpoint.ToString(), authKeyOrResourceToken, clientOptions);
if (infiniteRetrying)
- DocumentClient.SetupInfiniteRetries();
-
- _serializerSettings = DocumentClient.GetJsonSerializerSettingsFromClient();
- }
+ CosmosClient.SetupInfiniteRetries();
- public CosmonautClient(
- Uri endpoint,
- string authKeyOrResourceToken,
- JsonSerializerSettings jsonSerializerSettings,
- ConnectionPolicy connectionPolicy = null,
- ConsistencyLevel? desiredConsistencyLevel = null,
- bool infiniteRetrying = true)
- {
- DocumentClient = DocumentClientFactory.CreateDocumentClient(endpoint, authKeyOrResourceToken, jsonSerializerSettings, connectionPolicy, desiredConsistencyLevel);
-
- if (infiniteRetrying)
- DocumentClient.SetupInfiniteRetries();
-
- _serializerSettings = DocumentClient.GetJsonSerializerSettingsFromClient();
+ _serializerSettings = CosmosClient.ClientOptions.Serializer;
}
public CosmonautClient(
string endpoint,
string authKeyOrResourceToken,
- ConnectionPolicy connectionPolicy = null,
- ConsistencyLevel? desiredConsistencyLevel = null,
- bool infiniteRetrying = true) : this(new Uri(endpoint), authKeyOrResourceToken, connectionPolicy, desiredConsistencyLevel, infiniteRetrying)
- {
- }
-
- public async Task GetDatabaseAsync(string databaseId, RequestOptions requestOptions = null)
- {
- var databaseUri = UriFactory.CreateDatabaseUri(databaseId);
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.ReadDatabaseAsync(databaseUri, requestOptions), databaseId)
- .ExecuteCosmosQuery();
- }
-
- public async Task> QueryDatabasesAsync(Expression> predicate = null,
- FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+ CosmosClientOptions clientOptions = null,
+ bool infiniteRetrying = true) : this(new Uri(endpoint), authKeyOrResourceToken, clientOptions, infiniteRetrying)
{
- if (predicate == null) predicate = x => true;
- return await DocumentClient.CreateDatabaseQuery(feedOptions).Where(predicate).ToListAsync(cancellationToken);
- }
-
- public async Task GetDocumentAsync(string databaseId, string collectionId, string documentId,
- RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- var documentUri = UriFactory.CreateDocumentUri(databaseId, collectionId, documentId);
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.ReadDocumentAsync(documentUri, requestOptions, cancellationToken), documentId)
- .ExecuteCosmosQuery();
}
- public async Task GetDocumentAsync(string databaseId, string collectionId, string documentId,
- RequestOptions requestOptions = null, CancellationToken cancellationToken = default) where T : class
+ public async Task GetDatabaseAsync(string databaseId, RequestOptions requestOptions = null)
{
- var documentUri = UriFactory.CreateDocumentUri(databaseId, collectionId, documentId);
- return await this.InvokeCosmosOperationAsync(
- () => DocumentClient.ReadDocumentAsync(documentUri, requestOptions, cancellationToken), documentId)
- .ExecuteCosmosQuery();
+ return await CosmosClient.CreateDatabaseAsync(databaseId);
}
- public async Task> QueryCollectionsAsync(string databaseId,
- Expression> predicate = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- if (predicate == null) predicate = x => true;
- var databaseUri = UriFactory.CreateDatabaseUri(databaseId);
- return await DocumentClient.CreateDocumentCollectionQuery(databaseUri, feedOptions).Where(predicate).ToListAsync(cancellationToken);
- }
-
- public async Task> QueryDocumentsAsync(string databaseId, string collectionId, Expression> predicate = null,
- FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- if (predicate == null) predicate = x => true;
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- return await DocumentClient.CreateDocumentQuery(collectionUri, feedOptions).Where(predicate).ToListAsync(cancellationToken);
- }
-
- public async Task> QueryDocumentsAsync(string databaseId, string collectionId, string sql, object parameters = null,
- FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- var sqlParameters = parameters.ConvertToSqlParameterCollection();
- var sqlQuerySpec = sqlParameters != null && sqlParameters.Any() ? new SqlQuerySpec(sql, sqlParameters) : new SqlQuerySpec(sql);
- return await DocumentClient.CreateDocumentQuery(collectionUri, sqlQuerySpec, feedOptions).ToListAsync(cancellationToken);
- }
-
- public async Task> QueryDocumentsAsync(string databaseId, string collectionId, string sql, IDictionary parameters,
- FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- var sqlParameters = parameters.ConvertDictionaryToSqlParameterCollection();
- var sqlQuerySpec = sqlParameters != null && sqlParameters.Any() ? new SqlQuerySpec(sql, sqlParameters) : new SqlQuerySpec(sql);
- return await DocumentClient.CreateDocumentQuery(collectionUri, sqlQuerySpec, feedOptions).ToListAsync(cancellationToken);
- }
-
- public async Task> QueryDocumentsAsync(string databaseId, string collectionId,
- Expression> predicate = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- if (predicate == null) predicate = x => true;
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- return await DocumentClient.CreateDocumentQuery(collectionUri, feedOptions).Where(predicate).ToListAsync(cancellationToken);
- }
-
- public async Task GetCollectionAsync(string databaseId, string collectionId, RequestOptions requestOptions = null)
- {
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.ReadDocumentCollectionAsync(collectionUri, requestOptions), collectionId)
- .ExecuteCosmosQuery();
- }
-
- public async Task GetOfferForCollectionAsync(string databaseId, string collectionId, FeedOptions feedOptions = null,
+ public Task> QueryDatabasesAsync(Expression> predicate = null, RequestOptions requestOptions = null,
CancellationToken cancellationToken = default)
{
- var collection = await GetCollectionAsync(databaseId, collectionId);
-
- if (collection == null)
- return null;
-
- return await DocumentClient.CreateOfferQuery(feedOptions).SingleOrDefaultAsync(x => x.ResourceLink == collection.SelfLink, cancellationToken);
+ throw new NotImplementedException();
}
- public async Task GetOfferV2ForCollectionAsync(string databaseId, string collectionId, FeedOptions feedOptions = null,
+ public Task> QueryContainersAsync(string databaseId, Expression> predicate = null, ContainerRequestOptions requestOptions = null,
CancellationToken cancellationToken = default)
{
- return (OfferV2) await GetOfferForCollectionAsync(databaseId, collectionId, feedOptions, cancellationToken);
- }
-
- public async Task GetOfferForDatabaseAsync(string databaseId, FeedOptions feedOptions = null,
- CancellationToken cancellationToken = default)
- {
- var database = await GetDatabaseAsync(databaseId);
-
- if (database == null)
- return null;
-
- return await DocumentClient.CreateOfferQuery(feedOptions).SingleOrDefaultAsync(x => x.ResourceLink == database.SelfLink, cancellationToken);
- }
-
- public async Task GetOfferV2ForDatabaseAsync(string databaseId, FeedOptions feedOptions = null,
- CancellationToken cancellationToken = default)
- {
- return (OfferV2)await GetOfferForDatabaseAsync(databaseId, feedOptions, cancellationToken);
- }
-
- public async Task> QueryOffersAsync(Expression> predicate = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- if (predicate == null) predicate = x => true;
- return await DocumentClient.CreateOfferQuery(feedOptions).Where(predicate).ToListAsync(cancellationToken);
+ throw new NotImplementedException();
}
- public async Task> QueryOffersV2Async(Expression> predicate = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+ public Task> QueryItemsAsync(string databaseId, string collectionId, Expression> predicate = null,
+ ItemRequestOptions requestOptions = null, CancellationToken cancellationToken = default)
{
- if (predicate == null) predicate = x => true;
- var offers = await DocumentClient.CreateOfferQuery(feedOptions).Where(predicate).ToListAsync(cancellationToken);
- return offers.Cast();
+ throw new NotImplementedException();
}
- public async Task> UpdateOfferAsync(Offer offer)
+ public Task> QueryItemsAsync(string databaseId, string collectionId, string sql, object parameters = null,
+ ContainerRequestOptions requestOptions = null, CancellationToken cancellationToken = default)
{
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.ReplaceOfferAsync(offer), offer.Id).ExecuteCosmosCommand();
+ throw new NotImplementedException();
}
- public async Task> QueryStoredProceduresAsync(string databaseId, string collectionId, Expression> predicate = null,
- FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+ public Task> QueryItemsAsync(string databaseId, string collectionId, string sql, IDictionary parameters,
+ ContainerRequestOptions requestOptions = null, CancellationToken cancellationToken = default)
{
- if (predicate == null) predicate = x => true;
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- return await DocumentClient.CreateStoredProcedureQuery(collectionUri, feedOptions).Where(predicate).ToListAsync(cancellationToken);
+ throw new NotImplementedException();
}
- public async Task GetStoredProcedureAsync(string databaseId, string collectionId, string storedProcedureId, RequestOptions requestOptions = null)
+ public Task GetItemAsync(string databaseId, string collectionId, string documentId,
+ ContainerRequestOptions requestOptions = null, CancellationToken cancellationToken = default) where T : class
{
- var storedProcedureUri = UriFactory.CreateStoredProcedureUri(databaseId, collectionId, storedProcedureId);
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.ReadStoredProcedureAsync(storedProcedureUri, requestOptions), storedProcedureId)
- .ExecuteCosmosQuery();
+ throw new NotImplementedException();
}
- public IQueryable Query(string databaseId, string collectionId, FeedOptions feedOptions = null)
+ public Task GetContainerAsync(string databaseId, string containerId, ContainerRequestOptions requestOptions = null)
{
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- var queryable = DocumentClient.CreateDocumentQuery(collectionUri, feedOptions);
- return queryable;
+ throw new NotImplementedException();
}
- public IQueryable Query(string databaseId, string collectionId, string sql, object parameters = null, FeedOptions feedOptions = null)
+ public IQueryable Query(string databaseId, string collectionId, ItemRequestOptions requestOptions = null)
{
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- var sqlParameters = parameters.ConvertToSqlParameterCollection();
- return GetSqlBasedQueryableForType(collectionUri, sql, sqlParameters, feedOptions);
+ throw new NotImplementedException();
}
- public IQueryable Query(string databaseId, string collectionId, string sql, IDictionary parameters, FeedOptions feedOptions = null)
+ public IQueryable Query(string databaseId, string collectionId, string sql, object parameters = null,
+ ItemRequestOptions requestOptions = null)
{
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- var sqlParameters = parameters.ConvertDictionaryToSqlParameterCollection();
- return GetSqlBasedQueryableForType(collectionUri, sql, sqlParameters, feedOptions);
+ throw new NotImplementedException();
}
-
- public async Task> CreateCollectionAsync(string databaseId, DocumentCollection collection,
- RequestOptions requestOptions = null)
- {
- var databaseUri = UriFactory.CreateDatabaseUri(databaseId);
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.CreateDocumentCollectionAsync(databaseUri, collection, requestOptions), collection.ToString())
- .ExecuteCosmosCommand();
- }
-
- public async Task> CreateDatabaseAsync(Database database, RequestOptions requestOptions = null)
- {
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.CreateDatabaseAsync(database, requestOptions), database.ToString())
- .ExecuteCosmosCommand();
- }
-
- public async Task> CreateDocumentAsync(string databaseId,
- string collectionId, Document obj,
- RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- return await this.InvokeCosmosOperationAsync(() =>
- DocumentClient.CreateDocumentAsync(collectionUri, obj, requestOptions, cancellationToken: cancellationToken), obj.GetDocumentId())
- .ExecuteCosmosCommand();
- }
-
- public async Task> CreateDocumentAsync(string databaseId, string collectionId, T obj,
- RequestOptions requestOptions = null, CancellationToken cancellationToken = default) where T : class
- {
- var safeDocument = obj.ToCosmonautDocument(requestOptions?.JsonSerializerSettings ?? _serializerSettings);
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- return await this.InvokeCosmosOperationAsync(() =>
- DocumentClient.CreateDocumentAsync(collectionUri, safeDocument, requestOptions, cancellationToken: cancellationToken), obj.GetDocumentId())
- .ExecuteCosmosCommand(obj);
- }
-
- public async Task> DeleteDocumentAsync(string databaseId, string collectionId, string documentId,
- RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- var documentUri = UriFactory.CreateDocumentUri(databaseId, collectionId, documentId);
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.DeleteDocumentAsync(documentUri, requestOptions, cancellationToken), documentId)
- .ExecuteCosmosCommand();
- }
-
- public async Task> UpdateDocumentAsync(string databaseId, string collectionId, Document document,
- RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- var documentUri = UriFactory.CreateDocumentUri(databaseId, collectionId, document.Id);
- return await this.InvokeCosmosOperationAsync(() =>
- DocumentClient.ReplaceDocumentAsync(documentUri, document, requestOptions, cancellationToken), document.GetDocumentId())
- .ExecuteCosmosCommand();
- }
-
- public async Task> UpdateDocumentAsync(string databaseId, string collectionId, T document,
- RequestOptions requestOptions = null, CancellationToken cancellationToken = default) where T : class
- {
- var safeDocument = document.ToCosmonautDocument(requestOptions?.JsonSerializerSettings ?? _serializerSettings);
- var documentUri = UriFactory.CreateDocumentUri(databaseId, collectionId, safeDocument.Id);
- return await this.InvokeCosmosOperationAsync(() =>
- DocumentClient.ReplaceDocumentAsync(documentUri, safeDocument, requestOptions, cancellationToken), document.GetDocumentId())
- .ExecuteCosmosCommand(document);
- }
-
- public async Task> UpsertDocumentAsync(string databaseId, string collectionId, Document document,
- RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- return await this.InvokeCosmosOperationAsync(() =>
- DocumentClient.UpsertDocumentAsync(collectionUri, document, requestOptions, cancellationToken: cancellationToken), document.Id)
- .ExecuteCosmosCommand();
- }
-
- public async Task> UpsertDocumentAsync(string databaseId, string collectionId,
- T document, RequestOptions requestOptions = null, CancellationToken cancellationToken = default) where T : class
- {
- var safeDocument = document.ToCosmonautDocument(requestOptions?.JsonSerializerSettings ?? _serializerSettings);
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- return await this.InvokeCosmosOperationAsync(() =>
- DocumentClient.UpsertDocumentAsync(collectionUri, safeDocument, requestOptions, cancellationToken: cancellationToken), document.GetDocumentId())
- .ExecuteCosmosCommand(document);
- }
-
- public async Task> DeleteDatabaseAsync(string databaseId, RequestOptions requestOptions = null)
- {
- var databaseUri = UriFactory.CreateDatabaseUri(databaseId);
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.DeleteDatabaseAsync(databaseUri, requestOptions), databaseId)
- .ExecuteCosmosCommand();
- }
-
- public async Task> DeleteCollectionAsync(string databaseId, string collectionId, RequestOptions requestOptions = null)
- {
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.DeleteDocumentCollectionAsync(collectionUri, requestOptions), collectionId)
- .ExecuteCosmosCommand();
- }
-
- public async Task> UpdateCollectionAsync(string databaseId, string collectionId, DocumentCollection documentCollection,
- RequestOptions requestOptions = null)
- {
- var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
- return await this.InvokeCosmosOperationAsync(() => DocumentClient.ReplaceDocumentCollectionAsync(collectionUri, documentCollection, requestOptions), collectionId)
- .ExecuteCosmosCommand();
- }
-
- public async Task> ExecuteStoredProcedureAsync(string databaseId, string collectionId, string storedProcedureId,
- params object[] procedureParams)
- {
- var storedProcedureUri = UriFactory.CreateStoredProcedureUri(databaseId, collectionId, storedProcedureId);
- return await this.InvokeCosmosOperationAsync(
- () => DocumentClient.ExecuteStoredProcedureAsync(storedProcedureUri, procedureParams), storedProcedureId);
- }
-
- public async Task> ExecuteStoredProcedureAsync(string databaseId, string collectionId, string storedProcedureId,
- RequestOptions requestOptions, params object[] procedureParams)
- {
- var storedProcedureUri = UriFactory.CreateStoredProcedureUri(databaseId, collectionId, storedProcedureId);
- return await this.InvokeCosmosOperationAsync(
- () => DocumentClient.ExecuteStoredProcedureAsync(storedProcedureUri, requestOptions, procedureParams), storedProcedureId);
- }
-
- public async Task> ExecuteStoredProcedureAsync(string databaseId, string collectionId, string storedProcedureId,
- RequestOptions requestOptions, CancellationToken cancellationToken, params object[] procedureParams)
- {
- var storedProcedureUri = UriFactory.CreateStoredProcedureUri(databaseId, collectionId, storedProcedureId);
- return await this.InvokeCosmosOperationAsync(
- () => DocumentClient.ExecuteStoredProcedureAsync(storedProcedureUri, requestOptions, cancellationToken, procedureParams), storedProcedureId);
- }
-
- private IQueryable GetSqlBasedQueryableForType(Uri collectionUri, string sql,
- SqlParameterCollection parameters, FeedOptions feedOptions)
- {
- var sqlQuerySpec = parameters != null && parameters.Any() ? new SqlQuerySpec(sql, parameters) : new SqlQuerySpec(sql);
- var queryable = DocumentClient.CreateDocumentQuery(collectionUri, sqlQuerySpec, feedOptions);
- return queryable;
- }
-
- public IDocumentClient DocumentClient { get; }
+
+ public CosmosClient CosmosClient { get; }
}
}
\ No newline at end of file
diff --git a/src/Cosmonaut/CosmosConstants.cs b/src/Cosmonaut/CosmosConstants.cs
index 5d4da0f..608b578 100644
--- a/src/Cosmonaut/CosmosConstants.cs
+++ b/src/Cosmonaut/CosmosConstants.cs
@@ -1,4 +1,4 @@
-using Microsoft.Azure.Documents;
+using Microsoft.Azure.Cosmos;
namespace Cosmonaut
{
@@ -8,8 +8,7 @@ public class CosmosConstants
public const int MinimumCosmosThroughput = 400;
public const int DefaultMaximumUpscaleThroughput = 10000;
public const int TooManyRequestsStatusCode = 429;
- public static readonly IndexingPolicy DefaultIndexingPolicy =
- new IndexingPolicy(new RangeIndex(DataType.Number, -1), new RangeIndex(DataType.String, -1), new SpatialIndex(DataType.Point));
+ public static readonly IndexingPolicy DefaultIndexingPolicy = new IndexingPolicy();
public static readonly UniqueKeyPolicy DefaultUniqueKeyPolicy = new UniqueKeyPolicy();
}
}
\ No newline at end of file
diff --git a/src/Cosmonaut/CosmosStore.cs b/src/Cosmonaut/CosmosStore.cs
index 2f8ea9f..1442f5b 100644
--- a/src/Cosmonaut/CosmosStore.cs
+++ b/src/Cosmonaut/CosmosStore.cs
@@ -1,346 +1,334 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Threading;
-using System.Threading.Tasks;
-using Cosmonaut.Extensions;
-using Cosmonaut.Factories;
-using Cosmonaut.Response;
-using Cosmonaut.Storage;
-using Microsoft.Azure.Documents;
-using Microsoft.Azure.Documents.Client;
-
+
namespace Cosmonaut
{
public sealed class CosmosStore : ICosmosStore where TEntity : class
{
- public bool IsShared { get; internal set; }
-
- public string CollectionName { get; private set; }
-
- public string DatabaseName { get; }
-
- public CosmosStoreSettings Settings { get; }
-
- public ICosmonautClient CosmonautClient { get; }
-
- private readonly IDatabaseCreator _databaseCreator;
- private readonly ICollectionCreator _collectionCreator;
-
- public CosmosStore(CosmosStoreSettings settings) : this(settings, string.Empty)
- {
- }
-
- public CosmosStore(CosmosStoreSettings settings, string overriddenCollectionName)
- {
- Settings = settings ?? throw new ArgumentNullException(nameof(settings));
- DatabaseName = settings.DatabaseName;
- var documentClient = DocumentClientFactory.CreateDocumentClient(settings);
- CosmonautClient = new CosmonautClient(documentClient, Settings.InfiniteRetries);
- if (string.IsNullOrEmpty(Settings.DatabaseName)) throw new ArgumentNullException(nameof(Settings.DatabaseName));
- _collectionCreator = new CosmosCollectionCreator(CosmonautClient);
- _databaseCreator = new CosmosDatabaseCreator(CosmonautClient);
- InitialiseCosmosStore(overriddenCollectionName);
- }
-
- public CosmosStore(ICosmonautClient cosmonautClient,
- string databaseName) : this(cosmonautClient, databaseName, string.Empty,
- new CosmosDatabaseCreator(cosmonautClient),
- new CosmosCollectionCreator(cosmonautClient))
- {
- }
-
- public CosmosStore(ICosmonautClient cosmonautClient,
- string databaseName,
- string overriddenCollectionName) : this(cosmonautClient,
- databaseName,
- overriddenCollectionName,
- new CosmosDatabaseCreator(cosmonautClient),
- new CosmosCollectionCreator(cosmonautClient))
- {
- }
-
- internal CosmosStore(ICosmonautClient cosmonautClient,
- string databaseName,
- string overriddenCollectionName,
- IDatabaseCreator databaseCreator = null,
- ICollectionCreator collectionCreator = null)
- {
- DatabaseName = databaseName;
- CosmonautClient = cosmonautClient ?? throw new ArgumentNullException(nameof(cosmonautClient));
- Settings = new CosmosStoreSettings(databaseName, cosmonautClient.DocumentClient.ServiceEndpoint.ToString(), string.Empty, cosmonautClient.DocumentClient.ConnectionPolicy);
- if (Settings.InfiniteRetries)
- CosmonautClient.DocumentClient.SetupInfiniteRetries();
- if (string.IsNullOrEmpty(Settings.DatabaseName)) throw new ArgumentNullException(nameof(Settings.DatabaseName));
- _collectionCreator = collectionCreator ?? new CosmosCollectionCreator(CosmonautClient);
- _databaseCreator = databaseCreator ?? new CosmosDatabaseCreator(CosmonautClient);
- InitialiseCosmosStore(overriddenCollectionName);
- }
-
- public IQueryable Query(FeedOptions feedOptions = null)
- {
- var queryable =
- CosmonautClient.Query(DatabaseName, CollectionName, GetFeedOptionsForQuery(feedOptions));
-
- return IsShared ? queryable.Where(ExpressionExtensions.SharedCollectionExpression()) : queryable;
- }
-
- public IQueryable Query(string sql, object parameters = null, FeedOptions feedOptions = null,
- CancellationToken cancellationToken = default)
- {
- var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
- return CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
- }
-
- public async Task QuerySingleAsync(string sql, object parameters = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
- var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
- return await queryable.SingleOrDefaultAsync(cancellationToken);
- }
-
- public async Task QuerySingleAsync(string sql, object parameters = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
- var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
- return await queryable.SingleOrDefaultAsync(cancellationToken);
- }
-
- public async Task> QueryMultipleAsync(string sql, object parameters = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
- var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
- return await queryable.ToListAsync(cancellationToken);
- }
-
- public async Task> QueryMultipleAsync(string sql, object parameters = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
- var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
- return await queryable.ToListAsync(cancellationToken);
- }
-
- public IQueryable Query(string sql, IDictionary parameters, FeedOptions feedOptions = null,
- CancellationToken cancellationToken = default)
- {
- var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
- return CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
- }
-
- public async Task QuerySingleAsync(string sql, IDictionary parameters, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
- var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
- return await queryable.SingleOrDefaultAsync(cancellationToken);
- }
-
- public async Task QuerySingleAsync(string sql, IDictionary parameters, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
- var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
- return await queryable.SingleOrDefaultAsync(cancellationToken);
- }
-
- public async Task> QueryMultipleAsync(string sql, IDictionary parameters, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
- var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
- return await queryable.ToListAsync(cancellationToken);
- }
-
- public async Task> QueryMultipleAsync(string sql, IDictionary parameters, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
- {
- var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
- var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
- return await queryable.ToListAsync(cancellationToken);
- }
-
- public async Task> AddAsync(TEntity entity, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- return await CosmonautClient.CreateDocumentAsync(DatabaseName, CollectionName, entity,
- GetRequestOptions(requestOptions, entity), cancellationToken);
- }
-
- public async Task> AddRangeAsync(IEnumerable entities, Func requestOptions = null, CancellationToken cancellationToken = default)
- {
- return await ExecuteMultiOperationAsync(entities, x => AddAsync(x, requestOptions?.Invoke(x), cancellationToken));
- }
-
- public async Task> RemoveAsync(
- Expression> predicate,
- FeedOptions feedOptions = null,
- Func requestOptions = null,
- CancellationToken cancellationToken = default)
- {
- var entitiesToRemove = await Query(GetFeedOptionsForQuery(feedOptions)).Where(predicate).ToListAsync(cancellationToken);
- return await RemoveRangeAsync(entitiesToRemove, requestOptions, cancellationToken);
- }
-
- public async Task> RemoveAsync(TEntity entity, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- entity.ValidateEntityForCosmosDb();
- var documentId = entity.GetDocumentId();
- return await CosmonautClient.DeleteDocumentAsync(DatabaseName, CollectionName, documentId,
- GetRequestOptions(requestOptions, entity), cancellationToken).ExecuteCosmosCommand(entity);
- }
-
- public async Task> RemoveRangeAsync(IEnumerable entities, Func requestOptions = null, CancellationToken cancellationToken = default)
- {
- return await ExecuteMultiOperationAsync(entities, x => RemoveAsync(x, requestOptions?.Invoke(x), cancellationToken));
- }
-
- public async Task> UpdateAsync(TEntity entity, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- entity.ValidateEntityForCosmosDb();
- requestOptions = GetRequestOptions(requestOptions, entity);
- var document = entity.ToCosmonautDocument(requestOptions?.JsonSerializerSettings ?? Settings.JsonSerializerSettings);
- return await CosmonautClient.UpdateDocumentAsync(DatabaseName, CollectionName, document,
- requestOptions, cancellationToken).ExecuteCosmosCommand(entity);
- }
-
- public async Task> UpdateRangeAsync(IEnumerable entities, Func requestOptions = null, CancellationToken cancellationToken = default)
- {
- return await ExecuteMultiOperationAsync(entities, x => UpdateAsync(x, requestOptions?.Invoke(x), cancellationToken));
- }
-
- public async Task> UpsertAsync(TEntity entity, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- requestOptions = GetRequestOptions(requestOptions, entity);
- var document = entity.ToCosmonautDocument(requestOptions?.JsonSerializerSettings ?? Settings.JsonSerializerSettings);
- return await CosmonautClient.UpsertDocumentAsync(DatabaseName, CollectionName, document,
- requestOptions, cancellationToken).ExecuteCosmosCommand(entity);
- }
-
- public async Task> UpsertRangeAsync(IEnumerable entities, Func requestOptions = null, CancellationToken cancellationToken = default)
- {
- return await ExecuteMultiOperationAsync(entities, x => UpsertAsync(x, requestOptions?.Invoke(x), cancellationToken));
- }
-
- public async Task> RemoveByIdAsync(string id, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- var response = await CosmonautClient.DeleteDocumentAsync(DatabaseName, CollectionName, id,
- GetRequestOptions(id, requestOptions), cancellationToken);
- return new CosmosResponse(response);
- }
-
- public async Task> RemoveByIdAsync(string id, object partitionKeyValue, CancellationToken cancellationToken = default)
- {
- var requestOptions = partitionKeyValue != null
- ? new RequestOptions { PartitionKey = new PartitionKey(partitionKeyValue) }
- : null;
-
- return await RemoveByIdAsync(id, requestOptions, cancellationToken);
- }
-
- public async Task FindAsync(string id, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
- {
- return await CosmonautClient.GetDocumentAsync(DatabaseName, CollectionName, id,
- GetRequestOptions(id, requestOptions), cancellationToken);
- }
-
- public async Task FindAsync(string id, object partitionKeyValue, CancellationToken cancellationToken = default)
- {
- var requestOptions = partitionKeyValue != null
- ? new RequestOptions { PartitionKey = new PartitionKey(partitionKeyValue) }
- : null;
- return await FindAsync(id, requestOptions, cancellationToken);
- }
-
- public async Task EnsureInfrastructureProvisionedAsync()
- {
- var databaseCreated =
- await _databaseCreator.EnsureCreatedAsync(DatabaseName, Settings.DefaultDatabaseThroughput);
- var collectionCreated = await _collectionCreator.EnsureCreatedAsync(DatabaseName, CollectionName,
- Settings.DefaultCollectionThroughput, Settings.JsonSerializerSettings, Settings.IndexingPolicy, Settings.OnDatabaseThroughput, Settings.UniqueKeyPolicy);
-
- return databaseCreated && collectionCreated;
- }
-
- private void InitialiseCosmosStore(string overridenCollectionName)
- {
- IsShared = typeof(TEntity).UsesSharedCollection();
- CollectionName = GetCosmosStoreCollectionName(overridenCollectionName);
-
- if (Settings.ProvisionInfrastructureIfMissing)
- {
- EnsureInfrastructureProvisionedAsync().GetAwaiter().GetResult();
- }
-
- Settings.JsonSerializerSettings = CosmonautClient.DocumentClient.GetJsonSerializerSettingsFromClient();
- }
-
- private string GetCosmosStoreCollectionName(string overridenCollectionName)
- {
- var hasOverridenName = !string.IsNullOrEmpty(overridenCollectionName);
- return IsShared
- ? $"{Settings.CollectionPrefix ?? string.Empty}{(hasOverridenName ? overridenCollectionName : typeof(TEntity).GetSharedCollectionName())}"
- : $"{Settings.CollectionPrefix ?? string.Empty}{(hasOverridenName ? overridenCollectionName : typeof(TEntity).GetCollectionName())}";
- }
-
- private async Task> ExecuteMultiOperationAsync(IEnumerable entities,
- Func>> operationFunc)
- {
- var multipleResponse = new CosmosMultipleResponse();
-
- var entitiesList = entities.ToList();
- if (!entitiesList.Any())
- return multipleResponse;
-
- var results = (await entitiesList.Select(operationFunc).WhenAllTasksAsync()).ToList();
- multipleResponse.SuccessfulEntities.AddRange(results.Where(x => x.IsSuccess));
- multipleResponse.FailedEntities.AddRange(results.Where(x => !x.IsSuccess));
- return multipleResponse;
- }
-
- private RequestOptions GetRequestOptions(RequestOptions requestOptions, TEntity entity)
- {
- var partitionKeyValue = entity.GetPartitionKeyValueForEntity();
- if (requestOptions == null)
- {
- return partitionKeyValue != null ? new RequestOptions
- {
- PartitionKey = partitionKeyValue
- } : null;
- }
-
- requestOptions.PartitionKey = partitionKeyValue;
- return requestOptions;
- }
-
- private RequestOptions GetRequestOptions(string id, RequestOptions requestOptions)
- {
- var partitionKeyDefinition = typeof(TEntity).GetPartitionKeyDefinitionForEntity(requestOptions?.JsonSerializerSettings ?? Settings.JsonSerializerSettings);
- var partitionKeyIsId = partitionKeyDefinition?.Paths?.SingleOrDefault()?.Equals($"/{CosmosConstants.CosmosId}") ?? false;
- if (requestOptions == null && partitionKeyIsId)
- {
- return new RequestOptions
- {
- PartitionKey = new PartitionKey(id)
- };
- }
-
- if (requestOptions != null && partitionKeyIsId)
- requestOptions.PartitionKey = new PartitionKey(id);
-
- return requestOptions;
- }
-
- private FeedOptions GetFeedOptionsForQuery(FeedOptions feedOptions)
- {
- var shouldEnablePartitionQuery = (typeof(TEntity).HasPartitionKey() && feedOptions?.PartitionKey == null)
- || (feedOptions != null && feedOptions.EnableCrossPartitionQuery);
-
- if (feedOptions == null)
- {
- return new FeedOptions
- {
- EnableCrossPartitionQuery = shouldEnablePartitionQuery
- };
- }
-
- feedOptions.EnableCrossPartitionQuery = shouldEnablePartitionQuery;
- return feedOptions;
- }
+// public bool IsShared { get; internal set; }
+//
+// public string CollectionName { get; private set; }
+//
+// public string DatabaseName { get; }
+//
+// public CosmosStoreSettings Settings { get; }
+//
+// public ICosmonautClient CosmonautClient { get; }
+//
+// private readonly IDatabaseCreator _databaseCreator;
+// private readonly ICollectionCreator _collectionCreator;
+//
+// public CosmosStore(CosmosStoreSettings settings) : this(settings, string.Empty)
+// {
+// }
+//
+// public CosmosStore(CosmosStoreSettings settings, string overriddenCollectionName)
+// {
+// Settings = settings ?? throw new ArgumentNullException(nameof(settings));
+// DatabaseName = settings.DatabaseName;
+// var documentClient = DocumentClientFactory.CreateDocumentClient(settings);
+// CosmonautClient = new CosmonautClient(documentClient, Settings.InfiniteRetries);
+// if (string.IsNullOrEmpty(Settings.DatabaseName)) throw new ArgumentNullException(nameof(Settings.DatabaseName));
+// _collectionCreator = new CosmosCollectionCreator(CosmonautClient);
+// _databaseCreator = new CosmosDatabaseCreator(CosmonautClient);
+// InitialiseCosmosStore(overriddenCollectionName);
+// }
+//
+// public CosmosStore(ICosmonautClient cosmonautClient,
+// string databaseName) : this(cosmonautClient, databaseName, string.Empty,
+// new CosmosDatabaseCreator(cosmonautClient),
+// new CosmosCollectionCreator(cosmonautClient))
+// {
+// }
+//
+// public CosmosStore(ICosmonautClient cosmonautClient,
+// string databaseName,
+// string overriddenCollectionName) : this(cosmonautClient,
+// databaseName,
+// overriddenCollectionName,
+// new CosmosDatabaseCreator(cosmonautClient),
+// new CosmosCollectionCreator(cosmonautClient))
+// {
+// }
+//
+// internal CosmosStore(ICosmonautClient cosmonautClient,
+// string databaseName,
+// string overriddenCollectionName,
+// IDatabaseCreator databaseCreator = null,
+// ICollectionCreator collectionCreator = null)
+// {
+// DatabaseName = databaseName;
+// CosmonautClient = cosmonautClient ?? throw new ArgumentNullException(nameof(cosmonautClient));
+// Settings = new CosmosStoreSettings(databaseName, cosmonautClient.DocumentClient.ServiceEndpoint.ToString(), string.Empty, cosmonautClient.DocumentClient.ConnectionPolicy);
+// if (Settings.InfiniteRetries)
+// CosmonautClient.DocumentClient.SetupInfiniteRetries();
+// if (string.IsNullOrEmpty(Settings.DatabaseName)) throw new ArgumentNullException(nameof(Settings.DatabaseName));
+// _collectionCreator = collectionCreator ?? new CosmosCollectionCreator(CosmonautClient);
+// _databaseCreator = databaseCreator ?? new CosmosDatabaseCreator(CosmonautClient);
+// InitialiseCosmosStore(overriddenCollectionName);
+// }
+//
+// public IQueryable Query(FeedOptions feedOptions = null)
+// {
+// var queryable =
+// CosmonautClient.Query(DatabaseName, CollectionName, GetFeedOptionsForQuery(feedOptions));
+//
+// return IsShared ? queryable.Where(ExpressionExtensions.SharedCollectionExpression()) : queryable;
+// }
+//
+// public IQueryable Query(string sql, object parameters = null, FeedOptions feedOptions = null,
+// CancellationToken cancellationToken = default)
+// {
+// var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
+// return CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
+// }
+//
+// public async Task QuerySingleAsync(string sql, object parameters = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+// {
+// var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
+// var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
+// return await queryable.SingleOrDefaultAsync(cancellationToken);
+// }
+//
+// public async Task QuerySingleAsync(string sql, object parameters = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+// {
+// var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
+// var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
+// return await queryable.SingleOrDefaultAsync(cancellationToken);
+// }
+//
+// public async Task> QueryMultipleAsync(string sql, object parameters = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+// {
+// var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
+// var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
+// return await queryable.ToListAsync(cancellationToken);
+// }
+//
+// public async Task> QueryMultipleAsync(string sql, object parameters = null, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+// {
+// var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
+// var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
+// return await queryable.ToListAsync(cancellationToken);
+// }
+//
+// public IQueryable Query(string sql, IDictionary parameters, FeedOptions feedOptions = null,
+// CancellationToken cancellationToken = default)
+// {
+// var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
+// return CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
+// }
+//
+// public async Task QuerySingleAsync(string sql, IDictionary parameters, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+// {
+// var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
+// var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
+// return await queryable.SingleOrDefaultAsync(cancellationToken);
+// }
+//
+// public async Task QuerySingleAsync(string sql, IDictionary parameters, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+// {
+// var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
+// var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
+// return await queryable.SingleOrDefaultAsync(cancellationToken);
+// }
+//
+// public async Task> QueryMultipleAsync(string sql, IDictionary parameters, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+// {
+// var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
+// var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
+// return await queryable.ToListAsync(cancellationToken);
+// }
+//
+// public async Task> QueryMultipleAsync(string sql, IDictionary parameters, FeedOptions feedOptions = null, CancellationToken cancellationToken = default)
+// {
+// var collectionSharingFriendlySql = sql.EnsureQueryIsCollectionSharingFriendly();
+// var queryable = CosmonautClient.Query(DatabaseName, CollectionName, collectionSharingFriendlySql, parameters, GetFeedOptionsForQuery(feedOptions));
+// return await queryable.ToListAsync(cancellationToken);
+// }
+//
+// public async Task> AddAsync(TEntity entity, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
+// {
+// return await CosmonautClient.CreateDocumentAsync(DatabaseName, CollectionName, entity,
+// GetRequestOptions(requestOptions, entity), cancellationToken);
+// }
+//
+// public async Task> AddRangeAsync(IEnumerable entities, Func requestOptions = null, CancellationToken cancellationToken = default)
+// {
+// return await ExecuteMultiOperationAsync(entities, x => AddAsync(x, requestOptions?.Invoke(x), cancellationToken));
+// }
+//
+// public async Task> RemoveAsync(
+// Expression> predicate,
+// FeedOptions feedOptions = null,
+// Func requestOptions = null,
+// CancellationToken cancellationToken = default)
+// {
+// var entitiesToRemove = await Query(GetFeedOptionsForQuery(feedOptions)).Where(predicate).ToListAsync(cancellationToken);
+// return await RemoveRangeAsync(entitiesToRemove, requestOptions, cancellationToken);
+// }
+//
+// public async Task> RemoveAsync(TEntity entity, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
+// {
+// entity.ValidateEntityForCosmosDb();
+// var documentId = entity.GetDocumentId();
+// return await CosmonautClient.DeleteDocumentAsync(DatabaseName, CollectionName, documentId,
+// GetRequestOptions(requestOptions, entity), cancellationToken).ExecuteCosmosCommand(entity);
+// }
+//
+// public async Task> RemoveRangeAsync(IEnumerable entities, Func requestOptions = null, CancellationToken cancellationToken = default)
+// {
+// return await ExecuteMultiOperationAsync(entities, x => RemoveAsync(x, requestOptions?.Invoke(x), cancellationToken));
+// }
+//
+// public async Task> UpdateAsync(TEntity entity, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
+// {
+// entity.ValidateEntityForCosmosDb();
+// requestOptions = GetRequestOptions(requestOptions, entity);
+// var document = entity.ToCosmonautDocument(requestOptions?.JsonSerializerSettings ?? Settings.JsonSerializerSettings);
+// return await CosmonautClient.UpdateDocumentAsync(DatabaseName, CollectionName, document,
+// requestOptions, cancellationToken).ExecuteCosmosCommand(entity);
+// }
+//
+// public async Task> UpdateRangeAsync(IEnumerable entities, Func requestOptions = null, CancellationToken cancellationToken = default)
+// {
+// return await ExecuteMultiOperationAsync(entities, x => UpdateAsync(x, requestOptions?.Invoke(x), cancellationToken));
+// }
+//
+// public async Task> UpsertAsync(TEntity entity, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
+// {
+// requestOptions = GetRequestOptions(requestOptions, entity);
+// var document = entity.ToCosmonautDocument(requestOptions?.JsonSerializerSettings ?? Settings.JsonSerializerSettings);
+// return await CosmonautClient.UpsertDocumentAsync(DatabaseName, CollectionName, document,
+// requestOptions, cancellationToken).ExecuteCosmosCommand(entity);
+// }
+//
+// public async Task> UpsertRangeAsync(IEnumerable entities, Func requestOptions = null, CancellationToken cancellationToken = default)
+// {
+// return await ExecuteMultiOperationAsync(entities, x => UpsertAsync(x, requestOptions?.Invoke(x), cancellationToken));
+// }
+//
+// public async Task> RemoveByIdAsync(string id, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
+// {
+// var response = await CosmonautClient.DeleteDocumentAsync(DatabaseName, CollectionName, id,
+// GetRequestOptions(id, requestOptions), cancellationToken);
+// return new CosmosResponse(response);
+// }
+//
+// public async Task> RemoveByIdAsync(string id, object partitionKeyValue, CancellationToken cancellationToken = default)
+// {
+// var requestOptions = partitionKeyValue != null
+// ? new RequestOptions { PartitionKey = new PartitionKey(partitionKeyValue) }
+// : null;
+//
+// return await RemoveByIdAsync(id, requestOptions, cancellationToken);
+// }
+//
+// public async Task FindAsync(string id, RequestOptions requestOptions = null, CancellationToken cancellationToken = default)
+// {
+// return await CosmonautClient.GetDocumentAsync(DatabaseName, CollectionName, id,
+// GetRequestOptions(id, requestOptions), cancellationToken);
+// }
+//
+// public async Task FindAsync(string id, object partitionKeyValue, CancellationToken cancellationToken = default)
+// {
+// var requestOptions = partitionKeyValue != null
+// ? new RequestOptions { PartitionKey = new PartitionKey(partitionKeyValue) }
+// : null;
+// return await FindAsync(id, requestOptions, cancellationToken);
+// }
+//
+// public async Task EnsureInfrastructureProvisionedAsync()
+// {
+// var databaseCreated =
+// await _databaseCreator.EnsureCreatedAsync(DatabaseName, Settings.DefaultDatabaseThroughput);
+// var collectionCreated = await _collectionCreator.EnsureCreatedAsync(DatabaseName, CollectionName,
+// Settings.DefaultCollectionThroughput, Settings.JsonSerializerSettings, Settings.IndexingPolicy, Settings.OnDatabaseThroughput, Settings.UniqueKeyPolicy);
+//
+// return databaseCreated && collectionCreated;
+// }
+//
+// private void InitialiseCosmosStore(string overridenCollectionName)
+// {
+// IsShared = typeof(TEntity).UsesSharedCollection();
+// CollectionName = GetCosmosStoreCollectionName(overridenCollectionName);
+//
+// if (Settings.ProvisionInfrastructureIfMissing)
+// {
+// EnsureInfrastructureProvisionedAsync().GetAwaiter().GetResult();
+// }
+//
+// Settings.JsonSerializerSettings = CosmonautClient.DocumentClient.GetJsonSerializerSettingsFromClient();
+// }
+//
+// private string GetCosmosStoreCollectionName(string overridenCollectionName)
+// {
+// var hasOverridenName = !string.IsNullOrEmpty(overridenCollectionName);
+// return IsShared
+// ? $"{Settings.CollectionPrefix ?? string.Empty}{(hasOverridenName ? overridenCollectionName : typeof(TEntity).GetSharedCollectionName())}"
+// : $"{Settings.CollectionPrefix ?? string.Empty}{(hasOverridenName ? overridenCollectionName : typeof(TEntity).GetCollectionName())}";
+// }
+//
+// private async Task> ExecuteMultiOperationAsync(IEnumerable entities,
+// Func>> operationFunc)
+// {
+// var multipleResponse = new CosmosMultipleResponse();
+//
+// var entitiesList = entities.ToList();
+// if (!entitiesList.Any())
+// return multipleResponse;
+//
+// var results = (await entitiesList.Select(operationFunc).WhenAllTasksAsync()).ToList();
+// multipleResponse.SuccessfulEntities.AddRange(results.Where(x => x.IsSuccess));
+// multipleResponse.FailedEntities.AddRange(results.Where(x => !x.IsSuccess));
+// return multipleResponse;
+// }
+//
+// private RequestOptions GetRequestOptions(RequestOptions requestOptions, TEntity entity)
+// {
+// var partitionKeyValue = entity.GetPartitionKeyValueForEntity();
+// if (requestOptions == null)
+// {
+// return partitionKeyValue != null ? new RequestOptions
+// {
+// PartitionKey = partitionKeyValue
+// } : null;
+// }
+//
+// requestOptions.PartitionKey = partitionKeyValue;
+// return requestOptions;
+// }
+//
+// private RequestOptions GetRequestOptions(string id, RequestOptions requestOptions)
+// {
+// var partitionKeyDefinition = typeof(TEntity).GetPartitionKeyDefinitionForEntity(requestOptions?.JsonSerializerSettings ?? Settings.JsonSerializerSettings);
+// var partitionKeyIsId = partitionKeyDefinition?.Paths?.SingleOrDefault()?.Equals($"/{CosmosConstants.CosmosId}") ?? false;
+// if (requestOptions == null && partitionKeyIsId)
+// {
+// return new RequestOptions
+// {
+// PartitionKey = new PartitionKey(id)
+// };
+// }
+//
+// if (requestOptions != null && partitionKeyIsId)
+// requestOptions.PartitionKey = new PartitionKey(id);
+//
+// return requestOptions;
+// }
+//
+// private FeedOptions GetFeedOptionsForQuery(FeedOptions feedOptions)
+// {
+// var shouldEnablePartitionQuery = (typeof(TEntity).HasPartitionKey() && feedOptions?.PartitionKey == null)
+// || (feedOptions != null && feedOptions.EnableCrossPartitionQuery);
+//
+// if (feedOptions == null)
+// {
+// return new FeedOptions
+// {
+// EnableCrossPartitionQuery = shouldEnablePartitionQuery
+// };
+// }
+//
+// feedOptions.EnableCrossPartitionQuery = shouldEnablePartitionQuery;
+// return feedOptions;
+// }
}
}
\ No newline at end of file
diff --git a/src/Cosmonaut/CosmosStoreSettings.cs b/src/Cosmonaut/CosmosStoreSettings.cs
index e6178d1..0e1ca12 100644
--- a/src/Cosmonaut/CosmosStoreSettings.cs
+++ b/src/Cosmonaut/CosmosStoreSettings.cs
@@ -1,7 +1,6 @@
using System;
using Cosmonaut.Configuration;
-using Microsoft.Azure.Documents;
-using Microsoft.Azure.Documents.Client;
+using Microsoft.Azure.Cosmos;
using Newtonsoft.Json;
namespace Cosmonaut
@@ -14,7 +13,7 @@ public class CosmosStoreSettings
public Uri EndpointUrl { get; }
- public ConnectionPolicy ConnectionPolicy { get; set; }
+ public ConnectionMode ConnectionMode { get; set; }
public ConsistencyLevel? ConsistencyLevel { get; set; } = null;
@@ -28,7 +27,7 @@ public class CosmosStoreSettings
public ThroughputBehaviour OnDatabaseThroughput { get; set; } = ThroughputBehaviour.UseDatabaseThroughput;
- public JsonSerializerSettings JsonSerializerSettings { get; set; }
+ public CosmosSerializer CosmosSerializer { get; set; }
public bool InfiniteRetries { get; set; } = true;
@@ -58,13 +57,13 @@ public CosmosStoreSettings(
string databaseName,
string endpointUrl,
string authKey,
- ConnectionPolicy connectionPolicy = null,
+ ConnectionMode connectionMode = ConnectionMode.Direct,
IndexingPolicy indexingPolicy = null,
int defaultCollectionThroughput = CosmosConstants.MinimumCosmosThroughput)
: this(databaseName,
new Uri(endpointUrl),
authKey,
- connectionPolicy,
+ connectionMode,
indexingPolicy,
defaultCollectionThroughput)
{
@@ -74,14 +73,14 @@ public CosmosStoreSettings(
string databaseName,
Uri endpointUrl,
string authKey,
- ConnectionPolicy connectionPolicy = null,
+ ConnectionMode connectionMode = ConnectionMode.Direct,
IndexingPolicy indexingPolicy = null,
int defaultCollectionThroughput = CosmosConstants.MinimumCosmosThroughput)
{
DatabaseName = databaseName ?? throw new ArgumentNullException(nameof(databaseName));
EndpointUrl = endpointUrl ?? throw new ArgumentNullException(nameof(endpointUrl));
AuthKey = authKey ?? throw new ArgumentNullException(nameof(authKey));
- ConnectionPolicy = connectionPolicy;
+ ConnectionMode = connectionMode;
DefaultCollectionThroughput = defaultCollectionThroughput;
IndexingPolicy = indexingPolicy ?? CosmosConstants.DefaultIndexingPolicy;
diff --git a/src/Cosmonaut/Diagnostics/CosmosEventCall.cs b/src/Cosmonaut/Diagnostics/CosmosEventCall.cs
index 4a2261d..3dc136f 100644
--- a/src/Cosmonaut/Diagnostics/CosmosEventCall.cs
+++ b/src/Cosmonaut/Diagnostics/CosmosEventCall.cs
@@ -5,8 +5,7 @@
using System.Net;
using System.Reflection;
using System.Threading.Tasks;
-using Microsoft.Azure.Documents;
-using Microsoft.Azure.Documents.Client;
+using Microsoft.Azure.Cosmos;
using Newtonsoft.Json;
namespace Cosmonaut.Diagnostics
@@ -78,8 +77,8 @@ internal async Task> InvokeAsync(Func> InvokeAsync(Func> InvokeAsync(Func>> eventCall)
+ internal async Task> InvokeAsync(Func>> eventCall)
{
if (!CosmosEventSource.EventSource.IsEnabled())
{
@@ -105,7 +104,7 @@ internal async Task> InvokeAsync