public static async Task <TryCatch <CosmosQueryExecutionContext> > TryCreateFromPartitionedQuerExecutionInfoAsync(
            PartitionedQueryExecutionInfo partitionedQueryExecutionInfo,
            ContainerQueryProperties containerQueryProperties,
            CosmosQueryContext cosmosQueryContext,
            InputParameters inputParameters,
            CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            List <Documents.PartitionKeyRange> targetRanges = await CosmosQueryExecutionContextFactory.GetTargetPartitionKeyRangesAsync(
                cosmosQueryContext.QueryClient,
                cosmosQueryContext.ResourceLink.OriginalString,
                partitionedQueryExecutionInfo,
                containerQueryProperties,
                inputParameters.Properties);

            if (!string.IsNullOrEmpty(partitionedQueryExecutionInfo.QueryInfo.RewrittenQuery))
            {
                // We need pass down the rewritten query.
                SqlQuerySpec rewrittenQuerySpec = new SqlQuerySpec()
                {
                    QueryText  = partitionedQueryExecutionInfo.QueryInfo.RewrittenQuery,
                    Parameters = inputParameters.SqlQuerySpec.Parameters
                };

                inputParameters = new InputParameters(
                    rewrittenQuerySpec,
                    inputParameters.InitialUserContinuationToken,
                    inputParameters.MaxConcurrency,
                    inputParameters.MaxItemCount,
                    inputParameters.MaxBufferedItemCount,
                    inputParameters.PartitionKey,
                    inputParameters.Properties,
                    inputParameters.PartitionedQueryExecutionInfo,
                    inputParameters.ExecutionEnvironment,
                    inputParameters.ReturnResultsInDeterministicOrder,
                    inputParameters.TestInjections);
            }

            return(await CosmosQueryExecutionContextFactory.TryCreateSpecializedDocumentQueryExecutionContextAsync(
                       cosmosQueryContext,
                       inputParameters,
                       partitionedQueryExecutionInfo,
                       targetRanges,
                       containerQueryProperties.ResourceId,
                       cancellationToken));
        }
Beispiel #2
0
        public static async Task <TryCatch <CosmosQueryExecutionContext> > TryCreateFromPartitionedQuerExecutionInfoAsync(
            PartitionedQueryExecutionInfo partitionedQueryExecutionInfo,
            ContainerQueryProperties containerQueryProperties,
            CosmosQueryContext cosmosQueryContext,
            InputParameters inputParameters,
            CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            List <Documents.PartitionKeyRange> targetRanges = await CosmosQueryExecutionContextFactory.GetTargetPartitionKeyRangesAsync(
                cosmosQueryContext.QueryClient,
                cosmosQueryContext.ResourceLink,
                partitionedQueryExecutionInfo,
                containerQueryProperties,
                inputParameters.Properties,
                inputParameters.InitialFeedRange);

            bool singleLogicalPartitionKeyQuery = inputParameters.PartitionKey.HasValue ||
                                                  ((partitionedQueryExecutionInfo.QueryRanges.Count == 1) &&
                                                   partitionedQueryExecutionInfo.QueryRanges[0].IsSingleValue);
            bool serverStreamingQuery = !partitionedQueryExecutionInfo.QueryInfo.HasAggregates &&
                                        !partitionedQueryExecutionInfo.QueryInfo.HasDistinct &&
                                        !partitionedQueryExecutionInfo.QueryInfo.HasGroupBy;
            bool streamingSinglePartitionQuery = singleLogicalPartitionKeyQuery && serverStreamingQuery;

            bool clientStreamingQuery =
                serverStreamingQuery &&
                !partitionedQueryExecutionInfo.QueryInfo.HasOrderBy &&
                !partitionedQueryExecutionInfo.QueryInfo.HasTop &&
                !partitionedQueryExecutionInfo.QueryInfo.HasLimit &&
                !partitionedQueryExecutionInfo.QueryInfo.HasOffset;
            bool streamingCrossContinuationQuery = !singleLogicalPartitionKeyQuery && clientStreamingQuery;

            bool createPassthoughQuery = streamingSinglePartitionQuery || streamingCrossContinuationQuery;

            Task <TryCatch <CosmosQueryExecutionContext> > tryCreateContextTask;

            if (createPassthoughQuery)
            {
                TestInjections.ResponseStats responseStats = inputParameters?.TestInjections?.Stats;
                if (responseStats != null)
                {
                    responseStats.PipelineType = TestInjections.PipelineType.Passthrough;
                }

                tryCreateContextTask = CosmosQueryExecutionContextFactory.TryCreatePassthroughQueryExecutionContextAsync(
                    cosmosQueryContext,
                    inputParameters,
                    partitionedQueryExecutionInfo,
                    targetRanges,
                    containerQueryProperties.ResourceId,
                    cancellationToken);
            }
            else
            {
                TestInjections.ResponseStats responseStats = inputParameters?.TestInjections?.Stats;
                if (responseStats != null)
                {
                    responseStats.PipelineType = TestInjections.PipelineType.Specialized;
                }

                if (!string.IsNullOrEmpty(partitionedQueryExecutionInfo.QueryInfo.RewrittenQuery))
                {
                    // We need pass down the rewritten query.
                    SqlQuerySpec rewrittenQuerySpec = new SqlQuerySpec()
                    {
                        QueryText  = partitionedQueryExecutionInfo.QueryInfo.RewrittenQuery,
                        Parameters = inputParameters.SqlQuerySpec.Parameters
                    };

                    inputParameters = new InputParameters(
                        rewrittenQuerySpec,
                        inputParameters.InitialUserContinuationToken,
                        inputParameters.InitialFeedRange,
                        inputParameters.MaxConcurrency,
                        inputParameters.MaxItemCount,
                        inputParameters.MaxBufferedItemCount,
                        inputParameters.PartitionKey,
                        inputParameters.Properties,
                        inputParameters.PartitionedQueryExecutionInfo,
                        inputParameters.ExecutionEnvironment,
                        inputParameters.ReturnResultsInDeterministicOrder,
                        inputParameters.ForcePassthrough,
                        inputParameters.TestInjections);
                }

                tryCreateContextTask = CosmosQueryExecutionContextFactory.TryCreateSpecializedDocumentQueryExecutionContextAsync(
                    cosmosQueryContext,
                    inputParameters,
                    partitionedQueryExecutionInfo,
                    targetRanges,
                    containerQueryProperties.ResourceId,
                    cancellationToken);
            }

            return(await tryCreateContextTask);
        }