Skip to content

Commit c304562

Browse files
author
Eric Bohanon
committed
MAGETWO-82674: GraphQL Full Text Search
- Introduce workaround for incorrect search pagination.
1 parent 20ca688 commit c304562

File tree

1 file changed

+27
-4
lines changed
  • app/code/Magento/GraphQlCatalog/Model/Resolver/Products/Query

1 file changed

+27
-4
lines changed

app/code/Magento/GraphQlCatalog/Model/Resolver/Products/Query/Search.php

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,24 @@ public function __construct(
6363
*/
6464
public function getResult(SearchCriteriaInterface $searchCriteria)
6565
{
66+
$realPageSize = $searchCriteria->getPageSize();
67+
$realCurrentPage = $searchCriteria->getCurrentPage();
68+
$searchCriteria->setPageSize(PHP_INT_MAX);
6669
// Search starts pages from 0, whereas filtering starts at 1. GraphQL's query starts at 1, so it must be altered
67-
$searchCriteria->setCurrentPage($searchCriteria->getCurrentPage() - 1);
70+
$searchCriteria->setCurrentPage($realCurrentPage - 1);
6871
$itemsResults = $this->search->search($searchCriteria);
72+
6973
$ids = [];
7074
$searchIds = [];
7175
foreach ($itemsResults->getItems() as $item) {
7276
$ids[$item->getId()] = null;
7377
$searchIds[] = $item->getId();
7478
}
75-
$filter = $this->filterHelper->generate('entity_id', 'in', $searchIds);
76-
$searchCriteria->setCurrentPage($searchCriteria->getCurrentPage() + 1);
79+
$searchCriteria->setPageSize($realPageSize);
80+
$paginatedIds = $this->paginateIdList($searchIds, $searchCriteria);
81+
$filter = $this->filterHelper->generate('entity_id', 'in', $paginatedIds);
82+
83+
$searchCriteria->setCurrentPage($realCurrentPage);
7784
$searchCriteria = $this->filterHelper->remove($searchCriteria, 'search_term');
7885
$searchCriteria = $this->filterHelper->add($searchCriteria, $filter);
7986
$searchResult = $this->filterQuery->getResult($searchCriteria);
@@ -82,6 +89,22 @@ public function getResult(SearchCriteriaInterface $searchCriteria)
8289
}
8390
$products = array_filter($ids);
8491

85-
return $this->searchResultFactory->create($searchResult->getTotalCount(), $products);
92+
return $this->searchResultFactory->create($itemsResults->getTotalCount(), $products);
93+
}
94+
95+
/**
96+
* Paginates array of Ids pulled back in search based off search criteria and total count.
97+
*
98+
* This function and its usages should be removed after MAGETWO-85611 is resolved.
99+
*
100+
* @param int[] $ids
101+
* @param SearchCriteriaInterface $searchCriteria
102+
* @return int[]
103+
*/
104+
private function paginateIdList(array $ids, SearchCriteriaInterface $searchCriteria)
105+
{
106+
$length = $searchCriteria->getPageSize();
107+
$offset = $length * $searchCriteria->getCurrentPage();
108+
return array_slice($ids, $offset, $length);
86109
}
87110
}

0 commit comments

Comments
 (0)