Skip to content

Commit 7a742ff

Browse files
committed
MC-32278: Position sort does not work in GraphQl.
- allow only category through
1 parent b7dce0e commit 7a742ff

File tree

3 files changed

+54
-17
lines changed

3 files changed

+54
-17
lines changed

app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Product/CollectionProcessor/VisibilityStatusProcessor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public function process(
2727
array $attributeNames
2828
): Collection {
2929
$collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner');
30-
//$collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
30+
$collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
3131

3232
return $collection;
3333
}

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

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1717
use Magento\Search\Api\SearchInterface;
1818
use Magento\Search\Model\Search\PageSizeProvider;
19+
use Magento\Framework\Api\FilterBuilder;
20+
use Magento\Framework\Api\Search\FilterGroupBuilder;
1921

2022
/**
2123
* Full text search for catalog using given search criteria.
@@ -57,6 +59,12 @@ class Search implements ProductQueryInterface
5759
*/
5860
private $searchCriteriaBuilder;
5961

62+
/** @var FilterBuilder */
63+
private $filterBuilder;
64+
65+
/** @var FilterGroupBuilder */
66+
private $filterGroupBuilder;
67+
6068
/**
6169
* @param SearchInterface $search
6270
* @param SearchResultFactory $searchResultFactory
@@ -65,6 +73,8 @@ class Search implements ProductQueryInterface
6573
* @param FieldSelection $fieldSelection
6674
* @param ProductSearch $productsProvider
6775
* @param SearchCriteriaBuilder $searchCriteriaBuilder
76+
* @param FilterBuilder $filterBuilder
77+
* @param FilterGroupBuilder $filterGroupBuilder
6878
*/
6979
public function __construct(
7080
SearchInterface $search,
@@ -73,7 +83,9 @@ public function __construct(
7383
SearchCriteriaInterfaceFactory $searchCriteriaFactory,
7484
FieldSelection $fieldSelection,
7585
ProductSearch $productsProvider,
76-
SearchCriteriaBuilder $searchCriteriaBuilder
86+
SearchCriteriaBuilder $searchCriteriaBuilder,
87+
FilterBuilder $filterBuilder,
88+
FilterGroupBuilder $filterGroupBuilder
7789
) {
7890
$this->search = $search;
7991
$this->searchResultFactory = $searchResultFactory;
@@ -82,6 +94,8 @@ public function __construct(
8294
$this->fieldSelection = $fieldSelection;
8395
$this->productsProvider = $productsProvider;
8496
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
97+
$this->filterBuilder = $filterBuilder;
98+
$this->filterGroupBuilder = $filterGroupBuilder;
8599
}
86100

87101
/**
@@ -109,14 +123,42 @@ public function getResult(
109123

110124
$searchCriteria->setPageSize($realPageSize)->setCurrentPage($realCurrentPage);
111125

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);
113153

114154
//possible division by 0
115155
if ($realPageSize) {
116156
$maxPages = (int)ceil($searchResults->getTotalCount() / $realPageSize);
117157
} else {
118158
$maxPages = 0;
119159
}
160+
$searchCriteria->setPageSize($realPageSize);
161+
$searchCriteria->setCurrentPage($realCurrentPage);
120162

121163
$productArray = [];
122164
/** @var \Magento\Catalog\Model\Product $product */

app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,16 @@ private function addFilterGroupToCollection(
6565
) {
6666
$fields = [];
6767
foreach ($filterGroup->getFilters() as $filter) {
68-
if ($filter->getField() != 'search_term'
69-
&& $filter->getField() != 'price_dynamic_algorithm'
70-
&& $filter->getField() != 'price.to'
71-
&& $filter->getField() != 'price.from') {
72-
$isApplied = false;
73-
$customFilter = $this->getCustomFilterForField($filter->getField());
74-
if ($customFilter) {
75-
$isApplied = $customFilter->apply($filter, $collection);
76-
}
68+
$isApplied = false;
69+
$customFilter = $this->getCustomFilterForField($filter->getField());
70+
if ($customFilter) {
71+
$isApplied = $customFilter->apply($filter, $collection);
72+
}
7773

78-
if (!$isApplied) {
79-
$field = $this->getFieldMapping($filter->getField());
80-
$condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
81-
$fields[] = ['attribute' => $field, $condition => $filter->getValue()];
82-
}
74+
if (!$isApplied) {
75+
$field = $this->getFieldMapping($filter->getField());
76+
$condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
77+
$fields[] = ['attribute' => $field, $condition => $filter->getValue()];
8378
}
8479
}
8580

0 commit comments

Comments
 (0)