@@ -339,7 +339,7 @@ export function experimentalExecuteQueryOrMutationOrSubscriptionEvent(
339
339
) ;
340
340
}
341
341
342
- const collectedFields = collectFields (
342
+ const { groupedFieldSet , newDeferUsages } = collectFields (
343
343
schema ,
344
344
fragments ,
345
345
variableValues ,
@@ -348,24 +348,14 @@ export function experimentalExecuteQueryOrMutationOrSubscriptionEvent(
348
348
hideSuggestions ,
349
349
) ;
350
350
351
- const { groupedFieldSet, newDeferUsages } = collectedFields ;
352
- const graphqlWrappedResult =
353
- newDeferUsages . length === 0
354
- ? executeRootGroupedFieldSet (
355
- exeContext ,
356
- operation . operation ,
357
- rootType ,
358
- rootValue ,
359
- groupedFieldSet ,
360
- undefined ,
361
- )
362
- : executeExecutionPlan (
363
- exeContext ,
364
- rootType ,
365
- rootValue ,
366
- newDeferUsages ,
367
- buildExecutionPlan ( groupedFieldSet ) ,
368
- ) ;
351
+ const graphqlWrappedResult = executeRootExecutionPlan (
352
+ exeContext ,
353
+ operation . operation ,
354
+ rootType ,
355
+ rootValue ,
356
+ groupedFieldSet ,
357
+ newDeferUsages ,
358
+ ) ;
369
359
370
360
if ( isPromise ( graphqlWrappedResult ) ) {
371
361
return graphqlWrappedResult . then (
@@ -388,78 +378,6 @@ export function experimentalExecuteQueryOrMutationOrSubscriptionEvent(
388
378
}
389
379
}
390
380
391
- function executeExecutionPlan (
392
- exeContext : ExecutionContext ,
393
- returnType : GraphQLObjectType ,
394
- sourceValue : unknown ,
395
- newDeferUsages : ReadonlyArray < DeferUsage > ,
396
- executionPlan : ExecutionPlan ,
397
- path ?: Path | undefined ,
398
- incrementalContext ?: IncrementalContext | undefined ,
399
- deferMap ?: ReadonlyMap < DeferUsage , DeferredFragmentRecord > | undefined ,
400
- ) : PromiseOrValue < GraphQLWrappedResult < ObjMap < unknown > > > {
401
- const newDeferMap = getNewDeferMap ( newDeferUsages , deferMap , path ) ;
402
-
403
- const { groupedFieldSet, newGroupedFieldSets } = executionPlan ;
404
-
405
- const graphqlWrappedResult = executeFields (
406
- exeContext ,
407
- returnType ,
408
- sourceValue ,
409
- path ,
410
- groupedFieldSet ,
411
- incrementalContext ,
412
- newDeferMap ,
413
- ) ;
414
-
415
- if ( newGroupedFieldSets . size > 0 ) {
416
- const newPendingExecutionGroups = collectExecutionGroups (
417
- exeContext ,
418
- returnType ,
419
- sourceValue ,
420
- path ,
421
- incrementalContext ?. deferUsageSet ,
422
- newGroupedFieldSets ,
423
- newDeferMap ,
424
- ) ;
425
-
426
- return withNewExecutionGroups (
427
- graphqlWrappedResult ,
428
- newPendingExecutionGroups ,
429
- ) ;
430
- }
431
- return graphqlWrappedResult ;
432
- }
433
-
434
- function withNewExecutionGroups (
435
- result : PromiseOrValue < GraphQLWrappedResult < ObjMap < unknown > > > ,
436
- newPendingExecutionGroups : ReadonlyArray < PendingExecutionGroup > ,
437
- ) : PromiseOrValue < GraphQLWrappedResult < ObjMap < unknown > > > {
438
- if ( isPromise ( result ) ) {
439
- return result . then ( ( resolved ) => {
440
- addIncrementalDataRecords ( resolved , newPendingExecutionGroups ) ;
441
- return resolved ;
442
- } ) ;
443
- }
444
-
445
- addIncrementalDataRecords ( result , newPendingExecutionGroups ) ;
446
- return result ;
447
- }
448
-
449
- function addIncrementalDataRecords (
450
- graphqlWrappedResult : GraphQLWrappedResult < unknown > ,
451
- incrementalDataRecords : ReadonlyArray < IncrementalDataRecord > | undefined ,
452
- ) : void {
453
- if ( incrementalDataRecords === undefined ) {
454
- return ;
455
- }
456
- if ( graphqlWrappedResult . incrementalDataRecords === undefined ) {
457
- graphqlWrappedResult . incrementalDataRecords = [ ...incrementalDataRecords ] ;
458
- } else {
459
- graphqlWrappedResult . incrementalDataRecords . push ( ...incrementalDataRecords ) ;
460
- }
461
- }
462
-
463
381
function withError (
464
382
errors : Array < GraphQLError > | undefined ,
465
383
error : GraphQLError ,
@@ -616,6 +534,73 @@ export function validateExecutionArgs(
616
534
} ;
617
535
}
618
536
537
+ function executeRootExecutionPlan (
538
+ exeContext : ExecutionContext ,
539
+ operation : OperationTypeNode ,
540
+ rootType : GraphQLObjectType ,
541
+ rootValue : unknown ,
542
+ originalGroupedFieldSet : GroupedFieldSet ,
543
+ newDeferUsages : ReadonlyArray < DeferUsage > ,
544
+ ) : PromiseOrValue < GraphQLWrappedResult < ObjMap < unknown > > > {
545
+ if ( newDeferUsages . length === 0 ) {
546
+ return executeRootGroupedFieldSet (
547
+ exeContext ,
548
+ operation ,
549
+ rootType ,
550
+ rootValue ,
551
+ originalGroupedFieldSet ,
552
+ undefined ,
553
+ ) ;
554
+ }
555
+ const newDeferMap = getNewDeferMap ( newDeferUsages , undefined , undefined ) ;
556
+
557
+ const { groupedFieldSet, newGroupedFieldSets } = buildExecutionPlan (
558
+ originalGroupedFieldSet ,
559
+ ) ;
560
+
561
+ const graphqlWrappedResult = executeRootGroupedFieldSet (
562
+ exeContext ,
563
+ operation ,
564
+ rootType ,
565
+ rootValue ,
566
+ groupedFieldSet ,
567
+ newDeferMap ,
568
+ ) ;
569
+
570
+ if ( newGroupedFieldSets . size > 0 ) {
571
+ const newPendingExecutionGroups = collectExecutionGroups (
572
+ exeContext ,
573
+ rootType ,
574
+ rootValue ,
575
+ undefined ,
576
+ undefined ,
577
+ newGroupedFieldSets ,
578
+ newDeferMap ,
579
+ ) ;
580
+
581
+ return withNewExecutionGroups (
582
+ graphqlWrappedResult ,
583
+ newPendingExecutionGroups ,
584
+ ) ;
585
+ }
586
+ return graphqlWrappedResult ;
587
+ }
588
+
589
+ function withNewExecutionGroups (
590
+ result : PromiseOrValue < GraphQLWrappedResult < ObjMap < unknown > > > ,
591
+ newPendingExecutionGroups : ReadonlyArray < PendingExecutionGroup > ,
592
+ ) : PromiseOrValue < GraphQLWrappedResult < ObjMap < unknown > > > {
593
+ if ( isPromise ( result ) ) {
594
+ return result . then ( ( resolved ) => {
595
+ addIncrementalDataRecords ( resolved , newPendingExecutionGroups ) ;
596
+ return resolved ;
597
+ } ) ;
598
+ }
599
+
600
+ addIncrementalDataRecords ( result , newPendingExecutionGroups ) ;
601
+ return result ;
602
+ }
603
+
619
604
function executeRootGroupedFieldSet (
620
605
exeContext : ExecutionContext ,
621
606
operation : OperationTypeNode ,
@@ -728,6 +713,20 @@ function executeFieldsSerially(
728
713
) ;
729
714
}
730
715
716
+ function addIncrementalDataRecords (
717
+ graphqlWrappedResult : GraphQLWrappedResult < unknown > ,
718
+ incrementalDataRecords : ReadonlyArray < IncrementalDataRecord > | undefined ,
719
+ ) : void {
720
+ if ( incrementalDataRecords === undefined ) {
721
+ return ;
722
+ }
723
+ if ( graphqlWrappedResult . incrementalDataRecords === undefined ) {
724
+ graphqlWrappedResult . incrementalDataRecords = [ ...incrementalDataRecords ] ;
725
+ } else {
726
+ graphqlWrappedResult . incrementalDataRecords . push ( ...incrementalDataRecords ) ;
727
+ }
728
+ }
729
+
731
730
/**
732
731
* Implements the "Executing selection sets" section of the spec
733
732
* for fields that may be executed in parallel.
@@ -1877,29 +1876,74 @@ function collectAndExecuteSubfields(
1877
1876
fieldDetailsList ,
1878
1877
) ;
1879
1878
const { groupedFieldSet, newDeferUsages } = collectedSubfields ;
1880
- return deferMap === undefined && newDeferUsages . length === 0
1881
- ? executeFields (
1882
- exeContext ,
1883
- returnType ,
1884
- result ,
1885
- path ,
1886
- groupedFieldSet ,
1887
- incrementalContext ,
1888
- undefined ,
1889
- )
1890
- : executeExecutionPlan (
1891
- exeContext ,
1892
- returnType ,
1893
- result ,
1894
- newDeferUsages ,
1895
- buildSubExecutionPlan (
1896
- groupedFieldSet ,
1897
- incrementalContext ?. deferUsageSet ,
1898
- ) ,
1899
- path ,
1900
- incrementalContext ,
1901
- deferMap ,
1902
- ) ;
1879
+ return executeSubExecutionPlan (
1880
+ exeContext ,
1881
+ returnType ,
1882
+ result ,
1883
+ groupedFieldSet ,
1884
+ newDeferUsages ,
1885
+ path ,
1886
+ incrementalContext ,
1887
+ deferMap ,
1888
+ ) ;
1889
+ }
1890
+
1891
+ function executeSubExecutionPlan (
1892
+ exeContext : ExecutionContext ,
1893
+ returnType : GraphQLObjectType ,
1894
+ sourceValue : unknown ,
1895
+ originalGroupedFieldSet : GroupedFieldSet ,
1896
+ newDeferUsages : ReadonlyArray < DeferUsage > ,
1897
+ path ?: Path | undefined ,
1898
+ incrementalContext ?: IncrementalContext | undefined ,
1899
+ deferMap ?: ReadonlyMap < DeferUsage , DeferredFragmentRecord > | undefined ,
1900
+ ) : PromiseOrValue < GraphQLWrappedResult < ObjMap < unknown > > > {
1901
+ if ( deferMap === undefined && newDeferUsages . length === 0 ) {
1902
+ return executeFields (
1903
+ exeContext ,
1904
+ returnType ,
1905
+ sourceValue ,
1906
+ path ,
1907
+ originalGroupedFieldSet ,
1908
+ incrementalContext ,
1909
+ deferMap ,
1910
+ ) ;
1911
+ }
1912
+
1913
+ const newDeferMap = getNewDeferMap ( newDeferUsages , deferMap , path ) ;
1914
+
1915
+ const { groupedFieldSet, newGroupedFieldSets } = buildSubExecutionPlan (
1916
+ originalGroupedFieldSet ,
1917
+ incrementalContext ?. deferUsageSet ,
1918
+ ) ;
1919
+
1920
+ const graphqlWrappedResult = executeFields (
1921
+ exeContext ,
1922
+ returnType ,
1923
+ sourceValue ,
1924
+ path ,
1925
+ groupedFieldSet ,
1926
+ incrementalContext ,
1927
+ newDeferMap ,
1928
+ ) ;
1929
+
1930
+ if ( newGroupedFieldSets . size > 0 ) {
1931
+ const newPendingExecutionGroups = collectExecutionGroups (
1932
+ exeContext ,
1933
+ returnType ,
1934
+ sourceValue ,
1935
+ path ,
1936
+ incrementalContext ?. deferUsageSet ,
1937
+ newGroupedFieldSets ,
1938
+ newDeferMap ,
1939
+ ) ;
1940
+
1941
+ return withNewExecutionGroups (
1942
+ graphqlWrappedResult ,
1943
+ newPendingExecutionGroups ,
1944
+ ) ;
1945
+ }
1946
+ return graphqlWrappedResult ;
1903
1947
}
1904
1948
1905
1949
function buildSubExecutionPlan (
0 commit comments