diff --git a/vendor/magento/module-visual-merchandiser/Model/Sorting/SortAbstract.php b/vendor/magento/module-visual-merchandiser/Model/Sorting/SortAbstract.php index bf81a6fdc75..3055a478345 100644 --- a/vendor/magento/module-visual-merchandiser/Model/Sorting/SortAbstract.php +++ b/vendor/magento/module-visual-merchandiser/Model/Sorting/SortAbstract.php @@ -7,15 +7,19 @@ namespace Magento\VisualMerchandiser\Model\Sorting; use Magento\Catalog\Model\Indexer\Product\Price\DimensionCollectionFactory; +use Magento\Catalog\Model\Indexer\Product\Price\PriceTableResolver; +use Magento\Customer\Model\GroupManagement; use Magento\Framework\App\ObjectManager; use Magento\Framework\Indexer\ScopeResolver\IndexScopeResolver; use Magento\Customer\Model\Indexer\CustomerGroupDimensionProvider; use Magento\Framework\Indexer\DimensionFactory; +use Magento\Store\Api\WebsiteRepositoryInterface; +use Magento\Store\Model\Indexer\WebsiteDimensionProvider; /** - * Class SortAbstract * @api * @since 100.0.2 + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class SortAbstract { @@ -44,28 +48,46 @@ class SortAbstract */ private $dimensionFactory; + /** + * @var WebsiteRepositoryInterface + */ + private $websiteRepository; + + /** + * @var PriceTableResolver + */ + private $priceTableResolver; + /** * @param \Magento\Framework\Module\Manager $moduleManager * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig * @param DimensionCollectionFactory|null $dimensionCollectionFactory * @param IndexScopeResolver|null $indexScopeResolver * @param DimensionFactory|null $dimensionFactory + * @param WebsiteRepositoryInterface|null $websiteRepository + * @param PriceTableResolver|null $priceTableResolver */ public function __construct( \Magento\Framework\Module\Manager $moduleManager, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, DimensionCollectionFactory $dimensionCollectionFactory = null, IndexScopeResolver $indexScopeResolver = null, - DimensionFactory $dimensionFactory = null + DimensionFactory $dimensionFactory = null, + WebsiteRepositoryInterface $websiteRepository = null, + PriceTableResolver $priceTableResolver = null ) { $this->moduleManager = $moduleManager; $this->scopeConfig = $scopeConfig; $this->dimensionCollectionFactory = $dimensionCollectionFactory - ?: ObjectManager::getInstance()->get(DimensionCollectionFactory::class); + ?? ObjectManager::getInstance()->get(DimensionCollectionFactory::class); $this->indexScopeResolver = $indexScopeResolver - ?: ObjectManager::getInstance()->get(IndexScopeResolver::class); + ?? ObjectManager::getInstance()->get(IndexScopeResolver::class); $this->dimensionFactory = $dimensionFactory - ?: ObjectManager::getInstance()->get(DimensionFactory::class); + ?? ObjectManager::getInstance()->get(DimensionFactory::class); + $this->websiteRepository = $websiteRepository + ?? ObjectManager::getInstance()->get(WebsiteRepositoryInterface::class); + $this->priceTableResolver = $priceTableResolver + ?? ObjectManager::getInstance()->get(PriceTableResolver::class); } /** @@ -108,11 +130,16 @@ protected function addPriceData($collection) { $connection = $collection->getConnection(); $select = $collection->getSelect(); + + $websiteId = $this->websiteRepository->getDefault()->getId(); $joinCond = join( ' AND ', - ['price_index.entity_id = e.entity_id'] + [ + 'price_index.entity_id = e.entity_id', + 'price_index.customer_group_id = ' . GroupManagement::NOT_LOGGED_IN_ID, + 'price_index.website_id = ' . $websiteId, + ] ); - $select->where('price_index.customer_group_id = ?', 0); $fromPart = $select->getPart(\Magento\Framework\DB\Select::FROM); @@ -139,24 +166,22 @@ protected function addPriceData($collection) 'minimal_price' => $minimalExpr, ]; - $where = str_replace('`e`.', '', $select->getPart('where')[0]); - - $selects = []; - $dimensionsCollection = iterator_to_array($this->dimensionCollectionFactory->create()); - foreach ($dimensionsCollection as $dimensions) { - $unionSelect = clone $connection->select(); - if (array_key_exists(CustomerGroupDimensionProvider::DIMENSION_NAME, $dimensions)) { - $dimensions[CustomerGroupDimensionProvider::DIMENSION_NAME] - = $this->dimensionFactory->create(CustomerGroupDimensionProvider::DIMENSION_NAME, 0); - } - $tableName = $this->indexScopeResolver->resolve('catalog_product_index_price', $dimensions); - $selects[] = $unionSelect->from($tableName)->where($where); - } - $selects = array_unique($selects); - $unionPrice = $connection->select()->union($selects); + $priceIndexTable = $this->priceTableResolver->resolve( + 'catalog_product_index_price', + [ + $this->dimensionFactory->create( + CustomerGroupDimensionProvider::DIMENSION_NAME, + (string) GroupManagement::NOT_LOGGED_IN_ID + ), + $this->dimensionFactory->create( + WebsiteDimensionProvider::DIMENSION_NAME, + (string) $websiteId + ) + ] + ); $select->joinLeft( - ['price_index' => $unionPrice], - 'price_index.entity_id = e.entity_id', + ['price_index' => $priceIndexTable], + $joinCond, $colls ); } else {