@@ -268,10 +268,11 @@ CreateSourceEventStream(subscription, schema, variableValues, initialValue):
268
268
- Let {subscriptionType} be the root Subscription type in {schema}.
269
269
- Assert: {subscriptionType} is an Object type.
270
270
- Let {selectionSet} be the top level selection set in {subscription}.
271
- - Let {groupedFieldSet } be the result of {CollectFields(subscriptionType,
271
+ - Let {collectedFieldsMap } be the result of {CollectFields(subscriptionType,
272
272
selectionSet, variableValues)}.
273
- - If {groupedFieldSet} does not have exactly one entry, raise a _ request error_ .
274
- - Let {fields} be the value of the first entry in {groupedFieldSet}.
273
+ - If {collectedFieldsMap} does not have exactly one entry, raise a _ request
274
+ error_ .
275
+ - Let {fields} be the value of the first entry in {collectedFieldsMap}.
275
276
- Let {fieldName} be the name of the first entry in {fields}. Note: This value
276
277
is unaffected if an alias is used.
277
278
- Let {field} be the first entry in {fields}.
@@ -368,31 +369,32 @@ Executing the root selection set works similarly for queries (parallel),
368
369
mutations (serial), and subscriptions (where it is executed for each event in
369
370
the underlying Source Stream).
370
371
371
- First, the _ selection set_ is collected into a _ grouped field set _ which is then
372
- executed, returning the resulting {data} and {errors}.
372
+ First, the _ selection set_ is collected into a _ collected fields map _ which is
373
+ then executed, returning the resulting {data} and {errors}.
373
374
374
375
ExecuteRootSelectionSet(variableValues, initialValue, objectType, selectionSet,
375
376
executionMode):
376
377
377
- - Let {groupedFieldSet } be the result of {CollectFields(objectType,
378
+ - Let {collectedFieldsMap } be the result of {CollectFields(objectType,
378
379
selectionSet, variableValues)}.
379
- - Let {data} be the result of running {ExecuteCollectedFields(groupedFieldSet,
380
- objectType, initialValue, variableValues)} _ serially_ if {executionMode} is
381
- {"serial"}, otherwise _ normally_ (allowing parallelization)).
380
+ - Let {data} be the result of running
381
+ {ExecuteCollectedFields(collectedFieldsMap, objectType, initialValue,
382
+ variableValues)} _ serially_ if {executionMode} is {"serial"}, otherwise
383
+ _ normally_ (allowing parallelization)).
382
384
- Let {errors} be the list of all _ execution error_ raised while executing the
383
385
selection set.
384
386
- Return an unordered map containing {data} and {errors}.
385
387
386
388
### Field Collection
387
389
388
- Before execution, each _ selection set_ is converted to a _ grouped field set _ by
389
- calling {CollectFields()}. This ensures all fields with the same response name,
390
- including those in referenced fragments, are executed at the same time.
390
+ Before execution, each _ selection set_ is converted to a _ collected fields map _
391
+ by calling {CollectFields()}. This ensures all fields with the same response
392
+ name, including those in referenced fragments, are executed at the same time.
391
393
392
- :: A _ grouped field set _ is a map where each entry is a _ response name_ and its
393
- associated _ field set_ . A _ grouped field set _ may be produced from a selection
394
- set via {CollectFields()} or from the selection sets of a _ field set_ via
395
- {CollectSubfields()}.
394
+ :: A _ collected fields map _ is a map where each entry is a _ response name_ and
395
+ its associated _ field set_ . A _ collected fields map _ may be produced from a
396
+ selection set via {CollectFields()} or from the selection sets of a _ field set_
397
+ via {CollectSubfields()}.
396
398
397
399
:: A _ field set_ is an ordered set of selected fields that share the same
398
400
_ response name_ (the field alias if defined, otherwise the field's name).
@@ -404,8 +406,8 @@ Note: The order of field selections in a _field set_ is significant, hence the
404
406
algorithms in this specification model it as an ordered set.
405
407
406
408
As an example, collecting the fields of this query's selection set would result
407
- in a grouped field set with two entries, ` "a" ` and ` "b" ` , with two instances of
408
- the field ` a ` and one of field ` b ` :
409
+ in a collected fields map with two entries, ` "a" ` and ` "b" ` , with two instances
410
+ of the field ` a ` and one of field ` b ` :
409
411
410
412
``` graphql example
411
413
{
@@ -430,7 +432,7 @@ response in a stable and predictable order.
430
432
CollectFields(objectType, selectionSet, variableValues, visitedFragments):
431
433
432
434
- If {visitedFragments} is not provided, initialize it to the empty set.
433
- - Initialize {groupedFieldSet } to an empty ordered map of ordered sets.
435
+ - Initialize {collectedFieldsMap } to an empty ordered map of ordered sets.
434
436
- For each {selection} in {selectionSet}:
435
437
- If {selection} provides the directive ` @skip ` , let {skipDirective} be that
436
438
directive.
@@ -445,8 +447,9 @@ CollectFields(objectType, selectionSet, variableValues, visitedFragments):
445
447
- If {selection} is a {Field}:
446
448
- Let {responseName} be the _ response name_ of {selection} (the alias if
447
449
defined, otherwise the field name).
448
- - Let {fieldsForResponseName} be the _ field set_ in {groupedFieldSet} for
449
- {responseName}; if no such set exists, create it as an empty set.
450
+ - Let {fieldsForResponseName} be the _ field set_ value in
451
+ {collectedFieldsMap} for the key {responseName}; otherwise create it as an
452
+ empty ordered set.
450
453
- Append {selection} to the {fieldsForResponseName}.
451
454
- If {selection} is a {FragmentSpread}:
452
455
- Let {fragmentSpreadName} be the name of {selection}.
@@ -467,8 +470,9 @@ CollectFields(objectType, selectionSet, variableValues, visitedFragments):
467
470
- For each {fragmentGroup} in {fragmentGroupedFieldSet}:
468
471
- Let {responseName} be the response name shared by all fields in
469
472
{fragmentGroup}.
470
- - Let {fieldsForResponseName} be the _ field set_ in {groupedFieldSet} for
471
- {responseName}; if no such set exists, create it as an empty set.
473
+ - Let {fieldsForResponseName} be the _ field set_ value in
474
+ {collectedFieldsMap} for the key {responseName}; otherwise create it as
475
+ an empty ordered set.
472
476
- Append all items in {fragmentGroup} to {fieldsForResponseName}.
473
477
- If {selection} is an {InlineFragment}:
474
478
- Let {fragmentType} be the type condition on {selection}.
@@ -482,10 +486,11 @@ CollectFields(objectType, selectionSet, variableValues, visitedFragments):
482
486
- For each {fragmentGroup} in {fragmentGroupedFieldSet}:
483
487
- Let {responseName} be the response name shared by all fields in
484
488
{fragmentGroup}.
485
- - Let {fieldsForResponseName} be the _ field set_ in {groupedFieldSet} for
486
- {responseName}; if no such set exists, create it as an empty set.
489
+ - Let {fieldsForResponseName} be the _ field set_ value in
490
+ {collectedFieldsMap} for the key {responseName}; otherwise create it as
491
+ an empty ordered set.
487
492
- Append all items in {fragmentGroup} to {fieldsForResponseName}.
488
- - Return {groupedFieldSet }.
493
+ - Return {collectedFieldsMap }.
489
494
490
495
DoesFragmentTypeApply(objectType, fragmentType):
491
496
@@ -506,8 +511,8 @@ directives may be applied in either order since they apply commutatively.
506
511
507
512
In order to execute the sub-selections of a object typed field, all _ selection
508
513
sets_ of each field with the same response name of the parent _ field set_ are
509
- merged together into a single _ grouped field set _ representing the subfields to
510
- be executed next.
514
+ merged together into a single _ collected fields map _ representing the subfields
515
+ to be executed next.
511
516
512
517
An example operation illustrating parallel fields with the same name with
513
518
sub-selections.
@@ -536,17 +541,17 @@ phase with the same value.
536
541
537
542
CollectSubfields(objectType, fields, variableValues):
538
543
539
- - Let {groupedFieldSet } be an empty ordered map of ordered sets.
544
+ - Let {collectedFieldsMap } be an empty ordered map of ordered sets.
540
545
- For each {field} in {fields}:
541
546
- Let {fieldSelectionSet} be the selection set of {field}.
542
547
- If {fieldSelectionSet} is null or empty, continue to the next field.
543
548
- Let {fieldGroupedFieldSet} be the result of {CollectFields(objectType,
544
549
fieldSelectionSet, variableValues)}.
545
550
- For each {fieldGroupedFieldSet} as {responseName} and {subfields}:
546
- - Let {fieldsForResponseName} be the _ field set_ in {groupedFieldSet } for
547
- {responseName}; if no such set exists, create it as an empty set.
551
+ - Let {fieldsForResponseName} be the _ field set_ value in {collectedFieldsMap } for
552
+ the key {responseName}; otherwise create it as an empty ordered set.
548
553
- Add each fields in {subfields} to {fieldsForResponseName}.
549
- - Return {groupedFieldSet }.
554
+ - Return {collectedFieldsMap }.
550
555
551
556
Note: All the {fields} passed to {CollectSubfields()} share the same _ response
552
557
name_ .
@@ -556,19 +561,19 @@ name_.
556
561
The {CollectFields()} and {CollectSubfields()} algorithms transitively collect
557
562
the field selections from a _ selection set_ or the associated selection sets of
558
563
a _ field set_ respectively, and split them into groups by their _ response name_
559
- to produce a _ grouped field set _ .
564
+ to produce a _ collected fields map _ .
560
565
561
- To execute a _ grouped field set _ , the object type being evaluated and the
566
+ To execute a _ collected fields map _ , the object type being evaluated and the
562
567
runtime value need to be known, as well as the runtime values for any variables.
563
568
564
- Each entry in the grouped field set represents a _ response name_ which produces
565
- an entry into a result map.
569
+ Each entry in the collected fields map represents a _ response name_ which
570
+ produces an entry into a result map.
566
571
567
- ExecuteCollectedFields(groupedFieldSet , objectType, objectValue,
572
+ ExecuteCollectedFields(collectedFieldsMap , objectType, objectValue,
568
573
variableValues):
569
574
570
575
- Initialize {resultMap} to an empty ordered map.
571
- - For each {groupedFieldSet } as {responseName} and {fields}:
576
+ - For each {collectedFieldsMap } as {responseName} and {fields}:
572
577
- Let {fieldName} be the name of the first entry in {fields}. Note: This value
573
578
is unaffected if an alias is used.
574
579
- Let {fieldType} be the return type defined for the field {fieldName} of
@@ -603,13 +608,14 @@ about this behavior.
603
608
604
609
### Normal and Serial Execution
605
610
606
- Normally the executor can execute the entries in a grouped field set in whatever
607
- order it chooses (normally in parallel). Because the resolution of fields other
608
- than top-level mutation fields must always be side effect-free and idempotent,
609
- the execution order must not affect the result, and hence the service has the
610
- freedom to execute the field entries in whatever order it deems optimal.
611
+ Normally the executor can execute the entries in a collected fields map in
612
+ whatever order it chooses (normally in parallel). Because the resolution of
613
+ fields other than top-level mutation fields must always be side effect-free and
614
+ idempotent, the execution order must not affect the result, and hence the
615
+ service has the freedom to execute the field entries in whatever order it deems
616
+ optimal.
611
617
612
- For example, given the following grouped field set to be executed normally:
618
+ For example, given the following collected fields map to be executed normally:
613
619
614
620
``` graphql example
615
621
{
@@ -629,10 +635,11 @@ before `street`).
629
635
When executing a mutation, the selections in the top most selection set will be
630
636
executed in serial order, starting with the first appearing field textually.
631
637
632
- When executing a grouped field set serially, the executor must consider each
633
- entry from the grouped field set in the order provided in the grouped field set.
634
- It must determine the corresponding entry in the result map for each item to
635
- completion before it continues on to the next item in the grouped field set:
638
+ When executing a collected fields map serially, the executor must consider each
639
+ entry from the collected fields map in the order provided in the collected
640
+ fields map. It must determine the corresponding entry in the result map for each
641
+ item to completion before it continues on to the next entry in the collected
642
+ fields map:
636
643
637
644
For example, given the following mutation operation, the root _ selection set_
638
645
must be executed serially:
@@ -701,7 +708,7 @@ A correct executor must generate the following result for that _selection set_:
701
708
702
709
## Executing Fields
703
710
704
- Each field requested in the grouped field set that is defined on the selected
711
+ Each field from the _ collected fields map _ that is defined on the selected
705
712
objectType will result in an entry in the result map. Field execution first
706
713
coerces any provided argument values, then resolves a value for the field, and
707
714
finally completes that value either by recursively executing another selection
@@ -830,9 +837,9 @@ CompleteValue(fieldType, fields, result, variableValues):
830
837
- Let {objectType} be {fieldType}.
831
838
- Otherwise if {fieldType} is an Interface or Union type.
832
839
- Let {objectType} be {ResolveAbstractType(fieldType, result)}.
833
- - Let {groupedFieldSet } be the result of calling {CollectSubfields(objectType,
834
- fields, variableValues)}.
835
- - Return the result of evaluating {ExecuteCollectedFields(groupedFieldSet ,
840
+ - Let {collectedFieldsMap } be the result of calling
841
+ {CollectSubfields(objectType, fields, variableValues)}.
842
+ - Return the result of evaluating {ExecuteCollectedFields(collectedFieldsMap ,
836
843
objectType, result, variableValues)} _ normally_ (allowing for
837
844
parallelization).
838
845
0 commit comments