Skip to content

Commit 8cb6f27

Browse files
committed
introduce target
1 parent 324a5ad commit 8cb6f27

File tree

1 file changed

+34
-40
lines changed

1 file changed

+34
-40
lines changed

src/execution/collectFields.ts

Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -30,24 +30,23 @@ import { getDirectiveValues } from './values.js';
3030

3131
export interface DeferUsage {
3232
label: string | undefined;
33-
ancestors: ReadonlyArray<DeferUsage | undefined>;
33+
ancestors: ReadonlyArray<Target>;
3434
}
3535

36-
export const NON_DEFERRED_SET = new OrderedSet<DeferUsage | undefined>([
37-
undefined,
38-
]).freeze();
36+
export const NON_DEFERRED_SET = new OrderedSet<Target>([undefined]).freeze();
3937

4038
export type Target = DeferUsage | undefined;
4139
export type TargetSet = ReadonlyOrderedSet<Target>;
4240

4341
export interface FieldGroup {
4442
fieldName: string;
45-
fields: Map<DeferUsage | undefined, ReadonlyArray<FieldNode>>;
43+
fields: Map<Target, ReadonlyArray<FieldNode>>;
4644
targets: TargetSet;
4745
}
46+
4847
interface MutableFieldGroup {
4948
fieldName: string;
50-
fields: AccumulatorMap<DeferUsage | undefined, FieldNode>;
49+
fields: AccumulatorMap<Target, FieldNode>;
5150
}
5251

5352
export type GroupedFieldSet = Map<string, FieldGroup>;
@@ -123,7 +122,7 @@ export function collectSubfields(
123122
const deferUsages = new Map<string | undefined, DeferUsage>();
124123
const visitedFragmentNames = new Set<string>();
125124

126-
for (const [deferUsage, fieldNodes] of fieldGroup.fields) {
125+
for (const [target, fieldNodes] of fieldGroup.fields) {
127126
for (const node of fieldNodes) {
128127
if (node.selectionSet) {
129128
collectFieldsImpl(
@@ -136,7 +135,7 @@ export function collectSubfields(
136135
subGroupedFieldSet,
137136
deferUsages,
138137
visitedFragmentNames,
139-
deferUsage,
138+
target,
140139
);
141140
}
142141
}
@@ -150,7 +149,7 @@ export function collectSubfields(
150149

151150
function buildGroupedFieldSets(
152151
originalGroupedFieldSet: MutableGroupedFieldSet,
153-
parentDeferUsages = NON_DEFERRED_SET,
152+
parentTargets = NON_DEFERRED_SET,
154153
): {
155154
groupedFieldSet: GroupedFieldSet;
156155
newGroupedFieldSets: Map<
@@ -165,21 +164,19 @@ function buildGroupedFieldSets(
165164
>();
166165

167166
for (const [key, fieldGroup] of originalGroupedFieldSet) {
168-
const nonMaskedDeferUsageList: Array<DeferUsage | undefined> = [];
167+
const nonMaskedTargetList: Array<Target> = [];
169168
const originalTargetSet = new Set(fieldGroup.fields.keys());
170-
for (const [deferUsage] of fieldGroup.fields) {
169+
for (const [target] of fieldGroup.fields) {
171170
if (
172-
deferUsage === undefined ||
173-
deferUsage.ancestors.every(
174-
(ancestor) => !originalTargetSet.has(ancestor),
175-
)
171+
target === undefined ||
172+
target.ancestors.every((ancestor) => !originalTargetSet.has(ancestor))
176173
) {
177-
nonMaskedDeferUsageList.push(deferUsage);
174+
nonMaskedTargetList.push(target);
178175
}
179176
}
180177

181-
const newTargetSet = new OrderedSet(nonMaskedDeferUsageList).freeze();
182-
if (newTargetSet === parentDeferUsages) {
178+
const newTargetSet = new OrderedSet(nonMaskedTargetList).freeze();
179+
if (newTargetSet === parentTargets) {
183180
groupedFieldSet.set(key, {
184181
...fieldGroup,
185182
targets: newTargetSet,
@@ -190,8 +187,8 @@ function buildGroupedFieldSets(
190187
let newGroupedFieldSet =
191188
newGroupedFieldSets.get(newTargetSet)?.groupedFieldSet;
192189
if (newGroupedFieldSet === undefined) {
193-
const shouldInitiateDefer = nonMaskedDeferUsageList.some(
194-
(deferUsage) => !parentDeferUsages.has(deferUsage),
190+
const shouldInitiateDefer = nonMaskedTargetList.some(
191+
(target) => !parentTargets.has(target),
195192
);
196193
newGroupedFieldSet = new Map();
197194
newGroupedFieldSets.set(newTargetSet, {
@@ -222,8 +219,8 @@ function collectFieldsImpl(
222219
groupedFieldSet: MutableGroupedFieldSet,
223220
deferUsages: Map<string | undefined, DeferUsage>,
224221
visitedFragmentNames: Set<string>,
225-
parentDeferUsage?: DeferUsage | undefined,
226-
newDeferUsage?: DeferUsage | undefined,
222+
parentTarget?: Target,
223+
newTarget?: Target,
227224
): void {
228225
for (const selection of selectionSet.selections) {
229226
switch (selection.kind) {
@@ -234,14 +231,11 @@ function collectFieldsImpl(
234231
const key = getFieldEntryKey(selection);
235232
const fieldGroup = groupedFieldSet.get(key);
236233
if (fieldGroup) {
237-
fieldGroup.fields.add(newDeferUsage ?? parentDeferUsage, selection);
234+
fieldGroup.fields.add(newTarget ?? parentTarget, selection);
238235
} else {
239-
const fields = new AccumulatorMap<
240-
DeferUsage | undefined,
241-
FieldNode
242-
>();
236+
const fields = new AccumulatorMap<Target, FieldNode>();
243237

244-
fields.add(newDeferUsage ?? parentDeferUsage, selection);
238+
fields.add(newTarget ?? parentTarget, selection);
245239

246240
groupedFieldSet.set(key, {
247241
fieldName: selection.name.value,
@@ -271,8 +265,8 @@ function collectFieldsImpl(
271265
groupedFieldSet,
272266
deferUsages,
273267
visitedFragmentNames,
274-
parentDeferUsage,
275-
newDeferUsage,
268+
parentTarget,
269+
newTarget,
276270
);
277271
break;
278272
}
@@ -288,7 +282,7 @@ function collectFieldsImpl(
288282
deferUsages,
289283
visitedFragmentNames,
290284
defer,
291-
parentDeferUsage,
285+
parentTarget,
292286
);
293287
break;
294288
}
@@ -324,8 +318,8 @@ function collectFieldsImpl(
324318
groupedFieldSet,
325319
deferUsages,
326320
visitedFragmentNames,
327-
parentDeferUsage,
328-
newDeferUsage,
321+
parentTarget,
322+
newTarget,
329323
);
330324
break;
331325
}
@@ -341,7 +335,7 @@ function collectFieldsImpl(
341335
deferUsages,
342336
visitedFragmentNames,
343337
defer,
344-
parentDeferUsage,
338+
parentTarget,
345339
);
346340
break;
347341
}
@@ -361,7 +355,7 @@ function collectDeferredFragmentFields(
361355
deferUsages: Map<string | undefined, DeferUsage>,
362356
visitedFragmentNames: Set<string>,
363357
defer: { label: string | undefined },
364-
parentDeferUsage?: DeferUsage | undefined,
358+
parentTarget?: Target,
365359
): void {
366360
const existingNewDefer = deferUsages.get(defer.label);
367361
if (existingNewDefer !== undefined) {
@@ -375,16 +369,16 @@ function collectDeferredFragmentFields(
375369
groupedFieldSet,
376370
deferUsages,
377371
visitedFragmentNames,
378-
parentDeferUsage,
372+
parentTarget,
379373
existingNewDefer,
380374
);
381375
return;
382376
}
383377

384378
const ancestors =
385-
parentDeferUsage === undefined
386-
? [parentDeferUsage]
387-
: [...parentDeferUsage.ancestors, parentDeferUsage];
379+
parentTarget === undefined
380+
? [parentTarget]
381+
: [...parentTarget.ancestors, parentTarget];
388382
const newDefer: DeferUsage = { ...defer, ancestors };
389383
deferUsages.set(defer.label, newDefer);
390384
collectFieldsImpl(
@@ -397,7 +391,7 @@ function collectDeferredFragmentFields(
397391
groupedFieldSet,
398392
deferUsages,
399393
visitedFragmentNames,
400-
parentDeferUsage,
394+
parentTarget,
401395
newDefer,
402396
);
403397
}

0 commit comments

Comments
 (0)