From 02c2a34a62c3717a4885449172e404f19ebf66c9 Mon Sep 17 00:00:00 2001 From: "Sachin D. Shinde" Date: Wed, 21 Aug 2024 10:37:41 -0700 Subject: [PATCH] Avoid unnecessary array copying in `ConditionValidationState.advance()` (#3109) We were using `concat()` in `ConditionValidationState.advance()`, which was frequently copying the array. Shifting this to use `push()` instead increases performance significantly for some graphs. --- .changeset/fast-points-wonder.md | 7 +++++++ query-graphs-js/src/conditionsValidation.ts | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .changeset/fast-points-wonder.md diff --git a/.changeset/fast-points-wonder.md b/.changeset/fast-points-wonder.md new file mode 100644 index 000000000..710f230b1 --- /dev/null +++ b/.changeset/fast-points-wonder.md @@ -0,0 +1,7 @@ +--- +"@apollo/federation-internals": patch +"@apollo/gateway": patch +"@apollo/composition": patch +--- + +Reduce memory overhead during satisfiability checking when there are many options. diff --git a/query-graphs-js/src/conditionsValidation.ts b/query-graphs-js/src/conditionsValidation.ts index 7bae900ad..7763c170c 100644 --- a/query-graphs-js/src/conditionsValidation.ts +++ b/query-graphs-js/src/conditionsValidation.ts @@ -25,7 +25,7 @@ class ConditionValidationState { ) {} advance(supergraph: Schema): ConditionValidationState[] | null { - let newOptions: SimultaneousPathsWithLazyIndirectPaths[] = []; + const newOptions: SimultaneousPathsWithLazyIndirectPaths[] = []; for (const paths of this.subgraphOptions) { const pathsOptions = advanceSimultaneousPathsWithOperation( supergraph, @@ -40,7 +40,7 @@ class ConditionValidationState { if (!pathsOptions) { continue; } - newOptions = newOptions.concat(pathsOptions); + newOptions.push(...pathsOptions); } // If we got no options, it means that particular selection of the conditions cannot be satisfied, so the