1010use GraphQL \Language \AST \FieldNode ;
1111use GraphQL \Language \AST \InlineFragmentNode ;
1212use GraphQL \Language \AST \NodeKind ;
13+ use GraphQL \Language \AST \NodeList ;
1314use Magento \Eav \Model \Entity \Collection \AbstractCollection ;
1415use Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
1516use Magento \Framework \ObjectManager \ResetAfterRequestInterface ;
@@ -69,37 +70,49 @@ public function getQueryFields(FieldNode $fieldNode, ResolveInfo $resolveInfo):
6970 {
7071 if (null === $ this ->getFieldNodeSelections ($ fieldNode )) {
7172 $ query = $ fieldNode ->selectionSet ->selections ;
72- $ selectedFields = [];
73- $ fragmentFields = [];
7473 /** @var FieldNode $field */
75- foreach ($ query as $ field ) {
76- if ($ field ->kind === NodeKind::INLINE_FRAGMENT ) {
77- $ fragmentFields [] = $ this ->addInlineFragmentFields ($ resolveInfo , $ field );
78- } elseif ($ field ->kind === NodeKind::FRAGMENT_SPREAD &&
79- ($ spreadFragmentNode = $ resolveInfo ->fragments [$ field ->name ->value ])) {
80-
81- foreach ($ spreadFragmentNode ->selectionSet ->selections as $ spreadNode ) {
82- if (isset ($ spreadNode ->selectionSet ->selections )
83- && $ spreadNode ->kind === NodeKind::INLINE_FRAGMENT ) {
84- $ fragmentFields [] = $ this ->addInlineFragmentFields ($ resolveInfo , $ spreadNode );
85- } elseif (isset ($ spreadNode ->selectionSet ->selections )
86- && $ spreadNode ->kind !== NodeKind::INLINE_FRAGMENT ) {
87- $ fragmentFields [] = $ this ->getQueryFields ($ spreadNode , $ resolveInfo );
88- } else {
74+ $ result = $ this ->getQueryData ($ query , $ resolveInfo );
75+ if ($ result ['fragmentFields ' ]) {
76+ $ result ['selectedFields ' ] = array_merge ([], $ result ['selectedFields ' ], ...$ result ['fragmentFields ' ]);
77+ }
78+ $ this ->setSelectionsForFieldNode ($ fieldNode , array_unique ($ result ['selectedFields ' ]));
79+ }
80+ return $ this ->getFieldNodeSelections ($ fieldNode );
81+ }
82+
83+ /**
84+ * Get an array of queried data.
85+ *
86+ * @param NodeList $query
87+ * @param ResolveInfo $resolveInfo
88+ * @return array
89+ */
90+ public function getQueryData (NodeList $ query , ResolveInfo $ resolveInfo ): array
91+ {
92+ $ selectedFields = $ fragmentFields = $ data = [];
93+ foreach ($ query as $ field ) {
94+ if ($ field ->kind === NodeKind::INLINE_FRAGMENT ) {
95+ $ fragmentFields [] = $ this ->addInlineFragmentFields ($ resolveInfo , $ field );
96+ } elseif ($ field ->kind === NodeKind::FRAGMENT_SPREAD &&
97+ ($ spreadFragmentNode = $ resolveInfo ->fragments [$ field ->name ->value ])) {
98+ foreach ($ spreadFragmentNode ->selectionSet ->selections as $ spreadNode ) {
99+ if (isset ($ spreadNode ->selectionSet ->selections )) {
100+ if ($ spreadNode ->kind === NodeKind::FIELD && isset ($ spreadNode ->name )) {
89101 $ selectedFields [] = $ spreadNode ->name ->value ;
90102 }
103+ $ fragmentFields [] = $ this ->getQueryFields ($ spreadNode , $ resolveInfo );
104+ } else {
105+ $ selectedFields [] = $ spreadNode ->name ->value ;
91106 }
92- } else {
93- $ selectedFields [] = $ field ->name ->value ;
94107 }
108+ } else {
109+ $ selectedFields [] = $ field ->name ->value ;
95110 }
96- if ($ fragmentFields ) {
97- $ selectedFields = array_merge ([], $ selectedFields , ...$ fragmentFields );
98- }
99- $ this ->setSelectionsForFieldNode ($ fieldNode , array_unique ($ selectedFields ));
100111 }
112+ $ data ['selectedFields ' ] = $ selectedFields ;
113+ $ data ['fragmentFields ' ] = $ fragmentFields ;
101114
102- return $ this -> getFieldNodeSelections ( $ fieldNode ) ;
115+ return $ data ;
103116 }
104117
105118 /**
@@ -117,15 +130,22 @@ private function addInlineFragmentFields(
117130 ): array {
118131 $ query = $ inlineFragmentField ->selectionSet ->selections ;
119132 /** @var FieldNode $field */
133+ $ fragmentFields = [];
120134 foreach ($ query as $ field ) {
121135 if ($ field ->kind === NodeKind::INLINE_FRAGMENT ) {
122136 $ this ->addInlineFragmentFields ($ resolveInfo , $ field , $ inlineFragmentFields );
123137 } elseif (isset ($ field ->selectionSet ->selections )) {
124- continue ;
138+ if ($ field ->kind === NodeKind::FIELD && isset ($ field ->name )) {
139+ $ inlineFragmentFields [] = $ field ->name ->value ;
140+ }
141+ $ fragmentFields [] = $ this ->getQueryFields ($ field , $ resolveInfo );
125142 } else {
126143 $ inlineFragmentFields [] = $ field ->name ->value ;
127144 }
128145 }
146+ if ($ fragmentFields ) {
147+ $ inlineFragmentFields = array_merge ([], $ inlineFragmentFields , ...$ fragmentFields );
148+ }
129149
130150 return array_unique ($ inlineFragmentFields );
131151 }
0 commit comments