Skip to content

Commit 24784b3

Browse files
committed
remove Target term
1 parent 40f07e2 commit 24784b3

File tree

2 files changed

+62
-58
lines changed

2 files changed

+62
-58
lines changed

src/execution/buildFieldPlan.ts

Lines changed: 56 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@ import { isSameSet } from '../jsutils/isSameSet.js';
33

44
import type { DeferUsage, FieldDetails } from './collectFields.js';
55

6-
export const NON_DEFERRED_TARGET_SET: TargetSet = new Set<Target>([undefined]);
7-
8-
export type Target = DeferUsage | undefined;
9-
export type TargetSet = ReadonlySet<Target>;
106
export type DeferUsageSet = ReadonlySet<DeferUsage>;
117

128
export interface FieldGroup {
139
fields: ReadonlyArray<FieldDetails>;
14-
targets?: TargetSet | undefined;
15-
knownTargets?: TargetSet | undefined;
10+
deferUsages?: DeferUsageSet | undefined;
11+
knownDeferUsages?: DeferUsageSet | undefined;
1612
}
1713

1814
export type GroupedFieldSet = Map<string, FieldGroup>;
@@ -24,19 +20,23 @@ export interface NewGroupedFieldSetDetails {
2420

2521
export function buildFieldPlan(
2622
fields: Map<string, ReadonlyArray<FieldDetails>>,
27-
parentTargets = NON_DEFERRED_TARGET_SET,
28-
knownTargets = NON_DEFERRED_TARGET_SET,
23+
parentDeferUsages: DeferUsageSet = new Set<DeferUsage>(),
24+
knownDeferUsages: DeferUsageSet = new Set<DeferUsage>(),
2925
): {
3026
groupedFieldSet: GroupedFieldSet;
3127
newGroupedFieldSetDetailsMap: Map<DeferUsageSet, NewGroupedFieldSetDetails>;
3228
newDeferUsages: ReadonlyArray<DeferUsage>;
3329
} {
3430
const newDeferUsages: Set<DeferUsage> = new Set<DeferUsage>();
35-
const newKnownTargets = new Set<Target>(knownTargets);
31+
const newKnownDeferUsages = new Set<DeferUsage>(knownDeferUsages);
3632

3733
const groupedFieldSet = new Map<
3834
string,
39-
{ fields: Array<FieldDetails>; targets: TargetSet; knownTargets: TargetSet }
35+
{
36+
fields: Array<FieldDetails>;
37+
deferUsages: DeferUsageSet;
38+
knownDeferUsages: DeferUsageSet;
39+
}
4040
>();
4141

4242
const newGroupedFieldSetDetailsMap = new Map<
@@ -46,8 +46,8 @@ export function buildFieldPlan(
4646
string,
4747
{
4848
fields: Array<FieldDetails>;
49-
targets: TargetSet;
50-
knownTargets: TargetSet;
49+
deferUsages: DeferUsageSet;
50+
knownDeferUsages: DeferUsageSet;
5151
}
5252
>;
5353
shouldInitiateDefer: boolean;
@@ -56,41 +56,50 @@ export function buildFieldPlan(
5656

5757
const map = new Map<
5858
string,
59-
{ targetSet: TargetSet; fieldDetailsList: ReadonlyArray<FieldDetails> }
59+
{
60+
deferUsageSet: DeferUsageSet;
61+
fieldDetailsList: ReadonlyArray<FieldDetails>;
62+
}
6063
>();
64+
6165
for (const [responseKey, fieldDetailsList] of fields) {
62-
const targetSet = new Set<Target>();
66+
const deferUsageSet = new Set<DeferUsage>();
67+
let inOriginalResult = false;
6368
for (const fieldDetails of fieldDetailsList) {
64-
const target = fieldDetails.deferUsage;
65-
targetSet.add(target);
66-
if (!knownTargets.has(target)) {
67-
// all targets that are not known must be defined
68-
newDeferUsages.add(target as DeferUsage);
69+
const deferUsage = fieldDetails.deferUsage;
70+
if (deferUsage === undefined) {
71+
inOriginalResult = true;
72+
continue;
6973
}
70-
newKnownTargets.add(target);
71-
}
72-
map.set(responseKey, { targetSet, fieldDetailsList });
73-
}
74-
75-
for (const [responseKey, { targetSet, fieldDetailsList }] of map) {
76-
const maskingTargetList: Array<Target> = [];
77-
for (const target of targetSet) {
78-
if (
79-
target === undefined ||
80-
getAncestors(target).every((ancestor) => !targetSet.has(ancestor))
81-
) {
82-
maskingTargetList.push(target);
74+
deferUsageSet.add(deferUsage);
75+
if (!knownDeferUsages.has(deferUsage)) {
76+
newDeferUsages.add(deferUsage);
77+
newKnownDeferUsages.add(deferUsage);
8378
}
8479
}
80+
if (inOriginalResult) {
81+
deferUsageSet.clear();
82+
} else {
83+
deferUsageSet.forEach((deferUsage) => {
84+
const ancestors = getAncestors(deferUsage);
85+
for (const ancestor of ancestors) {
86+
if (deferUsageSet.has(ancestor)) {
87+
deferUsageSet.delete(deferUsage);
88+
}
89+
}
90+
});
91+
}
92+
map.set(responseKey, { deferUsageSet, fieldDetailsList });
93+
}
8594

86-
const maskingTargets: TargetSet = new Set<Target>(maskingTargetList);
87-
if (isSameSet(maskingTargets, parentTargets)) {
95+
for (const [responseKey, { deferUsageSet, fieldDetailsList }] of map) {
96+
if (isSameSet(deferUsageSet, parentDeferUsages)) {
8897
let fieldGroup = groupedFieldSet.get(responseKey);
8998
if (fieldGroup === undefined) {
9099
fieldGroup = {
91100
fields: [],
92-
targets: maskingTargets,
93-
knownTargets: newKnownTargets,
101+
deferUsages: deferUsageSet,
102+
knownDeferUsages: newKnownDeferUsages,
94103
};
95104
groupedFieldSet.set(responseKey, fieldGroup);
96105
}
@@ -100,28 +109,27 @@ export function buildFieldPlan(
100109

101110
let newGroupedFieldSetDetails = getBySet(
102111
newGroupedFieldSetDetailsMap,
103-
maskingTargets,
112+
deferUsageSet,
104113
);
105114
let newGroupedFieldSet;
106115
if (newGroupedFieldSetDetails === undefined) {
107116
newGroupedFieldSet = new Map<
108117
string,
109118
{
110119
fields: Array<FieldDetails>;
111-
targets: TargetSet;
112-
knownTargets: TargetSet;
120+
deferUsages: DeferUsageSet;
121+
knownDeferUsages: DeferUsageSet;
113122
}
114123
>();
115124

116125
newGroupedFieldSetDetails = {
117126
groupedFieldSet: newGroupedFieldSet,
118-
shouldInitiateDefer: maskingTargetList.some(
119-
(deferUsage) => !parentTargets.has(deferUsage),
127+
shouldInitiateDefer: Array.from(deferUsageSet).some(
128+
(deferUsage) => !parentDeferUsages.has(deferUsage),
120129
),
121130
};
122131
newGroupedFieldSetDetailsMap.set(
123-
// all new grouped field sets must not contain the initial result as a target
124-
maskingTargets as DeferUsageSet,
132+
deferUsageSet,
125133
newGroupedFieldSetDetails,
126134
);
127135
} else {
@@ -131,8 +139,8 @@ export function buildFieldPlan(
131139
if (fieldGroup === undefined) {
132140
fieldGroup = {
133141
fields: [],
134-
targets: maskingTargets,
135-
knownTargets: newKnownTargets,
142+
deferUsages: deferUsageSet,
143+
knownDeferUsages: newKnownDeferUsages,
136144
};
137145
newGroupedFieldSet.set(responseKey, fieldGroup);
138146
}
@@ -146,14 +154,12 @@ export function buildFieldPlan(
146154
};
147155
}
148156

149-
function getAncestors(
150-
deferUsage: DeferUsage,
151-
): ReadonlyArray<DeferUsage | undefined> {
157+
function getAncestors(deferUsage: DeferUsage): ReadonlyArray<DeferUsage> {
158+
const ancestors: Array<DeferUsage> = [];
152159
let parentDeferUsage: DeferUsage | undefined = deferUsage.parentDeferUsage;
153-
const ancestors: Array<DeferUsage | undefined> = [parentDeferUsage];
154160
while (parentDeferUsage !== undefined) {
155-
parentDeferUsage = parentDeferUsage.parentDeferUsage;
156161
ancestors.unshift(parentDeferUsage);
162+
parentDeferUsage = parentDeferUsage.parentDeferUsage;
157163
}
158164
return ancestors;
159165
}

src/execution/execute.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ const buildSubFieldPlan = memoize3(
101101
);
102102
return buildFieldPlan(
103103
subFields,
104-
fieldGroup.targets,
105-
fieldGroup.knownTargets,
104+
fieldGroup.deferUsages,
105+
fieldGroup.knownDeferUsages,
106106
);
107107
},
108108
);
@@ -1464,17 +1464,15 @@ function addNewDeferredFragments(
14641464

14651465
// For each new deferUsage object:
14661466
for (const newDeferUsage of newDeferUsages) {
1467-
const parentTarget = newDeferUsage.parentDeferUsage;
1467+
const parentDeferUsage = newDeferUsage.parentDeferUsage;
14681468

1469-
// If the parent target is defined, the parent target is a DeferUsage object and
1470-
// the parent result record is the DeferredFragmentRecord corresponding to that DeferUsage.
1471-
// If the parent target is not defined, the parent result record is either:
1469+
// If the parent defer usage is not defined, the parent result record is either:
14721470
// - the InitialResultRecord, or
14731471
// - a StreamItemsRecord, as `@defer` may be nested under `@stream`.
14741472
const parent =
1475-
parentTarget === undefined
1473+
parentDeferUsage === undefined
14761474
? (incrementalDataRecord as InitialResultRecord | StreamItemsRecord)
1477-
: deferredFragmentRecordFromDeferUsage(parentTarget, newDeferMap);
1475+
: deferredFragmentRecordFromDeferUsage(parentDeferUsage, newDeferMap);
14781476

14791477
// Instantiate the new record.
14801478
const deferredFragmentRecord = new DeferredFragmentRecord({

0 commit comments

Comments
 (0)