private static Task <TryCatch <CosmosQueryExecutionContext> > TryCreatePassthroughQueryExecutionContextAsync( CosmosQueryContext cosmosQueryContext, InputParameters inputParameters, PartitionedQueryExecutionInfo partitionedQueryExecutionInfo, List <Documents.PartitionKeyRange> targetRanges, string collectionRid, CancellationToken cancellationToken) { CosmosCrossPartitionQueryExecutionContext.CrossPartitionInitParams initParams = new CosmosCrossPartitionQueryExecutionContext.CrossPartitionInitParams( sqlQuerySpec: inputParameters.SqlQuerySpec, collectionRid: collectionRid, partitionedQueryExecutionInfo: partitionedQueryExecutionInfo, partitionKeyRanges: targetRanges, initialPageSize: inputParameters.MaxItemCount, maxConcurrency: inputParameters.MaxConcurrency, maxItemCount: inputParameters.MaxItemCount, maxBufferedItemCount: inputParameters.MaxBufferedItemCount, returnResultsInDeterministicOrder: inputParameters.ReturnResultsInDeterministicOrder, testSettings: inputParameters.TestInjections); return(PipelinedDocumentQueryExecutionContext.TryCreatePassthroughAsync( inputParameters.ExecutionEnvironment, cosmosQueryContext, initParams, inputParameters.InitialUserContinuationToken, cancellationToken)); }
private static async Task <TryCatch <CosmosQueryExecutionContext> > TryCreateSpecializedDocumentQueryExecutionContextAsync( CosmosQueryContext cosmosQueryContext, InputParameters inputParameters, PartitionedQueryExecutionInfo partitionedQueryExecutionInfo, List <Documents.PartitionKeyRange> targetRanges, string collectionRid, CancellationToken cancellationToken) { QueryInfo queryInfo = partitionedQueryExecutionInfo.QueryInfo; bool getLazyFeedResponse = queryInfo.HasTop; // We need to compute the optimal initial page size for order-by queries long optimalPageSize = inputParameters.MaxItemCount; if (queryInfo.HasOrderBy) { int top; if (queryInfo.HasTop && (top = partitionedQueryExecutionInfo.QueryInfo.Top.Value) > 0) { // All partitions should initially fetch about 1/nth of the top value. long pageSizeWithTop = (long)Math.Min( Math.Ceiling(top / (double)targetRanges.Count) * CosmosQueryExecutionContextFactory.PageSizeFactorForTop, top); optimalPageSize = Math.Min(pageSizeWithTop, optimalPageSize); } else if (cosmosQueryContext.IsContinuationExpected) { optimalPageSize = (long)Math.Min( Math.Ceiling(optimalPageSize / (double)targetRanges.Count) * CosmosQueryExecutionContextFactory.PageSizeFactorForTop, optimalPageSize); } } Debug.Assert( (optimalPageSize > 0) && (optimalPageSize <= int.MaxValue), $"Invalid MaxItemCount {optimalPageSize}"); CosmosCrossPartitionQueryExecutionContext.CrossPartitionInitParams initParams = new CosmosCrossPartitionQueryExecutionContext.CrossPartitionInitParams( sqlQuerySpec: inputParameters.SqlQuerySpec, collectionRid: collectionRid, partitionedQueryExecutionInfo: partitionedQueryExecutionInfo, partitionKeyRanges: targetRanges, initialPageSize: (int)optimalPageSize, maxConcurrency: inputParameters.MaxConcurrency, maxItemCount: inputParameters.MaxItemCount, maxBufferedItemCount: inputParameters.MaxBufferedItemCount, returnResultsInDeterministicOrder: inputParameters.ReturnResultsInDeterministicOrder, testSettings: inputParameters.TestInjections); return(await PipelinedDocumentQueryExecutionContext.TryCreateAsync( inputParameters.ExecutionEnvironment, cosmosQueryContext, initParams, inputParameters.InitialUserContinuationToken, cancellationToken)); }