10
10
use Magento \Framework \App \ResourceConnection ;
11
11
use Magento \Framework \Mview \View \CollectionFactory ;
12
12
use Magento \Framework \Mview \View \StateInterface ;
13
+ use Magento \Framework \Mview \View \Subscription ;
14
+ use Magento \Framework \DB \Ddl \Trigger ;
13
15
14
16
/**
15
17
* Class for removing old triggers that were created by mview
@@ -54,28 +56,47 @@ public function __construct(
54
56
*/
55
57
public function removeTriggers (): bool
56
58
{
59
+ //Get all existing triggers from the DB
60
+ $ triggers = $ this ->getAllTriggers ();
61
+ $ processedTriggers = [];
62
+
57
63
// Get list of views that are enabled
58
64
$ viewCollection = $ this ->viewCollectionFactory ->create ();
59
65
$ viewList = $ viewCollection ->getViewsByStateMode (StateInterface::MODE_ENABLED );
60
66
61
- // Unsubscribe existing view to remove triggers from db
67
+ // Check triggers declaration for the enabled views and update them if any changes
62
68
foreach ($ viewList as $ view ) {
63
- $ view ->unsubscribe ();
69
+ $ subscriptions = $ view ->getSubscriptions ();
70
+ foreach ($ subscriptions as $ subscriptionConfig ) {
71
+ /* @var $subscription Subscription */
72
+ $ subscription = $ view ->initSubscriptionInstance ($ subscriptionConfig );
73
+ $ 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
+ }
89
+ }
64
90
}
65
91
66
92
// Remove any remaining triggers from db that are not linked to a view
67
- $ triggerTableNames = $ this -> getTableNamesWithTriggers ( );
68
- foreach ($ triggerTableNames as $ tableName ) {
69
- $ view = $ this ->createViewByTableName ($ tableName );
93
+ $ remainingTriggers = array_diff_key ( $ triggers , $ processedTriggers );
94
+ foreach ($ remainingTriggers as $ trigger ) {
95
+ $ view = $ this ->createViewByTableName ($ trigger [ ' EVENT_OBJECT_TABLE ' ] );
70
96
$ view ->unsubscribe ();
71
97
$ view ->getState ()->delete ();
72
98
}
73
99
74
- // Restore the previous state of the views to add triggers back to db
75
- foreach ($ viewList as $ view ) {
76
- $ view ->subscribe ();
77
- }
78
-
79
100
return true ;
80
101
}
81
102
@@ -84,18 +105,17 @@ public function removeTriggers(): bool
84
105
*
85
106
* @return array
86
107
*/
87
- private function getTableNamesWithTriggers (): array
108
+ private function getAllTriggers (): array
88
109
{
89
110
$ connection = $ this ->resource ->getConnection ();
90
111
$ dbName = $ this ->resource ->getSchemaName (ResourceConnection::DEFAULT_CONNECTION );
91
112
$ sql = $ connection ->select ()
92
113
->from (
93
114
['information_schema.TRIGGERS ' ],
94
- ['EVENT_OBJECT_TABLE ' ]
115
+ ['TRIGGER_NAME ' , ' ACTION_STATEMENT ' , ' EVENT_OBJECT_TABLE ' ]
95
116
)
96
- ->distinct (true )
97
117
->where ('TRIGGER_SCHEMA = ? ' , $ dbName );
98
- return $ connection ->fetchCol ($ sql );
118
+ return $ connection ->fetchAssoc ($ sql );
99
119
}
100
120
101
121
/**
@@ -124,4 +144,26 @@ private function createViewByTableName(string $tableName): ViewInterface
124
144
125
145
return $ view ;
126
146
}
147
+
148
+ /**
149
+ * Get trigger statements for further analyze
150
+ *
151
+ * @param Trigger $trigger
152
+ * @return string[]
153
+ */
154
+ private function getStatementsFromViewTrigger (Trigger $ trigger ): array
155
+ {
156
+ $ statements = $ trigger ->getStatements ();
157
+
158
+ //Check for staged entity attribute subscription
159
+ $ statement = array_shift ($ statements );
160
+ if (str_contains ($ statement , 'SET ' )) {
161
+ $ splitStatements = explode (PHP_EOL , $ statement );
162
+ $ statements += $ splitStatements ;
163
+ } else {
164
+ array_unshift ($ statements , $ statement );
165
+ }
166
+
167
+ return $ statements ;
168
+ }
127
169
}
0 commit comments