Skip to content

Commit

Permalink
introduce target
Browse files Browse the repository at this point in the history
  • Loading branch information
yaacovCR committed May 4, 2023
1 parent 324a5ad commit 8cb6f27
Showing 1 changed file with 34 additions and 40 deletions.
74 changes: 34 additions & 40 deletions src/execution/collectFields.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,24 +30,23 @@ import { getDirectiveValues } from './values.js';

export interface DeferUsage {
label: string | undefined;
ancestors: ReadonlyArray<DeferUsage | undefined>;
ancestors: ReadonlyArray<Target>;
}

export const NON_DEFERRED_SET = new OrderedSet<DeferUsage | undefined>([
undefined,
]).freeze();
export const NON_DEFERRED_SET = new OrderedSet<Target>([undefined]).freeze();

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

export interface FieldGroup {
fieldName: string;
fields: Map<DeferUsage | undefined, ReadonlyArray<FieldNode>>;
fields: Map<Target, ReadonlyArray<FieldNode>>;
targets: TargetSet;
}

interface MutableFieldGroup {
fieldName: string;
fields: AccumulatorMap<DeferUsage | undefined, FieldNode>;
fields: AccumulatorMap<Target, FieldNode>;
}

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

for (const [deferUsage, fieldNodes] of fieldGroup.fields) {
for (const [target, fieldNodes] of fieldGroup.fields) {
for (const node of fieldNodes) {
if (node.selectionSet) {
collectFieldsImpl(
Expand All @@ -136,7 +135,7 @@ export function collectSubfields(
subGroupedFieldSet,
deferUsages,
visitedFragmentNames,
deferUsage,
target,
);
}
}
Expand All @@ -150,7 +149,7 @@ export function collectSubfields(

function buildGroupedFieldSets(
originalGroupedFieldSet: MutableGroupedFieldSet,
parentDeferUsages = NON_DEFERRED_SET,
parentTargets = NON_DEFERRED_SET,
): {
groupedFieldSet: GroupedFieldSet;
newGroupedFieldSets: Map<
Expand All @@ -165,21 +164,19 @@ function buildGroupedFieldSets(
>();

for (const [key, fieldGroup] of originalGroupedFieldSet) {
const nonMaskedDeferUsageList: Array<DeferUsage | undefined> = [];
const nonMaskedTargetList: Array<Target> = [];
const originalTargetSet = new Set(fieldGroup.fields.keys());
for (const [deferUsage] of fieldGroup.fields) {
for (const [target] of fieldGroup.fields) {
if (
deferUsage === undefined ||
deferUsage.ancestors.every(
(ancestor) => !originalTargetSet.has(ancestor),
)
target === undefined ||
target.ancestors.every((ancestor) => !originalTargetSet.has(ancestor))
) {
nonMaskedDeferUsageList.push(deferUsage);
nonMaskedTargetList.push(target);
}
}

const newTargetSet = new OrderedSet(nonMaskedDeferUsageList).freeze();
if (newTargetSet === parentDeferUsages) {
const newTargetSet = new OrderedSet(nonMaskedTargetList).freeze();
if (newTargetSet === parentTargets) {
groupedFieldSet.set(key, {
...fieldGroup,
targets: newTargetSet,
Expand All @@ -190,8 +187,8 @@ function buildGroupedFieldSets(
let newGroupedFieldSet =
newGroupedFieldSets.get(newTargetSet)?.groupedFieldSet;
if (newGroupedFieldSet === undefined) {
const shouldInitiateDefer = nonMaskedDeferUsageList.some(
(deferUsage) => !parentDeferUsages.has(deferUsage),
const shouldInitiateDefer = nonMaskedTargetList.some(
(target) => !parentTargets.has(target),
);
newGroupedFieldSet = new Map();
newGroupedFieldSets.set(newTargetSet, {
Expand Down Expand Up @@ -222,8 +219,8 @@ function collectFieldsImpl(
groupedFieldSet: MutableGroupedFieldSet,
deferUsages: Map<string | undefined, DeferUsage>,
visitedFragmentNames: Set<string>,
parentDeferUsage?: DeferUsage | undefined,
newDeferUsage?: DeferUsage | undefined,
parentTarget?: Target,
newTarget?: Target,
): void {
for (const selection of selectionSet.selections) {
switch (selection.kind) {
Expand All @@ -234,14 +231,11 @@ function collectFieldsImpl(
const key = getFieldEntryKey(selection);
const fieldGroup = groupedFieldSet.get(key);
if (fieldGroup) {
fieldGroup.fields.add(newDeferUsage ?? parentDeferUsage, selection);
fieldGroup.fields.add(newTarget ?? parentTarget, selection);
} else {
const fields = new AccumulatorMap<
DeferUsage | undefined,
FieldNode
>();
const fields = new AccumulatorMap<Target, FieldNode>();

fields.add(newDeferUsage ?? parentDeferUsage, selection);
fields.add(newTarget ?? parentTarget, selection);

groupedFieldSet.set(key, {
fieldName: selection.name.value,
Expand Down Expand Up @@ -271,8 +265,8 @@ function collectFieldsImpl(
groupedFieldSet,
deferUsages,
visitedFragmentNames,
parentDeferUsage,
newDeferUsage,
parentTarget,
newTarget,
);
break;
}
Expand All @@ -288,7 +282,7 @@ function collectFieldsImpl(
deferUsages,
visitedFragmentNames,
defer,
parentDeferUsage,
parentTarget,
);
break;
}
Expand Down Expand Up @@ -324,8 +318,8 @@ function collectFieldsImpl(
groupedFieldSet,
deferUsages,
visitedFragmentNames,
parentDeferUsage,
newDeferUsage,
parentTarget,
newTarget,
);
break;
}
Expand All @@ -341,7 +335,7 @@ function collectFieldsImpl(
deferUsages,
visitedFragmentNames,
defer,
parentDeferUsage,
parentTarget,
);
break;
}
Expand All @@ -361,7 +355,7 @@ function collectDeferredFragmentFields(
deferUsages: Map<string | undefined, DeferUsage>,
visitedFragmentNames: Set<string>,
defer: { label: string | undefined },
parentDeferUsage?: DeferUsage | undefined,
parentTarget?: Target,
): void {
const existingNewDefer = deferUsages.get(defer.label);
if (existingNewDefer !== undefined) {
Expand All @@ -375,16 +369,16 @@ function collectDeferredFragmentFields(
groupedFieldSet,
deferUsages,
visitedFragmentNames,
parentDeferUsage,
parentTarget,
existingNewDefer,
);
return;
}

const ancestors =
parentDeferUsage === undefined
? [parentDeferUsage]
: [...parentDeferUsage.ancestors, parentDeferUsage];
parentTarget === undefined
? [parentTarget]
: [...parentTarget.ancestors, parentTarget];
const newDefer: DeferUsage = { ...defer, ancestors };
deferUsages.set(defer.label, newDefer);
collectFieldsImpl(
Expand All @@ -397,7 +391,7 @@ function collectDeferredFragmentFields(
groupedFieldSet,
deferUsages,
visitedFragmentNames,
parentDeferUsage,
parentTarget,
newDefer,
);
}
Expand Down

0 comments on commit 8cb6f27

Please sign in to comment.