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));
            }
        }
Exemplo n.º 2
0
        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));
            }
        }