30 private $resourceConnection;
35 private $conditionManager;
45 private $storeManager;
50 private $aliasResolver;
67 $this->conditionManager = $conditionManager;
70 $this->aliasResolver = $aliasResolver;
86 $mainTableAlias = $this->extractTableAliasFromSelect(
$select);
90 $filterJoinAlias = $this->aliasResolver->getAlias($filter);
92 $attributeId = $this->getAttributeIdByCode($filter->getField());
94 if ($attributeId ===
null) {
95 throw new \InvalidArgumentException(
96 sprintf(
'Invalid attribute id for field: %s', $filter->getField())
103 [$filterJoinAlias => $this->resourceConnection->getTableName(
'catalog_product_index_eav')],
104 $this->conditionManager->combineQueries(
105 $this->getJoinConditions($attributeId, $mainTableAlias, $filterJoinAlias),
118 $this->conditionManager->generateCondition(
119 sprintf(
'%s.attribute_id', $mainTableAlias),
124 $this->conditionManager->generateCondition(
125 sprintf(
'%s.value', $mainTableAlias),
126 is_array($filter->getValue()) ?
'in' :
'=',
143 private function getJoinConditions($attrId, $mainTable, $joinTable)
146 sprintf(
'`%s`.`entity_id` = `%s`.`entity_id`', $mainTable, $joinTable),
147 sprintf(
'`%s`.`source_id` = `%s`.`source_id`', $mainTable, $joinTable),
148 $this->conditionManager->generateCondition(
149 sprintf(
'%s.attribute_id', $joinTable),
153 $this->conditionManager->generateCondition(
154 sprintf(
'%s.store_id', $joinTable),
156 (
int) $this->storeManager->getStore()->getId()
168 private function getAttributeIdByCode($field)
182 private function extractTableAliasFromSelect(Select
$select)
184 $fromArr = array_filter(
186 function ($fromPart) {
191 return $fromArr ? array_keys($fromArr)[0] :
null;
apply(Select $select, FilterInterface ... $filters)
__construct(ResourceConnection $resourceConnection, ConditionManager $conditionManager, EavConfig $eavConfig, StoreManagerInterface $storeManager, AliasResolver $aliasResolver)