
com.azure.cosmos.implementation.query.OrderByDocumentProducer Maven / Gradle / Ivy
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.cosmos.implementation.query;
import com.azure.cosmos.implementation.query.orderbyquery.OrderByRowResult;
import com.azure.cosmos.implementation.query.orderbyquery.OrderbyRowComparer;
import com.azure.cosmos.BridgeInternal;
import com.azure.cosmos.FeedOptions;
import com.azure.cosmos.FeedResponse;
import com.azure.cosmos.Resource;
import com.azure.cosmos.implementation.HttpConstants;
import com.azure.cosmos.implementation.IDocumentClientRetryPolicy;
import com.azure.cosmos.implementation.PartitionKeyRange;
import com.azure.cosmos.implementation.QueryMetrics;
import com.azure.cosmos.implementation.RequestChargeTracker;
import com.azure.cosmos.implementation.RxDocumentServiceRequest;
import com.azure.cosmos.implementation.Utils;
import reactor.core.publisher.Flux;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.function.Function;
class OrderByDocumentProducer extends DocumentProducer {
private final OrderbyRowComparer consumeComparer;
private final Map targetRangeToOrderByContinuationTokenMap;
OrderByDocumentProducer(
OrderbyRowComparer consumeComparer,
IDocumentQueryClient client,
String collectionResourceId,
FeedOptions feedOptions,
TriFunction createRequestFunc,
Function>> executeRequestFunc,
PartitionKeyRange targetRange,
String collectionLink,
Callable createRetryPolicyFunc,
Class resourceType,
UUID correlatedActivityId,
int initialPageSize,
String initialContinuationToken,
int top,
Map targetRangeToOrderByContinuationTokenMap) {
super(client, collectionResourceId, feedOptions, createRequestFunc, executeRequestFunc, targetRange, collectionLink,
createRetryPolicyFunc, resourceType, correlatedActivityId, initialPageSize, initialContinuationToken, top);
this.consumeComparer = consumeComparer;
this.targetRangeToOrderByContinuationTokenMap = targetRangeToOrderByContinuationTokenMap;
}
protected Flux produceOnSplit(Flux> replacementProducers) {
return replacementProducers.collectList().flux().flatMap(documentProducers -> {
RequestChargeTracker tracker = new RequestChargeTracker();
Map queryMetricsMap = new HashMap<>();
return OrderByUtils.orderedMerge(resourceType, consumeComparer, tracker, documentProducers, queryMetricsMap,
targetRangeToOrderByContinuationTokenMap)
.map(orderByQueryResult -> resultPageFrom(tracker, orderByQueryResult));
});
}
@SuppressWarnings("unchecked")
private DocumentProducerFeedResponse resultPageFrom(RequestChargeTracker tracker, OrderByRowResult row) {
double requestCharge = tracker.getAndResetCharge();
Map headers = Utils.immutableMapOf(HttpConstants.HttpHeaders.REQUEST_CHARGE, String.valueOf(requestCharge));
FeedResponse fr = BridgeInternal.createFeedResponse(Collections.singletonList((T) row), headers);
return new DocumentProducerFeedResponse(fr, row.getSourcePartitionKeyRange());
}
protected DocumentProducer createChildDocumentProducerOnSplit(
PartitionKeyRange targetRange,
String initialContinuationToken) {
return new OrderByDocumentProducer<>(
consumeComparer,
client,
collectionRid,
feedOptions,
createRequestFunc,
executeRequestFuncWithRetries,
targetRange,
collectionLink,
createRetryPolicyFunc,
resourceType ,
correlatedActivityId,
pageSize,
initialContinuationToken,
top,
this.targetRangeToOrderByContinuationTokenMap);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy