Ejemplo n.º 1
0
        internal static QueryResponseCore CreateSuccess(
            IReadOnlyList <CosmosElement> result,
            double requestCharge,
            string activityId,
            string queryMetricsText,
            IReadOnlyDictionary <string, QueryMetrics> queryMetrics,
            ClientSideRequestStatistics requestStatistics,
            long responseLengthBytes,
            string disallowContinuationTokenMessage,
            string continuationToken)
        {
            QueryResponseCore cosmosQueryResponse = new QueryResponseCore(
                result: result,
                isSuccess: true,
                statusCode: HttpStatusCode.OK,
                requestCharge: requestCharge,
                activityId: activityId,
                queryMetricsText: queryMetricsText,
                queryMetrics: queryMetrics,
                requestStatistics: requestStatistics,
                responseLengthBytes: responseLengthBytes,
                disallowContinuationTokenMessage: disallowContinuationTokenMessage,
                continuationToken: continuationToken,
                errorMessage: null,
                subStatusCode: null);

            return(cosmosQueryResponse);
        }
Ejemplo n.º 2
0
 private QueryResponseCore(
     IReadOnlyList <CosmosElement> result,
     bool isSuccess,
     HttpStatusCode statusCode,
     double requestCharge,
     string activityId,
     string queryMetricsText,
     IReadOnlyDictionary <string, QueryMetrics> queryMetrics,
     ClientSideRequestStatistics requestStatistics,
     long responseLengthBytes,
     string disallowContinuationTokenMessage,
     string continuationToken,
     string errorMessage,
     SubStatusCodes?subStatusCode)
 {
     this.IsSuccess           = isSuccess;
     this.CosmosElements      = result;
     this.StatusCode          = statusCode;
     this.ActivityId          = activityId;
     this.QueryMetricsText    = queryMetricsText;
     this.QueryMetrics        = queryMetrics;
     this.ResponseLengthBytes = responseLengthBytes;
     this.RequestCharge       = requestCharge;
     this.DisallowContinuationTokenMessage = disallowContinuationTokenMessage;
     this.ContinuationToken = continuationToken;
     this.ErrorMessage      = errorMessage;
     this.SubStatusCode     = subStatusCode;
     this.RequestStatistics = requestStatistics;
 }
Ejemplo n.º 3
0
        /// <summary>
        /// Drains at most 'maxElements' documents from the AggregateDocumentQueryExecutionComponent.
        /// </summary>
        /// <param name="maxElements">This value is ignored, since the aggregates are aggregated for you.</param>
        /// <param name="token">The cancellation token.</param>
        /// <returns>The aggregate result after all the continuations have been followed.</returns>
        /// <remarks>
        /// Note that this functions follows all continuations meaning that it won't return until all continuations are drained.
        /// This means that if you have a long running query this function will take a very long time to return.
        /// </remarks>
        public override async Task <QueryResponseCore> DrainAsync(int maxElements, CancellationToken token)
        {
            // Note-2016-10-25-felixfan: Given what we support now, we should expect to return only 1 document.
            // Note-2019-07-11-brchon: We can return empty pages until all the documents are drained,
            // but then we will have to design a continuation token.

            double     requestCharge       = 0;
            long       responseLengthBytes = 0;
            List <Uri> replicaUris         = new List <Uri>();
            ClientSideRequestStatistics requestStatistics       = new ClientSideRequestStatistics();
            PartitionedQueryMetrics     partitionedQueryMetrics = new PartitionedQueryMetrics();

            while (!this.IsDone)
            {
                QueryResponseCore result = await base.DrainAsync(int.MaxValue, token);

                if (!result.IsSuccess)
                {
                    return(result);
                }

                requestCharge       += result.RequestCharge;
                responseLengthBytes += result.ResponseLengthBytes;
                // DEVNOTE: Add when query metrics is supported
                // partitionedQueryMetrics += new PartitionedQueryMetrics(results.QueryMetrics);
                if (result.RequestStatistics != null)
                {
                    replicaUris.AddRange(result.RequestStatistics.ContactedReplicas);
                }

                foreach (CosmosElement element in result.CosmosElements)
                {
                    RewrittenAggregateProjections rewrittenAggregateProjections = new RewrittenAggregateProjections(
                        this.isValueAggregateQuery,
                        element);
                    this.singleGroupAggregator.AddValues(rewrittenAggregateProjections.Payload);
                }
            }

            List <CosmosElement> finalResult       = new List <CosmosElement>();
            CosmosElement        aggregationResult = this.singleGroupAggregator.GetResult();

            if (aggregationResult != null)
            {
                finalResult.Add(aggregationResult);
            }

            // The replicaUris may have duplicates.
            requestStatistics.ContactedReplicas.AddRange(replicaUris);

            return(QueryResponseCore.CreateSuccess(
                       result: finalResult,
                       continuationToken: null,
                       activityId: null,
                       disallowContinuationTokenMessage: null,
                       requestCharge: requestCharge,
                       queryMetricsText: null,
                       queryMetrics: this.GetQueryMetrics(),
                       requestStatistics: requestStatistics,
                       responseLengthBytes: responseLengthBytes));
        }