8
8
9
9
use Magento \Framework \Setup \Declaration \Schema \Db \MySQL \DDL \Triggers \MigrateDataBetweenShards ;
10
10
use Magento \Framework \Setup \Declaration \Schema \Db \Statement ;
11
+ use Magento \Framework \Setup \Declaration \Schema \Dto \ElementFactory ;
11
12
use Magento \Framework \Setup \Declaration \Schema \Dto \Table ;
12
13
use Magento \Framework \Setup \Declaration \Schema \ElementHistory ;
14
+ use Magento \Framework \Setup \Declaration \Schema \ElementHistoryFactory ;
13
15
use Magento \Framework \Setup \Declaration \Schema \OperationInterface ;
14
16
15
17
/**
@@ -38,21 +40,37 @@ class ReCreateTable implements OperationInterface
38
40
*/
39
41
private $ migrateDataBetweenShards ;
40
42
43
+ /**
44
+ * @var ElementHistoryFactory
45
+ */
46
+ private $ elementHistoryFactory ;
47
+
48
+ /**
49
+ * @var ElementFactory
50
+ */
51
+ private $ elementFactory ;
52
+
41
53
/**
42
54
* Constructor.
43
55
*
44
56
* @param CreateTable $createTable
45
57
* @param DropTable $dropTable
46
58
* @param MigrateDataBetweenShards $migrateDataBetweenShards
59
+ * @param ElementHistoryFactory $elementHistoryFactory
60
+ * @param ElementFactory $elementFactory
47
61
*/
48
62
public function __construct (
49
63
CreateTable $ createTable ,
50
64
DropTable $ dropTable ,
51
- MigrateDataBetweenShards $ migrateDataBetweenShards
65
+ MigrateDataBetweenShards $ migrateDataBetweenShards ,
66
+ ElementHistoryFactory $ elementHistoryFactory ,
67
+ ElementFactory $ elementFactory
52
68
) {
53
69
$ this ->createTable = $ createTable ;
54
70
$ this ->dropTable = $ dropTable ;
55
71
$ this ->migrateDataBetweenShards = $ migrateDataBetweenShards ;
72
+ $ this ->elementHistoryFactory = $ elementHistoryFactory ;
73
+ $ this ->elementFactory = $ elementFactory ;
56
74
}
57
75
58
76
/**
@@ -71,21 +89,62 @@ public function getOperationName()
71
89
return self ::OPERATION_NAME ;
72
90
}
73
91
92
+ /**
93
+ * Merge 2 tables: take old data from new table, columns and indexes from old tables:
94
+ * we need to take in account, that 3-rd party extensions can add columns and indexes and also
95
+ * internal constraints in old way: with UpgradeSchema/InstallSchema scripts
96
+ *
97
+ * @param ElementHistory $elementHistory
98
+ * @return Table
99
+ */
100
+ private function getRecreatedTable (ElementHistory $ elementHistory ) : Table
101
+ {
102
+ /** @var Table $newTable */
103
+ $ newTable = $ elementHistory ->getNew ();
104
+ /** @var Table $oldTable */
105
+ $ oldTable = $ elementHistory ->getOld ();
106
+ /** @var Table $recreationTable */
107
+ $ recreationTable = $ this ->elementFactory ->create (
108
+ 'table ' ,
109
+ [
110
+ 'name ' => $ newTable ->getName (),
111
+ 'type ' => 'table ' ,
112
+ 'nameWithoutPrefix ' => $ newTable ->getNameWithoutPrefix (),
113
+ 'resource ' => $ newTable ->getResource (),
114
+ 'engine ' => $ newTable ->getEngine (),
115
+ 'charset ' => $ newTable ->getCharset (),
116
+ 'collation ' => $ newTable ->getCollation (),
117
+ 'onCreate ' => $ newTable ->getOnCreate (),
118
+ 'comment ' => $ newTable ->getOnCreate (),
119
+ 'columns ' => $ oldTable ->getColumns (),
120
+ 'indexes ' => $ oldTable ->getIndexes (),
121
+ 'constraints ' => array_merge ($ oldTable ->getInternalConstraints (), $ newTable ->getReferenceConstraints ())
122
+ ]
123
+ );
124
+
125
+ return $ recreationTable ;
126
+ }
127
+
74
128
/**
75
129
* {@inheritdoc}
76
130
*/
77
131
public function doOperation (ElementHistory $ elementHistory )
78
132
{
79
- /** @var Table $table */
80
- $ table = $ elementHistory ->getNew ();
81
- $ statements = $ this ->createTable ->doOperation ($ elementHistory );
133
+ $ recreatedTable = $ this ->getRecreatedTable ($ elementHistory );
134
+ $ recreatedElementHistory = $ this ->elementHistoryFactory ->create (
135
+ [
136
+ 'old ' => $ elementHistory ->getOld (),
137
+ 'new ' => $ recreatedTable
138
+ ]
139
+ );
140
+ $ statements = $ this ->createTable ->doOperation ($ recreatedElementHistory );
82
141
/** @var Statement $statement */
83
142
foreach ($ statements as $ statement ) {
84
- if ($ this ->migrateDataBetweenShards ->isApplicable ((string ) $ table ->getOnCreate ())) {
85
- $ statement ->addTrigger ($ this ->migrateDataBetweenShards ->getCallback ($ elementHistory ));
143
+ if ($ this ->migrateDataBetweenShards ->isApplicable ((string ) $ recreatedTable ->getOnCreate ())) {
144
+ $ statement ->addTrigger ($ this ->migrateDataBetweenShards ->getCallback ($ recreatedElementHistory ));
86
145
}
87
146
}
88
147
89
- return array_merge ($ statements , $ this ->dropTable ->doOperation ($ elementHistory ));
148
+ return array_merge ($ statements , $ this ->dropTable ->doOperation ($ recreatedElementHistory ));
90
149
}
91
150
}
0 commit comments