@@ -302,24 +302,25 @@ query getName {
302
302
- Let {subscriptionType} be the root Subscription type in {schema}.
303
303
- For each subscription operation definition {subscription} in the document:
304
304
- Let {selectionSet} be the top level selection set on {subscription}.
305
- - Let {groupedFieldSet } be the result of
305
+ - Let {collectedFieldsMap } be the result of
306
306
{CollectSubscriptionFields(subscriptionType, selectionSet)}.
307
- - {groupedFieldSet } must have exactly one entry, which must not be an
307
+ - {collectedFieldsMap } must have exactly one entry, which must not be an
308
308
introspection field.
309
309
310
310
CollectSubscriptionFields(objectType, selectionSet, visitedFragments):
311
311
312
312
- If {visitedFragments} is not provided, initialize it to the empty set.
313
- - Initialize {groupedFields } to an empty ordered map of lists .
313
+ - Initialize {collectedFieldsMap } to an empty ordered map of ordered sets .
314
314
- For each {selection} in {selectionSet}:
315
315
- {selection} must not provide the ` @skip ` directive.
316
316
- {selection} must not provide the ` @include ` directive.
317
317
- If {selection} is a {Field}:
318
- - Let {responseKey } be the response key of {selection} (the alias if
318
+ - Let {responseName } be the _ response name _ of {selection} (the alias if
319
319
defined, otherwise the field name).
320
- - Let {groupForResponseKey} be the list in {groupedFields} for
321
- {responseKey}; if no such list exists, create it as an empty list.
322
- - Append {selection} to the {groupForResponseKey}.
320
+ - Let {fieldsForResponseKey} be the _ field set_ value in
321
+ {collectedFieldsMap} for the key {responseName}; otherwise create the
322
+ entry with an empty ordered set.
323
+ - Add {selection} to the {fieldsForResponseKey}.
323
324
- If {selection} is a {FragmentSpread}:
324
325
- Let {fragmentSpreadName} be the name of {selection}.
325
326
- If {fragmentSpreadName} is in {visitedFragments}, continue with the next
@@ -333,31 +334,31 @@ CollectSubscriptionFields(objectType, selectionSet, visitedFragments):
333
334
- If {DoesFragmentTypeApply(objectType, fragmentType)} is {false}, continue
334
335
with the next {selection} in {selectionSet}.
335
336
- Let {fragmentSelectionSet} be the top-level selection set of {fragment}.
336
- - Let {fragmentGroupedFieldSet } be the result of calling
337
+ - Let {fragmentCollectedFieldMap } be the result of calling
337
338
{CollectSubscriptionFields(objectType, fragmentSelectionSet,
338
339
visitedFragments)}.
339
- - For each {fragmentGroup} in {fragmentGroupedFieldSet}:
340
- - Let {responseKey} be the response key shared by all fields in
341
- {fragmentGroup}.
342
- - Let {groupForResponseKey} be the list in {groupedFields} for
343
- {responseKey}; if no such list exists, create it as an empty list .
344
- - Append all items in {fragmentGroup } to {groupForResponseKey }.
340
+ - For each {responseName} and {fragmentFields} in
341
+ {fragmentCollectedFieldMap}:
342
+ - Let {fieldsForResponseKey} be the _ field set _ value in
343
+ {collectedFieldsMap} for the key {responseName}; otherwise create the
344
+ entry with an empty ordered set .
345
+ - Add each item from {fragmentFields } to {fieldsForResponseKey }.
345
346
- If {selection} is an {InlineFragment}:
346
347
- Let {fragmentType} be the type condition on {selection}.
347
348
- If {fragmentType} is not {null} and {DoesFragmentTypeApply(objectType,
348
349
fragmentType)} is {false}, continue with the next {selection} in
349
350
{selectionSet}.
350
351
- Let {fragmentSelectionSet} be the top-level selection set of {selection}.
351
- - Let {fragmentGroupedFieldSet } be the result of calling
352
+ - Let {fragmentCollectedFieldMap } be the result of calling
352
353
{CollectSubscriptionFields(objectType, fragmentSelectionSet,
353
354
visitedFragments)}.
354
- - For each {fragmentGroup} in {fragmentGroupedFieldSet}:
355
- - Let {responseKey} be the response key shared by all fields in
356
- {fragmentGroup}.
357
- - Let {groupForResponseKey} be the list in {groupedFields} for
358
- {responseKey}; if no such list exists, create it as an empty list .
359
- - Append all items in {fragmentGroup } to {groupForResponseKey }.
360
- - Return {groupedFields }.
355
+ - For each {responseName} and {fragmentFields} in
356
+ {fragmentCollectedFieldMap}:
357
+ - Let {fieldsForResponseKey} be the _ field set _ value in
358
+ {collectedFieldsMap} for the key {responseName}; otherwise create the
359
+ entry with an empty ordered set .
360
+ - Add each item from {fragmentFields } to {fieldsForResponseKey }.
361
+ - Return {collectedFieldsMap }.
361
362
362
363
Note: This algorithm is very similar to {CollectFields()}, it differs in that it
363
364
does not have access to runtime variables and thus the ` @skip ` and ` @include `
@@ -583,7 +584,7 @@ should be unambiguous. Therefore any two field selections which might both be
583
584
encountered for the same object are only valid if they are equivalent.
584
585
585
586
During execution, the simultaneous execution of fields with the same response
586
- name is accomplished by {MergeSelectionSets ()} and {CollectFields()} .
587
+ name is accomplished by {CollectSubfields ()} before execution .
587
588
588
589
For simple hand-written GraphQL, this rule is obviously a clear developer error,
589
590
however nested fragments can make this difficult to detect manually.
0 commit comments