@@ -70,16 +70,52 @@ public function getQueryFields(FieldNode $fieldNode, ResolveInfo $resolveInfo):
70
70
$ selectedFields = [];
71
71
$ fragmentFields = [];
72
72
/** @var FieldNode $field */
73
- $ response =$ this ->test ($ query , $ resolveInfo );
74
- $ fragmentFields =$ response ['fragmentFields ' ];
75
- $ selectedFields =$ response ['selectedFields ' ];
73
+ foreach ($ query as $ field ) {
74
+ if ($ field ->kind === NodeKind::INLINE_FRAGMENT ) {
75
+ $ fragmentFields [] = $ this ->addInlineFragmentFields ($ resolveInfo , $ field );
76
+ } elseif ($ field ->kind === NodeKind::FRAGMENT_SPREAD &&
77
+ ($ spreadFragmentNode = $ resolveInfo ->fragments [$ field ->name ->value ])) {
78
+
79
+ foreach ($ spreadFragmentNode ->selectionSet ->selections as $ spreadNode ) {
80
+ $ response = $ this ->setFieldNodeData ($ spreadNode , $ resolveInfo );
81
+ $ fragmentFields =$ response ['fragmentFields ' ];
82
+ $ selectedFields =$ response ['selectedFields ' ];
83
+ }
84
+ } else {
85
+ $ selectedFields [] = $ field ->name ->value ;
86
+ }
87
+ }
76
88
if ($ fragmentFields ) {
77
89
$ selectedFields = array_merge ([], $ selectedFields , ...$ fragmentFields );
78
90
}
79
- $ this ->setSelectionsForFieldNode ($ fieldNode , array_unique ($ selectedFields ));
91
+ $ this ->setSelectionsForFieldNode ($ fieldNode , array_unique ($ selectedFields ));
80
92
}
81
93
82
- return $ this ->getFieldNodeSelections ($ fieldNode );
94
+ return $ this ->getFieldNodeSelections ($ fieldNode );
95
+ }
96
+
97
+ /**
98
+ * Set the field selections for a query node
99
+ *
100
+ * @param array $spreadNode
101
+ * @param ResolveInfo $resolveInfo
102
+ */
103
+ public function setFieldNodeData ($ spreadNode , $ resolveInfo )
104
+ {
105
+ $ fragmentFields =[];
106
+ $ selectedFields = [];
107
+ if (isset ($ spreadNode ->selectionSet ->selections )) {
108
+ if ($ spreadNode ->kind === NodeKind::FIELD && isset ($ spreadNode ->name )) {
109
+ $ selectedFields [] = $ spreadNode ->name ->value ;
110
+ }
111
+ $ fragmentFields [] = $ this ->getQueryFields ($ spreadNode , $ resolveInfo );
112
+ } else {
113
+ $ selectedFields [] = $ spreadNode ->name ->value ;
114
+ }
115
+ $ data =[];
116
+ $ data ['fragmentFields ' ]=$ fragmentFields ;
117
+ $ data ['selectedFields ' ]=$ selectedFields ;
118
+ return $ data ;
83
119
}
84
120
85
121
/**
@@ -113,6 +149,7 @@ private function addInlineFragmentFields(
113
149
if ($ fragmentFields ) {
114
150
$ inlineFragmentFields = array_merge ([], $ inlineFragmentFields , ...$ fragmentFields );
115
151
}
152
+
116
153
return array_unique ($ inlineFragmentFields );
117
154
}
118
155
@@ -164,37 +201,4 @@ private function setSelectionsForFieldNode(FieldNode $fieldNode, array $selected
164
201
{
165
202
$ this ->queryFields [$ fieldNode ->name ->value ][$ fieldNode ->name ->loc ->start ] = $ selectedFields ;
166
203
}
167
-
168
- /**
169
- * Get array for fragment fields
170
- *
171
- * @param array $query
172
- * @param ResolveInfo $resolveInfo
173
- */
174
- public function test ($ query , $ resolveInfo )
175
- {
176
- $ selectedFields = [];
177
- $ fragmentFields = [];
178
- foreach ($ query as $ field ) {
179
- if ($ field ->kind === NodeKind::INLINE_FRAGMENT ) {
180
- $ fragmentFields [] = $ this ->addInlineFragmentFields ($ resolveInfo , $ field );
181
- } elseif ($ field ->kind === NodeKind::FRAGMENT_SPREAD &&
182
- ($ spreadFragmentNode = $ resolveInfo ->fragments [$ field ->name ->value ])) {
183
-
184
- foreach ($ spreadFragmentNode ->selectionSet ->selections as $ spreadNode ) {
185
- if (isset ($ spreadNode ->selectionSet ->selections )) {
186
- $ fragmentFields [] = $ this ->getQueryFields ($ spreadNode , $ resolveInfo );
187
- } else {
188
- $ selectedFields [] = $ spreadNode ->name ->value ;
189
- }
190
- }
191
- } else {
192
- $ selectedFields [] = $ field ->name ->value ;
193
- }
194
- $ data =[];
195
- $ data ['fragmentFields ' ]=$ fragmentFields ;
196
- $ data ['selectedFields ' ]=$ selectedFields ;
197
- return $ data ;
198
- }
199
- }
200
204
}
0 commit comments