private async Task <SearchResult> ExecuteSearchAsync( SqlQuerySpec sqlQuerySpec, SearchOptions searchOptions, CancellationToken cancellationToken) { string ct = null; if (!string.IsNullOrEmpty(searchOptions.ContinuationToken)) { ct = await _continuationTokenCache.GetContinuationTokenAsync(searchOptions.ContinuationToken, cancellationToken); } var feedOptions = new FeedOptions { EnableCrossPartitionQuery = true, MaxItemCount = searchOptions.MaxItemCount, RequestContinuation = ct, }; if (searchOptions.CountOnly) { IDocumentQuery <int> documentCountQuery = _cosmosDataStore.CreateDocumentQuery <int>(sqlQuerySpec, feedOptions); using (documentCountQuery) { return(new SearchResult(Enumerable.Empty <ResourceWrapper>(), null) { TotalCount = (await documentCountQuery.ExecuteNextAsync <int>(cancellationToken)).Single(), }); } } IDocumentQuery <Document> documentQuery = _cosmosDataStore.CreateDocumentQuery <Document>( sqlQuerySpec, feedOptions); using (documentQuery) { Debug.Assert(documentQuery != null, $"The {nameof(documentQuery)} should not be null."); FeedResponse <Document> fetchedResults = await documentQuery.ExecuteNextAsync <Document>(cancellationToken); CosmosResourceWrapper[] wrappers = fetchedResults .Select(r => r.GetPropertyValue <CosmosResourceWrapper>(SearchValueConstants.RootAliasName)).ToArray(); string continuationTokenId = null; // TODO: Eventually, we will need to take a snapshot of the search and manage the continuation // tokens ourselves since there might be multiple continuation token involved depending on // the search. if (!string.IsNullOrEmpty(fetchedResults.ResponseContinuation)) { continuationTokenId = await _continuationTokenCache.SaveContinuationTokenAsync(fetchedResults.ResponseContinuation, cancellationToken); } return(new SearchResult(wrappers, continuationTokenId)); } }
private async Task <SearchResult> ExecuteSearchAsync( SqlQuerySpec sqlQuerySpec, SearchOptions searchOptions, CancellationToken cancellationToken) { var feedOptions = new FeedOptions { EnableCrossPartitionQuery = true, MaxItemCount = searchOptions.MaxItemCount, RequestContinuation = searchOptions.ContinuationToken, }; if (searchOptions.CountOnly) { IDocumentQuery <int> documentCountQuery = _cosmosDataStore.CreateDocumentQuery <int>(sqlQuerySpec, feedOptions); using (documentCountQuery) { return(new SearchResult(Enumerable.Empty <ResourceWrapper>(), null) { TotalCount = (await documentCountQuery.ExecuteNextAsync <int>(cancellationToken)).Single(), }); } } IDocumentQuery <Document> documentQuery = _cosmosDataStore.CreateDocumentQuery <Document>( sqlQuerySpec, feedOptions); using (documentQuery) { Debug.Assert(documentQuery != null, $"The {nameof(documentQuery)} should not be null."); FeedResponse <Document> fetchedResults = await documentQuery.ExecuteNextAsync <Document>(cancellationToken); CosmosResourceWrapper[] wrappers = fetchedResults .Select(r => r.GetPropertyValue <CosmosResourceWrapper>(SearchValueConstants.RootAliasName)).ToArray(); return(new SearchResult(wrappers, fetchedResults.ResponseContinuation)); } }