Skip to content

Commit d6f92ea

Browse files
[Magento Community Engineering] Community Contributions - 2.4-develop-prs
- merged with '2.4-develop-expedited-prs' branch
2 parents 553959c + 34b6c61 commit d6f92ea

File tree

39 files changed

+253
-228
lines changed

39 files changed

+253
-228
lines changed

app/code/Magento/CatalogGraphQl/DataProvider/Product/SearchCriteriaBuilder.php

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,10 @@ public function build(array $args, bool $includeAggregation): SearchCriteriaInte
101101
}
102102

103103
if (!$searchCriteria->getSortOrders()) {
104-
$this->addDefaultSortOrder($searchCriteria, $isSearch);
104+
$this->addDefaultSortOrder($searchCriteria, $args, $isSearch);
105105
}
106106

107+
$this->addEntityIdSort($searchCriteria, $isSearch);
107108
$this->addVisibilityFilter($searchCriteria, $isSearch, !empty($args['filter']));
108109

109110
$searchCriteria->setCurrentPage($args['currentPage']);
@@ -132,6 +133,25 @@ private function addVisibilityFilter(SearchCriteriaInterface $searchCriteria, bo
132133
$this->addFilter($searchCriteria, 'visibility', $visibilityIds, 'in');
133134
}
134135

136+
/**
137+
* Add sort by Entity ID
138+
*
139+
* @param SearchCriteriaInterface $searchCriteria
140+
* @param bool $isSearch
141+
*/
142+
private function addEntityIdSort(SearchCriteriaInterface $searchCriteria, bool $isSearch): void
143+
{
144+
if ($isSearch) {
145+
return;
146+
}
147+
$sortOrderArray = $searchCriteria->getSortOrders();
148+
$sortOrderArray[] = $this->sortOrderBuilder
149+
->setField('_id')
150+
->setDirection(SortOrder::SORT_DESC)
151+
->create();
152+
$searchCriteria->setSortOrders($sortOrderArray);
153+
}
154+
135155
/**
136156
* Prepare price aggregation algorithm
137157
*
@@ -179,18 +199,32 @@ private function addFilter(
179199
* Sort by relevance DESC by default
180200
*
181201
* @param SearchCriteriaInterface $searchCriteria
202+
* @param array $args
182203
* @param bool $isSearch
183204
*/
184-
private function addDefaultSortOrder(SearchCriteriaInterface $searchCriteria, $isSearch = false): void
205+
private function addDefaultSortOrder(SearchCriteriaInterface $searchCriteria, array $args, $isSearch = false): void
185206
{
186-
$sortField = $isSearch ? 'relevance' : EavAttributeInterface::POSITION;
187-
$sortDirection = $isSearch ? SortOrder::SORT_DESC : SortOrder::SORT_ASC;
188-
$defaultSortOrder = $this->sortOrderBuilder
189-
->setField($sortField)
190-
->setDirection($sortDirection)
191-
->create();
207+
$defaultSortOrder = [];
208+
if ($isSearch) {
209+
$defaultSortOrder[] = $this->sortOrderBuilder
210+
->setField('relevance')
211+
->setDirection(SortOrder::SORT_DESC)
212+
->create();
213+
} else {
214+
$categoryIdFilter = isset($args['filter']['category_id']) ? $args['filter']['category_id'] : false;
215+
if ($categoryIdFilter) {
216+
if (!is_array($categoryIdFilter[array_key_first($categoryIdFilter)])
217+
|| count($categoryIdFilter[array_key_first($categoryIdFilter)]) <= 1
218+
) {
219+
$defaultSortOrder[] = $this->sortOrderBuilder
220+
->setField(EavAttributeInterface::POSITION)
221+
->setDirection(SortOrder::SORT_ASC)
222+
->create();
223+
}
224+
}
225+
}
192226

193-
$searchCriteria->setSortOrders([$defaultSortOrder]);
227+
$searchCriteria->setSortOrders($defaultSortOrder);
194228
}
195229

196230
/**

app/code/Magento/CatalogGraphQl/Model/Category/CategoryFilter.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Magento\Framework\Exception\InputException;
1414
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
1515
use Magento\Framework\GraphQl\Query\Resolver\Argument\SearchCriteria\ArgumentApplier\Filter;
16+
use Magento\Framework\GraphQl\Query\Resolver\Argument\SearchCriteria\ArgumentApplier\Sort;
1617
use Magento\Search\Model\Query;
1718
use Magento\Store\Api\Data\StoreInterface;
1819
use Magento\Store\Model\ScopeInterface;
@@ -71,6 +72,7 @@ public function getResult(array $criteria, StoreInterface $store)
7172
$categoryIds = [];
7273
$criteria[Filter::ARGUMENT_NAME] = $this->formatMatchFilters($criteria['filters'], $store);
7374
$criteria[Filter::ARGUMENT_NAME][CategoryInterface::KEY_IS_ACTIVE] = ['eq' => 1];
75+
$criteria[Sort::ARGUMENT_NAME][CategoryInterface::KEY_POSITION] = ['ASC'];
7476
$searchCriteria = $this->searchCriteriaBuilder->build('categoryList', $criteria);
7577
$pageSize = $criteria['pageSize'] ?? 20;
7678
$currentPage = $criteria['currentPage'] ?? 1;

app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ProductSearch.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,12 @@ private function getSortOrderArray(SearchCriteriaInterface $searchCriteria)
153153
$sortOrders = $searchCriteria->getSortOrders();
154154
if (is_array($sortOrders)) {
155155
foreach ($sortOrders as $sortOrder) {
156+
// I am replacing _id with entity_id because in ElasticSearch _id is required for sorting by ID.
157+
// Where as entity_id is required when using ID as the sort in $collection->load();.
158+
// @see \Magento\CatalogGraphQl\Model\Resolver\Products\Query\Search::getResult
159+
if ($sortOrder->getField() === '_id') {
160+
$sortOrder->setField('entity_id');
161+
}
156162
$ordersArray[$sortOrder->getField()] = $sortOrder->getDirection();
157163
}
158164
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Magento\CatalogGraphQl\Model\Resolver\Products\SearchResult;
1313
use Magento\CatalogGraphQl\Model\Resolver\Products\SearchResultFactory;
1414
use Magento\Framework\Api\Search\SearchCriteriaInterface;
15+
use Magento\Framework\Exception\InputException;
1516
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1617
use Magento\GraphQl\Model\Query\ContextInterface;
1718
use Magento\Search\Api\SearchInterface;
@@ -83,6 +84,7 @@ public function __construct(
8384
* @param ResolveInfo $info
8485
* @param ContextInterface $context
8586
* @return SearchResult
87+
* @throws InputException
8688
*/
8789
public function getResult(
8890
array $args,
@@ -103,7 +105,12 @@ public function getResult(
103105
//Address limitations of sort and pagination on search API apply original pagination from GQL query
104106
$searchCriteria->setPageSize($realPageSize);
105107
$searchCriteria->setCurrentPage($realCurrentPage);
106-
$searchResults = $this->productsProvider->getList($searchCriteria, $itemsResults, $queryFields, $context);
108+
$searchResults = $this->productsProvider->getList(
109+
$searchCriteria,
110+
$itemsResults,
111+
$queryFields,
112+
$context
113+
);
107114

108115
$totalPages = $realPageSize ? ((int)ceil($searchResults->getTotalCount() / $realPageSize)) : 0;
109116

app/code/Magento/MediaContentSynchronizationApi/Api/SynchronizerInterface.php

Lines changed: 0 additions & 21 deletions
This file was deleted.

app/code/Magento/MediaContentSynchronizationApi/Model/SynchronizerPool.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Magento\MediaContentSynchronizationApi\Model;
99

10-
use Magento\MediaContentSynchronizationApi\Api\SynchronizerInterface;
10+
use Magento\MediaContentSynchronizationApi\Api\SynchronizeInterface;
1111

1212
/**
1313
* A pool that handles content and assets synchronization.
@@ -18,20 +18,20 @@ class SynchronizerPool
1818
/**
1919
* Content with assets synchronizers
2020
*
21-
* @var SynchronizerInterface[]
21+
* @var SynchronizeInterface[]
2222
*/
2323
private $synchronizers;
2424

2525
/**
26-
* @param SynchronizerInterface[] $synchronizers
26+
* @param SynchronizeInterface[] $synchronizers
2727
*/
2828
public function __construct(
2929
array $synchronizers = []
3030
) {
3131
foreach ($synchronizers as $synchronizer) {
32-
if (!$synchronizer instanceof SynchronizerInterface) {
32+
if (!$synchronizer instanceof SynchronizeInterface) {
3333
throw new \InvalidArgumentException(
34-
get_class($synchronizer) . ' must implement ' . SynchronizerInterface::class
34+
get_class($synchronizer) . ' must implement ' . SynchronizeInterface::class
3535
);
3636
}
3737
}
@@ -42,7 +42,7 @@ public function __construct(
4242
/**
4343
* Get all synchronizers from the pool
4444
*
45-
* @return SynchronizerInterface[]
45+
* @return SynchronizeInterface[]
4646
*/
4747
public function get(): array
4848
{

app/code/Magento/MediaContentSynchronizationCatalog/Model/Synchronizer/Category.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
use Magento\MediaContentApi\Api\Data\ContentIdentityInterfaceFactory;
1111
use Magento\MediaContentApi\Api\UpdateContentAssetLinksInterface;
1212
use Magento\MediaContentApi\Model\GetEntityContentsInterface;
13-
use Magento\MediaContentSynchronizationApi\Api\SynchronizerInterface;
13+
use Magento\MediaContentSynchronizationApi\Api\SynchronizeInterface;
1414
use Magento\MediaGallerySynchronizationApi\Model\FetchBatchesInterface;
1515

1616
/**
1717
* Synchronize category content with assets
1818
*/
19-
class Category implements SynchronizerInterface
19+
class Category implements SynchronizeInterface
2020
{
2121
private const CONTENT_TYPE = 'catalog_category';
2222
private const TYPE = 'entityType';

app/code/Magento/MediaContentSynchronizationCatalog/Model/Synchronizer/Product.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
use Magento\MediaContentApi\Api\Data\ContentIdentityInterfaceFactory;
1111
use Magento\MediaContentApi\Api\UpdateContentAssetLinksInterface;
1212
use Magento\MediaContentApi\Model\GetEntityContentsInterface;
13-
use Magento\MediaContentSynchronizationApi\Api\SynchronizerInterface;
13+
use Magento\MediaContentSynchronizationApi\Api\SynchronizeInterface;
1414
use Magento\MediaGallerySynchronizationApi\Model\FetchBatchesInterface;
1515

1616
/**
1717
* Synchronize product content with assets
1818
*/
19-
class Product implements SynchronizerInterface
19+
class Product implements SynchronizeInterface
2020
{
2121
private const CONTENT_TYPE = 'catalog_product';
2222
private const TYPE = 'entityType';

app/code/Magento/MediaContentSynchronizationCms/Model/Synchronizer/Block.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99

1010
use Magento\MediaContentApi\Api\Data\ContentIdentityInterfaceFactory;
1111
use Magento\MediaContentApi\Api\UpdateContentAssetLinksInterface;
12-
use Magento\MediaContentSynchronizationApi\Api\SynchronizerInterface;
12+
use Magento\MediaContentSynchronizationApi\Api\SynchronizeInterface;
1313
use Magento\MediaGallerySynchronizationApi\Model\FetchBatchesInterface;
1414

1515
/**
1616
* Synchronize block content with assets
1717
*/
18-
class Block implements SynchronizerInterface
18+
class Block implements SynchronizeInterface
1919
{
2020
private const CONTENT_TYPE = 'cms_block';
2121
private const TYPE = 'entityType';

app/code/Magento/MediaContentSynchronizationCms/Model/Synchronizer/Page.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99

1010
use Magento\MediaContentApi\Api\Data\ContentIdentityInterfaceFactory;
1111
use Magento\MediaContentApi\Api\UpdateContentAssetLinksInterface;
12-
use Magento\MediaContentSynchronizationApi\Api\SynchronizerInterface;
12+
use Magento\MediaContentSynchronizationApi\Api\SynchronizeInterface;
1313
use Magento\MediaGallerySynchronizationApi\Model\FetchBatchesInterface;
1414

1515
/**
1616
* Synchronize page content with assets
1717
*/
18-
class Page implements SynchronizerInterface
18+
class Page implements SynchronizeInterface
1919
{
2020
private const CONTENT_TYPE = 'cms_page';
2121
private const TYPE = 'entityType';

0 commit comments

Comments
 (0)