From eab02b07c2da9ce49592bfa260dcf370c3db1fae Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sat, 3 Jul 2021 13:24:05 +0200 Subject: [PATCH] implementing newSubset and unavailableSubset for migration lists --- .../Metadata/AvailableMigrationsList.php | 8 +++++++ .../Metadata/ExecutedMigrationsList.php | 8 +++++++ .../CurrentMigrationStatusCalculator.php | 12 ++--------- .../Metadata/AvailableMigrationListTest.php | 19 +++++++++++++++++ .../Metadata/ExecutedMigrationSetTest.php | 21 +++++++++++++++++++ 5 files changed, 58 insertions(+), 10 deletions(-) diff --git a/lib/Doctrine/Migrations/Metadata/AvailableMigrationsList.php b/lib/Doctrine/Migrations/Metadata/AvailableMigrationsList.php index 7d8423746b..ec8d271e5c 100644 --- a/lib/Doctrine/Migrations/Metadata/AvailableMigrationsList.php +++ b/lib/Doctrine/Migrations/Metadata/AvailableMigrationsList.php @@ -9,6 +9,7 @@ use Doctrine\Migrations\Exception\NoMigrationsFoundWithCriteria; use Doctrine\Migrations\Version\Version; +use function array_filter; use function array_values; use function count; @@ -81,4 +82,11 @@ public function getMigration(Version $version): AvailableMigration throw MigrationNotAvailable::forVersion($version); } + + public function newSubset(ExecutedMigrationsList $executedMigrations): self + { + return new self(array_filter($this->getItems(), static function (AvailableMigration $migration) use ($executedMigrations): bool { + return ! $executedMigrations->hasMigration($migration->getVersion()); + })); + } } diff --git a/lib/Doctrine/Migrations/Metadata/ExecutedMigrationsList.php b/lib/Doctrine/Migrations/Metadata/ExecutedMigrationsList.php index 23dea6128e..97e7ee620a 100644 --- a/lib/Doctrine/Migrations/Metadata/ExecutedMigrationsList.php +++ b/lib/Doctrine/Migrations/Metadata/ExecutedMigrationsList.php @@ -9,6 +9,7 @@ use Doctrine\Migrations\Exception\NoMigrationsFoundWithCriteria; use Doctrine\Migrations\Version\Version; +use function array_filter; use function array_values; use function count; @@ -82,4 +83,11 @@ public function getMigration(Version $version): ExecutedMigration throw MigrationNotExecuted::new((string) $version); } + + public function unavailableSubset(AvailableMigrationsList $availableMigrations): self + { + return new self(array_filter($this->getItems(), static function (ExecutedMigration $migration) use ($availableMigrations): bool { + return ! $availableMigrations->hasMigration($migration->getVersion()); + })); + } } diff --git a/lib/Doctrine/Migrations/Version/CurrentMigrationStatusCalculator.php b/lib/Doctrine/Migrations/Version/CurrentMigrationStatusCalculator.php index c4913c89e7..7a575d71fd 100644 --- a/lib/Doctrine/Migrations/Version/CurrentMigrationStatusCalculator.php +++ b/lib/Doctrine/Migrations/Version/CurrentMigrationStatusCalculator.php @@ -4,14 +4,10 @@ namespace Doctrine\Migrations\Version; -use Doctrine\Migrations\Metadata\AvailableMigration; use Doctrine\Migrations\Metadata\AvailableMigrationsList; -use Doctrine\Migrations\Metadata\ExecutedMigration; use Doctrine\Migrations\Metadata\ExecutedMigrationsList; use Doctrine\Migrations\Metadata\Storage\MetadataStorage; -use function array_filter; - /** * The MigrationPlanCalculator is responsible for calculating the plan for migrating from the current * version to another version. @@ -37,9 +33,7 @@ public function getExecutedUnavailableMigrations(): ExecutedMigrationsList $executedMigrations = $this->metadataStorage->getExecutedMigrations(); $availableMigration = $this->migrationPlanCalculator->getMigrations(); - return new ExecutedMigrationsList(array_filter($executedMigrations->getItems(), static function (ExecutedMigration $migrationInfo) use ($availableMigration): bool { - return ! $availableMigration->hasMigration($migrationInfo->getVersion()); - })); + return $executedMigrations->unavailableSubset($availableMigration); } public function getNewMigrations(): AvailableMigrationsList @@ -47,8 +41,6 @@ public function getNewMigrations(): AvailableMigrationsList $executedMigrations = $this->metadataStorage->getExecutedMigrations(); $availableMigration = $this->migrationPlanCalculator->getMigrations(); - return new AvailableMigrationsList(array_filter($availableMigration->getItems(), static function (AvailableMigration $migrationInfo) use ($executedMigrations): bool { - return ! $executedMigrations->hasMigration($migrationInfo->getVersion()); - })); + return $availableMigration->newSubset($executedMigrations); } } diff --git a/tests/Doctrine/Migrations/Tests/Metadata/AvailableMigrationListTest.php b/tests/Doctrine/Migrations/Tests/Metadata/AvailableMigrationListTest.php index d5bde8189d..3695d3a313 100644 --- a/tests/Doctrine/Migrations/Tests/Metadata/AvailableMigrationListTest.php +++ b/tests/Doctrine/Migrations/Tests/Metadata/AvailableMigrationListTest.php @@ -9,6 +9,8 @@ use Doctrine\Migrations\Exception\NoMigrationsFoundWithCriteria; use Doctrine\Migrations\Metadata\AvailableMigration; use Doctrine\Migrations\Metadata\AvailableMigrationsList; +use Doctrine\Migrations\Metadata\ExecutedMigration; +use Doctrine\Migrations\Metadata\ExecutedMigrationsList; use Doctrine\Migrations\Version\Version; use PHPUnit\Framework\TestCase; @@ -119,4 +121,21 @@ public function testAvailableMigration(): void self::assertEquals(new Version('A'), $m1->getVersion()); self::assertSame($this->abstractMigration, $m1->getMigration()); } + + public function testNewSubset(): void + { + $m1 = new AvailableMigration(new Version('A'), $this->abstractMigration); + $m2 = new AvailableMigration(new Version('B'), $this->abstractMigration); + $m3 = new AvailableMigration(new Version('C'), $this->abstractMigration); + $availableSet = new AvailableMigrationsList([$m1, $m2, $m3]); + + $executedSet = new ExecutedMigrationsList([ + new ExecutedMigration(new Version('A')), + new ExecutedMigration(new Version('B')), + ]); + + $newSubset = $availableSet->newSubset($executedSet); + self::assertCount(1, $newSubset); + self::assertTrue($newSubset->hasMigration(new Version('C'))); + } } diff --git a/tests/Doctrine/Migrations/Tests/Metadata/ExecutedMigrationSetTest.php b/tests/Doctrine/Migrations/Tests/Metadata/ExecutedMigrationSetTest.php index 73a067e295..fc46c0e40e 100644 --- a/tests/Doctrine/Migrations/Tests/Metadata/ExecutedMigrationSetTest.php +++ b/tests/Doctrine/Migrations/Tests/Metadata/ExecutedMigrationSetTest.php @@ -5,8 +5,11 @@ namespace Doctrine\Migrations\Tests\Metadata; use DateTimeImmutable; +use Doctrine\Migrations\AbstractMigration; use Doctrine\Migrations\Exception\MigrationNotExecuted; use Doctrine\Migrations\Exception\NoMigrationsFoundWithCriteria; +use Doctrine\Migrations\Metadata\AvailableMigration; +use Doctrine\Migrations\Metadata\AvailableMigrationsList; use Doctrine\Migrations\Metadata\ExecutedMigration; use Doctrine\Migrations\Metadata\ExecutedMigrationsList; use Doctrine\Migrations\Version\Version; @@ -121,4 +124,22 @@ public function testExecutedMigrationWithTiming(): void self::assertSame($date, $m1->getExecutedAt()); self::assertSame(123.0, $m1->getExecutionTime()); } + + public function testUnavailableSubset(): void + { + $m1 = new ExecutedMigration(new Version('A')); + $m2 = new ExecutedMigration(new Version('B')); + $m3 = new ExecutedMigration(new Version('C')); + $executedSet = new ExecutedMigrationsList([$m1, $m2, $m3]); + + $abstractMigration = $this->createMock(AbstractMigration::class); + $availableSet = new AvailableMigrationsList([ + new AvailableMigration(new Version('A'), $abstractMigration), + new AvailableMigration(new Version('C'), $abstractMigration), + ]); + + $unavailableSubset = $executedSet->unavailableSubset($availableSet); + self::assertCount(1, $unavailableSubset); + self::assertTrue($unavailableSubset->hasMigration(new Version('B'))); + } }