12
12
use Magento \CatalogGraphQl \Model \Resolver \Products \SearchResult ;
13
13
use Magento \CatalogGraphQl \Model \Resolver \Products \SearchResultFactory ;
14
14
use Magento \Framework \Api \Search \SearchCriteriaInterface ;
15
- use Magento \Framework \Api \Search \SearchCriteriaInterfaceFactory ;
16
15
use Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
17
16
use Magento \Search \Api \SearchInterface ;
18
17
use Magento \Search \Model \Search \PageSizeProvider ;
19
- use Magento \Framework \Api \FilterBuilder ;
20
- use Magento \Framework \Api \Search \FilterGroupBuilder ;
21
18
22
19
/**
23
20
* Full text search for catalog using given search criteria.
@@ -39,11 +36,6 @@ class Search implements ProductQueryInterface
39
36
*/
40
37
private $ pageSizeProvider ;
41
38
42
- /**
43
- * @var SearchCriteriaInterfaceFactory
44
- */
45
- private $ searchCriteriaFactory ;
46
-
47
39
/**
48
40
* @var FieldSelection
49
41
*/
@@ -59,43 +51,28 @@ class Search implements ProductQueryInterface
59
51
*/
60
52
private $ searchCriteriaBuilder ;
61
53
62
- /** @var FilterBuilder */
63
- private $ filterBuilder ;
64
-
65
- /** @var FilterGroupBuilder */
66
- private $ filterGroupBuilder ;
67
-
68
54
/**
69
55
* @param SearchInterface $search
70
56
* @param SearchResultFactory $searchResultFactory
71
57
* @param PageSizeProvider $pageSize
72
- * @param SearchCriteriaInterfaceFactory $searchCriteriaFactory
73
58
* @param FieldSelection $fieldSelection
74
59
* @param ProductSearch $productsProvider
75
60
* @param SearchCriteriaBuilder $searchCriteriaBuilder
76
- * @param FilterBuilder $filterBuilder
77
- * @param FilterGroupBuilder $filterGroupBuilder
78
61
*/
79
62
public function __construct (
80
63
SearchInterface $ search ,
81
64
SearchResultFactory $ searchResultFactory ,
82
65
PageSizeProvider $ pageSize ,
83
- SearchCriteriaInterfaceFactory $ searchCriteriaFactory ,
84
66
FieldSelection $ fieldSelection ,
85
67
ProductSearch $ productsProvider ,
86
- SearchCriteriaBuilder $ searchCriteriaBuilder ,
87
- FilterBuilder $ filterBuilder ,
88
- FilterGroupBuilder $ filterGroupBuilder
68
+ SearchCriteriaBuilder $ searchCriteriaBuilder
89
69
) {
90
70
$ this ->search = $ search ;
91
71
$ this ->searchResultFactory = $ searchResultFactory ;
92
72
$ this ->pageSizeProvider = $ pageSize ;
93
- $ this ->searchCriteriaFactory = $ searchCriteriaFactory ;
94
73
$ this ->fieldSelection = $ fieldSelection ;
95
74
$ this ->productsProvider = $ productsProvider ;
96
75
$ this ->searchCriteriaBuilder = $ searchCriteriaBuilder ;
97
- $ this ->filterBuilder = $ filterBuilder ;
98
- $ this ->filterGroupBuilder = $ filterGroupBuilder ;
99
76
}
100
77
101
78
/**
@@ -115,48 +92,18 @@ public function getResult(
115
92
116
93
$ realPageSize = $ searchCriteria ->getPageSize ();
117
94
$ realCurrentPage = $ searchCriteria ->getCurrentPage ();
118
- // Current page must be set to 0 and page size to max for search to grab all ID's as temporary workaround
95
+ //Because of limitations of sort and pagination on search API we will query all IDS
119
96
$ pageSize = $ this ->pageSizeProvider ->getMaxPageSize ();
120
97
$ searchCriteria ->setPageSize ($ pageSize );
121
98
$ searchCriteria ->setCurrentPage (0 );
122
99
$ itemsResults = $ this ->search ->search ($ searchCriteria );
123
100
124
- //Create copy of search criteria without conditions (conditions will be applied by joining search result)
125
- $ searchCriteriaCopy = $ this ->searchCriteriaFactory ->create ()
126
- ->setSortOrders ($ searchCriteria ->getSortOrders ())
127
- ->setPageSize ($ realPageSize )
128
- ->setCurrentPage ($ realCurrentPage );
129
-
130
- $ categoryGroup = null ;
131
- foreach ($ searchCriteria ->getFilterGroups () as $ filterGroup ) {
132
- foreach ($ filterGroup ->getFilters () as $ filter ) {
133
- if ($ filter ->getField () == 'category_id ' ) {
134
- $ categoryFilter = $ this ->filterBuilder
135
- ->setField ($ filter ->getField ())
136
- ->setValue ($ filter ->getValue ())
137
- ->setConditionType ($ filter ->getConditionType ())
138
- ->create ();
139
-
140
- $ this ->filterGroupBuilder ->addFilter ($ categoryFilter );
141
- $ categoryGroup = $ this ->filterGroupBuilder ->create ();
142
- }
143
- }
144
- }
145
- //add root category or all root category children if category_id is not defined
146
- if ($ categoryGroup ) {
147
- $ searchCriteriaCopy ->setFilterGroups ([$ categoryGroup ]);
148
- }
149
-
150
- $ searchResults = $ this ->productsProvider ->getList ($ searchCriteriaCopy , $ itemsResults , $ queryFields );
151
-
152
- //possible division by 0
153
- if ($ realPageSize ) {
154
- $ maxPages = (int )ceil ($ searchResults ->getTotalCount () / $ realPageSize );
155
- } else {
156
- $ maxPages = 0 ;
157
- }
101
+ //Address limitations of sort and pagination on search API apply original pagination from GQL query
158
102
$ searchCriteria ->setPageSize ($ realPageSize );
159
103
$ searchCriteria ->setCurrentPage ($ realCurrentPage );
104
+ $ searchResults = $ this ->productsProvider ->getList ($ searchCriteria , $ itemsResults , $ queryFields );
105
+
106
+ $ totalPages = $ realPageSize ? ((int )ceil ($ searchResults ->getTotalCount () / $ realPageSize )) : 0 ;
160
107
161
108
$ productArray = [];
162
109
/** @var \Magento\Catalog\Model\Product $product */
@@ -172,7 +119,7 @@ public function getResult(
172
119
'searchAggregation ' => $ itemsResults ->getAggregations (),
173
120
'pageSize ' => $ realPageSize ,
174
121
'currentPage ' => $ realCurrentPage ,
175
- 'totalPages ' => $ maxPages ,
122
+ 'totalPages ' => $ totalPages ,
176
123
]
177
124
);
178
125
}
0 commit comments