Skip to content

Commit

Permalink
Merge pull request #1174 from chr-hertel/migrationlist-subset
Browse files Browse the repository at this point in the history
implementing newSubset and unavailableSubset for migration lists
  • Loading branch information
greg0ire authored Jul 4, 2021
2 parents 53bc42c + eab02b0 commit 5586aab
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 10 deletions.
8 changes: 8 additions & 0 deletions lib/Doctrine/Migrations/Metadata/AvailableMigrationsList.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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());
}));
}
}
8 changes: 8 additions & 0 deletions lib/Doctrine/Migrations/Metadata/ExecutedMigrationsList.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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());
}));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -37,18 +33,14 @@ 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
{
$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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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')));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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')));
}
}

0 comments on commit 5586aab

Please sign in to comment.