Skip to content

Commit 001c3fa

Browse files
authored
Merge pull request #8368 from magento-performance/ACPT-10
ACPT-10
2 parents 867d074 + dea3e28 commit 001c3fa

File tree

11 files changed

+94
-40
lines changed

11 files changed

+94
-40
lines changed

app/code/Magento/Quote/Model/Quote/Address.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@
8686
* @method float getDiscountAmount()
8787
* @method Address setDiscountAmount(float $value)
8888
* @method float getBaseDiscountAmount()
89-
* @method Address setBaseDiscountAmount(float $value)
9089
* @method float getGrandTotal()
9190
* @method Address setGrandTotal(float $value)
9291
* @method float getBaseGrandTotal()
@@ -142,6 +141,8 @@ class Address extends AbstractAddress implements
142141

143142
private const CACHED_ITEMS_ALL = 'cached_items_all';
144143

144+
private const BASE_DISCOUNT_AMOUNT = 'base_discount_amount';
145+
145146
/**
146147
* Prefix of model events
147148
*
@@ -1796,4 +1797,17 @@ protected function getCustomAttributesCodes()
17961797
{
17971798
return array_keys($this->attributeList->getAttributes());
17981799
}
1800+
1801+
/**
1802+
* Realization of the actual set method to boost performance
1803+
*
1804+
* @param float $value
1805+
* @return $this
1806+
*/
1807+
public function setBaseDiscountAmount(float $value)
1808+
{
1809+
$this->_data[self::BASE_DISCOUNT_AMOUNT] = $value;
1810+
1811+
return $this;
1812+
}
17991813
}

app/code/Magento/SalesRule/Helper/CartFixedDiscount.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ public function getDiscountedAmountProportionally(
138138
$baseItemPriceTotal = $baseItemPrice * $qty - $baseItemDiscountAmount;
139139
$ratio = $baseRuleTotalsDiscount != 0 ? $baseItemPriceTotal / $baseRuleTotalsDiscount : 0;
140140
$discountAmount = $this->deltaPriceRound->round($ruleDiscount * $ratio, $discountType);
141+
141142
return $discountAmount;
142143
}
143144

app/code/Magento/SalesRule/Model/Quote/Discount.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ public function collect(
178178
$items = $this->calculator->sortItemsByPriority($items, $address);
179179
$itemsToApplyRules = $items;
180180
$rules = $this->calculator->getRules($address);
181+
$totalDiscount = 0;
182+
$address->setBaseDiscountAmount(0);
181183
/** @var Rule $rule */
182184
foreach ($rules as $rule) {
183185
/** @var Item $item */
@@ -190,14 +192,18 @@ public function collect(
190192
}
191193
$eventArgs['item'] = $item;
192194
$this->eventManager->dispatch('sales_quote_address_discount_item', $eventArgs);
195+
193196
$this->calculator->process($item, $rule);
194197
$appliedRuleIds = $item->getAppliedRuleIds() ? explode(',', $item->getAppliedRuleIds()) : [];
195198
if ($rule->getStopRulesProcessing() && in_array($rule->getId(), $appliedRuleIds)) {
196199
unset($itemsToApplyRules[$key]);
197200
}
201+
202+
$totalDiscount += $item->getBaseDiscountAmount();
198203
}
199-
$this->calculator->initTotals($items, $address);
204+
$address->setBaseDiscountAmount($totalDiscount);
200205
}
206+
$this->calculator->initTotals($items, $address);
201207
foreach ($items as $item) {
202208
if (!isset($itemsAggregate[$item->getId()])) {
203209
continue;

app/code/Magento/SalesRule/Model/ResourceModel/Rule/Collection.php

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -113,26 +113,29 @@ protected function mapAssociatedEntities($entityType, $objectField)
113113

114114
$entityInfo = $this->_getAssociatedEntityInfo($entityType);
115115
$ruleIdField = $entityInfo['rule_id_field'];
116-
$entityIds = $this->getColumnValues($ruleIdField);
116+
117+
$items = [];
118+
foreach ($this->getItems() as $item) {
119+
$items[$item->getData($ruleIdField)] = $item;
120+
}
117121

118122
$select = $this->getConnection()->select()->from(
119123
$this->getTable($entityInfo['associations_table'])
120124
)->where(
121125
$ruleIdField . ' IN (?)',
122-
$entityIds
126+
array_keys($items)
123127
);
124128

125129
$associatedEntities = $this->getConnection()->fetchAll($select);
126130

127-
array_map(
128-
function ($associatedEntity) use ($entityInfo, $ruleIdField, $objectField) {
129-
$item = $this->getItemByColumnValue($ruleIdField, $associatedEntity[$ruleIdField]);
130-
$itemAssociatedValue = $item->getData($objectField) ?? [];
131-
$itemAssociatedValue[] = $associatedEntity[$entityInfo['entity_id_field']];
132-
$item->setData($objectField, $itemAssociatedValue);
133-
},
134-
$associatedEntities
135-
);
131+
$dataToAdd = [];
132+
foreach ($associatedEntities as $associatedEntity) {
133+
//group data
134+
$dataToAdd[$associatedEntity[$ruleIdField]][] = $associatedEntity[$entityInfo['entity_id_field']];
135+
}
136+
foreach ($dataToAdd as $id => $value) {
137+
$items[$id]->setData($objectField, $value);
138+
}
136139
}
137140

138141
/**

app/code/Magento/SalesRule/Model/Rule.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
* @method \Magento\SalesRule\Model\Rule setProductIds(string $value)
3939
* @method int getSortOrder()
4040
* @method \Magento\SalesRule\Model\Rule setSortOrder(int $value)
41-
* @method string getSimpleAction()
4241
* @method \Magento\SalesRule\Model\Rule setSimpleAction(string $value)
4342
* @method float getDiscountAmount()
4443
* @method \Magento\SalesRule\Model\Rule setDiscountAmount(float $value)
@@ -547,6 +546,17 @@ public function getFromDate()
547546
return $this->getData('from_date');
548547
}
549548

549+
/**
550+
* Get from date.
551+
*
552+
* @return string
553+
* @since 100.1.0
554+
*/
555+
public function getSimpleAction()
556+
{
557+
return $this->_getData('simple_action');
558+
}
559+
550560
/**
551561
* Get to date.
552562
*

app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ public function calculate($rule, $item, $qty)
8080

8181
$ruleTotals = $this->validator->getRuleItemTotalsInfo($rule->getId());
8282
$baseRuleTotals = $ruleTotals['base_items_price'] ?? 0.0;
83-
$baseRuleTotalsDiscount = $ruleTotals['base_items_discount_amount'] ?? 0.0;
8483
$ruleItemsCount = $ruleTotals['items_count'] ?? 0;
8584

8685
$address = $item->getAddress();
@@ -134,7 +133,7 @@ public function calculate($rule, $item, $qty)
134133
$qty,
135134
$baseItemPrice,
136135
$baseItemDiscountAmount,
137-
$baseRuleTotals - $baseRuleTotalsDiscount,
136+
$baseRuleTotals - $address->getBaseDiscountAmount(),
138137
$discountType
139138
);
140139
}

app/code/Magento/SalesRule/Model/Validator.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ public function initTotals($items, Address $address)
477477
$ruleTotalBaseItemsDiscountAmount = 0;
478478
$validItemsCount = 0;
479479

480+
/** @var Quote\Item $item */
480481
foreach ($items as $item) {
481482
if ($item->getHasChildren()) {
482483
continue;

app/code/Magento/SalesRule/Test/Unit/Model/Quote/Address/Total/ShippingDiscountTest.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,9 @@ protected function setUp(): void
9191
'setBaseShippingDiscountAmount',
9292
'getDiscountDescription',
9393
'setDiscountAmount',
94-
'setBaseDiscountAmount'
9594
]
9695
)
97-
->onlyMethods(['getQuote'])
96+
->onlyMethods(['getQuote', 'setBaseDiscountAmount'])
9897
->disableOriginalConstructor()
9998
->getMock();
10099

app/code/Magento/SalesRule/Test/Unit/Model/Quote/DiscountTest.php

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,6 @@ protected function setUp(): void
117117
->getMock();
118118
$this->rule = $this->getMockBuilder(Rule::class)
119119
->disableOriginalConstructor()
120-
->addMethods(
121-
[
122-
'getSimpleAction'
123-
]
124-
)
125120
->getMock();
126121
$this->eventManagerMock = $this->createMock(Manager::class);
127122
$priceCurrencyMock = $this->getMockForAbstractClass(PriceCurrencyInterface::class);
@@ -219,7 +214,15 @@ public function testCollectItemNoDiscount()
219214
$this->shippingAssignmentMock->expects($this->any())->method('getItems')->willReturn([$itemNoDiscount]);
220215
$this->addressMock->expects($this->any())->method('getShippingAmount')->willReturn(true);
221216

222-
$totalMock = $this->createMock(Total::class);
217+
$totalMock = $this->getMockBuilder(Total::class)
218+
->addMethods(
219+
[
220+
'getBaseDiscountAmount'
221+
]
222+
)
223+
->disableOriginalConstructor()
224+
->getMock();
225+
$totalMock->expects($this->any())->method('getBaseDiscountAmount')->willReturn(0.0);
223226

224227
$this->assertInstanceOf(
225228
Discount::class,
@@ -265,7 +268,15 @@ public function testCollectItemHasParent()
265268
$this->addressMock->expects($this->any())->method('getQuote')->willReturn($quoteMock);
266269
$this->addressMock->expects($this->any())->method('getShippingAmount')->willReturn(true);
267270
$this->shippingAssignmentMock->expects($this->any())->method('getItems')->willReturn([$itemWithParentId]);
268-
$totalMock = $this->createMock(Total::class);
271+
$totalMock = $this->getMockBuilder(Total::class)
272+
->addMethods(
273+
[
274+
'getBaseDiscountAmount'
275+
]
276+
)
277+
->disableOriginalConstructor()
278+
->getMock();
279+
$totalMock->expects($this->any())->method('getBaseDiscountAmount')->willReturn(0.0);
269280

270281
$this->assertInstanceOf(
271282
Discount::class,
@@ -334,7 +345,16 @@ public function testCollectItemHasNoChildren()
334345
$this->addressMock->expects($this->any())->method('getShippingAmount')->willReturn(true);
335346
$this->shippingAssignmentMock->expects($this->any())->method('getItems')->willReturn([$itemWithChildren]);
336347

337-
$totalMock = $this->createMock(Total::class);
348+
$totalMock = $this->getMockBuilder(Total::class)
349+
->addMethods(
350+
[
351+
'getBaseDiscountAmount'
352+
]
353+
)
354+
->disableOriginalConstructor()
355+
->getMock();
356+
$totalMock->expects($this->any())->method('getBaseDiscountAmount')->willReturn(0.0);
357+
338358
$this->assertInstanceOf(
339359
Discount::class,
340360
$this->discount->collect($quoteMock, $this->shippingAssignmentMock, $totalMock)
@@ -353,10 +373,11 @@ public function testFetch()
353373

354374
$quoteMock = $this->createMock(Quote::class);
355375
$totalMock = $this->getMockBuilder(Total::class)
356-
->addMethods(['getDiscountAmount', 'getDiscountDescription'])
376+
->addMethods(['getDiscountAmount', 'getDiscountDescription', 'getBaseDiscountAmount'])
357377
->disableOriginalConstructor()
358378
->getMock();
359379

380+
$totalMock->expects($this->any())->method('getBaseDiscountAmount')->willReturn(0.0);
360381
$totalMock->expects($this->once())->method('getDiscountAmount')->willReturn($discountAmount);
361382
$totalMock->expects($this->once())->method('getDiscountDescription')->willReturn($discountDescription);
362383
$this->assertEquals($expectedResult, $this->discount->fetch($quoteMock, $totalMock));

app/code/Magento/SalesRule/Test/Unit/Model/ValidatorTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -375,8 +375,7 @@ public function testCanApplyDiscount(): void
375375
public function testInitTotalsCanApplyDiscount(): void
376376
{
377377
$rule = $this->getMockBuilder(Rule::class)
378-
->addMethods(['getSimpleAction'])
379-
->onlyMethods(['getActions', 'getId'])
378+
->onlyMethods(['getActions', 'getId', 'getSimpleAction'])
380379
->disableOriginalConstructor()
381380
->getMock();
382381
$item1 = $this->getMockForAbstractClass(
@@ -561,14 +560,14 @@ public function testProcessShippingAmountActions(
561560

562561
$ruleMock = $this->getMockBuilder(Rule::class)
563562
->disableOriginalConstructor()
564-
->addMethods(['getApplyToShipping', 'getSimpleAction', 'getDiscountAmount'])
563+
->addMethods(['getApplyToShipping', 'getDiscountAmount'])
564+
->onlyMethods(['getSimpleAction'])
565565
->getMock();
566566
$ruleMock->method('getApplyToShipping')
567567
->willReturn(true);
568568
$ruleMock->method('getDiscountAmount')
569569
->willReturn($ruleDiscount);
570-
$ruleMock->method('getSimpleAction')
571-
->willReturn($action);
570+
$ruleMock->expects($this->any())->method('getSimpleAction')->willReturn($action);
572571

573572
$iterator = new \ArrayIterator([$ruleMock]);
574573
$this->ruleCollection->method('getIterator')
@@ -632,7 +631,8 @@ public function testProcessShippingAmountWithFullFixedPercentDiscount(
632631
): void {
633632
$ruleMock = $this->getMockBuilder(Rule::class)
634633
->disableOriginalConstructor()
635-
->addMethods(['getApplyToShipping', 'getSimpleAction', 'getDiscountAmount'])
634+
->addMethods(['getApplyToShipping', 'getDiscountAmount'])
635+
->onlyMethods(['getSimpleAction'])
636636
->getMock();
637637
$ruleMock->method('getApplyToShipping')
638638
->willReturn(true);

0 commit comments

Comments
 (0)