Skip to content

Commit 0c5d35f

Browse files
authored
ENGCOM-6595: Performance: Getting rid of array_merge in loop #26355
2 parents 606c3e8 + a11fd8b commit 0c5d35f

File tree

42 files changed

+630
-502
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+630
-502
lines changed

app/code/Magento/Catalog/Block/Product/ProductList/Related.php

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,15 @@
66

77
namespace Magento\Catalog\Block\Product\ProductList;
88

9+
use Magento\Catalog\Block\Product\AbstractProduct;
10+
use Magento\Catalog\Block\Product\Context;
11+
use Magento\Catalog\Model\Product;
12+
use Magento\Catalog\Model\Product\Visibility as ProductVisibility;
913
use Magento\Catalog\Model\ResourceModel\Product\Collection;
14+
use Magento\Checkout\Model\ResourceModel\Cart as CartResourceModel;
15+
use Magento\Checkout\Model\Session as CheckoutSession;
16+
use Magento\Framework\DataObject\IdentityInterface;
17+
use Magento\Framework\Module\Manager;
1018
use Magento\Framework\View\Element\AbstractBlock;
1119

1220
/**
@@ -16,8 +24,7 @@
1624
* @SuppressWarnings(PHPMD.LongVariable)
1725
* @since 100.0.2
1826
*/
19-
class Related extends \Magento\Catalog\Block\Product\AbstractProduct implements
20-
\Magento\Framework\DataObject\IdentityInterface
27+
class Related extends AbstractProduct implements IdentityInterface
2128
{
2229
/**
2330
* @var Collection
@@ -27,53 +34,50 @@ class Related extends \Magento\Catalog\Block\Product\AbstractProduct implements
2734
/**
2835
* Checkout session
2936
*
30-
* @var \Magento\Checkout\Model\Session
37+
* @var CheckoutSession
3138
*/
3239
protected $_checkoutSession;
3340

3441
/**
3542
* Catalog product visibility
3643
*
37-
* @var \Magento\Catalog\Model\Product\Visibility
44+
* @var ProductVisibility
3845
*/
3946
protected $_catalogProductVisibility;
4047

4148
/**
4249
* Checkout cart
4350
*
44-
* @var \Magento\Checkout\Model\ResourceModel\Cart
51+
* @var CartResourceModel
4552
*/
4653
protected $_checkoutCart;
4754

4855
/**
49-
* @var \Magento\Framework\Module\Manager
56+
* @var Manager
5057
*/
5158
protected $moduleManager;
5259

5360
/**
54-
* @param \Magento\Catalog\Block\Product\Context $context
55-
* @param \Magento\Checkout\Model\ResourceModel\Cart $checkoutCart
56-
* @param \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility
57-
* @param \Magento\Checkout\Model\Session $checkoutSession
58-
* @param \Magento\Framework\Module\Manager $moduleManager
61+
* @param Context $context
62+
* @param CartResourceModel $checkoutCart
63+
* @param ProductVisibility $catalogProductVisibility
64+
* @param CheckoutSession $checkoutSession
65+
* @param Manager $moduleManager
5966
* @param array $data
6067
*/
6168
public function __construct(
62-
\Magento\Catalog\Block\Product\Context $context,
63-
\Magento\Checkout\Model\ResourceModel\Cart $checkoutCart,
64-
\Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
65-
\Magento\Checkout\Model\Session $checkoutSession,
66-
\Magento\Framework\Module\Manager $moduleManager,
69+
Context $context,
70+
CartResourceModel $checkoutCart,
71+
ProductVisibility $catalogProductVisibility,
72+
CheckoutSession $checkoutSession,
73+
Manager $moduleManager,
6774
array $data = []
6875
) {
6976
$this->_checkoutCart = $checkoutCart;
7077
$this->_catalogProductVisibility = $catalogProductVisibility;
7178
$this->_checkoutSession = $checkoutSession;
7279
$this->moduleManager = $moduleManager;
73-
parent::__construct(
74-
$context,
75-
$data
76-
);
80+
parent::__construct($context, $data);
7781
}
7882

7983
/**
@@ -84,7 +88,7 @@ public function __construct(
8488
protected function _prepareData()
8589
{
8690
$product = $this->getProduct();
87-
/* @var $product \Magento\Catalog\Model\Product */
91+
/* @var $product Product */
8892

8993
$this->_itemCollection = $product->getRelatedProductCollection()->addAttributeToSelect(
9094
'required_options'
@@ -139,12 +143,11 @@ public function getItems()
139143
*/
140144
public function getIdentities()
141145
{
142-
$identities = [];
146+
$identities = [[]];
143147
foreach ($this->getItems() as $item) {
144-
// phpcs:ignore Magento2.Performance.ForeachArrayMerge
145-
$identities = array_merge($identities, $item->getIdentities());
148+
$identities[] = $item->getIdentities();
146149
}
147-
return $identities;
150+
return array_merge(...$identities);
148151
}
149152

150153
/**

app/code/Magento/Catalog/Block/Product/ProductList/Upsell.php

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,16 @@
66

77
namespace Magento\Catalog\Block\Product\ProductList;
88

9+
use Magento\Catalog\Block\Product\AbstractProduct;
10+
use Magento\Catalog\Block\Product\Context;
11+
use Magento\Catalog\Model\Product;
12+
use Magento\Catalog\Model\Product\Visibility as ProductVisibility;
913
use Magento\Catalog\Model\ResourceModel\Product\Collection;
14+
use Magento\Checkout\Model\ResourceModel\Cart as CartResourceModel;
15+
use Magento\Checkout\Model\Session as CheckoutSession;
16+
use Magento\Framework\DataObject;
17+
use Magento\Framework\DataObject\IdentityInterface;
18+
use Magento\Framework\Module\Manager;
1019

1120
/**
1221
* Catalog product upsell items block
@@ -15,16 +24,15 @@
1524
* @SuppressWarnings(PHPMD.LongVariable)
1625
* @since 100.0.2
1726
*/
18-
class Upsell extends \Magento\Catalog\Block\Product\AbstractProduct implements
19-
\Magento\Framework\DataObject\IdentityInterface
27+
class Upsell extends AbstractProduct implements IdentityInterface
2028
{
2129
/**
2230
* @var int
2331
*/
2432
protected $_columnCount = 4;
2533

2634
/**
27-
* @var \Magento\Framework\DataObject[]
35+
* @var DataObject[]
2836
*/
2937
protected $_items;
3038

@@ -41,53 +49,50 @@ class Upsell extends \Magento\Catalog\Block\Product\AbstractProduct implements
4149
/**
4250
* Checkout session
4351
*
44-
* @var \Magento\Checkout\Model\Session
52+
* @var CheckoutSession
4553
*/
4654
protected $_checkoutSession;
4755

4856
/**
4957
* Catalog product visibility
5058
*
51-
* @var \Magento\Catalog\Model\Product\Visibility
59+
* @var ProductVisibility
5260
*/
5361
protected $_catalogProductVisibility;
5462

5563
/**
5664
* Checkout cart
5765
*
58-
* @var \Magento\Checkout\Model\ResourceModel\Cart
66+
* @var CartResourceModel
5967
*/
6068
protected $_checkoutCart;
6169

6270
/**
63-
* @var \Magento\Framework\Module\Manager
71+
* @var Manager
6472
*/
6573
protected $moduleManager;
6674

6775
/**
68-
* @param \Magento\Catalog\Block\Product\Context $context
69-
* @param \Magento\Checkout\Model\ResourceModel\Cart $checkoutCart
70-
* @param \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility
71-
* @param \Magento\Checkout\Model\Session $checkoutSession
72-
* @param \Magento\Framework\Module\Manager $moduleManager
76+
* @param Context $context
77+
* @param CartResourceModel $checkoutCart
78+
* @param ProductVisibility $catalogProductVisibility
79+
* @param CheckoutSession $checkoutSession
80+
* @param Manager $moduleManager
7381
* @param array $data
7482
*/
7583
public function __construct(
76-
\Magento\Catalog\Block\Product\Context $context,
77-
\Magento\Checkout\Model\ResourceModel\Cart $checkoutCart,
78-
\Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
79-
\Magento\Checkout\Model\Session $checkoutSession,
80-
\Magento\Framework\Module\Manager $moduleManager,
84+
Context $context,
85+
CartResourceModel $checkoutCart,
86+
ProductVisibility $catalogProductVisibility,
87+
CheckoutSession $checkoutSession,
88+
Manager $moduleManager,
8189
array $data = []
8290
) {
8391
$this->_checkoutCart = $checkoutCart;
8492
$this->_catalogProductVisibility = $catalogProductVisibility;
8593
$this->_checkoutSession = $checkoutSession;
8694
$this->moduleManager = $moduleManager;
87-
parent::__construct(
88-
$context,
89-
$data
90-
);
95+
parent::__construct($context, $data);
9196
}
9297

9398
/**
@@ -98,7 +103,7 @@ public function __construct(
98103
protected function _prepareData()
99104
{
100105
$product = $this->getProduct();
101-
/* @var $product \Magento\Catalog\Model\Product */
106+
/* @var $product Product */
102107
$this->_itemCollection = $product->getUpSellProductCollection()->setPositionOrder()->addStoreFilter();
103108
if ($this->moduleManager->isEnabled('Magento_Checkout')) {
104109
$this->_addProductAttributesAndPrices($this->_itemCollection);
@@ -181,8 +186,8 @@ public function getRowCount()
181186
*/
182187
public function setColumnCount($columns)
183188
{
184-
if ((int) $columns > 0) {
185-
$this->_columnCount = (int) $columns;
189+
if ((int)$columns > 0) {
190+
$this->_columnCount = (int)$columns;
186191
}
187192
return $this;
188193
}
@@ -231,8 +236,8 @@ public function getIterableItem()
231236
*/
232237
public function setItemLimit($type, $limit)
233238
{
234-
if ((int) $limit > 0) {
235-
$this->_itemLimits[$type] = (int) $limit;
239+
if ((int)$limit > 0) {
240+
$this->_itemLimits[$type] = (int)$limit;
236241
}
237242
return $this;
238243
}
@@ -250,9 +255,9 @@ public function getItemLimit($type = '')
250255
}
251256
if (isset($this->_itemLimits[$type])) {
252257
return $this->_itemLimits[$type];
253-
} else {
254-
return 0;
255258
}
259+
260+
return 0;
256261
}
257262

258263
/**
@@ -262,11 +267,10 @@ public function getItemLimit($type = '')
262267
*/
263268
public function getIdentities()
264269
{
265-
$identities = [];
266-
foreach ($this->getItems() as $item) {
267-
// phpcs:ignore Magento2.Performance.ForeachArrayMerge
268-
$identities = array_merge($identities, $item->getIdentities());
269-
}
270-
return $identities;
270+
$identities = array_map(function (DataObject $item) {
271+
return $item->getIdentities();
272+
}, $this->getItems()) ?: [[]];
273+
274+
return array_merge(...$identities);
271275
}
272276
}

app/code/Magento/Catalog/Test/Unit/Block/Product/ProductList/UpsellTest.php

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,21 @@
55
*/
66
namespace Magento\Catalog\Test\Unit\Block\Product\ProductList;
77

8+
use Magento\Catalog\Block\Product\ProductList\Upsell as UpsellBlock;
9+
use Magento\Catalog\Model\Product;
10+
811
class UpsellTest extends \PHPUnit\Framework\TestCase
912
{
13+
const STUB_EMPTY_ARRAY = [];
1014
/**
11-
* @var \Magento\Catalog\Block\Product\ProductList\Upsell
15+
* @var UpsellBlock
1216
*/
1317
protected $block;
1418

1519
protected function setUp()
1620
{
1721
$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
18-
$this->block = $objectManager->getObject(\Magento\Catalog\Block\Product\ProductList\Upsell::class);
22+
$this->block = $objectManager->getObject(UpsellBlock::class);
1923
}
2024

2125
protected function tearDown()
@@ -26,10 +30,10 @@ protected function tearDown()
2630
public function testGetIdentities()
2731
{
2832
$productTag = ['compare_item_1'];
29-
$product = $this->createMock(\Magento\Catalog\Model\Product::class);
33+
$product = $this->createMock(Product::class);
3034
$product->expects($this->once())->method('getIdentities')->will($this->returnValue($productTag));
3135

32-
$itemsCollection = new \ReflectionProperty(\Magento\Catalog\Block\Product\ProductList\Upsell::class, '_items');
36+
$itemsCollection = new \ReflectionProperty(UpsellBlock::class, '_items');
3337
$itemsCollection->setAccessible(true);
3438
$itemsCollection->setValue($this->block, [$product]);
3539

@@ -38,4 +42,32 @@ public function testGetIdentities()
3842
$this->block->getIdentities()
3943
);
4044
}
45+
46+
public function testGetIdentitiesWhenItemGetIdentitiesReturnEmptyArray()
47+
{
48+
$product = $this->createMock(Product::class);
49+
$product->expects($this->once())->method('getIdentities')
50+
->willReturn(self::STUB_EMPTY_ARRAY);
51+
52+
$itemsCollection = new \ReflectionProperty(UpsellBlock::class, '_items');
53+
$itemsCollection->setAccessible(true);
54+
$itemsCollection->setValue($this->block, [$product]);
55+
56+
$this->assertEquals(
57+
self::STUB_EMPTY_ARRAY,
58+
$this->block->getIdentities()
59+
);
60+
}
61+
62+
public function testGetIdentitiesWhenGetItemsReturnEmptyArray()
63+
{
64+
$itemsCollection = new \ReflectionProperty(UpsellBlock::class, '_items');
65+
$itemsCollection->setAccessible(true);
66+
$itemsCollection->setValue($this->block, self::STUB_EMPTY_ARRAY);
67+
68+
$this->assertEquals(
69+
self::STUB_EMPTY_ARRAY,
70+
$this->block->getIdentities()
71+
);
72+
}
4173
}

0 commit comments

Comments
 (0)