66
77namespace Magento \CatalogSearch \Model \ResourceModel \Advanced ;
88
9+ use Magento \Catalog \Model \Category ;
910use Magento \Catalog \Model \Product ;
11+ use Magento \Catalog \Model \ResourceModel \Product \Collection \ProductLimitationFactory ;
12+ use Magento \CatalogSearch \Model \ResourceModel \Advanced ;
1013use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \DefaultFilterStrategyApplyChecker ;
1114use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \DefaultFilterStrategyApplyCheckerInterface ;
15+ use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \SearchCriteriaResolverFactory ;
1216use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \SearchCriteriaResolverInterface ;
17+ use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \SearchResultApplierFactory ;
1318use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \SearchResultApplierInterface ;
14- use Magento \Framework \Search \EngineResolverInterface ;
15- use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \TotalRecordsResolverInterface ;
1619use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \TotalRecordsResolverFactory ;
20+ use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \TotalRecordsResolverInterface ;
21+ use Magento \Eav \Model \Entity \Attribute \AbstractAttribute ;
1722use Magento \Framework \Api \FilterBuilder ;
18- use Magento \Framework \DB \Select ;
1923use Magento \Framework \Api \Search \SearchCriteriaBuilder ;
2024use Magento \Framework \Api \Search \SearchResultFactory ;
25+ use Magento \Framework \Api \Search \SearchResultInterface ;
26+ use Magento \Framework \App \ObjectManager ;
27+ use Magento \Framework \DB \Select ;
2128use Magento \Framework \EntityManager \MetadataPool ;
2229use Magento \Framework \Exception \LocalizedException ;
30+ use Magento \Framework \Search \EngineResolverInterface ;
2331use Magento \Framework \Search \Request \EmptyRequestDataException ;
2432use 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 */
@@ -377,7 +407,7 @@ public function _loadEntities($printQuery = false, $logQuery = false)
377407 $ query = $ this ->getSelect ();
378408 $ rows = $ this ->_fetchAll ($ query );
379409 } catch (\Exception $ e ) {
380- $ this ->printLogQuery (false , true , $ query );
410+ $ this ->printLogQuery (false , true , $ query ?? null );
381411 throw $ e ;
382412 }
383413
0 commit comments