Elgg  Version master
20170728030000_denormalize_metastrings.php
Go to the documentation of this file.
1 <?php
2 
5 
6 class DenormalizeMetastrings extends AbstractMigration {
15  public function up() {
16 
17  if (!$this->hasTable('metastrings')) {
18  return;
19  }
20 
21  $tables = [
22  'metadata',
23  'annotations',
24  ];
25 
26  foreach ($tables as $table) {
27  if (!$this->hasTable($table)) {
28  continue;
29  }
30 
31  $table = $this->table($table);
32 
33  if (!$table->hasColumn('value')) {
34  $table->addColumn('value', 'text', [
35  'null' => false,
36  'after' => 'entity_guid',
37  'limit' => MysqlAdapter::TEXT_LONG,
38  ]);
39  }
40 
41  if (!$table->hasColumn('name')) {
42  $table->addColumn('name', 'text', [
43  'null' => false,
44  'after' => 'entity_guid',
45  ]);
46  }
47 
48  $table->save();
49 
50  if ($table->hasColumn('name_id') && $table->hasColumn('value_id')) {
51  $prefix = $this->getAdapter()->getOption('table_prefix');
52 
53  // remove indexes
54  if ($table->hasIndexByName('name_id')) {
55  $table->removeIndexByName('name_id')->save();
56  }
57 
58  if ($table->hasIndexByName('value_id')) {
59  $table->removeIndexByName('value_id')->save();
60  }
61 
62  // move in all metastrings
63  $this->query("
64  UPDATE {$prefix}{$table->getName()} n_table
65  INNER JOIN {$prefix}metastrings msn ON n_table.name_id = msn.id
66  INNER JOIN {$prefix}metastrings msv ON n_table.value_id = msv.id
67  SET n_table.name = msn.string,
68  n_table.value = msv.string
69  ");
70 
71  // drop columns
72  $table->removeColumn('name_id');
73  $table->removeColumn('value_id');
74  }
75 
76  // add new indexes
77  if (!$table->hasIndexByName('name')) {
78  $table->addIndex(['name'], [
79  'name' => "name",
80  'unique' => false,
81  'limit' => 50,
82  ]);
83  }
84 
85  if (!$table->hasIndexByName('value')) {
86  $table->addIndex(['value'], [
87  'name' => "value",
88  'unique' => false,
89  'limit' => 50,
90  ]);
91  }
92 
93  $table->save();
94  }
95 
96  $this->table('metastrings')->drop()->save();
97  }
98 
109  public function down() {
110 
111  if ($this->hasTable('metastrtings')) {
112  return;
113  }
114 
115  $table = $this->table('metastrings', [
116  'engine' => 'MyISAM',
117  'encoding' => "utf8",
118  'collation' => "utf8_general_ci",
119  ]);
120 
121  $table->addColumn('string', 'text', [
122  'null' => false,
123  ]);
124 
125  $table->addIndex(['string'], [
126  'name' => 'string',
127  'limit' => 50,
128  ]);
129 
130  $table->save();
131 
132  $prefix = $this->getAdapter()->getOption('table_prefix');
133 
134  foreach ([
135  'metadata',
136  'annotations'
137  ] as $table) {
138  $table = $this->table($table);
139 
140  if (!$table->hasColumn('name_id')) {
141  $table->addColumn('name_id', 'integer', [
142  'null' => false,
143  'limit' => \Phinx\Db\Adapter\MysqlAdapter::INT_REGULAR,
144  'precision' => 11,
145  ]);
146  }
147 
148  if (!$table->hasColumn('value_id')) {
149  $table->addColumn('value_id', 'integer', [
150  'null' => false,
151  'limit' => \Phinx\Db\Adapter\MysqlAdapter::INT_REGULAR,
152  'precision' => 11,
153  ]);
154  }
155 
156  if (!$table->hasIndexByName('name_id')) {
157  $table->addIndex(['name_id'], [
158  'name' => 'name_id',
159  ]);
160  }
161 
162  if (!$table->hasIndexByName('value_id')) {
163  $table->addIndex(['value_id'], [
164  'name' => 'value_id',
165  ]);
166  }
167 
168  $table->save();
169 
170  $rows = $this->fetchAll("
171  SELECT name, value
172  FROM {$prefix}{$table->getName()}
173  ");
174 
175  foreach ($rows as $row) {
176  $this->table('metastrings')->insert([
177  ['string' => $row['name']],
178  ['string' => $row['value']],
179  ])->saveData();
180  }
181 
182  // move in all metastrings
183  $this->query("
184  UPDATE {$prefix}{$table->getName()} n_table
185  INNER JOIN {$prefix}metastrings msn ON n_table.name = msn.string
186  INNER JOIN {$prefix}metastrings msv ON n_table.value = msv.string
187  SET n_table.name_id = msn.id,
188  n_table.value_id = msv.id
189  ");
190 
191  if ($table->hasIndexByName('name')) {
192  $table->removeIndexByName('name')->save();
193  }
194 
195  if ($table->hasIndexByName('value')) {
196  $table->removeIndexByName('value')->save();
197  }
198 
199  if ($table->hasColumn('name')) {
200  $table->removeColumn('name');
201  }
202 
203  if ($table->hasColumn('value')) {
204  $table->removeColumn('value');
205  }
206  }
207  }
208 
209 
210 }
$rows
Definition: redis.php:25
$table
Definition: user.php:37
$tables
Definition: database.php:6