@@ -3,8 +3,8 @@ import { invariant } from '../jsutils/invariant.js';
33import { isAsyncIterable } from '../jsutils/isAsyncIterable.js' ;
44import { isIterableObject } from '../jsutils/isIterableObject.js' ;
55import { isPromise } from '../jsutils/isPromise.js' ;
6- import { memoize1 } from '../jsutils/memoize1.js' ;
76import { memoize2 } from '../jsutils/memoize2.js' ;
7+ import { memoize3 } from '../jsutils/memoize3.js' ;
88import type { ObjMap } from '../jsutils/ObjMap.js' ;
99import type { Path } from '../jsutils/Path.js' ;
1010import { addPath , pathToArray } from '../jsutils/Path.js' ;
@@ -54,7 +54,7 @@ import {
5454 collectSubfields as _collectSubfields ,
5555} from './collectFields.js' ;
5656import type { StreamUsage } from './getStreamUsage.js' ;
57- import { getStreamUsage } from './getStreamUsage.js' ;
57+ import { getStreamUsage as _getStreamUsage } from './getStreamUsage.js' ;
5858import type {
5959 DeferUsageSet ,
6060 ExecutionPlan ,
@@ -121,6 +121,37 @@ export interface ValidatedExecutionArgs {
121121 enableEarlyExecution : boolean ;
122122}
123123
124+ /**
125+ * A memoized collection of relevant subfields with regard to the return
126+ * type. Memoizing ensures the subfields are not repeatedly calculated, which
127+ * saves overhead when resolving lists of values.
128+ */
129+ export const collectSubfields = memoize3 (
130+ (
131+ validatedExecutionArgs : ValidatedExecutionArgs ,
132+ returnType : GraphQLObjectType ,
133+ fieldDetailsList : FieldDetailsList ,
134+ ) => {
135+ const { schema, fragments, variableValues, hideSuggestions } =
136+ validatedExecutionArgs ;
137+ return _collectSubfields (
138+ schema ,
139+ fragments ,
140+ variableValues ,
141+ returnType ,
142+ fieldDetailsList ,
143+ hideSuggestions ,
144+ ) ;
145+ } ,
146+ ) ;
147+
148+ export const getStreamUsage = memoize2 (
149+ (
150+ validatedExecutionArgs : ValidatedExecutionArgs ,
151+ fieldDetailsList : FieldDetailsList ,
152+ ) => _getStreamUsage ( validatedExecutionArgs , fieldDetailsList ) ,
153+ ) ;
154+
124155/**
125156 * @internal
126157 */
@@ -384,18 +415,6 @@ export class Executor {
384415 tasks : Array < ExecutionGroup > ;
385416 streams : Array < ItemStream > ;
386417
387- collectSubfields : (
388- returnType : GraphQLObjectType ,
389- fieldDetailsList : FieldDetailsList ,
390- ) => {
391- groupedFieldSet : GroupedFieldSet ;
392- newDeferUsages : ReadonlyArray < DeferUsage > ;
393- } ;
394-
395- getStreamUsage : (
396- fieldDetailsList : FieldDetailsList ,
397- ) => StreamUsage | undefined ;
398-
399418 constructor (
400419 validatedExecutionArgs : ValidatedExecutionArgs ,
401420 deferUsageSet ?: DeferUsageSet ,
@@ -408,28 +427,6 @@ export class Executor {
408427 this . groups = [ ] ;
409428 this . tasks = [ ] ;
410429 this . streams = [ ] ;
411-
412- /**
413- * A memoized collection of relevant subfields with regard to the return
414- * type. Memoizing ensures the subfields are not repeatedly calculated, which
415- * saves overhead when resolving lists of values.
416- */
417- this . collectSubfields = memoize2 ( ( returnType , fieldDetailsList ) => {
418- const { schema, fragments, variableValues, hideSuggestions } =
419- this . validatedExecutionArgs ;
420- return _collectSubfields (
421- schema ,
422- fragments ,
423- variableValues ,
424- returnType ,
425- fieldDetailsList ,
426- hideSuggestions ,
427- ) ;
428- } ) ;
429-
430- this . getStreamUsage = memoize1 ( ( fieldDetailsList ) =>
431- getStreamUsage ( this . validatedExecutionArgs , fieldDetailsList ) ,
432- ) ;
433430 }
434431
435432 executeQueryOrMutationOrSubscriptionEvent ( ) : PromiseOrValue <
@@ -1057,7 +1054,7 @@ export class Executor {
10571054 const streamUsage =
10581055 typeof path . key === 'number'
10591056 ? undefined
1060- : this . getStreamUsage ( fieldDetailsList ) ;
1057+ : getStreamUsage ( this . validatedExecutionArgs , fieldDetailsList ) ;
10611058
10621059 let containsPromise = false ;
10631060 const completedResults : Array < unknown > = [ ] ;
@@ -1177,7 +1174,7 @@ export class Executor {
11771174 const streamUsage =
11781175 typeof path . key === 'number'
11791176 ? undefined
1180- : this . getStreamUsage ( fieldDetailsList ) ;
1177+ : getStreamUsage ( this . validatedExecutionArgs , fieldDetailsList ) ;
11811178
11821179 // This is specified as a simple map, however we're optimizing the path
11831180 // where the list contains no Promises by avoiding creating another Promise.
@@ -1549,7 +1546,8 @@ export class Executor {
15491546 deliveryGroupMap : ReadonlyMap < DeferUsage , DeliveryGroup > | undefined ,
15501547 ) : PromiseOrValue < ObjMap < unknown > > {
15511548 // Collect sub-fields to execute to complete this value.
1552- const { groupedFieldSet, newDeferUsages } = this . collectSubfields (
1549+ const { groupedFieldSet, newDeferUsages } = collectSubfields (
1550+ this . validatedExecutionArgs ,
15531551 returnType ,
15541552 fieldDetailsList ,
15551553 ) ;
0 commit comments