@@ -46,12 +46,12 @@ public function __construct(array $fieldToAttributeMap = [])
46
46
*
47
47
* @param FieldNode $fieldNode
48
48
* @param AbstractCollection $collection
49
- * @param ResolveInfo $resolverInfo
49
+ * @param ResolveInfo $resolveInfo
50
50
* @return void
51
51
*/
52
- public function join (FieldNode $ fieldNode , AbstractCollection $ collection , ResolveInfo $ resolverInfo ): void
52
+ public function join (FieldNode $ fieldNode , AbstractCollection $ collection , ResolveInfo $ resolveInfo ): void
53
53
{
54
- foreach ($ this ->getQueryFields ($ fieldNode , $ resolverInfo ) as $ field ) {
54
+ foreach ($ this ->getQueryFields ($ fieldNode , $ resolveInfo ) as $ field ) {
55
55
$ this ->addFieldToCollection ($ collection , $ field );
56
56
}
57
57
}
@@ -60,26 +60,25 @@ public function join(FieldNode $fieldNode, AbstractCollection $collection, Resol
60
60
* Get an array of queried fields.
61
61
*
62
62
* @param FieldNode $fieldNode
63
- * @param ResolveInfo $resolverInfo
63
+ * @param ResolveInfo $resolveInfo
64
64
* @return string[]
65
65
*/
66
66
public function getQueryFields (FieldNode $ fieldNode , ResolveInfo $ resolveInfo ): array
67
67
{
68
68
if (null === $ this ->getFieldNodeSelections ($ fieldNode )) {
69
69
$ query = $ fieldNode ->selectionSet ->selections ;
70
70
$ selectedFields = [];
71
+ $ fragmentFields = [];
71
72
/** @var FieldNode $field */
72
73
foreach ($ query as $ field ) {
73
74
if ($ field ->kind === NodeKind::INLINE_FRAGMENT ) {
74
- $ inlineFragmentFields = $ this ->addInlineFragmentFields ($ resolveInfo , $ field );
75
- $ selectedFields = array_merge ($ selectedFields , $ inlineFragmentFields );
75
+ $ fragmentFields [] = $ this ->addInlineFragmentFields ($ resolveInfo , $ field );
76
76
} elseif ($ field ->kind === NodeKind::FRAGMENT_SPREAD &&
77
77
($ spreadFragmentNode = $ resolveInfo ->fragments [$ field ->name ->value ])) {
78
78
79
79
foreach ($ spreadFragmentNode ->selectionSet ->selections as $ spreadNode ) {
80
80
if (isset ($ spreadNode ->selectionSet ->selections )) {
81
- $ fragmentSpreadFields = $ this ->getQueryFields ($ spreadNode , $ resolveInfo );
82
- $ selectedFields = array_merge ($ selectedFields , $ fragmentSpreadFields );
81
+ $ fragmentFields [] = $ this ->getQueryFields ($ spreadNode , $ resolveInfo );
83
82
} else {
84
83
$ selectedFields [] = $ spreadNode ->name ->value ;
85
84
}
@@ -88,6 +87,9 @@ public function getQueryFields(FieldNode $fieldNode, ResolveInfo $resolveInfo):
88
87
$ selectedFields [] = $ field ->name ->value ;
89
88
}
90
89
}
90
+ if ($ fragmentFields ) {
91
+ $ selectedFields = array_merge ($ selectedFields , array_merge (...$ fragmentFields ));
92
+ }
91
93
$ this ->setSelectionsForFieldNode ($ fieldNode , array_unique ($ selectedFields ));
92
94
}
93
95
@@ -113,9 +115,7 @@ private function addInlineFragmentFields(
113
115
if ($ field ->kind === NodeKind::INLINE_FRAGMENT ) {
114
116
$ this ->addInlineFragmentFields ($ resolveInfo , $ field , $ inlineFragmentFields );
115
117
} elseif (isset ($ field ->selectionSet ->selections )) {
116
- if (is_array ($ queryFields = $ this ->getQueryFields ($ field , $ resolveInfo ))) {
117
- $ inlineFragmentFields = array_merge ($ inlineFragmentFields , $ queryFields );
118
- }
118
+ continue ;
119
119
} else {
120
120
$ inlineFragmentFields [] = $ field ->name ->value ;
121
121
}
0 commit comments