20 private $objectManager;
26 private $customAttributeFilter;
29 private $eavConfigMock;
32 private $storeManager;
35 private $conditionManager;
40 $this->resource = $this->objectManager->create(ResourceConnection::class);
41 $this->storeManager = $this->objectManager->create(StoreManagerInterface::class);
42 $this->conditionManager = $this->objectManager->create(ConditionManager::class);
44 $this->eavConfigMock = $this->getMockBuilder(EavConfig::class)
45 ->disableOriginalConstructor()
48 $this->customAttributeFilter = $this->objectManager->create(
49 CustomAttributeFilter::class,
51 'eavConfig' => $this->eavConfigMock
58 $select = $this->resource->getConnection()->select();
61 $resultSelect = $this->customAttributeFilter->apply(
$select, ...
$filters);
65 (
string) $resultSelect,
66 'Select queries must be the same in case when we have no filters to apply.' 76 $select = $this->resource->getConnection()->select();
81 ->method(
'getAttribute')
90 $select = $this->resource->getConnection()->select();
92 [
'some_index' =>
'some_table'],
93 [
'entity_id' =>
'entity_id']
103 ->method(
'getAttribute')
105 ->willReturn($firstAttribute);
107 $resultSelect = $this->customAttributeFilter->apply(
$select, ...[$firstFilter]);
109 $expectedSelect = $this->getSqlForOneAttributeSearch();
112 (
string) $expectedSelect,
113 (
string) $resultSelect,
114 'Select queries must be the same in case when we have one filter to apply.' 120 $select = $this->resource->getConnection()->select();
122 [
'some_index' =>
'some_table'],
123 [
'entity_id' =>
'entity_id']
130 ->method(
'getAttribute')
138 $resultSelect = $this->customAttributeFilter->apply(
$select, ...
$filters);
140 $expectedSelect = $this->getSqlForTwoAttributeSearch();
143 (
string) $expectedSelect,
144 (
string) $resultSelect,
145 'Select queries must be the same in case when we have two filters to apply.' 149 private function getSqlForOneAttributeSearch()
157 '`some_index`.`entity_id` = `field1_filter`.`entity_id`',
158 '`some_index`.`source_id` = `field1_filter`.`source_id`',
159 sprintf(
'`field1_filter`.`attribute_id` = %s', $firstAttribute->getId()),
160 sprintf(
'`field1_filter`.`store_id` = %s', (
int) $this->storeManager->getStore()->getId())
163 $select = $this->resource->getConnection()->select();
165 [
'some_index' =>
'some_table'],
166 [
'entity_id' =>
'entity_id']
168 [
'field1_filter' => $this->resource->getTableName(
'catalog_product_index_eav')],
169 $this->conditionManager->combineQueries($joinConditions,
Select::SQL_AND),
171 )->where(sprintf(
'`some_index`.`attribute_id` = %s', $firstAttribute->getId()))
172 ->where(sprintf(
"`some_index`.`value` = '%s'", $firstFilter->getValue()));
177 private function getSqlForTwoAttributeSearch()
184 '`some_index`.`entity_id` = `field1_filter`.`entity_id`',
185 '`some_index`.`source_id` = `field1_filter`.`source_id`',
186 sprintf(
'`field1_filter`.`attribute_id` = %s', $firstAttribute->getId()),
187 sprintf(
'`field1_filter`.`store_id` = %s', (
int) $this->storeManager->getStore()->getId())
191 '`some_index`.`entity_id` = `field2_filter`.`entity_id`',
192 '`some_index`.`source_id` = `field2_filter`.`source_id`',
193 sprintf(
'`field2_filter`.`attribute_id` = %s', $secondAttribute->getId()),
194 sprintf(
'`field2_filter`.`store_id` = %s', (
int) $this->storeManager->getStore()->getId())
197 $select = $this->resource->getConnection()->select();
199 [
'some_index' =>
'some_table'],
200 [
'entity_id' =>
'entity_id']
202 [
'field1_filter' => $this->resource->getTableName(
'catalog_product_index_eav')],
203 $this->conditionManager->combineQueries($joinConditions1,
Select::SQL_AND),
206 [
'field2_filter' => $this->resource->getTableName(
'catalog_product_index_eav')],
207 $this->conditionManager->combineQueries($joinConditions2,
Select::SQL_AND),
214 private function mockFilters()
218 $filters[] = $this->getMockBuilder(Term::class)
219 ->setConstructorArgs([
'name2',
'value2',
'field1'])
223 $filters[] = $this->getMockBuilder(Term::class)
224 ->setConstructorArgs([
'name3',
'value3',
'field2'])
231 private function mockAttributes()
233 $attribute1 = $this->getMockBuilder(AbstractAttribute::class)
234 ->disableOriginalConstructor()
235 ->setMethods([
'getId'])
236 ->getMockForAbstractClass();
242 $attribute2 = $this->getMockBuilder(AbstractAttribute::class)
243 ->disableOriginalConstructor()
244 ->setMethods([
'getId'])
245 ->getMockForAbstractClass();
testApplyWithWrongAttributeFilter()
static getObjectManager()
testApplyWithoutFilters()