Skip to content

Commit e0735e1

Browse files
author
Dmytro Voskoboinikov
committed
Merge branch 'MAGETWO-59163' into 2.1-PR-20171221
2 parents 48a4844 + 0e620f7 commit e0735e1

File tree

9 files changed

+82
-31
lines changed

9 files changed

+82
-31
lines changed

app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Filter/AliasResolver.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ public function getAlias(\Magento\Framework\Search\Request\FilterInterface $filt
3535
$alias = 'price_index';
3636
break;
3737
case 'category_ids':
38-
$alias = 'category_ids_index';
38+
case 'visibility':
39+
$alias = 'category_products_index';
3940
break;
4041
default:
4142
$alias = $field . RequestGenerator::FILTER_SUFFIX;

app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Filter/Preprocessor.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,10 @@ private function processQueryWithField(FilterInterface $filter, $isNegation, $qu
141141
$query
142142
);
143143
} elseif ($filter->getField() === 'category_ids') {
144-
return 'category_ids_index.category_id = ' . (int) $filter->getValue();
144+
return "{$this->aliasResolver->getAlias($filter)}.category_id = "
145+
. (int) $filter->getValue();
146+
} elseif ($filter->getField() === 'visibility') {
147+
return "{$this->aliasResolver->getAlias($filter)}." . $query;
145148
} elseif ($attribute->isStatic()) {
146149
$alias = $this->aliasResolver->getAlias($filter);
147150
$resultQuery = str_replace(

app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ public function setFilterBuilder(\Magento\Framework\Api\FilterBuilder $object)
254254
* Apply attribute filter to facet collection
255255
*
256256
* @param string $field
257-
* @param null $condition
257+
* @param null|string|array $condition
258258
* @return $this
259259
*/
260260
public function addFieldToFilter($field, $condition = null)
@@ -265,22 +265,21 @@ public function addFieldToFilter($field, $condition = null)
265265

266266
$this->getSearchCriteriaBuilder();
267267
$this->getFilterBuilder();
268-
if (!is_array($condition) || !in_array(key($condition), ['from', 'to'])) {
269-
$this->filterBuilder->setField($field);
270-
$this->filterBuilder->setValue($condition);
271-
$this->searchCriteriaBuilder->addFilter($this->filterBuilder->create());
272-
} else {
268+
if (is_array($condition)
269+
&& in_array(key($condition), ['from', 'to'], true)
270+
) {
273271
if (!empty($condition['from'])) {
274-
$this->filterBuilder->setField("{$field}.from");
275-
$this->filterBuilder->setValue($condition['from']);
276-
$this->searchCriteriaBuilder->addFilter($this->filterBuilder->create());
272+
$this->addFieldToFilter("{$field}.from", $condition['from']);
277273
}
278274
if (!empty($condition['to'])) {
279-
$this->filterBuilder->setField("{$field}.to");
280-
$this->filterBuilder->setValue($condition['to']);
281-
$this->searchCriteriaBuilder->addFilter($this->filterBuilder->create());
275+
$this->addFieldToFilter("{$field}.to", $condition['to']);
282276
}
277+
} else {
278+
$this->filterBuilder->setField($field);
279+
$this->filterBuilder->setValue($condition);
280+
$this->searchCriteriaBuilder->addFilter($this->filterBuilder->create());
283281
}
282+
284283
return $this;
285284
}
286285

app/code/Magento/CatalogSearch/Model/Search/FilterMapper/ExclusionStrategy.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,18 @@ public function apply(
7070
[]
7171
);
7272
$isApplied = true;
73-
} elseif ('category_ids' === $field) {
73+
} elseif ('category_ids' === $field || $field === 'visibility') {
7474
$alias = $this->aliasResolver->getAlias($filter);
75-
$tableName = $this->resourceConnection->getTableName('catalog_category_product_index');
76-
$select->joinInner(
77-
[$alias => $tableName],
78-
'search_index.entity_id = category_ids_index.product_id',
79-
[]
80-
);
75+
if (!array_key_exists($alias, $select->getPart('from'))) {
76+
$tableName = $this->resourceConnection->getTableName(
77+
'catalog_category_product_index'
78+
);
79+
$select->joinInner(
80+
[$alias => $tableName],
81+
"search_index.entity_id = $alias.product_id",
82+
[]
83+
);
84+
}
8185
$isApplied = true;
8286
}
8387

app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Filter/AliasResolverTest.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ public function aliasDataProvider()
6363
],
6464
'category_ids' => [
6565
'field' => 'category_ids',
66-
'alias' => 'category_ids_index',
66+
'alias' => 'category_products_index',
67+
],
68+
'visibility' => [
69+
'field' => 'visibility',
70+
'alias' => 'category_products_index',
6771
],
6872
];
6973
}

app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Filter/PreprocessorTest.php

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,9 @@ public function testProcessPrice()
203203
public function processCategoryIdsDataProvider()
204204
{
205205
return [
206-
['5', 'category_ids_index.category_id = 5'],
207-
[3, 'category_ids_index.category_id = 3'],
208-
["' and 1 = 0", 'category_ids_index.category_id = 0'],
206+
['5', ':alias.category_id = 5'],
207+
[3, ':alias.category_id = 3'],
208+
["' and 1 = 0", ':alias.category_id = 0'],
209209
];
210210
}
211211

@@ -218,7 +218,11 @@ public function testProcessCategoryIds($categoryId, $expectedResult)
218218
{
219219
$isNegation = false;
220220
$query = 'SELECT category_ids FROM catalog_product_entity';
221+
$tableAlias = 'category__alias';
221222

223+
$this->aliasResolver->expects($this->atLeastOnce())
224+
->method('getAlias')
225+
->willReturn($tableAlias);
222226
$this->filter->expects($this->exactly(3))
223227
->method('getField')
224228
->will($this->returnValue('category_ids'));
@@ -233,9 +237,35 @@ public function testProcessCategoryIds($categoryId, $expectedResult)
233237
->will($this->returnValue($this->attribute));
234238

235239
$actualResult = $this->target->process($this->filter, $isNegation, $query);
240+
$expectedResult = strtr($expectedResult, [':alias' => $tableAlias]);
236241
$this->assertSame($expectedResult, $this->removeWhitespaces($actualResult));
237242
}
238243

244+
public function testProcessVisibilityIds()
245+
{
246+
$query = 'visibility in (1, 2)';
247+
$tableAlias = 'visibility__alias';
248+
249+
$this->aliasResolver->expects($this->atLeastOnce())
250+
->method('getAlias')
251+
->willReturn($tableAlias);
252+
$this->filter->expects($this->atLeastOnce())
253+
->method('getField')
254+
->will($this->returnValue('visibility'));
255+
$this->filter->expects($this->never())
256+
->method('getValue');
257+
$this->config->expects($this->once())
258+
->method('getAttribute')
259+
->with(\Magento\Catalog\Model\Product::ENTITY, 'visibility')
260+
->will($this->returnValue($this->attribute));
261+
262+
$actualResult = $this->target->process($this->filter, false, $query);
263+
$this->assertSame(
264+
"$tableAlias.$query",
265+
$this->removeWhitespaces($actualResult)
266+
);
267+
}
268+
239269
public function testProcessStaticAttribute()
240270
{
241271
$expectedResult = 'attr_table_alias.static_attribute LIKE %name%';
@@ -246,7 +276,7 @@ public function testProcessStaticAttribute()
246276
->willReturn('static_attribute');
247277
$this->aliasResolver->expects($this->once())->method('getAlias')
248278
->willReturn('attr_table_alias');
249-
$this->filter->expects($this->exactly(3))
279+
$this->filter->expects($this->exactly(4))
250280
->method('getField')
251281
->will($this->returnValue('static_attribute'));
252282
$this->config->expects($this->exactly(1))
@@ -285,7 +315,7 @@ public function testProcessTermFilter($frontendInput, $fieldValue, $isNegation,
285315
$this->aliasResolver->expects($this->once())->method('getAlias')
286316
->willReturn('termAttrAlias');
287317

288-
$this->filter->expects($this->exactly(3))
318+
$this->filter->expects($this->exactly(4))
289319
->method('getField')
290320
->willReturn('termField');
291321
$this->filter->expects($this->exactly(2))
@@ -360,7 +390,7 @@ public function testProcessNotStaticAttribute()
360390
$attributeId = 1234567;
361391

362392
$this->scope->expects($this->once())->method('getId')->will($this->returnValue($scopeId));
363-
$this->filter->expects($this->exactly(4))
393+
$this->filter->expects($this->exactly(5))
364394
->method('getField')
365395
->will($this->returnValue('not_static_attribute'));
366396
$this->config->expects($this->exactly(1))

dev/tests/api-functional/testsuite/Magento/Framework/Api/Search/SearchTest.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ public function testCatalogSearch()
3434
'field' => 'price_dynamic_algorithm',
3535
'value' => 'auto',
3636
'condition_type' => 'eq'
37+
],
38+
[
39+
'field' => 'visibility',
40+
'value' => 4,
41+
'condition_type' => 'eq'
3742
]
3843
]
3944
]

dev/tests/integration/testsuite/Magento/CatalogSearch/Model/ResourceModel/Fulltext/CollectionTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public function filtersDataProviderSearch()
4040
['catalog_view_container', ['category_ids' => 100001], 0],
4141
['catalog_view_container', ['category_ids' => []], 0],
4242
['catalog_view_container', [], 0],
43+
['catalog_view_container', ['visibility' => [2, 4]], 5],
4344
];
4445
}
4546
}

lib/internal/Magento/Framework/Search/Search.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,19 @@ public function search(SearchCriteriaInterface $searchCriteria)
8484
*/
8585
private function addFieldToFilter($field, $condition = null)
8686
{
87-
if (!is_array($condition) || !in_array(key($condition), ['from', 'to'], true)) {
88-
$this->requestBuilder->bind($field, $condition);
89-
} else {
87+
if (is_array($condition)
88+
&& (
89+
!empty($condition['from']) || !empty($condition['to'])
90+
)
91+
) {
9092
if (!empty($condition['from'])) {
9193
$this->requestBuilder->bind("{$field}.from", $condition['from']);
9294
}
9395
if (!empty($condition['to'])) {
9496
$this->requestBuilder->bind("{$field}.to", $condition['to']);
9597
}
98+
} else {
99+
$this->requestBuilder->bind($field, $condition);
96100
}
97101

98102
return $this;

0 commit comments

Comments
 (0)