34 private $resourceConnection;
39 private $aliasResolver;
44 private $storeManager;
50 private $validFields = [
'price',
'category_ids'];
55 private $tableResolver;
60 private $priceTableResolver;
65 private $dimensionFactory;
85 TableResolver $tableResolver =
null,
92 $this->aliasResolver = $aliasResolver;
96 IndexScopeResolverInterface::class
108 if (!in_array($filter->getField(), $this->validFields,
true)) {
112 if ($filter->getField() ===
'price') {
113 return $this->applyPriceFilter($filter,
$select);
114 }
elseif ($filter->getField() ===
'category_ids') {
115 return $this->applyCategoryFilter($filter,
$select);
128 private function applyPriceFilter(
132 $alias = $this->aliasResolver->getAlias($filter);
133 $websiteId = $this->storeManager->getWebsite()->getId();
134 $tableName = $this->priceTableResolver->resolve(
135 'catalog_product_index_price',
138 $this->dimensionFactory->create(
140 (
string)$this->httpContext->getValue(CustomerContext::CONTEXT_GROUP)
144 $mainTableAlias = $this->extractTableAliasFromSelect(
$select);
150 $this->resourceConnection->getConnection()->quoteInto(
151 sprintf(
'%s.entity_id = price_index.entity_id AND price_index.website_id = ?', $mainTableAlias),
169 private function applyCategoryFilter(
173 $alias = $this->aliasResolver->getAlias($filter);
175 $catalogCategoryProductDimension =
new Dimension(
177 $this->storeManager->getStore()->getId()
183 $catalogCategoryProductDimension
186 $mainTableAlias = $this->extractTableAliasFromSelect(
$select);
192 $this->resourceConnection->getConnection()->quoteInto(
194 '%s.entity_id = category_ids_index.product_id AND category_ids_index.store_id = ?',
197 $this->storeManager->getStore()->getId()
211 private function extractTableAliasFromSelect(\
Magento\Framework\DB\Select
$select)
213 $fromArr = array_filter(
215 function ($fromPart) {
220 return $fromArr ? array_keys($fromArr)[0] :
null;
__construct(\Magento\Framework\App\ResourceConnection $resourceConnection, \Magento\Store\Model\StoreManagerInterface $storeManager, AliasResolver $aliasResolver, TableResolver $tableResolver=null, DimensionFactory $dimensionFactory=null, IndexScopeResolverInterface $priceTableResolver=null, Context $httpContext=null)
elseif(isset( $params[ 'redirect_parent']))
apply(\Magento\Framework\Search\Request\FilterInterface $filter, \Magento\Framework\DB\Select $select)