From e86d3314c47cf88f8fdd03f54700bfe3d8d458dc Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Wed, 17 Jul 2024 16:04:33 +0300 Subject: [PATCH 1/5] remove need for intermediate map --- src/execution/buildFieldPlan.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/execution/buildFieldPlan.ts b/src/execution/buildFieldPlan.ts index d29ae94cde..db01f026a2 100644 --- a/src/execution/buildFieldPlan.ts +++ b/src/execution/buildFieldPlan.ts @@ -22,14 +22,6 @@ export function buildFieldPlan( const newGroupedFieldSets = new Map>(); - const map = new Map< - string, - { - deferUsageSet: DeferUsageSet; - fieldGroup: FieldGroup; - } - >(); - for (const [responseKey, fieldGroup] of originalGroupedFieldSet) { const deferUsageSet = new Set(); let inOriginalResult = false; @@ -53,10 +45,6 @@ export function buildFieldPlan( } }); } - map.set(responseKey, { deferUsageSet, fieldGroup }); - } - - for (const [responseKey, { deferUsageSet, fieldGroup }] of map) { if (isSameSet(deferUsageSet, parentDeferUsages)) { groupedFieldSet.set(responseKey, fieldGroup); continue; From baa4faa8e95cc455dcdb7e98dad96d50a6b6dccd Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Wed, 17 Jul 2024 16:07:09 +0300 Subject: [PATCH 2/5] remove need for inOriginalResult variable --- src/execution/buildFieldPlan.ts | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/execution/buildFieldPlan.ts b/src/execution/buildFieldPlan.ts index db01f026a2..da93d4c9e0 100644 --- a/src/execution/buildFieldPlan.ts +++ b/src/execution/buildFieldPlan.ts @@ -24,27 +24,24 @@ export function buildFieldPlan( for (const [responseKey, fieldGroup] of originalGroupedFieldSet) { const deferUsageSet = new Set(); - let inOriginalResult = false; for (const fieldDetails of fieldGroup) { const deferUsage = fieldDetails.deferUsage; if (deferUsage === undefined) { - inOriginalResult = true; - continue; + deferUsageSet.clear(); + break; } deferUsageSet.add(deferUsage); } - if (inOriginalResult) { - deferUsageSet.clear(); - } else { - deferUsageSet.forEach((deferUsage) => { - const ancestors = getAncestors(deferUsage); - for (const ancestor of ancestors) { - if (deferUsageSet.has(ancestor)) { - deferUsageSet.delete(deferUsage); - } + + deferUsageSet.forEach((deferUsage) => { + const ancestors = getAncestors(deferUsage); + for (const ancestor of ancestors) { + if (deferUsageSet.has(ancestor)) { + deferUsageSet.delete(deferUsage); } - }); - } + } + }); + if (isSameSet(deferUsageSet, parentDeferUsages)) { groupedFieldSet.set(responseKey, fieldGroup); continue; From 6e860510db46a1327c42aeb4e862f570de233404 Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Wed, 17 Jul 2024 16:08:26 +0300 Subject: [PATCH 3/5] we do not need forEach leads to unnecessary repetitive deletions --- src/execution/buildFieldPlan.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/execution/buildFieldPlan.ts b/src/execution/buildFieldPlan.ts index da93d4c9e0..62acc01d24 100644 --- a/src/execution/buildFieldPlan.ts +++ b/src/execution/buildFieldPlan.ts @@ -33,14 +33,14 @@ export function buildFieldPlan( deferUsageSet.add(deferUsage); } - deferUsageSet.forEach((deferUsage) => { + for (const deferUsage of deferUsageSet) { const ancestors = getAncestors(deferUsage); for (const ancestor of ancestors) { if (deferUsageSet.has(ancestor)) { deferUsageSet.delete(deferUsage); } } - }); + } if (isSameSet(deferUsageSet, parentDeferUsages)) { groupedFieldSet.set(responseKey, fieldGroup); From 5b5dab54d328dc15ba851b9cf4eb3e7d9b5e3035 Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Wed, 17 Jul 2024 16:17:49 +0300 Subject: [PATCH 4/5] remove need for helper function getAncestors --- src/execution/buildFieldPlan.ts | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/execution/buildFieldPlan.ts b/src/execution/buildFieldPlan.ts index 62acc01d24..683fbea5d5 100644 --- a/src/execution/buildFieldPlan.ts +++ b/src/execution/buildFieldPlan.ts @@ -34,11 +34,14 @@ export function buildFieldPlan( } for (const deferUsage of deferUsageSet) { - const ancestors = getAncestors(deferUsage); - for (const ancestor of ancestors) { - if (deferUsageSet.has(ancestor)) { + let parentDeferUsage: DeferUsage | undefined = + deferUsage.parentDeferUsage; + while (parentDeferUsage !== undefined) { + if (deferUsageSet.has(parentDeferUsage)) { deferUsageSet.delete(deferUsage); + break; } + parentDeferUsage = parentDeferUsage.parentDeferUsage; } } @@ -60,13 +63,3 @@ export function buildFieldPlan( newGroupedFieldSets, }; } - -function getAncestors(deferUsage: DeferUsage): ReadonlyArray { - const ancestors: Array = []; - let parentDeferUsage: DeferUsage | undefined = deferUsage.parentDeferUsage; - while (parentDeferUsage !== undefined) { - ancestors.unshift(parentDeferUsage); - parentDeferUsage = parentDeferUsage.parentDeferUsage; - } - return ancestors; -} From 734093c9d66286f7b9b0706404f702bb2014c276 Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Wed, 17 Jul 2024 22:50:36 +0300 Subject: [PATCH 5/5] extract getFilteredDeferUsageSet --- src/execution/buildFieldPlan.ts | 59 ++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/execution/buildFieldPlan.ts b/src/execution/buildFieldPlan.ts index 683fbea5d5..51e2fdf8bb 100644 --- a/src/execution/buildFieldPlan.ts +++ b/src/execution/buildFieldPlan.ts @@ -19,41 +19,22 @@ export function buildFieldPlan( parentDeferUsages: DeferUsageSet = new Set(), ): FieldPlan { const groupedFieldSet = new Map(); - const newGroupedFieldSets = new Map>(); - for (const [responseKey, fieldGroup] of originalGroupedFieldSet) { - const deferUsageSet = new Set(); - for (const fieldDetails of fieldGroup) { - const deferUsage = fieldDetails.deferUsage; - if (deferUsage === undefined) { - deferUsageSet.clear(); - break; - } - deferUsageSet.add(deferUsage); - } + const filteredDeferUsageSet = getFilteredDeferUsageSet(fieldGroup); - for (const deferUsage of deferUsageSet) { - let parentDeferUsage: DeferUsage | undefined = - deferUsage.parentDeferUsage; - while (parentDeferUsage !== undefined) { - if (deferUsageSet.has(parentDeferUsage)) { - deferUsageSet.delete(deferUsage); - break; - } - parentDeferUsage = parentDeferUsage.parentDeferUsage; - } - } - - if (isSameSet(deferUsageSet, parentDeferUsages)) { + if (isSameSet(filteredDeferUsageSet, parentDeferUsages)) { groupedFieldSet.set(responseKey, fieldGroup); continue; } - let newGroupedFieldSet = getBySet(newGroupedFieldSets, deferUsageSet); + let newGroupedFieldSet = getBySet( + newGroupedFieldSets, + filteredDeferUsageSet, + ); if (newGroupedFieldSet === undefined) { newGroupedFieldSet = new Map(); - newGroupedFieldSets.set(deferUsageSet, newGroupedFieldSet); + newGroupedFieldSets.set(filteredDeferUsageSet, newGroupedFieldSet); } newGroupedFieldSet.set(responseKey, fieldGroup); } @@ -63,3 +44,29 @@ export function buildFieldPlan( newGroupedFieldSets, }; } + +function getFilteredDeferUsageSet( + fieldGroup: FieldGroup, +): ReadonlySet { + const filteredDeferUsageSet = new Set(); + for (const fieldDetails of fieldGroup) { + const deferUsage = fieldDetails.deferUsage; + if (deferUsage === undefined) { + filteredDeferUsageSet.clear(); + return filteredDeferUsageSet; + } + filteredDeferUsageSet.add(deferUsage); + } + + for (const deferUsage of filteredDeferUsageSet) { + let parentDeferUsage: DeferUsage | undefined = deferUsage.parentDeferUsage; + while (parentDeferUsage !== undefined) { + if (filteredDeferUsageSet.has(parentDeferUsage)) { + filteredDeferUsageSet.delete(deferUsage); + break; + } + parentDeferUsage = parentDeferUsage.parentDeferUsage; + } + } + return filteredDeferUsageSet; +}