Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
TableDiff.php
Go to the documentation of this file.
1 <?php
8 
15 
24 class TableDiff
25 {
29  const COLUMN_DIFF_TYPE = "columns";
30 
34  const CONSTRAINT_DIFF_TYPE = "constraints";
35 
39  const INDEX_DIFF_TYPE = "indexes";
40 
44  private $diffManager;
45 
51  public function __construct(DiffManager $diffManager)
52  {
53  $this->diffManager = $diffManager;
54  }
55 
64  private function excludeAutoIndexes(Table $table, array $indexes)
65  {
66  foreach ($table->getReferenceConstraints() as $constraint) {
67  unset($indexes[$constraint->getName()]);
68  }
69 
70  return $indexes;
71  }
72 
85  private function turnOffForeignKeys(Table $declaredTable, Table $generatedTable, Diff $diff)
86  {
87  $changes = $diff->getChange($generatedTable->getName(), ModifyColumn::OPERATION_NAME);
88 
89  foreach ($changes as $elementHistory) {
91  if ($elementHistory->getNew() instanceof Column) {
92  $column = $elementHistory->getNew();
93  $references = $generatedTable->getReferenceConstraints();
94  $declaredReferences = $this->getElementsListByNameWithoutPrefix(
95  $declaredTable->getReferenceConstraints()
96  );
97 
98  foreach ($references as $reference) {
100  if ($reference->getColumn()->getName() === $column->getName() &&
101  isset($declaredReferences[$reference->getNameWithoutPrefix()])
102  ) {
108  $diff = $this->diffManager->registerRemoval($diff, [$reference]);
109  $diff = $this->diffManager
110  ->registerCreation(
111  $diff,
112  $declaredReferences[$reference->getNameWithoutPrefix()]
113  );
114  }
115  }
116  }
117  }
118 
119  return $diff;
120  }
121 
128  private function getElementsListByNameWithoutPrefix(array $elements)
129  {
130  $elementsList = [];
131  foreach ($elements as $element) {
132  $elementsList[$element->getNameWithoutPrefix()] = $element;
133  }
134 
135  return $elementsList;
136  }
137 
146  public function diff(
147  ElementInterface $declaredTable,
148  ElementInterface $generatedTable,
149  Diff $diff
150  ) {
151  if ($declaredTable->getResource() !== $generatedTable->getResource()) {
152  $this->diffManager->registerRecreation($declaredTable, $generatedTable, $diff);
153  return $diff;
154  }
155 
156  if ($this->diffManager->shouldBeModified($declaredTable, $generatedTable)) {
157  $this->diffManager->registerTableModification($declaredTable, $generatedTable, $diff);
158  }
159 
160  return $this->calculateDiff($declaredTable, $generatedTable, $diff);
161  }
162 
171  private function calculateDiff(ElementInterface $declaredTable, ElementInterface $generatedTable, Diff $diff)
172  {
174  //We do inspection for each element type
175  foreach ($types as $elementType) {
176  $generatedElements = $generatedTable->getElementsByType($elementType);
177  $declaredElements = $declaredTable->getElementsByType($elementType);
178 
179  if ($elementType === self::INDEX_DIFF_TYPE) {
180  $generatedElements = $this->excludeAutoIndexes($generatedTable, $generatedElements);
181  $declaredElements = $this->excludeAutoIndexes($declaredTable, $declaredElements);
182  }
183 
184  if (in_array($elementType, [self::CONSTRAINT_DIFF_TYPE, self::INDEX_DIFF_TYPE], true)) {
185  $generatedElements = $this->getElementsListByNameWithoutPrefix($generatedElements);
186  $declaredElements = $this->getElementsListByNameWithoutPrefix($declaredElements);
187  }
188 
189  foreach ($declaredElements as $elementName => $element) {
190  //If it is new for generated (generated from db) elements - we need to create it
191  if (!isset($generatedElements[$elementName])) {
192  $diff = $this->diffManager->registerCreation($diff, $element);
193  } elseif ($this->diffManager->shouldBeModified(
194  $element,
195  $generatedElements[$elementName]
196  )) {
197  $diff = $this->diffManager
198  ->registerModification($diff, $element, $generatedElements[$elementName]);
199  }
200  //Unset processed elements from generated from db schema
201  //All other unprocessed elements will be added as removed ones
202  unset($generatedElements[$elementName]);
203  }
204 
205  //Elements that should be removed
206  if ($this->diffManager->shouldBeRemoved($generatedElements)) {
207  $diff = $this->diffManager->registerRemoval($diff, $generatedElements);
208  }
209  }
210 
211  $diff = $this->turnOffForeignKeys($declaredTable, $generatedTable, $diff);
212 
213  return $diff;
214  }
215 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
diff(ElementInterface $declaredTable, ElementInterface $generatedTable, Diff $diff)
Definition: TableDiff.php:146
$table
Definition: trigger.php:14
$elementName
Definition: gallery.phtml:10
$element
Definition: element.phtml:12