8
8
namespace Magento \CatalogGraphQl \Model ;
9
9
10
10
use GraphQL \Language \AST \FieldNode ;
11
- use GraphQL \Language \AST \FragmentSpreadNode ;
12
11
use GraphQL \Language \AST \InlineFragmentNode ;
13
12
use GraphQL \Language \AST \NodeKind ;
14
13
use Magento \Eav \Model \Entity \Collection \AbstractCollection ;
@@ -34,11 +33,6 @@ class AttributesJoiner
34
33
*/
35
34
private $ fieldToAttributeMap = [];
36
35
37
- /**
38
- * @var ResolveInfo
39
- */
40
- private $ resolverInfo = null ;
41
-
42
36
/**
43
37
* @param array $fieldToAttributeMap
44
38
*/
@@ -52,11 +46,12 @@ public function __construct(array $fieldToAttributeMap = [])
52
46
*
53
47
* @param FieldNode $fieldNode
54
48
* @param AbstractCollection $collection
49
+ * @param ResolveInfo $resolverInfo
55
50
* @return void
56
51
*/
57
- public function join (FieldNode $ fieldNode , AbstractCollection $ collection ): void
52
+ public function join (FieldNode $ fieldNode , AbstractCollection $ collection, ResolveInfo $ resolverInfo ): void
58
53
{
59
- foreach ($ this ->getQueryFields ($ fieldNode ) as $ field ) {
54
+ foreach ($ this ->getQueryFields ($ fieldNode, $ resolverInfo ) as $ field ) {
60
55
$ this ->addFieldToCollection ($ collection , $ field );
61
56
}
62
57
}
@@ -65,22 +60,25 @@ public function join(FieldNode $fieldNode, AbstractCollection $collection): void
65
60
* Get an array of queried fields.
66
61
*
67
62
* @param FieldNode $fieldNode
63
+ * @param ResolveInfo $resolverInfo
68
64
* @return string[]
69
65
*/
70
- public function getQueryFields (FieldNode $ fieldNode ): array
66
+ public function getQueryFields (FieldNode $ fieldNode, ResolveInfo $ resolveInfo ): array
71
67
{
72
68
if (null === $ this ->getFieldNodeSelections ($ fieldNode )) {
73
69
$ query = $ fieldNode ->selectionSet ->selections ;
74
70
$ selectedFields = [];
75
71
/** @var FieldNode $field */
76
72
foreach ($ query as $ field ) {
77
73
if ($ field ->kind === NodeKind::INLINE_FRAGMENT ) {
78
- $ inlineFragmentFields = $ this ->addInlineFragmentFields ($ field );
74
+ $ inlineFragmentFields = $ this ->addInlineFragmentFields ($ resolveInfo , $ field );
79
75
$ selectedFields = array_merge ($ selectedFields , $ inlineFragmentFields );
80
- } elseif ($ field ->kind === NodeKind::FRAGMENT_SPREAD && isset ($ this ->resolverInfo ->fragments [$ field ->name ->value ])) {
81
- foreach ($ this ->resolverInfo ->fragments [$ field ->name ->value ]->selectionSet ->selections as $ spreadNode ) {
76
+ } elseif ($ field ->kind === NodeKind::FRAGMENT_SPREAD &&
77
+ ($ spreadFragmentNode = $ resolveInfo ->fragments [$ field ->name ->value ])) {
78
+
79
+ foreach ($ spreadFragmentNode ->selectionSet ->selections as $ spreadNode ) {
82
80
if (isset ($ spreadNode ->selectionSet ->selections )) {
83
- $ fragmentSpreadFields = $ this ->getQueryFields ($ spreadNode );
81
+ $ fragmentSpreadFields = $ this ->getQueryFields ($ spreadNode, $ resolveInfo );
84
82
$ selectedFields = array_merge ($ selectedFields , $ fragmentSpreadFields );
85
83
} else {
86
84
$ selectedFields [] = $ spreadNode ->name ->value ;
@@ -90,7 +88,7 @@ public function getQueryFields(FieldNode $fieldNode): array
90
88
$ selectedFields [] = $ field ->name ->value ;
91
89
}
92
90
}
93
- $ this ->setSelectionsForFieldNode ($ fieldNode , $ selectedFields );
91
+ $ this ->setSelectionsForFieldNode ($ fieldNode , array_unique ( $ selectedFields) );
94
92
}
95
93
96
94
return $ this ->getFieldNodeSelections ($ fieldNode );
@@ -99,19 +97,23 @@ public function getQueryFields(FieldNode $fieldNode): array
99
97
/**
100
98
* Add fields from inline fragment nodes
101
99
*
100
+ * @param ResolveInfo $resolveInfo
102
101
* @param InlineFragmentNode $inlineFragmentField
103
102
* @param array $inlineFragmentFields
104
103
* @return string[]
105
104
*/
106
- private function addInlineFragmentFields (InlineFragmentNode $ inlineFragmentField , $ inlineFragmentFields = [])
107
- {
105
+ private function addInlineFragmentFields (
106
+ ResolveInfo $ resolveInfo ,
107
+ InlineFragmentNode $ inlineFragmentField ,
108
+ $ inlineFragmentFields = []
109
+ ): array {
108
110
$ query = $ inlineFragmentField ->selectionSet ->selections ;
109
111
/** @var FieldNode $field */
110
112
foreach ($ query as $ field ) {
111
113
if ($ field ->kind === NodeKind::INLINE_FRAGMENT ) {
112
- $ this ->addInlineFragmentFields ($ field , $ inlineFragmentFields );
114
+ $ this ->addInlineFragmentFields ($ resolveInfo , $ field , $ inlineFragmentFields );
113
115
} elseif (isset ($ field ->selectionSet ->selections )) {
114
- if (is_array ($ queryFields = $ this ->getQueryFields ($ field ))) {
116
+ if (is_array ($ queryFields = $ this ->getQueryFields ($ field, $ resolveInfo ))) {
115
117
$ inlineFragmentFields = array_merge ($ inlineFragmentFields , $ queryFields );
116
118
}
117
119
} else {
@@ -170,12 +172,4 @@ private function setSelectionsForFieldNode(FieldNode $fieldNode, array $selected
170
172
{
171
173
$ this ->queryFields [$ fieldNode ->name ->value ][$ fieldNode ->name ->loc ->start ] = $ selectedFields ;
172
174
}
173
-
174
- /**
175
- * @param ResolveInfo $resolverInfo
176
- */
177
- public function setResolverInfo (ResolveInfo $ resolverInfo ): void
178
- {
179
- $ this ->resolverInfo = $ resolverInfo ;
180
- }
181
175
}
0 commit comments