Skip to content

Commit bf8163a

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

File tree

1 file changed

+59
-107
lines changed
  • dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Sql

1 file changed

+59
-107
lines changed

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

Lines changed: 59 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,11 @@
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;
9+
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
1410
use Magento\Eav\Test\Fixture\AttributeOption as AttributeOptionFixture;
15-
use Magento\TestFramework\Fixture\DataFixture;
1611
use Magento\TestFramework\Helper\Bootstrap;
12+
use Magento\TestFramework\Fixture\DataFixture;
13+
use Magento\Catalog\Test\Fixture\MultiselectAttribute;
1714
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory;
1815
use Magento\CatalogWidget\Model\RuleFactory;
1916
use Magento\CatalogWidget\Model\Rule\Condition\Combine as CombineCondition;
@@ -35,26 +32,17 @@ protected function setUp(): void
3532
}
3633

3734
/**
38-
* @return void
35+
* @param array $conditions
36+
* @param string $expectedSql
3937
* @dataProvider attachConditionToCollectionDataProvider
38+
* @return void
4039
*/
4140
#[
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-
),
41+
DataFixture(MultiselectAttribute::class, ['attribute_code' => 'multi_select_attr'], 'multiselect'),
5342
DataFixture(
5443
AttributeOptionFixture::class,
5544
[
56-
'entity_type' => CategorySetup::CATALOG_PRODUCT_ENTITY_TYPE_ID,
57-
'attribute_code' => '$multiselect_custom_attribute.attribute_code$',
45+
'attribute_code' => 'multiselect.attribute_code$',
5846
'label' => 'red',
5947
'sort_order' => 20
6048
],
@@ -63,91 +51,44 @@ protected function setUp(): void
6351
DataFixture(
6452
AttributeOptionFixture::class,
6553
[
66-
'entity_type' => CategorySetup::CATALOG_PRODUCT_ENTITY_TYPE_ID,
67-
'attribute_code' => '$multiselect_custom_attribute.attribute_code$',
54+
'attribute_code' => 'multiselect.attribute_code$',
6855
'sort_order' => 10,
6956
'label' => 'white',
7057
'is_default' => true
7158
],
7259
'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-
),
60+
)
11361
]
114-
public function testAttachConditionToCollection(): void
62+
public function testAttachConditionToCollection(array $conditions, string $expectedSql): void
11563
{
11664
/** @var ProductCollectionFactory $collectionFactory */
11765
$collectionFactory = Bootstrap::getObjectManager()->create(ProductCollectionFactory::class);
11866
$collection = $collectionFactory->create();
119-
67+
/*$multiselect = DataFixtureStorageManager::getStorage()->get(
68+
'multi_select_attr'
69+
);*/
70+
$attribute = Bootstrap::getObjectManager()->create(
71+
Attribute::class
72+
);
73+
$attribute->load('multi_select_attr', 'attribute_code');
74+
$multiselectAttributeOptionIds = [];
75+
foreach ($attribute->getOptions() as $option) {
76+
if ($option->getValue()) {
77+
$multiselectAttributeOptionIds[] = $option->getValue();
78+
}
79+
}
80+
$conditions['1--4'] = [
81+
'type' => ProductCondition::class,
82+
'attribute' => 'multiselect_attribute',
83+
'operator' => '{}',
84+
'value' => implode(',', $multiselectAttributeOptionIds),
85+
];
12086
/** @var RuleFactory $ruleFactory */
12187
$ruleFactory = Bootstrap::getObjectManager()->create(RuleFactory::class);
12288
$rule = $ruleFactory->create();
12389

12490
$ruleConditionArray = [
125-
'conditions' => [
126-
'1' => [
127-
'type' => CombineCondition::class,
128-
'aggregator' => 'all',
129-
'value' => '1',
130-
'new_child' => '',
131-
],
132-
'1--1' => [
133-
'type' => ProductCondition::class,
134-
'attribute' => 'category_ids',
135-
'operator' => '==',
136-
'value' => '3',
137-
],
138-
'1--2' => [
139-
'type' => ProductCondition::class,
140-
'attribute' => 'special_to_date',
141-
'operator' => '==',
142-
'value' => '2017-09-15',
143-
],
144-
'1--3' => [
145-
'type' => ProductCondition::class,
146-
'attribute' => 'sku',
147-
'operator' => '()',
148-
'value' => 'sku1,sku2,sku3,sku4,sku5',
149-
]
150-
],
91+
'conditions' => $conditions,
15192
];
15293

15394
$rule->loadPost($ruleConditionArray);
@@ -156,7 +97,7 @@ public function testAttachConditionToCollection(): void
15697
$whereString = "/\(category_id IN \('3'\).+\(`e`\.`entity_id` = '2017-09-15 00:00:00'\)"
15798
.".+\(`e`\.`sku` IN \('sku1', 'sku2', 'sku3', 'sku4', 'sku5'\)"
15899
. ".+ORDER BY \(FIELD\(`e`.`sku`, 'sku1', 'sku2', 'sku3', 'sku4', 'sku5'\)\)/";
159-
$this->assertEquals(1, preg_match($whereString, $collection->getSelectSql(true)));
100+
$this->assertStringContainsString($expectedSql, $collection->getSelectSql(true));
160101
}
161102

162103
/**
@@ -166,22 +107,33 @@ public static function attachConditionToCollectionDataProvider(): array
166107
{
167108
return [
168109
[
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-
]
110+
[
111+
'1' => [
112+
'type' => CombineCondition::class,
113+
'aggregator' => 'all',
114+
'value' => '1',
115+
'new_child' => '',
116+
],
117+
'1--1' => [
118+
'type' => ProductCondition::class,
119+
'attribute' => 'category_ids',
120+
'operator' => '==',
121+
'value' => '3',
122+
],
123+
'1--2' => [
124+
'type' => ProductCondition::class,
125+
'attribute' => 'special_to_date',
126+
'operator' => '==',
127+
'value' => '2017-09-15',
128+
],
129+
'1--3' => [
130+
'type' => ProductCondition::class,
131+
'attribute' => 'sku',
132+
'operator' => '()',
133+
'value' => 'sku1,sku2,sku3,sku4,sku5',
134+
]
135+
],
136+
"WHERE ((((`e`.`entity_id` IN (SELECT `catalog_category_product`.`product_id` FROM `catalog_category_product` WHERE (category_id IN ('3')))) AND(`e`.`entity_id` = '2017-09-15 00:00:00') AND(`e`.`sku` IN ('sku1', 'sku2', 'sku3', 'sku4', 'sku5')) ))) AND (e.created_in <= 1) AND (e.updated_in > 1) ORDER BY (FIELD(`e`.`sku`, 'sku1', 'sku2', 'sku3', 'sku4', 'sku5'))"
185137
]
186138
];
187139
}

0 commit comments

Comments
 (0)