16
16
use Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
17
17
use Magento \Search \Api \SearchInterface ;
18
18
use Magento \Search \Model \Search \PageSizeProvider ;
19
+ use Magento \Framework \Api \FilterBuilder ;
20
+ use Magento \Framework \Api \Search \FilterGroupBuilder ;
19
21
20
22
/**
21
23
* Full text search for catalog using given search criteria.
@@ -57,6 +59,12 @@ class Search implements ProductQueryInterface
57
59
*/
58
60
private $ searchCriteriaBuilder ;
59
61
62
+ /** @var FilterBuilder */
63
+ private $ filterBuilder ;
64
+
65
+ /** @var FilterGroupBuilder */
66
+ private $ filterGroupBuilder ;
67
+
60
68
/**
61
69
* @param SearchInterface $search
62
70
* @param SearchResultFactory $searchResultFactory
@@ -65,6 +73,8 @@ class Search implements ProductQueryInterface
65
73
* @param FieldSelection $fieldSelection
66
74
* @param ProductSearch $productsProvider
67
75
* @param SearchCriteriaBuilder $searchCriteriaBuilder
76
+ * @param FilterBuilder $filterBuilder
77
+ * @param FilterGroupBuilder $filterGroupBuilder
68
78
*/
69
79
public function __construct (
70
80
SearchInterface $ search ,
@@ -73,7 +83,9 @@ public function __construct(
73
83
SearchCriteriaInterfaceFactory $ searchCriteriaFactory ,
74
84
FieldSelection $ fieldSelection ,
75
85
ProductSearch $ productsProvider ,
76
- SearchCriteriaBuilder $ searchCriteriaBuilder
86
+ SearchCriteriaBuilder $ searchCriteriaBuilder ,
87
+ FilterBuilder $ filterBuilder ,
88
+ FilterGroupBuilder $ filterGroupBuilder
77
89
) {
78
90
$ this ->search = $ search ;
79
91
$ this ->searchResultFactory = $ searchResultFactory ;
@@ -82,6 +94,8 @@ public function __construct(
82
94
$ this ->fieldSelection = $ fieldSelection ;
83
95
$ this ->productsProvider = $ productsProvider ;
84
96
$ this ->searchCriteriaBuilder = $ searchCriteriaBuilder ;
97
+ $ this ->filterBuilder = $ filterBuilder ;
98
+ $ this ->filterGroupBuilder = $ filterGroupBuilder ;
85
99
}
86
100
87
101
/**
@@ -109,14 +123,42 @@ public function getResult(
109
123
110
124
$ searchCriteria ->setPageSize ($ realPageSize )->setCurrentPage ($ realCurrentPage );
111
125
112
- $ searchResults = $ this ->productsProvider ->getList ($ searchCriteria , $ itemsResults , $ queryFields );
126
+ //Create copy of search criteria without conditions (conditions will be applied by joining search result)
127
+ $ searchCriteriaCopy = $ this ->searchCriteriaFactory ->create ()
128
+ ->setSortOrders ($ searchCriteria ->getSortOrders ())
129
+ ->setPageSize ($ realPageSize )
130
+ ->setCurrentPage ($ realCurrentPage );
131
+
132
+ $ categoryGroup = null ;
133
+ foreach ($ searchCriteria ->getFilterGroups () as $ filterGroup ) {
134
+ foreach ($ filterGroup ->getFilters () as $ filter ) {
135
+ if ($ filter ->getField () == 'category_id ' ) {
136
+ $ categoryFilter = $ this ->filterBuilder
137
+ ->setField ($ filter ->getField ())
138
+ ->setValue ($ filter ->getValue ())
139
+ ->setConditionType ($ filter ->getConditionType ())
140
+ ->create ();
141
+
142
+ $ this ->filterGroupBuilder ->addFilter ($ categoryFilter );
143
+ $ categoryGroup = $ this ->filterGroupBuilder ->create ();
144
+ }
145
+ }
146
+ }
147
+
148
+ if ($ categoryGroup ) {
149
+ $ searchCriteriaCopy ->setFilterGroups ([$ categoryGroup ]);
150
+ }
151
+
152
+ $ searchResults = $ this ->productsProvider ->getList ($ searchCriteriaCopy , $ itemsResults , $ queryFields );
113
153
114
154
//possible division by 0
115
155
if ($ realPageSize ) {
116
156
$ maxPages = (int )ceil ($ searchResults ->getTotalCount () / $ realPageSize );
117
157
} else {
118
158
$ maxPages = 0 ;
119
159
}
160
+ $ searchCriteria ->setPageSize ($ realPageSize );
161
+ $ searchCriteria ->setCurrentPage ($ realCurrentPage );
120
162
121
163
$ productArray = [];
122
164
/** @var \Magento\Catalog\Model\Product $product */
0 commit comments