Skip to content

Commit 15344eb

Browse files
author
Anna Bukatar
committed
ACP2E-963: setup:upgrade is changing indexer mode to save from schedule slowing it down immensely
1 parent d2a4054 commit 15344eb

File tree

4 files changed

+52
-54
lines changed

4 files changed

+52
-54
lines changed

lib/internal/Magento/Framework/Mview/Test/Unit/TriggerCleanerTest.php

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@
2121
use PHPUnit\Framework\MockObject\MockObject;
2222
use PHPUnit\Framework\TestCase;
2323

24-
/** test Mview TriggerCleaner functionality
24+
/**
25+
* test Mview TriggerCleaner functionality
26+
*
27+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2528
*/
2629
class TriggerCleanerTest extends TestCase
2730
{
@@ -138,29 +141,4 @@ private function getConnectionMock()
138141

139142
return $connectionMock;
140143
}
141-
142-
private function getViewListMock()
143-
{
144-
$triggerMock = $this->getMockForAbstractClass(Trigger::class);
145-
$triggerMock->expects($this->once())
146-
->method('getName')
147-
->willReturn('trg_catalog_category_entity_int_after_insert');
148-
$triggerMock->expects($this->once())->method('getStatements')->willReturn(['statement;']);
149-
150-
$subscriptionMock = $this->getMockForAbstractClass(SubscriptionInterface::class);
151-
$subscriptionMock->expects($this->once())->method('create')->willReturn($subscriptionMock);
152-
$subscriptionMock->expects($this->once())->method('getTriggers')->willReturn([$triggerMock]);
153-
154-
$viewMock = $this->getMockForAbstractClass(ViewInterface::class);
155-
$viewMock->expects($this->once())
156-
->method('getSubscriptions')
157-
->willReturn(['subscriptionConfig' => []]);
158-
$viewMock->expects($this->once())->method('initSubscriptionInstance')->willReturn($subscriptionMock);
159-
160-
$viewCollectionMock = $this->getMockForAbstractClass(CollectionInterface::class);
161-
$viewCollectionMock->expects($this->once())->method('getViewsByStateMode')->willReturn([$viewMock]);
162-
163-
$viewCollectionFactoryMock = $this->getMockForAbstractClass(CollectionFactory::class);
164-
$viewCollectionFactoryMock->expects($this->once())->method('create')->willReturn($viewCollectionMock);
165-
}
166144
}

lib/internal/Magento/Framework/Mview/TriggerCleaner.php

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ class TriggerCleaner
3333
*/
3434
private $viewFactory;
3535

36+
/**
37+
* @var array
38+
*/
39+
private $processedTriggers = [];
40+
41+
/**
42+
* @var array
43+
*/
44+
private $DbTriggers = [];
45+
3646
/**
3747
* @param CollectionFactory $viewCollectionFactory
3848
* @param ResourceConnection $resource
@@ -56,9 +66,7 @@ public function __construct(
5666
*/
5767
public function removeTriggers(): bool
5868
{
59-
//Get all existing triggers from the DB
60-
$triggers = $this->getAllTriggers();
61-
$processedTriggers = [];
69+
$this->getDbTriggers();
6270

6371
// Get list of views that are enabled
6472
$viewCollection = $this->viewCollectionFactory->create();
@@ -71,26 +79,12 @@ public function removeTriggers(): bool
7179
/* @var $subscription Subscription */
7280
$subscription = $view->initSubscriptionInstance($subscriptionConfig);
7381
$viewTriggers = $subscription->create(false)->getTriggers();
74-
foreach ($viewTriggers as $viewTrigger) {
75-
if (array_key_exists($viewTrigger->getName(), $triggers)) {
76-
foreach ($this->getStatementsFromViewTrigger($viewTrigger) as $statement) {
77-
if (!empty($statement) &&
78-
!str_contains($triggers[$viewTrigger->getName()]['ACTION_STATEMENT'],$statement)
79-
) {
80-
$subscription->saveTrigger($viewTrigger);
81-
break;
82-
}
83-
}
84-
} else {
85-
$subscription->saveTrigger($viewTrigger);
86-
}
87-
$processedTriggers[$viewTrigger->getName()] = true;
88-
}
82+
$this->processViewTriggers($viewTriggers, $subscription);
8983
}
9084
}
9185

9286
// Remove any remaining triggers from db that are not linked to a view
93-
$remainingTriggers = array_diff_key($triggers, $processedTriggers);
87+
$remainingTriggers = array_diff_key($this->DbTriggers, $this->processedTriggers);
9488
foreach ($remainingTriggers as $trigger) {
9589
$view = $this->createViewByTableName($trigger['EVENT_OBJECT_TABLE']);
9690
$view->unsubscribe();
@@ -100,12 +94,31 @@ public function removeTriggers(): bool
10094
return true;
10195
}
10296

97+
private function processViewTriggers(array $viewTriggers, Subscription $subscription): void
98+
{
99+
foreach ($viewTriggers as $viewTrigger) {
100+
if (array_key_exists($viewTrigger->getName(), $this->DbTriggers)) {
101+
foreach ($this->getStatementsFromViewTrigger($viewTrigger) as $statement) {
102+
if (!empty($statement) &&
103+
!str_contains($this->DbTriggers[$viewTrigger->getName()]['ACTION_STATEMENT'], $statement)
104+
) {
105+
$subscription->saveTrigger($viewTrigger);
106+
break;
107+
}
108+
}
109+
} else {
110+
$subscription->saveTrigger($viewTrigger);
111+
}
112+
$this->processedTriggers[$viewTrigger->getName()] = true;
113+
}
114+
}
115+
103116
/**
104-
* Retrieve list of table names that have triggers
117+
* Retrieve list of all triggers from DB
105118
*
106-
* @return array
119+
* @return void
107120
*/
108-
private function getAllTriggers(): array
121+
private function getDbTriggers(): void
109122
{
110123
$connection = $this->resource->getConnection();
111124
$dbName = $this->resource->getSchemaName(ResourceConnection::DEFAULT_CONNECTION);
@@ -115,7 +128,7 @@ private function getAllTriggers(): array
115128
['TRIGGER_NAME', 'ACTION_STATEMENT', 'EVENT_OBJECT_TABLE']
116129
)
117130
->where('TRIGGER_SCHEMA = ?', $dbName);
118-
return $connection->fetchAssoc($sql);
131+
$this->DbTriggers = $connection->fetchAssoc($sql);
119132
}
120133

121134
/**

lib/internal/Magento/Framework/Mview/View.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class View extends DataObject implements ViewInterface
2828
/**
2929
* Default batch size for partial reindex
3030
*/
31-
const DEFAULT_BATCH_SIZE = 1000;
31+
public const DEFAULT_BATCH_SIZE = 1000;
3232

3333
/**
3434
* @var string

lib/internal/Magento/Framework/Mview/View/Subscription.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Magento\Framework\DB\Adapter\AdapterInterface;
1212
use Magento\Framework\DB\Ddl\Trigger;
1313
use Magento\Framework\DB\Ddl\TriggerFactory;
14+
use Magento\Framework\Exception\ConfigurationMismatchException;
1415
use Magento\Framework\Mview\Config;
1516
use Magento\Framework\Mview\ViewInterface;
1617

@@ -71,6 +72,8 @@ class Subscription implements SubscriptionInterface
7172
/**
7273
* List of columns that can be updated in a specific subscribed table
7374
* for a specific view without creating a new change log entry
75+
*
76+
* @var array
7477
*/
7578
private $ignoredUpdateColumnsBySubscription = [];
7679

@@ -126,6 +129,7 @@ public function __construct(
126129
/**
127130
* Create subscription
128131
*
132+
* @param bool $save
129133
* @return SubscriptionInterface
130134
*/
131135
public function create(bool $save = true)
@@ -252,7 +256,8 @@ protected function prepareColumns(ViewInterface $view, string $event): array
252256
{
253257
$changelog = $view->getChangelog();
254258
$prefix = $event === Trigger::EVENT_DELETE ? 'OLD.' : 'NEW.';
255-
$subscriptionData = $this->mviewConfig->getView($changelog->getViewId())['subscriptions'][$this->getTableName()];
259+
$subscriptionData = $this->mviewConfig
260+
->getView($changelog->getViewId())['subscriptions'][$this->getTableName()];
256261
$columns = [
257262
'column_names' => [
258263
'entity_id' => $this->connection->quoteIdentifier($changelog->getColumnName())
@@ -332,7 +337,7 @@ protected function buildStatement(string $event, ViewInterface $view): string
332337
* Instantiate and retrieve additional columns processor
333338
*
334339
* @return AdditionalColumnProcessorInterface
335-
* @throws \Exception
340+
* @throws ConfigurationMismatchException
336341
*/
337342
private function getProcessor(): AdditionalColumnProcessorInterface
338343
{
@@ -341,15 +346,17 @@ private function getProcessor(): AdditionalColumnProcessorInterface
341346
$processor = ObjectManager::getInstance()->get($processorClass);
342347

343348
if (!$processor instanceof AdditionalColumnProcessorInterface) {
344-
throw new \Exception(
345-
'Processor should implements ' . AdditionalColumnProcessorInterface::class
349+
throw new ConfigurationMismatchException(
350+
'Processor should implement ' . AdditionalColumnProcessorInterface::class
346351
);
347352
}
348353

349354
return $processor;
350355
}
351356

352357
/**
358+
* Get subscription column for a view
359+
*
353360
* @param string $prefix
354361
* @param ViewInterface $view
355362
* @return string

0 commit comments

Comments
 (0)