public static async Task <TryCatch <CosmosQueryExecutionContext> > TryCreateAsync( ExecutionEnvironment executionEnvironment, CosmosQueryContext queryContext, CosmosCrossPartitionQueryExecutionContext.CrossPartitionInitParams initParams, string requestContinuationToken, CancellationToken cancellationToken) { if (queryContext == null) { throw new ArgumentNullException(nameof(initParams)); } cancellationToken.ThrowIfCancellationRequested(); QueryInfo queryInfo = initParams.PartitionedQueryExecutionInfo.QueryInfo; int initialPageSize = initParams.InitialPageSize; if (queryInfo.HasGroupBy) { // The query will block until all groupings are gathered so we might as well speed up the process. initParams = new CosmosCrossPartitionQueryExecutionContext.CrossPartitionInitParams( sqlQuerySpec: initParams.SqlQuerySpec, collectionRid: initParams.CollectionRid, partitionedQueryExecutionInfo: initParams.PartitionedQueryExecutionInfo, partitionKeyRanges: initParams.PartitionKeyRanges, initialPageSize: int.MaxValue, maxConcurrency: initParams.MaxConcurrency, maxItemCount: int.MaxValue, maxBufferedItemCount: initParams.MaxBufferedItemCount, returnResultsInDeterministicOrder: true, testSettings: initParams.TestSettings); } Task <TryCatch <IDocumentQueryExecutionComponent> > tryCreateOrderByComponentAsync(string continuationToken) { return(CosmosOrderByItemQueryExecutionContext.TryCreateAsync( queryContext, initParams, continuationToken, cancellationToken)); } Task <TryCatch <IDocumentQueryExecutionComponent> > tryCreateParallelComponentAsync(string continuationToken) { return(CosmosParallelItemQueryExecutionContext.TryCreateAsync( queryContext, initParams, continuationToken, cancellationToken)); } Func <string, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreatePipelineAsync; if (queryInfo.HasOrderBy) { tryCreatePipelineAsync = tryCreateOrderByComponentAsync; } else { tryCreatePipelineAsync = tryCreateParallelComponentAsync; } if (queryInfo.HasAggregates && !queryInfo.HasGroupBy) { Func <string, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync = tryCreatePipelineAsync; tryCreatePipelineAsync = async(continuationToken) => { return(await AggregateDocumentQueryExecutionComponent.TryCreateAsync( executionEnvironment, queryInfo.Aggregates, queryInfo.GroupByAliasToAggregateType, queryInfo.GroupByAliases, queryInfo.HasSelectValue, continuationToken, tryCreateSourceAsync)); }; } if (queryInfo.HasDistinct) { Func <string, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync = tryCreatePipelineAsync; tryCreatePipelineAsync = async(continuationToken) => { return(await DistinctDocumentQueryExecutionComponent.TryCreateAsync( executionEnvironment, continuationToken, tryCreateSourceAsync, queryInfo.DistinctType)); }; } if (queryInfo.HasGroupBy) { Func <string, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync = tryCreatePipelineAsync; tryCreatePipelineAsync = async(continuationToken) => { return(await GroupByDocumentQueryExecutionComponent.TryCreateAsync( executionEnvironment, continuationToken, tryCreateSourceAsync, queryInfo.GroupByAliasToAggregateType, queryInfo.GroupByAliases, queryInfo.HasSelectValue)); }; } if (queryInfo.HasOffset) { Func <string, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync = tryCreatePipelineAsync; tryCreatePipelineAsync = async(continuationToken) => { return(await SkipDocumentQueryExecutionComponent.TryCreateAsync( queryInfo.Offset.Value, continuationToken, tryCreateSourceAsync)); }; } if (queryInfo.HasLimit) { Func <string, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync = tryCreatePipelineAsync; tryCreatePipelineAsync = async(continuationToken) => { return(await TakeDocumentQueryExecutionComponent.TryCreateLimitDocumentQueryExecutionComponentAsync( queryInfo.Limit.Value, continuationToken, tryCreateSourceAsync)); }; } if (queryInfo.HasTop) { Func <string, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync = tryCreatePipelineAsync; tryCreatePipelineAsync = async(continuationToken) => { return(await TakeDocumentQueryExecutionComponent.TryCreateTopDocumentQueryExecutionComponentAsync( queryInfo.Top.Value, continuationToken, tryCreateSourceAsync)); }; } return((await tryCreatePipelineAsync(requestContinuationToken)) .Try <CosmosQueryExecutionContext>((source) => new PipelinedDocumentQueryExecutionContext(source, initialPageSize))); }