Skip to content

Commit 8ab0f26

Browse files
authored
MDEE-463: Commerce Data Extension do not break main process (#276)
* MDEE-463: Commerce Data Extension do not break main process
1 parent b46365a commit 8ab0f26

File tree

40 files changed

+1306
-464
lines changed

40 files changed

+1306
-464
lines changed

CatalogDataExporter/Plugin/DDLTrigger/MigrateDataFromJSON.php renamed to CatalogDataExporter/Model/MigrateDataFromJSON.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66
declare(strict_types=1);
77

8-
namespace Magento\CatalogDataExporter\Plugin\DDLTrigger;
8+
namespace Magento\CatalogDataExporter\Model;
99

1010
use Magento\Framework\App\ResourceConnection;
1111
use Magento\Framework\DB\Sql\Expression;
@@ -22,7 +22,7 @@ class MigrateDataFromJSON implements DDLTriggerInterface
2222
/**
2323
* Pattern with which we can match whether we can apply and use this trigger or not.
2424
*/
25-
const MATCH_PATTERN = '/migrateDataFromJSON\((.+)\)/';
25+
private const MATCH_PATTERN = '/migrateDataFromJSON\((.+)\)/';
2626

2727
/**
2828
* @var ResourceConnection

CatalogDataExporter/Plugin/Category/ReindexCategoryFeedOnSave.php

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
use Magento\Catalog\Model\Category;
1212
use Magento\CatalogDataExporter\Model\Query\Category\ChildCategoriesQuery;
13+
use Magento\DataExporter\Model\Logging\CommerceDataExportLoggerInterface;
1314
use Magento\Framework\Indexer\IndexerRegistry;
1415

1516
/**
@@ -22,26 +23,23 @@ class ReindexCategoryFeedOnSave
2223
*/
2324
private const CATEGORY_FEED_INDEXER = 'catalog_data_exporter_categories';
2425

25-
/**
26-
* @var ChildCategoriesQuery
27-
*/
28-
private $childCategoriesQuery;
29-
30-
/**
31-
* @var IndexerRegistry
32-
*/
33-
private $indexerRegistry;
26+
private ChildCategoriesQuery $childCategoriesQuery;
27+
private IndexerRegistry $indexerRegistry;
28+
private CommerceDataExportLoggerInterface $logger;
3429

3530
/**
3631
* @param IndexerRegistry $indexerRegistry
3732
* @param ChildCategoriesQuery $childCategoriesQuery
33+
* @param CommerceDataExportLoggerInterface $logger
3834
*/
3935
public function __construct(
4036
IndexerRegistry $indexerRegistry,
41-
ChildCategoriesQuery $childCategoriesQuery
37+
ChildCategoriesQuery $childCategoriesQuery,
38+
CommerceDataExportLoggerInterface $logger
4239
) {
4340
$this->indexerRegistry = $indexerRegistry;
4441
$this->childCategoriesQuery = $childCategoriesQuery;
42+
$this->logger = $logger;
4543
}
4644

4745
/**
@@ -53,11 +51,18 @@ public function __construct(
5351
*/
5452
public function afterReindex(Category $subject) : void
5553
{
56-
$categoryFeedIndexer = $this->indexerRegistry->get(self::CATEGORY_FEED_INDEXER);
57-
if (!$categoryFeedIndexer->isScheduled()) {
58-
$children = $this->childCategoriesQuery->getAllChildrenIds($subject);
59-
$idsList = array_unique(array_merge([$subject->getId()], $children, $subject->getParentIds()));
60-
$categoryFeedIndexer->reindexList($idsList);
54+
try {
55+
$categoryFeedIndexer = $this->indexerRegistry->get(self::CATEGORY_FEED_INDEXER);
56+
if (!$categoryFeedIndexer->isScheduled()) {
57+
$children = $this->childCategoriesQuery->getAllChildrenIds($subject);
58+
$idsList = array_unique(array_merge([$subject->getId()], $children, $subject->getParentIds()));
59+
$categoryFeedIndexer->reindexList($idsList);
60+
}
61+
} catch (\Throwable $e) {
62+
$this->logger->error(
63+
'Data Exporter exception has occurred: ' . $e->getMessage(),
64+
['exception' => $e]
65+
);
6166
}
6267
}
6368
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\CatalogDataExporter\Plugin;
10+
11+
use Magento\Framework\Exception\BulkException;
12+
use Magento\Framework\Mview\Processor;
13+
use Magento\Framework\Mview\View\CollectionFactory;
14+
use Magento\Framework\Mview\ViewInterface;
15+
use Magento\Framework\Phrase;
16+
use Magento\Framework\Exception\RuntimeException;
17+
18+
/**
19+
* Hot fix before AC-8768
20+
*/
21+
class CoverExceptionMview
22+
{
23+
private CollectionFactory $viewsFactory;
24+
25+
/**
26+
* @param CollectionFactory $viewsFactory
27+
*/
28+
public function __construct(
29+
CollectionFactory $viewsFactory,
30+
) {
31+
$this->viewsFactory = $viewsFactory;
32+
}
33+
34+
/**
35+
* Don't fail before complete all indexer
36+
*
37+
* @param Processor $subject
38+
* @param callable $proceed
39+
* @param string $group
40+
* @return void
41+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
42+
* @throws BulkException
43+
*/
44+
public function aroundUpdate(Processor $subject, callable $proceed, $group = ''): void
45+
{
46+
$exception = new BulkException();
47+
$views = $this->getViewsByGroup($group);
48+
foreach ($views as $view) {
49+
try {
50+
$view->update();
51+
} catch (\Throwable $e) {
52+
$exception->addException(
53+
new RuntimeException(new Phrase('Mview fail %1', [$view->getId()]), $e)
54+
);
55+
}
56+
}
57+
58+
if ($exception->wasErrorAdded()) {
59+
throw $exception;
60+
}
61+
}
62+
63+
/**
64+
* Return list of views by group
65+
*
66+
* @param string $group
67+
* @return ViewInterface[]
68+
*/
69+
private function getViewsByGroup(string $group = ''): array
70+
{
71+
$collection = $this->viewsFactory->create();
72+
return $group ? $collection->getItemsByColumnValue('group', $group) : $collection->getItems();
73+
}
74+
}

CatalogDataExporter/Plugin/DDLTrigger/ResetTriggers.php

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Magento\CatalogDataExporter\Plugin\DDLTrigger;
99

1010
use Magento\Catalog\Model\ResourceModel\Indexer\ActiveTableSwitcher as Subject;
11+
use Magento\DataExporter\Model\Logging\CommerceDataExportLoggerInterface;
1112
use Magento\Framework\DB\Adapter\AdapterInterface;
1213
use Magento\Framework\App\ResourceConnection;
1314
use Magento\Framework\Mview\View\CollectionFactory;
@@ -20,26 +21,23 @@
2021
*/
2122
class ResetTriggers
2223
{
23-
/**
24-
* @var ResourceConnection
25-
*/
26-
private $resource;
27-
28-
/**
29-
* @var CollectionInterface
30-
*/
31-
private $viewCollection;
24+
private ResourceConnection $resource;
25+
private CollectionInterface $viewCollection;
26+
private CommerceDataExportLoggerInterface $logger;
3227

3328
/**
3429
* @param CollectionFactory $viewCollectionFactory
3530
* @param ResourceConnection $resource
31+
* @param CommerceDataExportLoggerInterface $logger
3632
*/
3733
public function __construct(
3834
CollectionFactory $viewCollectionFactory,
39-
ResourceConnection $resource
35+
ResourceConnection $resource,
36+
CommerceDataExportLoggerInterface $logger
4037
) {
4138
$this->resource = $resource;
4239
$this->viewCollection = $viewCollectionFactory->create();
40+
$this->logger = $logger;
4341
}
4442

4543
/**
@@ -59,19 +57,28 @@ public function aroundSwitchTable(
5957
AdapterInterface $connection,
6058
array $tableNames
6159
) {
62-
$viewList = $this->getViewsForTables($tableNames);
63-
foreach ($viewList as $view) {
64-
$view->unsubscribe();
65-
}
66-
$result = $proceed($connection, $tableNames);
67-
foreach ($viewList as $view) {
68-
$view->subscribe();
60+
try {
61+
$viewList = $this->getViewsForTables($tableNames);
62+
foreach ($viewList as $view) {
63+
$view->unsubscribe();
64+
}
65+
$result = $proceed($connection, $tableNames);
66+
foreach ($viewList as $view) {
67+
$view->subscribe();
68+
}
69+
return $result;
70+
} catch (\Throwable $e) {
71+
$this->logger->error(
72+
'Data Exporter exception has occurred: ' . $e->getMessage(),
73+
['exception' => $e]
74+
);
75+
return $proceed($connection, $tableNames);
6976
}
70-
return $result;
7177
}
7278

7379
/**
7480
* Get list of views that are enabled for particular tables
81+
*
7582
* @param $tableNames
7683
* @return array
7784
*/

CatalogDataExporter/Plugin/Eav/Attribute/ProductAttributeDelete.php

Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
namespace Magento\CatalogDataExporter\Plugin\Eav\Attribute;
88

99
use Magento\Catalog\Api\Data\ProductInterface;
10+
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
1011
use Magento\CatalogDataExporter\Model\Indexer\IndexInvalidationManager;
1112
use Magento\Framework\App\ResourceConnection;
1213
use Magento\Framework\EntityManager\MetadataPool;
1314
use Magento\Framework\Indexer\IndexerRegistry;
1415
use Magento\Store\Model\Store;
15-
use Magento\DataExporter\Model\Logging\CommerceDataExportLoggerInterface as LoggerInterface;
16+
use Magento\DataExporter\Model\Logging\CommerceDataExportLoggerInterface;
1617

1718
/**
1819
* MySQL trigger does not call in case of cascade deleting (by FK), as a result product not re-indexed when product
@@ -27,51 +28,28 @@ class ProductAttributeDelete
2728
{
2829
private const MAX_PRODUCTS_FOR_INSERT = 10000;
2930

30-
/**
31-
* @var ResourceConnection
32-
*/
33-
private $resourceConnection;
34-
35-
/**
36-
* @var MetadataPool
37-
*/
38-
private $metadataPool;
39-
40-
/**
41-
* @var IndexInvalidationManager
42-
*/
43-
private $invalidationManager;
44-
45-
/**
46-
* @var IndexerRegistry
47-
*/
48-
private $indexerRegistry;
49-
50-
/**
51-
* @var LoggerInterface
52-
*/
53-
private $logger;
54-
55-
/**
56-
* @var int
57-
*/
58-
private $maxProductsPerInsert;
31+
private ResourceConnection $resourceConnection;
32+
private MetadataPool $metadataPool;
33+
private IndexInvalidationManager $invalidationManager;
34+
private IndexerRegistry $indexerRegistry;
35+
private CommerceDataExportLoggerInterface $logger;
36+
private int $maxProductsPerInsert;
5937

6038
/**
6139
* @param ResourceConnection $resourceConnection
6240
* @param MetadataPool $metadataPool
6341
* @param IndexInvalidationManager $invalidationManager
6442
* @param IndexerRegistry $indexerRegistry
65-
* @param LoggerInterface $logger
43+
* @param CommerceDataExportLoggerInterface $logger
6644
* @param int $maxProductsPerInsert
6745
*/
6846
public function __construct(
6947
ResourceConnection $resourceConnection,
7048
MetadataPool $metadataPool,
7149
IndexInvalidationManager $invalidationManager,
7250
IndexerRegistry $indexerRegistry,
73-
LoggerInterface $logger,
74-
$maxProductsPerInsert = self::MAX_PRODUCTS_FOR_INSERT
51+
CommerceDataExportLoggerInterface $logger,
52+
int $maxProductsPerInsert = self::MAX_PRODUCTS_FOR_INSERT
7553
) {
7654
$this->resourceConnection = $resourceConnection;
7755
$this->metadataPool = $metadataPool;
@@ -82,10 +60,10 @@ public function __construct(
8260
}
8361

8462
/**
85-
* @param \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute
63+
* @param Attribute $attribute
8664
*/
8765
public function beforeDelete(
88-
\Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute
66+
Attribute $attribute
8967
) {
9068
$indexer = $this->indexerRegistry->get('catalog_data_exporter_products');
9169
if (!$indexer->isScheduled()) {

CatalogDataExporter/Plugin/FilterChangeLogTable.php

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
namespace Magento\CatalogDataExporter\Plugin;
88

9+
use Magento\DataExporter\Model\Logging\CommerceDataExportLoggerInterface;
910
use Magento\Setup\Model\FixtureGenerator\SqlCollector;
1011

1112
/**
@@ -14,6 +15,16 @@
1415
*/
1516
class FilterChangeLogTable
1617
{
18+
private CommerceDataExportLoggerInterface $logger;
19+
20+
/**
21+
* @param CommerceDataExportLoggerInterface $logger
22+
*/
23+
public function __construct(
24+
CommerceDataExportLoggerInterface $logger
25+
) {
26+
$this->logger = $logger;
27+
}
1728
/**
1829
* Filter out changelog tables by pattern {*_cl}
1930
*
@@ -24,8 +35,16 @@ class FilterChangeLogTable
2435
*/
2536
public function afterGetSql(SqlCollector $subject, array $result): array
2637
{
27-
return array_filter($result, static function ($item) {
28-
return !str_ends_with($item[1], '_cl');
29-
});
38+
try {
39+
return array_filter($result, static function ($item) {
40+
return !str_ends_with($item[1], '_cl');
41+
});
42+
} catch (\Throwable $e) {
43+
$this->logger->error(
44+
'Data Exporter exception has occurred: ' . $e->getMessage(),
45+
['exception' => $e]
46+
);
47+
return $result;
48+
}
3049
}
3150
}

0 commit comments

Comments
 (0)