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)));
        }