Skip to content

Commit c94e9de

Browse files
committed
Add indices to package version links to enforce the order of the links from the source material
1 parent e41c3af commit c94e9de

File tree

4 files changed

+80
-8
lines changed

4 files changed

+80
-8
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DoctrineMigrations;
6+
7+
use Doctrine\DBAL\Schema\Schema;
8+
use Doctrine\Migrations\AbstractMigration;
9+
10+
final class Version20260323085126 extends AbstractMigration
11+
{
12+
public function getDescription(): string
13+
{
14+
return '';
15+
}
16+
17+
public function up(Schema $schema): void
18+
{
19+
$this->addSql('ALTER TABLE version_conflict_link ADD index INT NOT NULL');
20+
$this->addSql('ALTER TABLE version_dev_require_link ADD index INT NOT NULL');
21+
$this->addSql('ALTER TABLE version_provide_link ADD index INT NOT NULL');
22+
$this->addSql('ALTER TABLE version_replace_link ADD index INT NOT NULL');
23+
$this->addSql('ALTER TABLE version_require_link ADD index INT NOT NULL');
24+
$this->addSql('ALTER TABLE version_suggest_link ADD index INT NOT NULL');
25+
}
26+
27+
public function down(Schema $schema): void
28+
{
29+
$this->addSql('ALTER TABLE version_conflict_link DROP index');
30+
$this->addSql('ALTER TABLE version_dev_require_link DROP index');
31+
$this->addSql('ALTER TABLE version_provide_link DROP index');
32+
$this->addSql('ALTER TABLE version_replace_link DROP index');
33+
$this->addSql('ALTER TABLE version_require_link DROP index');
34+
$this->addSql('ALTER TABLE version_suggest_link DROP index');
35+
}
36+
}

src/Doctrine/Entity/AbstractVersionLink.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ abstract class AbstractVersionLink
1515

1616
protected Version $version;
1717

18+
#[ORM\Column]
19+
private int $index;
20+
1821
#[ORM\Column(length: 191)]
1922
private string $linkedPackageName;
2023

@@ -26,6 +29,16 @@ public function getId(): ?int
2629
return $this->id;
2730
}
2831

32+
public function getIndex(): int
33+
{
34+
return $this->index;
35+
}
36+
37+
public function setIndex(int $index): void
38+
{
39+
$this->index = $index;
40+
}
41+
2942
public function getVersion(): Version
3043
{
3144
return $this->version;

src/Doctrine/Entity/Version.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,27 @@ class Version extends TrackedEntity implements \Stringable
5656
private ?array $dist = null;
5757

5858
#[ORM\OneToMany(mappedBy: 'version', targetEntity: VersionRequireLink::class, cascade: ['persist', 'detach', 'remove'])]
59+
#[ORM\OrderBy(['index' => 'ASC'])]
5960
private Collection $require;
6061

6162
#[ORM\OneToMany(mappedBy: 'version', targetEntity: VersionDevRequireLink::class, cascade: ['persist', 'detach', 'remove'])]
63+
#[ORM\OrderBy(['index' => 'ASC'])]
6264
private Collection $devRequire;
6365

6466
#[ORM\OneToMany(mappedBy: 'version', targetEntity: VersionConflictLink::class, cascade: ['persist', 'detach', 'remove'])]
67+
#[ORM\OrderBy(['index' => 'ASC'])]
6568
private Collection $conflict;
6669

6770
#[ORM\OneToMany(mappedBy: 'version', targetEntity: VersionProvideLink::class, cascade: ['persist', 'detach', 'remove'])]
71+
#[ORM\OrderBy(['index' => 'ASC'])]
6872
private Collection $provide;
6973

7074
#[ORM\OneToMany(mappedBy: 'version', targetEntity: VersionReplaceLink::class, cascade: ['persist', 'detach', 'remove'])]
75+
#[ORM\OrderBy(['index' => 'ASC'])]
7176
private Collection $replace;
7277

7378
#[ORM\OneToMany(mappedBy: 'version', targetEntity: VersionSuggestLink::class, cascade: ['persist', 'detach', 'remove'])]
79+
#[ORM\OrderBy(['index' => 'ASC'])]
7480
private Collection $suggest;
7581

7682
#[ORM\ManyToMany(targetEntity: Keyword::class, inversedBy: 'versions', cascade: ['persist', 'detach', 'remove'])]

src/Package/PackageMetadataResolver.php

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ private function updateVersion(Package $package, Version $version, CompletePacka
317317
// handle links
318318
foreach (self::SUPPORTED_LINK_TYPES as $linkType => $opts) {
319319
$links = [];
320+
$linkIndex = 0;
320321
foreach ($data->{$opts['method']}() as $link) {
321322
$constraint = $link->getPrettyConstraint();
322323
if (str_contains($constraint, ',') && str_contains($constraint, '@')) {
@@ -329,52 +330,68 @@ private function updateVersion(Package $package, Version $version, CompletePacka
329330
}, $constraint);
330331
}
331332

332-
$links[$link->getTarget()] = $constraint;
333+
$links[$link->getTarget()] = ['constraint' => $constraint, 'index' => $linkIndex++];
333334
}
334335

335336
/** @var AbstractVersionLink $link */
336337
foreach ($version->{'get' . $linkType}() as $link) {
337338
$linkPackageName = $link->getLinkedPackageName();
338339

339340
// Clear links that have changed/disappeared (for updates)
340-
if (!isset($links[$linkPackageName]) || $links[$linkPackageName] !== $link->getLinkedVersionConstraint()) {
341+
if (!isset($links[$linkPackageName]) || $links[$linkPackageName]['constraint'] !== $link->getLinkedVersionConstraint()) {
341342
$version->{'get' . $linkType}()->removeElement($link);
342343
$em->remove($link);
343344
} else {
345+
// Update index if it changed
346+
if ($link->getIndex() !== $links[$linkPackageName]['index']) {
347+
$link->setIndex($links[$linkPackageName]['index']);
348+
}
344349
// Clear those that are already set
345350
unset($links[$linkPackageName]);
346351
}
347352
}
348353

349-
foreach ($links as $linkPackageName => $linkPackageConstraint) {
354+
foreach ($links as $linkPackageName => $linkData) {
350355
/** @var AbstractVersionLink $link */
351356
$link = new $opts['entity']();
352357
$link->setLinkedPackageName($linkPackageName);
353-
$link->setLinkedVersionConstraint($linkPackageConstraint);
358+
$link->setLinkedVersionConstraint($linkData['constraint']);
359+
$link->setIndex($linkData['index']);
354360
$version->{'add' . $linkType . 'Link'}($link);
355361
$link->setVersion($version);
356362
$em->persist($link);
357363
}
358364
}
359365

360366
// handle suggests
361-
if ($suggests = $data->getSuggests()) {
367+
if ($suggestsData = $data->getSuggests()) {
368+
$suggests = [];
369+
$suggestIndex = 0;
370+
foreach ($suggestsData as $suggestPackageName => $suggestConstraint) {
371+
$suggests[$suggestPackageName] = ['constraint' => $suggestConstraint, 'index' => $suggestIndex++];
372+
}
373+
362374
foreach ($version->getSuggest() as $link) {
363375
$linkPackageName = $link->getLinkedPackageName();
364376
// clear links that have changed/disappeared (for updates)
365-
if (!isset($suggests[$linkPackageName]) || $suggests[$linkPackageName] !== $link->getLinkedVersionConstraint()) {
377+
if (!isset($suggests[$linkPackageName]) || $suggests[$linkPackageName]['constraint'] !== $link->getLinkedVersionConstraint()) {
366378
$version->getSuggest()->removeElement($link);
367379
$em->remove($link);
368380
} else {
381+
// Update index if it changed
382+
if ($link->getIndex() !== $suggests[$linkPackageName]['index']) {
383+
$link->setIndex($suggests[$linkPackageName]['index']);
384+
}
369385
// clear those that are already set
370386
unset($suggests[$linkPackageName]);
371387
}
372388
}
373389

374-
foreach ($suggests as $linkPackageName => $linkPackageConstraint) {
390+
foreach ($suggests as $linkPackageName => $linkData) {
375391
$link = new VersionSuggestLink();
376392
$link->setLinkedPackageName($linkPackageName);
377-
$link->setLinkedVersionConstraint($linkPackageConstraint);
393+
$link->setLinkedVersionConstraint($linkData['constraint']);
394+
$link->setIndex($linkData['index']);
378395
$version->addSuggestLink($link);
379396
$link->setVersion($version);
380397
$em->persist($link);

0 commit comments

Comments
 (0)