10
10
use GraphQL \Language \AST \FieldNode ;
11
11
use GraphQL \Language \AST \InlineFragmentNode ;
12
12
use GraphQL \Language \AST \NodeKind ;
13
+ use GraphQL \Language \AST \NodeList ;
13
14
use Magento \Eav \Model \Entity \Collection \AbstractCollection ;
14
15
use Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
15
16
use Magento \Framework \ObjectManager \ResetAfterRequestInterface ;
@@ -69,37 +70,49 @@ public function getQueryFields(FieldNode $fieldNode, ResolveInfo $resolveInfo):
69
70
{
70
71
if (null === $ this ->getFieldNodeSelections ($ fieldNode )) {
71
72
$ query = $ fieldNode ->selectionSet ->selections ;
72
- $ selectedFields = [];
73
- $ fragmentFields = [];
74
73
/** @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 )) {
89
101
$ selectedFields [] = $ spreadNode ->name ->value ;
90
102
}
103
+ $ fragmentFields [] = $ this ->getQueryFields ($ spreadNode , $ resolveInfo );
104
+ } else {
105
+ $ selectedFields [] = $ spreadNode ->name ->value ;
91
106
}
92
- } else {
93
- $ selectedFields [] = $ field ->name ->value ;
94
107
}
108
+ } else {
109
+ $ selectedFields [] = $ field ->name ->value ;
95
110
}
96
- if ($ fragmentFields ) {
97
- $ selectedFields = array_merge ([], $ selectedFields , ...$ fragmentFields );
98
- }
99
- $ this ->setSelectionsForFieldNode ($ fieldNode , array_unique ($ selectedFields ));
100
111
}
112
+ $ data ['selectedFields ' ] = $ selectedFields ;
113
+ $ data ['fragmentFields ' ] = $ fragmentFields ;
101
114
102
- return $ this -> getFieldNodeSelections ( $ fieldNode ) ;
115
+ return $ data ;
103
116
}
104
117
105
118
/**
@@ -117,15 +130,22 @@ private function addInlineFragmentFields(
117
130
): array {
118
131
$ query = $ inlineFragmentField ->selectionSet ->selections ;
119
132
/** @var FieldNode $field */
133
+ $ fragmentFields = [];
120
134
foreach ($ query as $ field ) {
121
135
if ($ field ->kind === NodeKind::INLINE_FRAGMENT ) {
122
136
$ this ->addInlineFragmentFields ($ resolveInfo , $ field , $ inlineFragmentFields );
123
137
} 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 );
125
142
} else {
126
143
$ inlineFragmentFields [] = $ field ->name ->value ;
127
144
}
128
145
}
146
+ if ($ fragmentFields ) {
147
+ $ inlineFragmentFields = array_merge ([], $ inlineFragmentFields , ...$ fragmentFields );
148
+ }
129
149
130
150
return array_unique ($ inlineFragmentFields );
131
151
}
0 commit comments