Skip to content

Commit 8393ca5

Browse files
committed
ACP2E-3449: Slow query is executed when product widget is included via pagebuilder
1 parent cdc585e commit 8393ca5

File tree

2 files changed

+110
-10
lines changed

2 files changed

+110
-10
lines changed

dev/tests/integration/testsuite/Magento/CatalogWidget/Block/Product/ProductListTest.php

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright 2017 Adobe
4-
* All Rights Reserved.
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
55
*/
66

77
namespace Magento\CatalogWidget\Block\Product;
@@ -97,10 +97,6 @@ public function testCreateCollection()
9797
// Load products collection filtered using specified conditions and perform assertions
9898
$productCollection = $this->block->createCollection();
9999
$productCollection->load();
100-
101-
$whereString = "/\(FIND_IN_SET \('/";
102-
$this->assertEquals(1, preg_match($whereString, $productCollection->getSelectSql(true)));
103-
104100
$this->assertEquals(
105101
1,
106102
$productCollection->count(),
@@ -155,10 +151,6 @@ private function performAssertions(int $count)
155151
// Load products collection filtered using specified conditions and perform assertions.
156152
$productCollection = $this->block->createCollection();
157153
$productCollection->load();
158-
159-
$whereString = "/\(FIND_IN_SET \('/";
160-
$this->assertEquals(0, preg_match($whereString, $productCollection->getSelectSql(true)));
161-
162154
$this->assertEquals(
163155
$count,
164156
$productCollection->count(),

dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Sql/BuilderTest.php

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66

77
namespace Magento\Rule\Model\Condition\Sql;
88

9+
use Magento\Catalog\Setup\CategorySetup;
10+
use Magento\Catalog\Test\Fixture\MultiselectAttribute;
11+
use Magento\Catalog\Test\Fixture\Product as ProductFixture;
12+
use Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend;
13+
use Magento\Eav\Model\Entity\Attribute\Source\Table;
14+
use Magento\Eav\Test\Fixture\AttributeOption as AttributeOptionFixture;
15+
use Magento\TestFramework\Fixture\DataFixture;
916
use Magento\TestFramework\Helper\Bootstrap;
1017
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory;
1118
use Magento\CatalogWidget\Model\RuleFactory;
@@ -29,7 +36,81 @@ protected function setUp(): void
2936

3037
/**
3138
* @return void
39+
* @dataProvider attachConditionToCollectionDataProvider
3240
*/
41+
#[
42+
DataFixture(CategoryFixture::class, ['url_path' => 'cat1'], 'cat1'),
43+
DataFixture(
44+
MultiselectAttribute::class,
45+
[
46+
'entity_type_id' => CategorySetup::CATALOG_PRODUCT_ENTITY_TYPE_ID,
47+
'source_model' => Table::class,
48+
'backend_model' => ArrayBackend::class,
49+
'attribute_code' => 'product_custom_attribute_multiselect'
50+
],
51+
'multiselect_custom_attribute'
52+
),
53+
DataFixture(
54+
AttributeOptionFixture::class,
55+
[
56+
'entity_type' => CategorySetup::CATALOG_PRODUCT_ENTITY_TYPE_ID,
57+
'attribute_code' => '$multiselect_custom_attribute.attribute_code$',
58+
'label' => 'red',
59+
'sort_order' => 20
60+
],
61+
'multiselect_custom_attribute_option_1'
62+
),
63+
DataFixture(
64+
AttributeOptionFixture::class,
65+
[
66+
'entity_type' => CategorySetup::CATALOG_PRODUCT_ENTITY_TYPE_ID,
67+
'attribute_code' => '$multiselect_custom_attribute.attribute_code$',
68+
'sort_order' => 10,
69+
'label' => 'white',
70+
'is_default' => true
71+
],
72+
'multiselect_custom_attribute_option_2'
73+
),
74+
DataFixture(ProductFixture::class,['sku' => 'sku1', 'category_ids' => ['$cat1.id$']], 'p1'),
75+
DataFixture(ProductFixture::class,['sku' => 'sku2', 'category_ids' => ['$cat1.id$']], 'p2'),
76+
DataFixture(ProductFixture::class,['sku' => 'sku3', 'category_ids' => ['$cat1.id$']], 'p3'),
77+
DataFixture(ProductFixture::class,['sku' => 'sku4', 'category_ids' => ['$cat1.id$']], 'p4'),
78+
DataFixture(ProductFixture::class, ['product_links' => [['sku' => '$p1.sku$', 'type' => 'related']]], 'p2'),
79+
DataFixture(ProductFixture::class, as: 'p3'),
80+
DataFixture(ProductFixture::class, as: 'p4'),
81+
DataFixture(ProductFixture::class, as: 'p5'),
82+
DataFixture(ProductFixture::class, ['product_links' => [['sku' => '$p4.sku$', 'type' => 'upsell']]], 'p6'),
83+
DataFixture(ProductFixture::class, as: 'p7'),
84+
DataFixture(ProductFixture::class, as: 'p8'),
85+
DataFixture(ProductFixture::class, ['product_links' => [['sku' => '$p8.sku$', 'type' => 'crosssell']]], 'p9'),
86+
DataFixture(RuleConditionFixture::class, ['attribute' => 'sku', 'value' => '$p2.sku$',], 'rule1Condition'),
87+
DataFixture(RuleConditionsFixture::class, ['conditions' => ['$rule1Condition$']], 'rule1Conditions'),
88+
DataFixture(RuleActionFixture::class, ['attribute' => 'sku', 'value' => '$p3.sku$',], 'rule1Action'),
89+
DataFixture(RuleActionsFixture::class, ['conditions' => ['$rule1Action$']], 'rule1Actions'),
90+
DataFixture(
91+
RuleFixture::class,
92+
['actions' => '$rule1Actions$', 'conditions' => '$rule1Conditions$', 'apply_to' => Rule::RELATED_PRODUCTS],
93+
'rule1'
94+
),
95+
DataFixture(RuleConditionFixture::class, ['attribute' => 'sku', 'value' => '$p6.sku$',], 'rule2Condition'),
96+
DataFixture(RuleConditionsFixture::class, ['conditions' => ['$rule2Condition$']], 'rule2Conditions'),
97+
DataFixture(RuleActionFixture::class, ['attribute' => 'sku', 'value' => '$p5.sku$',], 'rule2Action'),
98+
DataFixture(RuleActionsFixture::class, ['conditions' => ['$rule2Action$']], 'rule2Actions'),
99+
DataFixture(
100+
RuleFixture::class,
101+
['actions' => '$rule2Actions$', 'conditions' => '$rule2Conditions$', 'apply_to' => Rule::UP_SELLS],
102+
'rule2'
103+
),
104+
DataFixture(RuleConditionFixture::class, ['attribute' => 'sku', 'value' => '$p9.sku$',], 'rule3Condition'),
105+
DataFixture(RuleConditionsFixture::class, ['conditions' => ['$rule3Condition$']], 'rule3Conditions'),
106+
DataFixture(RuleActionFixture::class, ['attribute' => 'sku', 'value' => '$p7.sku$',], 'rule3Action'),
107+
DataFixture(RuleActionsFixture::class, ['conditions' => ['$rule3Action$']], 'rule3Actions'),
108+
DataFixture(
109+
RuleFixture::class,
110+
['actions' => '$rule3Actions$', 'conditions' => '$rule3Conditions$', 'apply_to' => Rule::CROSS_SELLS],
111+
'rule3'
112+
),
113+
]
33114
public function testAttachConditionToCollection(): void
34115
{
35116
/** @var ProductCollectionFactory $collectionFactory */
@@ -77,4 +158,31 @@ public function testAttachConditionToCollection(): void
77158
. ".+ORDER BY \(FIELD\(`e`.`sku`, 'sku1', 'sku2', 'sku3', 'sku4', 'sku5'\)\)/";
78159
$this->assertEquals(1, preg_match($whereString, $collection->getSelectSql(true)));
79160
}
161+
162+
/**
163+
* @return array
164+
*/
165+
public static function attachConditionToCollectionDataProvider(): array
166+
{
167+
return [
168+
[
169+
'productName' => 'p2',
170+
'relatedProducts' => ['p1', 'p3'],
171+
'upsellProducts' => [],
172+
'crosssellProducts' => [],
173+
'config' => [
174+
'catalog/magento_targetrule/related_position_behavior' => Rule::BOTH_SELECTED_AND_RULE_BASED
175+
]
176+
],
177+
[
178+
'productName' => 'p2',
179+
'relatedProducts' => ['p1'],
180+
'upsellProducts' => [],
181+
'crosssellProducts' => [],
182+
'config' => [
183+
'catalog/magento_targetrule/related_position_behavior' => Rule::SELECTED_ONLY
184+
]
185+
]
186+
];
187+
}
80188
}

0 commit comments

Comments
 (0)