public async Task ExecuteAsync(IDocumentClient client, DocumentCollection collection, Uri relativeCollectionUri) { EnsureArg.IsNotNull(client, nameof(client)); EnsureArg.IsNotNull(collection, nameof(collection)); EnsureArg.IsNotNull(relativeCollectionUri, nameof(relativeCollectionUri)); // Detect if registry has been initialized var query = _queryFactory.Create <dynamic>( client, new CosmosQueryContext( relativeCollectionUri, new SqlQuerySpec($"SELECT TOP 1 * FROM c where c.{KnownDocumentProperties.PartitionKey} = '{SearchParameterStatusWrapper.SearchParameterStatusPartitionKey}'"))); var results = await query.ExecuteNextAsync(); if (!results.Any()) { var statuses = await _filebasedRegistry.GetSearchParameterStatuses(); foreach (SearchParameterStatusWrapper status in statuses.Select(x => x.ToSearchParameterStatusWrapper())) { await client.UpsertDocumentAsync(relativeCollectionUri, status); } } }
public async Task <IReadOnlyCollection <ResourceSearchParameterStatus> > GetSearchParameterStatuses() { using var cancellationSource = new CancellationTokenSource(TimeSpan.FromMinutes(1)); var parameterStatus = new List <ResourceSearchParameterStatus>(); using IScoped <IDocumentClient> clientScope = _documentClientFactory.Invoke(); do { var query = _queryFactory.Create <SearchParameterStatusWrapper>( clientScope.Value, new CosmosQueryContext( CollectionUri, new SqlQuerySpec("select * from c"), new FeedOptions { PartitionKey = new PartitionKey(SearchParameterStatusWrapper.SearchParameterStatusPartitionKey), })); do { FeedResponse <SearchParameterStatusWrapper> results = await query.ExecuteNextAsync <SearchParameterStatusWrapper>(); parameterStatus.AddRange(results.Select(x => x.ToSearchParameterStatus())); }while (query.HasMoreResults); if (!parameterStatus.Any()) { await Task.Delay(TimeSpan.FromSeconds(1), cancellationSource.Token); } }while (!parameterStatus.Any() && !cancellationSource.IsCancellationRequested); return(parameterStatus); }
public async Task <IReadOnlyCollection <ResourceSearchParameterStatus> > GetSearchParameterStatuses() { var parameterStatus = new List <ResourceSearchParameterStatus>(); using var clientScope = _documentClientFactory.Invoke(); var query = _queryFactory.Create <SearchParameterStatusWrapper>( clientScope.Value, new CosmosQueryContext( CollectionUri, new SqlQuerySpec("select * from c"), new FeedOptions { PartitionKey = new PartitionKey(SearchParameterStatusWrapper.SearchParameterStatusPartitionKey), })); do { FeedResponse <SearchParameterStatusWrapper> results = await query.ExecuteNextAsync <SearchParameterStatusWrapper>(); parameterStatus.AddRange(results .Select(x => x.ToSearchParameterStatus())); }while (query.HasMoreResults); return(parameterStatus); }
internal IDocumentQuery <T> CreateDocumentQuery <T>( SqlQuerySpec sqlQuerySpec, FeedOptions feedOptions = null) { EnsureArg.IsNotNull(sqlQuerySpec, nameof(sqlQuerySpec)); CosmosQueryContext context = new CosmosQueryContext(_collectionUri, sqlQuerySpec, feedOptions); return(_cosmosDocumentQueryFactory.Create <T>(_documentClient, context)); }
public async Task GivenARegistryInitializer_WhenDatabaseIsNew_SearchParametersShouldBeUpserted() { IDocumentQuery <dynamic> documentQuery = Substitute.For <IDocumentQuery <dynamic> >(); _cosmosDocumentQueryFactory.Create <dynamic>(Arg.Any <IDocumentClient>(), Arg.Any <CosmosQueryContext>()) .Returns(documentQuery); documentQuery .ExecuteNextAsync() .Returns(new FeedResponse <dynamic>(new dynamic[0])); IDocumentClient documentClient = Substitute.For <IDocumentClient>(); var relativeCollectionUri = new Uri("/collection1", UriKind.Relative); await _initializer.ExecuteAsync(documentClient, new DocumentCollection(), relativeCollectionUri); await documentClient.Received().UpsertDocumentAsync( relativeCollectionUri, Arg.Is <SearchParameterStatusWrapper>(x => x.Uri == _testParameterUri)); }
internal async Task <FeedResponse <T> > ExecuteDocumentQueryAsync <T>(SqlQuerySpec sqlQuerySpec, FeedOptions feedOptions, CancellationToken cancellationToken) { EnsureArg.IsNotNull(sqlQuerySpec, nameof(sqlQuerySpec)); var context = new CosmosQueryContext(CollectionUri, sqlQuerySpec, feedOptions); IDocumentQuery <T> documentQuery = _cosmosDocumentQueryFactory.Create <T>(_documentClientScope.Value, context); using (documentQuery) { return(await documentQuery.ExecuteNextAsync <T>(cancellationToken)); } }