1212use  Magento \CatalogGraphQl \Model \Resolver \Products \SearchResult ;
1313use  Magento \CatalogGraphQl \Model \Resolver \Products \SearchResultFactory ;
1414use  Magento \Framework \Api \Search \SearchCriteriaInterface ;
15- use  Magento \Framework \Api \Search \SearchCriteriaInterfaceFactory ;
1615use  Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
1716use  Magento \Search \Api \SearchInterface ;
1817use  Magento \Search \Model \Search \PageSizeProvider ;
19- use  Magento \Framework \Api \FilterBuilder ;
20- use  Magento \Framework \Api \Search \FilterGroupBuilder ;
2118
2219/** 
2320 * Full text search for catalog using given search criteria. 
@@ -39,11 +36,6 @@ class Search implements ProductQueryInterface
3936     */ 
4037    private  $ pageSizeProvider ;
4138
42-     /** 
43-      * @var SearchCriteriaInterfaceFactory 
44-      */ 
45-     private  $ searchCriteriaFactory ;
46- 
4739    /** 
4840     * @var FieldSelection 
4941     */ 
@@ -59,43 +51,28 @@ class Search implements ProductQueryInterface
5951     */ 
6052    private  $ searchCriteriaBuilder ;
6153
62-     /** @var FilterBuilder */ 
63-     private  $ filterBuilder ;
64- 
65-     /** @var FilterGroupBuilder */ 
66-     private  $ filterGroupBuilder ;
67- 
6854    /** 
6955     * @param SearchInterface $search 
7056     * @param SearchResultFactory $searchResultFactory 
7157     * @param PageSizeProvider $pageSize 
72-      * @param SearchCriteriaInterfaceFactory $searchCriteriaFactory 
7358     * @param FieldSelection $fieldSelection 
7459     * @param ProductSearch $productsProvider 
7560     * @param SearchCriteriaBuilder $searchCriteriaBuilder 
76-      * @param FilterBuilder $filterBuilder 
77-      * @param FilterGroupBuilder $filterGroupBuilder 
7861     */ 
7962    public  function  __construct (
8063        SearchInterface   $ search ,
8164        SearchResultFactory   $ searchResultFactory ,
8265        PageSizeProvider   $ pageSize ,
83-         SearchCriteriaInterfaceFactory   $ searchCriteriaFactory ,
8466        FieldSelection   $ fieldSelection ,
8567        ProductSearch   $ productsProvider ,
86-         SearchCriteriaBuilder   $ searchCriteriaBuilder ,
87-         FilterBuilder   $ filterBuilder ,
88-         FilterGroupBuilder   $ filterGroupBuilder
68+         SearchCriteriaBuilder   $ searchCriteriaBuilder
8969    ) {
9070        $ this  ->search  = $ search ;
9171        $ this  ->searchResultFactory  = $ searchResultFactory ;
9272        $ this  ->pageSizeProvider  = $ pageSize ;
93-         $ this  ->searchCriteriaFactory  = $ searchCriteriaFactory ;
9473        $ this  ->fieldSelection  = $ fieldSelection ;
9574        $ this  ->productsProvider  = $ productsProvider ;
9675        $ this  ->searchCriteriaBuilder  = $ searchCriteriaBuilder ;
97-         $ this  ->filterBuilder  = $ filterBuilder ;
98-         $ this  ->filterGroupBuilder  = $ filterGroupBuilder ;
9976    }
10077
10178    /** 
@@ -115,48 +92,18 @@ public function getResult(
11592
11693        $ realPageSize  = $ searchCriteria ->getPageSize ();
11794        $ 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  
11996        $ pageSize  = $ this  ->pageSizeProvider ->getMaxPageSize ();
12097        $ searchCriteria ->setPageSize ($ pageSize );
12198        $ searchCriteria ->setCurrentPage (0 );
12299        $ itemsResults  = $ this  ->search ->search ($ searchCriteria );
123100
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 
158102        $ searchCriteria ->setPageSize ($ realPageSize );
159103        $ searchCriteria ->setCurrentPage ($ realCurrentPage );
104+         $ searchResults  = $ this  ->productsProvider ->getList ($ searchCriteria , $ itemsResults , $ queryFields );
105+ 
106+         $ totalPages  = $ realPageSize  ? ((int )ceil ($ searchResults ->getTotalCount () / $ realPageSize )) : 0 ;
160107
161108        $ productArray  = [];
162109        /** @var \Magento\Catalog\Model\Product $product */ 
@@ -172,7 +119,7 @@ public function getResult(
172119                'searchAggregation '  => $ itemsResults ->getAggregations (),
173120                'pageSize '  => $ realPageSize ,
174121                'currentPage '  => $ realCurrentPage ,
175-                 'totalPages '  => $ maxPages  ,
122+                 'totalPages '  => $ totalPages  ,
176123            ]
177124        );
178125    }
0 commit comments