Ejemplo n.º 1
0
        private async Task <CosmosMultipleResponse <TEntity> > ExecuteMultiOperationAsync(IEnumerable <TEntity> entities,
                                                                                          Func <TEntity, Task <CosmosResponse <TEntity> > > operationFunc)
        {
            var entitiesList = entities.ToList();

            if (!entitiesList.Any())
            {
                return(new CosmosMultipleResponse <TEntity>());
            }

            try
            {
                var multipleResponse = await _cosmosScaler.UpscaleCollectionIfConfiguredAsSuch(entitiesList, DatabaseName, CollectionName, operationFunc);

                var results = (await entitiesList.Select(operationFunc).WhenAllTasksAsync()).ToList();
                multipleResponse.SuccessfulEntities.AddRange(results.Where(x => x.IsSuccess));
                multipleResponse.FailedEntities.AddRange(results.Where(x => !x.IsSuccess));
                await _cosmosScaler.DownscaleCollectionRequestUnitsToDefault(DatabaseName, CollectionName);

                return(multipleResponse);
            }
            catch (Exception)
            {
                await _cosmosScaler.DownscaleCollectionRequestUnitsToDefault(DatabaseName, CollectionName);

                throw;
            }
        }
Ejemplo n.º 2
0
        private async Task <CosmosMultipleResponse <TEntity> > ExecuteMultiOperationAsync(IEnumerable <TEntity> entities,
                                                                                          Func <TEntity, Task <CosmosResponse <TEntity> > > operationFunc)
        {
            var entitiesList = entities.ToList();

            if (!entitiesList.Any())
            {
                return(new CosmosMultipleResponse <TEntity>());
            }

            try
            {
                var multipleResponse = await _cosmosScaler.UpscaleCollectionIfConfiguredAsSuch(entitiesList, DatabaseName, CollectionName, operationFunc);

                var multiOperationEntitiesTasks = entitiesList.Select(operationFunc);
                var operationResult             = await HandleOperationWithRateLimitRetry(multiOperationEntitiesTasks, operationFunc);

                multipleResponse.SuccessfulEntities.AddRange(operationResult.SuccessfulEntities);
                multipleResponse.FailedEntities.AddRange(operationResult.FailedEntities);
                await _cosmosScaler.DownscaleCollectionRequestUnitsToDefault(DatabaseName, CollectionName);

                return(multipleResponse);
            }
            catch (Exception exception)
            {
                await _cosmosScaler.DownscaleCollectionRequestUnitsToDefault(DatabaseName, CollectionName);

                if (exception is DocumentClientException documentClientException)
                {
                    return(new CosmosMultipleResponse <TEntity>(documentClientException));
                }
                throw;
            }
        }