graphql
Version:
A Query Language and Runtime which can target any service.
65 lines • 3.35 kB
JavaScript
import { AccumulatorMap } from "../../jsutils/AccumulatorMap.mjs";
import { getBySet } from "../../jsutils/getBySet.mjs";
import { invariant } from "../../jsutils/invariant.mjs";
import { isSameSet } from "../../jsutils/isSameSet.mjs";
import { memoize1 } from "../../jsutils/memoize1.mjs";
import { memoize2 } from "../../jsutils/memoize2.mjs";
import { IncrementalExecutor } from "../incremental/IncrementalExecutor.mjs";
import { BranchingIncrementalPublisher } from "./BranchingIncrementalPublisher.mjs";
const buildBranchingExecutionPlanFromInitial = memoize1((groupedFieldSet) => buildBranchingExecutionPlan(groupedFieldSet));
const buildBranchingExecutionPlanFromDeferred = memoize2((groupedFieldSet, deferUsageSet) => buildBranchingExecutionPlan(groupedFieldSet, deferUsageSet));
export class BranchingIncrementalExecutor extends IncrementalExecutor {
getCreateSubExecutor() {
const validatedExecutionArgs = this.validatedExecutionArgs;
const sharedExecutionContext = this.sharedExecutionContext;
return (deferUsageSet) => new BranchingIncrementalExecutor(validatedExecutionArgs, sharedExecutionContext, deferUsageSet);
}
buildResponse(data) {
const work = this.getIncrementalWork();
const { tasks, streams } = work;
if (tasks?.length === 0 && streams?.length === 0) {
return super.buildResponse(data);
}
const errors = this.collectedErrors.errors;
if (!(data !== null))
invariant(false);
const incrementalPublisher = new BranchingIncrementalPublisher();
return incrementalPublisher.buildResponse(data, errors, work, this.validatedExecutionArgs.externalAbortSignal, this.getFinishSharedExecution());
}
buildRootExecutionPlan(originalGroupedFieldSet) {
return buildBranchingExecutionPlanFromInitial(originalGroupedFieldSet);
}
buildSubExecutionPlan(originalGroupedFieldSet) {
return this.deferUsageSet === undefined
? buildBranchingExecutionPlanFromInitial(originalGroupedFieldSet)
: buildBranchingExecutionPlanFromDeferred(originalGroupedFieldSet, this.deferUsageSet);
}
}
function buildBranchingExecutionPlan(originalGroupedFieldSet, parentDeferUsages = new Set()) {
const groupedFieldSet = new AccumulatorMap();
const newGroupedFieldSets = new Map();
for (const [responseKey, fieldGroup] of originalGroupedFieldSet) {
for (const fieldDetails of fieldGroup) {
const deferUsage = fieldDetails.deferUsage;
const deferUsageSet = deferUsage === undefined
? new Set()
: new Set([deferUsage]);
if (isSameSet(parentDeferUsages, deferUsageSet)) {
groupedFieldSet.add(responseKey, fieldDetails);
}
else {
let newGroupedFieldSet = getBySet(newGroupedFieldSets, deferUsageSet);
if (newGroupedFieldSet === undefined) {
newGroupedFieldSet = new AccumulatorMap();
newGroupedFieldSets.set(deferUsageSet, newGroupedFieldSet);
}
newGroupedFieldSet.add(responseKey, fieldDetails);
}
}
}
return {
groupedFieldSet,
newGroupedFieldSets,
};
}
//# sourceMappingURL=BranchingIncrementalExecutor.js.map