Skip to content

Commit fc7700d

Browse files
committed
MC-37477: Advanced Search on Elasticsearch returns Configurable Product Children as Individual Search Results
1 parent 1dc62a7 commit fc7700d

File tree

3 files changed

+60
-15
lines changed

3 files changed

+60
-15
lines changed

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

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,30 @@
66

77
namespace Magento\CatalogSearch\Model\ResourceModel\Advanced;
88

9+
use Magento\Catalog\Model\Category;
910
use Magento\Catalog\Model\Product;
11+
use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
12+
use Magento\CatalogSearch\Model\ResourceModel\Advanced;
1013
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\DefaultFilterStrategyApplyChecker;
1114
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\DefaultFilterStrategyApplyCheckerInterface;
15+
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\SearchCriteriaResolverFactory;
1216
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\SearchCriteriaResolverInterface;
17+
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\SearchResultApplierFactory;
1318
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\SearchResultApplierInterface;
14-
use Magento\Framework\Search\EngineResolverInterface;
15-
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\TotalRecordsResolverInterface;
1619
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\TotalRecordsResolverFactory;
20+
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\TotalRecordsResolverInterface;
21+
use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
1722
use Magento\Framework\Api\FilterBuilder;
18-
use Magento\Framework\DB\Select;
1923
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
2024
use Magento\Framework\Api\Search\SearchResultFactory;
25+
use Magento\Framework\Api\Search\SearchResultInterface;
26+
use Magento\Framework\App\ObjectManager;
27+
use Magento\Framework\DB\Select;
2128
use Magento\Framework\EntityManager\MetadataPool;
2229
use Magento\Framework\Exception\LocalizedException;
30+
use Magento\Framework\Search\EngineResolverInterface;
2331
use Magento\Framework\Search\Request\EmptyRequestDataException;
2432
use Magento\Framework\Search\Request\NonExistingRequestNameException;
25-
use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
26-
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\SearchCriteriaResolverFactory;
27-
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection\SearchResultApplierFactory;
28-
use Magento\Framework\App\ObjectManager;
29-
use Magento\Framework\Api\Search\SearchResultInterface;
3033

3134
/**
3235
* Advanced search collection
@@ -106,6 +109,11 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
106109
*/
107110
private $defaultFilterStrategyApplyChecker;
108111

112+
/**
113+
* @var Advanced
114+
*/
115+
private $advancedSearchResource;
116+
109117
/**
110118
* Collection constructor
111119
*
@@ -141,6 +149,7 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
141149
* @param TotalRecordsResolverFactory|null $totalRecordsResolverFactory
142150
* @param EngineResolverInterface|null $engineResolver
143151
* @param DefaultFilterStrategyApplyCheckerInterface|null $defaultFilterStrategyApplyChecker
152+
* @param Advanced|null $advancedSearchResource
144153
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
145154
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
146155
*/
@@ -176,7 +185,8 @@ public function __construct(
176185
SearchResultApplierFactory $searchResultApplierFactory = null,
177186
TotalRecordsResolverFactory $totalRecordsResolverFactory = null,
178187
EngineResolverInterface $engineResolver = null,
179-
DefaultFilterStrategyApplyCheckerInterface $defaultFilterStrategyApplyChecker = null
188+
DefaultFilterStrategyApplyCheckerInterface $defaultFilterStrategyApplyChecker = null,
189+
Advanced $advancedSearchResource = null
180190
) {
181191
$this->searchRequestName = $searchRequestName;
182192
if ($searchResultFactory === null) {
@@ -193,6 +203,8 @@ public function __construct(
193203
->get(EngineResolverInterface::class);
194204
$this->defaultFilterStrategyApplyChecker = $defaultFilterStrategyApplyChecker ?: ObjectManager::getInstance()
195205
->get(DefaultFilterStrategyApplyChecker::class);
206+
$this->advancedSearchResource = $advancedSearchResource ?: ObjectManager::getInstance()
207+
->get(Advanced::class);
196208
parent::__construct(
197209
$entityFactory,
198210
$logger,
@@ -258,14 +270,14 @@ public function setOrder($attribute, $dir = Select::SQL_DESC)
258270
*/
259271
public function addCategoryFilter(\Magento\Catalog\Model\Category $category)
260272
{
273+
$this->setAttributeFilterData(Category::ENTITY, 'category_ids', $category->getId());
261274
/**
262275
* This changes need in backward compatible reasons for support dynamic improved algorithm
263276
* for price aggregation process.
264277
*/
265278
if ($this->defaultFilterStrategyApplyChecker->isApplicable()) {
266279
parent::addCategoryFilter($category);
267280
} else {
268-
$this->addFieldToFilter('category_ids', $category->getId());
269281
$this->_productLimitationPrice();
270282
}
271283

@@ -278,14 +290,13 @@ public function addCategoryFilter(\Magento\Catalog\Model\Category $category)
278290
*/
279291
public function setVisibility($visibility)
280292
{
293+
$this->setAttributeFilterData(Product::ENTITY, 'visibility', $visibility);
281294
/**
282295
* This changes need in backward compatible reasons for support dynamic improved algorithm
283296
* for price aggregation process.
284297
*/
285298
if ($this->defaultFilterStrategyApplyChecker->isApplicable()) {
286299
parent::setVisibility($visibility);
287-
} else {
288-
$this->addFieldToFilter('visibility', $visibility);
289300
}
290301

291302
return $this;
@@ -306,6 +317,25 @@ private function setSearchOrder($field, $direction)
306317
$this->searchOrders[$field] = $direction;
307318
}
308319

320+
/**
321+
* Prepare attribute data to filter.
322+
*
323+
* @param string $entityType
324+
* @param string $attributeCode
325+
* @param mixed $condition
326+
* @return $this
327+
*/
328+
private function setAttributeFilterData(string $entityType, string $attributeCode, $condition): self
329+
{
330+
/** @var AbstractAttribute $attribute */
331+
$attribute = $this->_eavConfig->getAttribute($entityType, $attributeCode);
332+
$table = $attribute->getBackend()->getTable();
333+
$condition = $this->advancedSearchResource->prepareCondition($attribute, $condition);
334+
$this->addFieldsToFilter([$table => [$attributeCode => $condition]]);
335+
336+
return $this;
337+
}
338+
309339
/**
310340
* @inheritdoc
311341
*/

app/code/Magento/CatalogSearch/etc/search_request.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
<queryReference clause="should" ref="sku_query"/>
6767
<queryReference clause="should" ref="price_query"/>
6868
<queryReference clause="should" ref="category_query"/>
69+
<queryReference clause="must" ref="visibility"/>
6970
</query>
7071
<query name="sku_query" xsi:type="filteredQuery">
7172
<filterReference clause="must" ref="sku_query_filter"/>
@@ -76,11 +77,15 @@
7677
<query name="category_query" xsi:type="filteredQuery">
7778
<filterReference clause="must" ref="category_filter"/>
7879
</query>
80+
<query name="visibility" xsi:type="filteredQuery">
81+
<filterReference clause="must" ref="visibility_filter"/>
82+
</query>
7983
</queries>
8084
<filters>
8185
<filter xsi:type="wildcardFilter" name="sku_query_filter" field="sku" value="$sku$"/>
8286
<filter xsi:type="rangeFilter" name="price_query_filter" field="price" from="$price.from$" to="$price.to$"/>
8387
<filter xsi:type="termFilter" name="category_filter" field="category_ids" value="$category_ids$"/>
88+
<filter xsi:type="termFilter" name="visibility_filter" field="visibility" value="$visibility$"/>
8489
</filters>
8590
<from>0</from>
8691
<size>10000</size>

app/code/Magento/Elasticsearch/Model/Advanced/ProductCollectionPrepareStrategy.php

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
*/
66
namespace Magento\Elasticsearch\Model\Advanced;
77

8-
use Magento\Catalog\Model\ResourceModel\Product\Collection;
98
use Magento\Catalog\Model\Config;
9+
use Magento\Catalog\Model\Product\Visibility;
10+
use Magento\Catalog\Model\ResourceModel\Product\Collection;
1011
use Magento\CatalogSearch\Model\Advanced\ProductCollectionPrepareStrategyInterface;
1112

1213
/**
@@ -19,13 +20,21 @@ class ProductCollectionPrepareStrategy implements ProductCollectionPrepareStrate
1920
*/
2021
private $catalogConfig;
2122

23+
/**
24+
* @var Visibility
25+
*/
26+
private $catalogProductVisibility;
27+
2228
/**
2329
* @param Config $catalogConfig
30+
* @param Visibility $catalogProductVisibility
2431
*/
2532
public function __construct(
26-
Config $catalogConfig
33+
Config $catalogConfig,
34+
Visibility $catalogProductVisibility
2735
) {
2836
$this->catalogConfig = $catalogConfig;
37+
$this->catalogProductVisibility = $catalogProductVisibility;
2938
}
3039

3140
/**
@@ -36,6 +45,7 @@ public function prepare(Collection $collection)
3645
$collection
3746
->addAttributeToSelect($this->catalogConfig->getProductAttributes())
3847
->addMinimalPrice()
39-
->addTaxPercents();
48+
->addTaxPercents()
49+
->setVisibility($this->catalogProductVisibility->getVisibleInSearchIds());
4050
}
4151
}

0 commit comments

Comments
 (0)