Skip to content

Commit c1e648f

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

File tree

1 file changed

+70
-28
lines changed
  • dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Sql

1 file changed

+70
-28
lines changed

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

Lines changed: 70 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,41 @@
88

99
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
1010
use Magento\Eav\Test\Fixture\AttributeOption as AttributeOptionFixture;
11+
use Magento\Framework\Exception\LocalizedException;
1112
use Magento\TestFramework\Helper\Bootstrap;
1213
use Magento\TestFramework\Fixture\DataFixture;
1314
use Magento\Catalog\Test\Fixture\MultiselectAttribute;
1415
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory;
1516
use Magento\CatalogWidget\Model\RuleFactory;
1617
use Magento\CatalogWidget\Model\Rule\Condition\Combine as CombineCondition;
1718
use Magento\CatalogWidget\Model\Rule\Condition\Product as ProductCondition;
19+
use PHPUnit\Framework\TestCase;
1820

1921
/**
2022
* Test for Magento\Rule\Model\Condition\Sql\Builder
2123
*/
22-
class BuilderTest extends \PHPUnit\Framework\TestCase
24+
class BuilderTest extends TestCase
2325
{
2426
/**
2527
* @var Builder
2628
*/
27-
private $model;
29+
private Builder $model;
2830

31+
/**
32+
* @inheritDoc
33+
*/
2934
protected function setUp(): void
3035
{
3136
$this->model = Bootstrap::getObjectManager()->create(Builder::class);
3237
}
3338

3439
/**
3540
* @param array $conditions
36-
* @param string $expectedSql
37-
* @dataProvider attachConditionToCollectionDataProvider
41+
* @param string $expectedWhere
42+
* @param string $expectedOrder
3843
* @return void
44+
* @throws LocalizedException
45+
* @dataProvider attachConditionToCollectionDataProvider
3946
*/
4047
#[
4148
DataFixture(MultiselectAttribute::class, ['attribute_code' => 'multi_select_attr'], 'multiselect'),
@@ -59,30 +66,31 @@ protected function setUp(): void
5966
'multiselect_custom_attribute_option_2'
6067
)
6168
]
62-
public function testAttachConditionToCollection(array $conditions, string $expectedSql): void
63-
{
69+
public function testAttachConditionToCollection(
70+
array $conditions,
71+
string $expectedWhere,
72+
string $expectedOrder
73+
): void {
6474
/** @var ProductCollectionFactory $collectionFactory */
6575
$collectionFactory = Bootstrap::getObjectManager()->create(ProductCollectionFactory::class);
6676
$collection = $collectionFactory->create();
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();
77+
foreach ($conditions as $key => $condition) {
78+
if (isset($condition['attribute']) && $condition['attribute'] === 'multiselect_attribute') {
79+
$multiselect = Bootstrap::getObjectManager()->create(
80+
Attribute::class
81+
);
82+
$multiselect->load('multi_select_attr', 'attribute_code');
83+
$multiselectAttributeOptionIds = [];
84+
foreach ($multiselect->getOptions() as $option) {
85+
if ($option->getValue()) {
86+
$multiselectAttributeOptionIds[] = $option->getValue();
87+
}
88+
}
89+
90+
$condition[$key]['value'] = implode(',', $multiselectAttributeOptionIds);
7891
}
7992
}
80-
$conditions['1--4'] = [
81-
'type' => ProductCondition::class,
82-
'attribute' => 'multiselect_attribute',
83-
'operator' => '{}',
84-
'value' => implode(',', $multiselectAttributeOptionIds),
85-
];
93+
8694
/** @var RuleFactory $ruleFactory */
8795
$ruleFactory = Bootstrap::getObjectManager()->create(RuleFactory::class);
8896
$rule = $ruleFactory->create();
@@ -94,10 +102,8 @@ public function testAttachConditionToCollection(array $conditions, string $expec
94102
$rule->loadPost($ruleConditionArray);
95103
$this->model->attachConditionToCollection($collection, $rule->getConditions());
96104

97-
$whereString = "/\(category_id IN \('3'\).+\(`e`\.`entity_id` = '2017-09-15 00:00:00'\)"
98-
.".+\(`e`\.`sku` IN \('sku1', 'sku2', 'sku3', 'sku4', 'sku5'\)"
99-
. ".+ORDER BY \(FIELD\(`e`.`sku`, 'sku1', 'sku2', 'sku3', 'sku4', 'sku5'\)\)/";
100-
$this->assertStringContainsString($expectedSql, $collection->getSelectSql(true));
105+
$this->assertStringContainsString($expectedWhere, $collection->getSelectSql(true));
106+
$this->assertStringContainsString($expectedOrder, $collection->getSelectSql(true));
101107
}
102108

103109
/**
@@ -133,7 +139,43 @@ public static function attachConditionToCollectionDataProvider(): array
133139
'value' => 'sku1,sku2,sku3,sku4,sku5',
134140
]
135141
],
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'))"
142+
"WHERE ((((`e`.`entity_id` IN (SELECT `catalog_category_product`.`product_id` FROM " .
143+
"`catalog_category_product` WHERE (category_id IN ('3')))) AND(`e`.`entity_id` = '2017-09-15 00:00:00')"
144+
." AND(`e`.`sku` IN ('sku1', 'sku2', 'sku3', 'sku4', 'sku5')) ))) AND (e.created_in <= 1) AND " .
145+
"(e.updated_in > 1) ",
146+
"ORDER BY (FIELD(`e`.`sku`, 'sku1', 'sku2', 'sku3', 'sku4', 'sku5'))"
147+
],
148+
[
149+
[
150+
'1' => [
151+
'type' => CombineCondition::class,
152+
'aggregator' => 'all',
153+
'value' => '1',
154+
'new_child' => '',
155+
],
156+
'1--1' => [
157+
'type' => ProductCondition::class,
158+
'attribute' => 'category_ids',
159+
'operator' => '==',
160+
'value' => '3',
161+
],
162+
'1--2' => [
163+
'type' => ProductCondition::class,
164+
'attribute' => 'sku',
165+
'operator' => '()',
166+
'value' => 'sku1,sku2,sku3',
167+
],
168+
'1--3' => [
169+
'type' => ProductCondition::class,
170+
'attribute' => 'multiselect_attribute',
171+
'operator' => '{}',
172+
]
173+
],
174+
"WHERE ((((`e`.`entity_id` IN (SELECT `catalog_category_product`.`product_id` FROM " .
175+
"`catalog_category_product` WHERE (category_id IN ('3')))) AND(`e`.`sku` IN " .
176+
"('sku1', 'sku2', 'sku3')) AND(`multiselect_attribute` LIKE '%%') ))) AND " .
177+
"(e.created_in <= 1) AND (e.updated_in > 1) ",
178+
"ORDER BY (FIELD(`e`.`sku`, 'sku1', 'sku2', 'sku3'))"
137179
]
138180
];
139181
}

0 commit comments

Comments
 (0)