Skip to content

Commit 1582684

Browse files
committed
Merge remote-tracking branch 'origin/2.4-develop' into Hammer_Platform_Health_Scope_05092023
2 parents f246ccf + 16cdf25 commit 1582684

File tree

78 files changed

+4336
-518
lines changed

Some content is hidden

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

78 files changed

+4336
-518
lines changed

app/code/Magento/Catalog/Model/ResourceModel/AbstractResource.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ protected function _isApplicableAttribute($object, $attribute)
8787
{
8888
$applyTo = $attribute->getApplyTo() ?: [];
8989
return (count($applyTo) == 0 || in_array($object->getTypeId(), $applyTo))
90-
&& $attribute->isInSet($object->getAttributeSetId());
90+
&& $attribute->isInSet($object->getAttributeSetId() ?? $this->getEntityType()->getDefaultAttributeSetId());
9191
}
9292

9393
/**
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Catalog\Test\Fixture;
9+
10+
use Magento\Catalog\Api\Data\ProductAttributeInterface;
11+
use Magento\Eav\Model\Config;
12+
use Magento\Framework\DataObject;
13+
use Magento\TestFramework\Fixture\Api\ServiceFactory;
14+
use Magento\TestFramework\Fixture\Data\ProcessorInterface;
15+
16+
class AttributeSet extends \Magento\Eav\Test\Fixture\AttributeSet
17+
{
18+
private const ENTITY_TYPE = ProductAttributeInterface::ENTITY_TYPE_CODE;
19+
20+
public function __construct(
21+
ServiceFactory $serviceFactory,
22+
ProcessorInterface $dataProcessor,
23+
private readonly Config $eavConfig
24+
) {
25+
parent::__construct($serviceFactory, $dataProcessor);
26+
}
27+
28+
/**
29+
* {@inheritdoc}
30+
*/
31+
public function apply(array $data = []): ?DataObject
32+
{
33+
return parent::apply(
34+
array_merge(
35+
[
36+
'entity_type_code' => self::ENTITY_TYPE,
37+
'skeleton_id' => $this->eavConfig->getEntityType(self::ENTITY_TYPE)->getDefaultAttributeSetId(),
38+
],
39+
$data
40+
)
41+
);
42+
}
43+
}

app/code/Magento/CatalogImportExport/Model/Import/Product.php

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Magento\CatalogImportExport\Model\Import\Product\MediaGalleryProcessor;
1717
use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface;
1818
use Magento\CatalogImportExport\Model\Import\Product\Skip;
19+
use Magento\CatalogImportExport\Model\Import\Product\SkuStorage;
1920
use Magento\CatalogImportExport\Model\Import\Product\StatusProcessor;
2021
use Magento\CatalogImportExport\Model\Import\Product\StockProcessor;
2122
use Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType;
@@ -769,6 +770,11 @@ class Product extends AbstractEntity
769770
*/
770771
private $stockItemProcessor;
771772

773+
/**
774+
* @var SkuStorage|null
775+
*/
776+
private ?SkuStorage $skuStorage;
777+
772778
/**
773779
* @param \Magento\Framework\Json\Helper\Data $jsonHelper
774780
* @param \Magento\ImportExport\Helper\Data $importExportData
@@ -819,6 +825,7 @@ class Product extends AbstractEntity
819825
* @param LinkProcessor|null $linkProcessor
820826
* @param File|null $fileDriver
821827
* @param StockItemProcessorInterface|null $stockItemProcessor
828+
* @param SkuStorage|null $skuStorage
822829
* @throws LocalizedException
823830
* @throws \Magento\Framework\Exception\FileSystemException
824831
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -874,7 +881,8 @@ public function __construct(
874881
StockProcessor $stockProcessor = null,
875882
LinkProcessor $linkProcessor = null,
876883
?File $fileDriver = null,
877-
?StockItemProcessorInterface $stockItemProcessor = null
884+
?StockItemProcessorInterface $stockItemProcessor = null,
885+
?SkuStorage $skuStorage = null
878886
) {
879887
$this->_eventManager = $eventManager;
880888
$this->stockRegistry = $stockRegistry;
@@ -930,6 +938,8 @@ public function __construct(
930938
);
931939
$this->_optionEntity = $data['option_entity'] ??
932940
$optionFactory->create(['data' => ['product_entity' => $this]]);
941+
$this->skuStorage = $skuStorage ?? ObjectManager::getInstance()
942+
->get(SkuStorage::class);
933943
$this->_initAttributeSets()
934944
->_initTypeModels()
935945
->_initSkus()
@@ -1146,7 +1156,7 @@ protected function _importData()
11461156
protected function _replaceProducts()
11471157
{
11481158
$this->deleteProductsForReplacement();
1149-
$this->_oldSku = $this->skuProcessor->reloadOldSkus()->getOldSkus();
1159+
$this->skuStorage->reset();
11501160
$this->_validatedRows = null;
11511161
$this->setParameters(
11521162
array_merge(
@@ -1208,7 +1218,7 @@ protected function _initAttributeSets()
12081218
protected function _initSkus()
12091219
{
12101220
$this->skuProcessor->setTypeModels($this->_productTypeModels);
1211-
$this->_oldSku = $this->skuProcessor->reloadOldSkus()->getOldSkus();
1221+
$this->skuStorage->reset();
12121222
return $this;
12131223
}
12141224

@@ -1341,7 +1351,7 @@ protected function _saveProductAttributes(array $attributesData)
13411351
$linkIdBySkuForStatusChanged = [];
13421352
$tableData = [];
13431353
foreach ($skuData as $sku => $attributes) {
1344-
$linkId = $this->_oldSku[strtolower($sku)][$linkField];
1354+
$linkId = $this->skuStorage->get((string)$sku)[$linkField];
13451355
foreach ($attributes as $attributeId => $storeValues) {
13461356
foreach ($storeValues as $storeId => $storeValue) {
13471357
if ($attributeId === $statusAttributeId) {
@@ -1464,7 +1474,7 @@ public function saveProductEntity(array $entityRowsIn, array $entityRowsUp)
14641474
$this->skuProcessor->setNewSkuData($sku, $key, $value);
14651475
}
14661476
}
1467-
$this->updateOldSku($newProducts);
1477+
$this->updateSkuStorage($newProducts);
14681478
}
14691479
return $this;
14701480
}
@@ -1485,22 +1495,11 @@ private function getOldSkuFieldsForSelect()
14851495
* @param array $newProducts
14861496
* @return void
14871497
*/
1488-
private function updateOldSku(array $newProducts)
1498+
private function updateSkuStorage(array $newProducts): void
14891499
{
1490-
$oldSkus = [];
14911500
foreach ($newProducts as $info) {
1492-
$typeId = $info['type_id'];
1493-
$sku = strtolower($info['sku']);
1494-
$oldSkus[$sku] = [
1495-
'type_id' => $typeId,
1496-
'attr_set_id' => $info['attribute_set_id'],
1497-
$this->getProductIdentifierField() => $info[$this->getProductIdentifierField()],
1498-
'supported_type' => isset($this->_productTypeModels[$typeId]),
1499-
$this->getProductEntityLinkField() => $info[$this->getProductEntityLinkField()],
1500-
];
1501+
$this->skuStorage->set($info);
15011502
}
1502-
1503-
$this->_oldSku = array_replace($this->_oldSku, $oldSkus);
15041503
}
15051504

15061505
/**
@@ -2596,10 +2595,19 @@ public function getNextBunch()
25962595
* new products with the same SKU in different letter cases.
25972596
*
25982597
* @return array
2598+
* @deprecated This method is deprecated due to high memory consumption.
2599+
* @see SkuStorage
25992600
*/
26002601
public function getOldSku()
26012602
{
2602-
return $this->_oldSku;
2603+
// For backward compatibility get all data from storage
2604+
$oldSkus = [];
2605+
foreach ($this->skuStorage->iterate() as $sku => $value) {
2606+
$oldSkus[$sku] = $value;
2607+
$oldSkus[$sku]['supported_type'] = isset($this->_productTypeModels[$value['type_id']]);
2608+
}
2609+
2610+
return $oldSkus;
26032611
}
26042612

26052613
/**
@@ -3253,8 +3261,7 @@ private function parseMultipleValues($labelRow)
32533261
private function isSkuExist($sku)
32543262
{
32553263
if ($sku !== null) {
3256-
$sku = strtolower($sku);
3257-
return isset($this->_oldSku[$sku]);
3264+
return $this->skuStorage->has($sku);
32583265
}
32593266
return false;
32603267
}
@@ -3267,7 +3274,7 @@ private function isSkuExist($sku)
32673274
*/
32683275
private function getExistingSku($sku)
32693276
{
3270-
return $this->_oldSku[strtolower($sku)];
3277+
return $this->skuStorage->get((string)$sku);
32713278
}
32723279

32733280
/**

app/code/Magento/CatalogImportExport/Model/Import/Product/LinkProcessor.php

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ class LinkProcessor
4646
*/
4747
private $logger;
4848

49+
/**
50+
* @var SkuStorage
51+
*/
52+
private SkuStorage $skuStorage;
53+
4954
/**
5055
* LinkProcessor constructor.
5156
*
@@ -54,20 +59,23 @@ class LinkProcessor
5459
* @param SkuProcessor $skuProcessor
5560
* @param LoggerInterface $logger
5661
* @param array $linkNameToId
62+
* @param SkuStorage $skuStorage
5763
*/
5864
public function __construct(
5965
LinkFactory $linkFactory,
6066
Helper $resourceHelper,
6167
SkuProcessor $skuProcessor,
6268
LoggerInterface $logger,
63-
array $linkNameToId
69+
array $linkNameToId,
70+
SkuStorage $skuStorage
6471
) {
6572
$this->linkFactory = $linkFactory;
6673
$this->resourceHelper = $resourceHelper;
6774
$this->skuProcessor = $skuProcessor;
6875
$this->logger = $logger;
6976

7077
$this->linkNameToId = $linkNameToId;
78+
$this->skuStorage = $skuStorage;
7179
}
7280

7381
/**
@@ -171,10 +179,10 @@ private function processLinkBunches(
171179
? explode($importEntity->getMultipleValueSeparator(), $rowData[$linkName . 'position'])
172180
: [];
173181

174-
$linkSkus = $this->filterValidLinks($importEntity, $sku, $linkSkus);
182+
$linkSkus = $this->filterValidLinks($sku, $linkSkus);
175183

176184
foreach ($linkSkus as $linkedKey => $linkedSku) {
177-
$linkedId = $this->getProductLinkedId($importEntity, $linkedSku);
185+
$linkedId = $this->getProductLinkedId($linkedSku);
178186
if ($linkedId == null) {
179187
// Import file links to a SKU which is skipped for some reason, which leads to a "NULL"
180188
// link causing fatal errors.
@@ -222,7 +230,7 @@ private function deleteProductsLinks(
222230
Product $importEntity,
223231
Link $resource,
224232
array $linksToDelete
225-
) {
233+
): void {
226234
if (!empty($linksToDelete) && Import::BEHAVIOR_APPEND === $importEntity->getBehavior()) {
227235
foreach ($linksToDelete as $linkTypeId => $productIds) {
228236
if (!empty($productIds)) {
@@ -243,27 +251,23 @@ private function deleteProductsLinks(
243251
/**
244252
* Check if product exists for specified SKU
245253
*
246-
* @param Product $importEntity
247254
* @param string $sku
248255
* @return bool
249256
*/
250-
private function isSkuExist(Product $importEntity, string $sku): bool
257+
private function isSkuExist(string $sku): bool
251258
{
252-
$sku = strtolower($sku);
253-
return isset($importEntity->getOldSku()[$sku]);
259+
return $this->skuStorage->has($sku);
254260
}
255261

256262
/**
257263
* Get existing SKU record
258264
*
259-
* @param Product $importEntity
260265
* @param string $sku
261-
* @return mixed
266+
* @return array|null
262267
*/
263-
private function getExistingSku(Product $importEntity, string $sku)
268+
private function getExistingSku(string $sku): ?array
264269
{
265-
$sku = strtolower($sku);
266-
return $importEntity->getOldSku()[$sku];
270+
return $this->skuStorage->get($sku);
267271
}
268272

269273
/**
@@ -296,20 +300,17 @@ private function fetchProductLinks(Product $importEntity, Link $resource, int $p
296300
/**
297301
* Gets the Id of the Sku
298302
*
299-
* @param Product $importEntity
300303
* @param string $linkedSku
301304
* @return int|null
302305
*/
303-
private function getProductLinkedId(Product $importEntity, string $linkedSku): ?int
306+
private function getProductLinkedId(string $linkedSku): ?int
304307
{
305308
$linkedSku = trim($linkedSku);
306309
$newSku = $this->skuProcessor->getNewSku($linkedSku);
307310

308-
$linkedId = ! empty($newSku) ?
311+
return !empty($newSku) ?
309312
$newSku['entity_id'] :
310-
$this->getExistingSku($importEntity, $linkedSku)['entity_id'];
311-
312-
return $linkedId;
313+
$this->getExistingSku($linkedSku)['entity_id'];
313314
}
314315

315316
/**
@@ -329,7 +330,7 @@ private function saveLinksData(
329330
array $productIds,
330331
array $linkRows,
331332
array $positionRows
332-
) {
333+
): void {
333334
$mainTable = $resource->getMainTable();
334335
if (Import::BEHAVIOR_APPEND != $importEntity->getBehavior() && $productIds) {
335336
$importEntity->getConnection()->delete(
@@ -370,7 +371,7 @@ private function composeLinkKey(int $productId, int $linkedId, int $linkTypeId):
370371
* @param array $rowData
371372
* @return array
372373
*/
373-
private function filterProvidedLinkTypes(array $rowData)
374+
private function filterProvidedLinkTypes(array $rowData): array
374375
{
375376
return array_filter(
376377
$this->linkNameToId,
@@ -384,21 +385,20 @@ function ($linkName) use ($rowData) {
384385
/**
385386
* Filter out invalid links
386387
*
387-
* @param Product $importEntity
388388
* @param string $sku
389389
* @param array $linkSkus
390390
* @return array
391391
*/
392-
private function filterValidLinks(Product $importEntity, string $sku, array $linkSkus)
392+
private function filterValidLinks(string $sku, array $linkSkus): array
393393
{
394394
return array_filter(
395395
$linkSkus,
396-
function ($linkedSku) use ($sku, $importEntity) {
396+
function ($linkedSku) use ($sku) {
397397
$linkedSku = $linkedSku !== null ? trim($linkedSku) : '';
398398

399399
return (
400400
$this->skuProcessor->getNewSku($linkedSku) !== null
401-
|| $this->isSkuExist($importEntity, $linkedSku)
401+
|| $this->isSkuExist($linkedSku)
402402
)
403403
&& strcasecmp($linkedSku, $sku) !== 0;
404404
}

0 commit comments

Comments
 (0)