Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
91.67% |
11 / 12 |
CRAP | |
97.01% |
65 / 67 |
| IndexListMigrator | |
0.00% |
0 / 1 |
|
91.67% |
11 / 12 |
31 | |
97.01% |
65 / 67 |
| __construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
6 / 6 |
|||
| createAlterStatementList | |
100.00% |
1 / 1 |
5 | |
100.00% |
11 / 11 |
|||
| createAlterStatement | |
100.00% |
1 / 1 |
3 | |
100.00% |
8 / 8 |
|||
| compareIndex | |
0.00% |
0 / 1 |
5.07 | |
85.71% |
12 / 14 |
|||
| needsRecreationOfIndex | |
100.00% |
1 / 1 |
6 | |
100.00% |
9 / 9 |
|||
| getIndexPartByColumnName | |
100.00% |
1 / 1 |
3 | |
100.00% |
4 / 4 |
|||
| recreateIndex | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| createDropIndex | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| createAddIndex | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| getAddIndexStatementList | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getDropIndexStatementList | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getIndexMetaDataByIndex | |
100.00% |
1 / 1 |
3 | |
100.00% |
4 / 4 |
|||
| <?php | |
| declare(strict_types = 1); | |
| namespace Siesta\Migration; | |
| use Siesta\Database\MetaData\IndexMetaData; | |
| use Siesta\Database\MetaData\IndexPartMetaData; | |
| use Siesta\Database\MigrationStatementFactory; | |
| use Siesta\Model\Index; | |
| use Siesta\Model\IndexPart; | |
| /** | |
| * @author Gregor Müller | |
| */ | |
| class IndexListMigrator | |
| { | |
| /** | |
| * @var MigrationStatementFactory | |
| */ | |
| protected $migrationStatementFactory; | |
| /** | |
| * @var IndexMetaData[] | |
| */ | |
| protected $indexMetaDataList; | |
| /** | |
| * @var Index[] | |
| */ | |
| protected $indexList; | |
| /** | |
| * @var string[] | |
| */ | |
| protected $addIndexStatementList; | |
| /** | |
| * @var string[] | |
| */ | |
| protected $dropIndexStatementList; | |
| /** | |
| * IndexListMigrator constructor. | |
| * | |
| * @param MigrationStatementFactory $migrationStatementFactory | |
| * @param IndexMetaData[] $indexMetaDataList | |
| * @param Index[] $indexList | |
| */ | |
| public function __construct(MigrationStatementFactory $migrationStatementFactory, array $indexMetaDataList, array $indexList) | |
| { | |
| $this->migrationStatementFactory = $migrationStatementFactory; | |
| $this->indexMetaDataList = $indexMetaDataList; | |
| $this->indexList = $indexList; | |
| $this->addIndexStatementList = []; | |
| $this->dropIndexStatementList = []; | |
| } | |
| /** | |
| * compares both attribute list and request the needed alter statements | |
| * @return void | |
| */ | |
| public function createAlterStatementList() | |
| { | |
| $processedIndexList = []; | |
| foreach ($this->indexList as $index) { | |
| $indexMetaData = $this->getIndexMetaDataByIndex($index); | |
| $this->createAlterStatement($indexMetaData, $index); | |
| if ($indexMetaData) { | |
| $processedIndexList[] = $indexMetaData->getName(); | |
| } | |
| } | |
| foreach ($this->indexMetaDataList as $indexMetaData) { | |
| if (in_array($indexMetaData->getName(), $processedIndexList)) { | |
| continue; | |
| } | |
| $this->createAlterStatement($indexMetaData, null); | |
| } | |
| } | |
| /** | |
| * @param IndexMetaData|null $indexMetaData | |
| * @param Index|null $index | |
| */ | |
| private function createAlterStatement(IndexMetaData $indexMetaData = null, Index $index = null) | |
| { | |
| // nothing in db create the index | |
| if ($indexMetaData === null) { | |
| $this->createAddIndex($index); | |
| return; | |
| } | |
| // nothing in model, drop the index | |
| if ($index === null) { | |
| $this->createDropIndex($indexMetaData); | |
| return; | |
| } | |
| $this->compareIndex($indexMetaData, $index); | |
| } | |
| /** | |
| * @param IndexMetaData $indexMetaData | |
| * @param Index $index | |
| */ | |
| private function compareIndex(IndexMetaData $indexMetaData, Index $index) | |
| { | |
| if (strtoupper($indexMetaData->getType()) !== strtoupper($index->getIndexType())) { | |
| $this->recreateIndex($indexMetaData, $index); | |
| return; | |
| } | |
| if ($indexMetaData->getIsUnique() !== $index->getIsUnique()) { | |
| $this->recreateIndex($indexMetaData, $index); | |
| return; | |
| } | |
| $databasePartList = $indexMetaData->getIndexPartList(); | |
| $modelPartList = $index->getIndexPartList(); | |
| if (sizeof($databasePartList) !== sizeof($modelPartList)) { | |
| $this->recreateIndex($indexMetaData, $index); | |
| return; | |
| } | |
| if ($this->needsRecreationOfIndex($databasePartList, $modelPartList)) { | |
| $this->recreateIndex($indexMetaData, $index); | |
| } | |
| } | |
| /** | |
| * @param IndexPartMetaData[] $databaseIndexPart | |
| * @param IndexPart[] $modelIndexPartList | |
| * | |
| * @return bool | |
| */ | |
| private function needsRecreationOfIndex($databaseIndexPart, $modelIndexPartList) | |
| { | |
| foreach ($modelIndexPartList as $modelIndexPart) { | |
| $databaseIndex = $this->getIndexPartByColumnName($databaseIndexPart, $modelIndexPart->getColumnName()); | |
| if ($databaseIndex === null) { | |
| return true; | |
| } | |
| $dbLength = $databaseIndex->getLength() ? $databaseIndex->getLength() : null; | |
| $modelLength = $modelIndexPart->getLength() ? $modelIndexPart->getLength() : null; | |
| if ($dbLength !== $modelLength) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| /** | |
| * @param IndexPartMetaData[] $databaseIndexPartList | |
| * @param string $columnName | |
| * | |
| * @return IndexPartMetaData|null | |
| */ | |
| private function getIndexPartByColumnName(array $databaseIndexPartList, string $columnName) | |
| { | |
| foreach ($databaseIndexPartList as $databaseIndexPart) { | |
| if ($databaseIndexPart->getColumnName() === $columnName) { | |
| return $databaseIndexPart; | |
| } | |
| } | |
| return null; | |
| } | |
| /** | |
| * @param IndexMetaData $indexMetaData | |
| * @param Index $index | |
| */ | |
| private function recreateIndex(IndexMetaData $indexMetaData, Index $index) | |
| { | |
| $this->createDropIndex($indexMetaData); | |
| $this->createAddIndex($index); | |
| } | |
| /** | |
| * @param IndexMetaData $indexMetaData | |
| */ | |
| private function createDropIndex(IndexMetaData $indexMetaData) | |
| { | |
| $dropList = $this->migrationStatementFactory->createDropIndexStatement($indexMetaData); | |
| $this->dropIndexStatementList = array_merge($this->dropIndexStatementList, $dropList); | |
| } | |
| /** | |
| * @param Index $index | |
| */ | |
| private function createAddIndex(Index $index) | |
| { | |
| $addList = $this->migrationStatementFactory->createAddIndexStatement($index); | |
| $this->addIndexStatementList = array_merge($this->addIndexStatementList, $addList); | |
| } | |
| /** | |
| * @return string[] | |
| */ | |
| public function getAddIndexStatementList() | |
| { | |
| return $this->addIndexStatementList; | |
| } | |
| /** | |
| * @return string[] | |
| */ | |
| public function getDropIndexStatementList() | |
| { | |
| return $this->dropIndexStatementList; | |
| } | |
| /** | |
| * @param Index $index | |
| * | |
| * @return null|IndexMetaData | |
| */ | |
| private function getIndexMetaDataByIndex(Index $index) | |
| { | |
| foreach ($this->indexMetaDataList as $indexMetaData) { | |
| if ($indexMetaData->getName() === $index->getName()) { | |
| return $indexMetaData; | |
| } | |
| } | |
| return null; | |
| } | |
| } |