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