@azure/cosmos
Version:
Microsoft Azure Cosmos DB Service Node.js SDK for NOSQL API
66 lines • 3.36 kB
JavaScript
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
import { BaseContinuationTokenManager } from "./BaseContinuationTokenManager.js";
import { createCompositeQueryContinuationToken, serializeCompositeToken, parseCompositeQueryContinuationToken, convertRangeMappingToQueryRange, } from "../../documents/ContinuationToken/CompositeQueryContinuationToken.js";
/**
* Manages continuation tokens for parallel queries using multi-range aggregation.
* Uses CompositeQueryContinuationToken for range tracking across multiple partitions.
* @internal
*/
export class ParallelQueryContinuationTokenManager extends BaseContinuationTokenManager {
continuationToken;
collectionLink;
constructor(collectionLink, initialContinuationToken) {
super(initialContinuationToken);
this.collectionLink = collectionLink;
if (initialContinuationToken) {
this.continuationToken = parseCompositeQueryContinuationToken(initialContinuationToken);
}
}
processRangesForPagination(pageSize, _isResponseEmpty) {
const result = this.partitionManager.processParallelRanges(pageSize);
if (!result || !result.processedRangeMappings || result.processedRangeMappings.length === 0) {
return { endIndex: 0, processedRanges: [] };
}
const rangeMappings = result.processedRangeMappings.map((mapping) => convertRangeMappingToQueryRange(mapping));
if (!this.continuationToken) {
this.continuationToken = createCompositeQueryContinuationToken(this.collectionLink, rangeMappings);
}
else {
this.updateExistingCompositeContinuationToken(rangeMappings);
}
if (result.lastPartitionBeforeCutoff && result.lastPartitionBeforeCutoff.mapping) {
this.continuationToken.offset = result.lastPartitionBeforeCutoff.mapping.offset;
this.continuationToken.limit = result.lastPartitionBeforeCutoff.mapping.limit;
}
return { endIndex: result.endIndex, processedRanges: result.processedRanges };
}
getCurrentContinuationToken() {
return this.continuationToken;
}
getSerializationFunction() {
return serializeCompositeToken;
}
processQuerySpecificResponse(_responseResult) {
// Parallel queries don't need additional response processing
}
performQuerySpecificDataTrim(_processedRanges, _endIndex) {
// Parallel queries don't need additional cleanup
}
updateExistingCompositeContinuationToken(rangeMappings) {
for (const newRange of rangeMappings) {
// Check if this range already exists in the token
const existingRangeIndex = this.continuationToken.rangeMappings.findIndex((existingRange) => existingRange.queryRange.min === newRange.queryRange.min &&
existingRange.queryRange.max === newRange.queryRange.max);
if (existingRangeIndex >= 0) {
// Range exists - update the continuation token
this.continuationToken.rangeMappings[existingRangeIndex] = newRange;
}
else {
// New range - add to the rangeMappings array
this.continuationToken.rangeMappings.push(newRange);
}
}
}
}
//# sourceMappingURL=ParallelQueryContinuationTokenManager.js.map