Skip to content

Commit 422fc9b

Browse files
committed
Refactor metadata link entities with type enum and index properties
Signed-off-by: Tim Goudriaan <tim@codedmonkey.com>
1 parent 4ce1688 commit 422fc9b

13 files changed

+191
-131
lines changed

migrations/Version20260120114538.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ private function createMetadataTables(): void
9494
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
9595
linked_package_name VARCHAR(191) NOT NULL,
9696
linked_version_constraint TEXT NOT NULL,
97+
index INT NOT NULL,
9798
metadata_id INT NOT NULL,
9899
PRIMARY KEY (id)
99100
)
@@ -106,6 +107,7 @@ private function createMetadataTables(): void
106107
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
107108
linked_package_name VARCHAR(191) NOT NULL,
108109
linked_version_constraint TEXT NOT NULL,
110+
index INT NOT NULL,
109111
metadata_id INT NOT NULL,
110112
PRIMARY KEY (id)
111113
)
@@ -118,6 +120,7 @@ private function createMetadataTables(): void
118120
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
119121
linked_package_name VARCHAR(191) NOT NULL,
120122
linked_version_constraint TEXT NOT NULL,
123+
index INT NOT NULL,
121124
metadata_id INT NOT NULL,
122125
PRIMARY KEY (id)
123126
)
@@ -130,6 +133,7 @@ private function createMetadataTables(): void
130133
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
131134
linked_package_name VARCHAR(191) NOT NULL,
132135
linked_version_constraint TEXT NOT NULL,
136+
index INT NOT NULL,
133137
metadata_id INT NOT NULL,
134138
PRIMARY KEY (id)
135139
)
@@ -142,6 +146,7 @@ private function createMetadataTables(): void
142146
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
143147
linked_package_name VARCHAR(191) NOT NULL,
144148
linked_version_constraint TEXT NOT NULL,
149+
index INT NOT NULL,
145150
metadata_id INT NOT NULL,
146151
PRIMARY KEY (id)
147152
)
@@ -154,6 +159,7 @@ private function createMetadataTables(): void
154159
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
155160
linked_package_name VARCHAR(191) NOT NULL,
156161
linked_version_constraint TEXT NOT NULL,
162+
index INT NOT NULL,
157163
metadata_id INT NOT NULL,
158164
PRIMARY KEY (id)
159165
)
@@ -292,8 +298,12 @@ private function fillMetadataTables(): void
292298

293299
foreach ($linkTables as $linkTable) {
294300
$this->addSql(<<<SQL
295-
INSERT INTO metadata_{$linkTable}_link (metadata_id, linked_package_name, linked_version_constraint)
296-
SELECT metadata.id, link.linked_package_name, link.linked_version_constraint
301+
INSERT INTO metadata_{$linkTable}_link (metadata_id, linked_package_name, linked_version_constraint, index)
302+
SELECT
303+
metadata.id,
304+
link.linked_package_name,
305+
link.linked_version_constraint,
306+
ROW_NUMBER() OVER (PARTITION BY metadata.id) - 1
297307
FROM version_{$linkTable}_link link
298308
INNER JOIN metadata metadata ON link.version_id = metadata.version_id
299309
SQL);
@@ -757,6 +767,7 @@ private function fillVersionTables(): void
757767
WHERE version_link.version_id = metadata.version_id
758768
AND version_link.linked_package_name = metadata_link.linked_package_name
759769
)
770+
ORDER BY metadata_link.index
760771
SQL);
761772
}
762773
}

phpstan.dist.neon

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ parameters:
1111
- tests/bootstrap.php
1212
ignoreErrors:
1313
- '#^Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition\:\:children\(\)\.$#'
14-
- '#CodedMonkey\\Dirigent\\Doctrine\\Entity\\AbstractMetadataLink given\.#'
15-
- '#^PHPDoc tag @var with type CodedMonkey\\Dirigent\\Doctrine\\Entity\\AbstractMetadataLink is not subtype of native type#'
1614
- '#^Property CodedMonkey\\Dirigent\\Doctrine\\Entity\\[a-zA-Z]+\:\:\$id \(int\|null\) is never assigned int so it can be removed from the property type\.$#'
1715
-
1816
message: '#^Class CodedMonkey\\Dirigent\\Doctrine\\Entity\\TrackedEntity has an uninitialized readonly property \$createdAt\. Assign it in the constructor\.$#'

src/Doctrine/Entity/AbstractMetadataLink.php

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace CodedMonkey\Dirigent\Doctrine\Entity;
44

5+
use CodedMonkey\Dirigent\Entity\MetadataLinkType;
56
use Doctrine\DBAL\Types\Types;
67
use Doctrine\ORM\Mapping as ORM;
78

@@ -21,9 +22,21 @@ abstract class AbstractMetadataLink
2122
#[ORM\Column(type: Types::TEXT)]
2223
private string $linkedVersionConstraint;
2324

24-
public function __construct(Metadata $metadata)
25-
{
25+
#[ORM\Column]
26+
private int $index;
27+
28+
public function __construct(
29+
Metadata $metadata,
30+
string $linkedPackageName,
31+
string $linkedVersionConstraint,
32+
int $index,
33+
) {
2634
$this->metadata = $metadata;
35+
$this->linkedPackageName = $linkedPackageName;
36+
$this->linkedVersionConstraint = $linkedVersionConstraint;
37+
$this->index = $index;
38+
39+
$this->addToCollection();
2740
}
2841

2942
public function getId(): ?int
@@ -41,18 +54,19 @@ public function getLinkedPackageName(): string
4154
return $this->linkedPackageName;
4255
}
4356

44-
public function setLinkedPackageName(string $packageName): void
57+
public function getLinkedVersionConstraint(): string
4558
{
46-
$this->linkedPackageName = $packageName;
59+
return $this->linkedVersionConstraint;
4760
}
4861

49-
public function getLinkedVersionConstraint(): string
62+
public function getIndex(): int
5063
{
51-
return $this->linkedVersionConstraint;
64+
return $this->index;
5265
}
5366

54-
public function setLinkedVersionConstraint(string $packageVersion): void
67+
private function addToCollection(): void
5568
{
56-
$this->linkedVersionConstraint = $packageVersion;
69+
$linkType = MetadataLinkType::fromClass(static::class);
70+
$linkType->getMetadataLinks($this->metadata)->add($this);
5771
}
5872
}

src/Doctrine/Entity/Metadata.php

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace CodedMonkey\Dirigent\Doctrine\Entity;
44

55
use CodedMonkey\Dirigent\Doctrine\Repository\MetadataRepository;
6+
use CodedMonkey\Dirigent\Entity\MetadataLinkType;
67
use Composer\Package\Version\VersionParser;
78
use Composer\Pcre\Preg;
89
use Doctrine\Common\Collections\ArrayCollection;
@@ -100,37 +101,43 @@ class Metadata extends TrackedEntity implements \Stringable
100101
* @var Collection<int, MetadataRequireLink>
101102
*/
102103
#[ORM\OneToMany(targetEntity: MetadataRequireLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
103-
private Collection $require;
104+
#[ORM\OrderBy(['index' => 'ASC'])]
105+
private Collection $requireLinks;
104106

105107
/**
106108
* @var Collection<int, MetadataDevRequireLink>
107109
*/
108110
#[ORM\OneToMany(targetEntity: MetadataDevRequireLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
109-
private Collection $devRequire;
111+
#[ORM\OrderBy(['index' => 'ASC'])]
112+
private Collection $devRequireLinks;
110113

111114
/**
112115
* @var Collection<int, MetadataConflictLink>
113116
*/
114117
#[ORM\OneToMany(targetEntity: MetadataConflictLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
115-
private Collection $conflict;
118+
#[ORM\OrderBy(['index' => 'ASC'])]
119+
private Collection $conflictLinks;
116120

117121
/**
118122
* @var Collection<int, MetadataProvideLink>
119123
*/
120124
#[ORM\OneToMany(targetEntity: MetadataProvideLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
121-
private Collection $provide;
125+
#[ORM\OrderBy(['index' => 'ASC'])]
126+
private Collection $provideLinks;
122127

123128
/**
124129
* @var Collection<int, MetadataReplaceLink>
125130
*/
126131
#[ORM\OneToMany(targetEntity: MetadataReplaceLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
127-
private Collection $replace;
132+
#[ORM\OrderBy(['index' => 'ASC'])]
133+
private Collection $replaceLinks;
128134

129135
/**
130136
* @var Collection<int, MetadataSuggestLink>
131137
*/
132138
#[ORM\OneToMany(targetEntity: MetadataSuggestLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
133-
private Collection $suggest;
139+
#[ORM\OrderBy(['index' => 'ASC'])]
140+
private Collection $suggestLinks;
134141

135142
/**
136143
* @var Collection<int, Keyword>
@@ -143,12 +150,12 @@ public function __construct(Version $version)
143150
$this->version = $version;
144151
$this->package = $version->getPackage();
145152

146-
$this->require = new ArrayCollection();
147-
$this->devRequire = new ArrayCollection();
148-
$this->conflict = new ArrayCollection();
149-
$this->provide = new ArrayCollection();
150-
$this->replace = new ArrayCollection();
151-
$this->suggest = new ArrayCollection();
153+
$this->requireLinks = new ArrayCollection();
154+
$this->devRequireLinks = new ArrayCollection();
155+
$this->conflictLinks = new ArrayCollection();
156+
$this->provideLinks = new ArrayCollection();
157+
$this->replaceLinks = new ArrayCollection();
158+
$this->suggestLinks = new ArrayCollection();
152159
$this->keywords = new ArrayCollection();
153160
}
154161

@@ -409,49 +416,49 @@ public function getPackage(): Package
409416
/**
410417
* @return Collection<int, MetadataRequireLink>
411418
*/
412-
public function getRequire(): Collection
419+
public function getRequireLinks(): Collection
413420
{
414-
return $this->require;
421+
return $this->requireLinks;
415422
}
416423

417424
/**
418425
* @return Collection<int, MetadataDevRequireLink>
419426
*/
420-
public function getDevRequire(): Collection
427+
public function getDevRequireLinks(): Collection
421428
{
422-
return $this->devRequire;
429+
return $this->devRequireLinks;
423430
}
424431

425432
/**
426433
* @return Collection<int, MetadataConflictLink>
427434
*/
428-
public function getConflict(): Collection
435+
public function getConflictLinks(): Collection
429436
{
430-
return $this->conflict;
437+
return $this->conflictLinks;
431438
}
432439

433440
/**
434441
* @return Collection<int, MetadataProvideLink>
435442
*/
436-
public function getProvide(): Collection
443+
public function getProvideLinks(): Collection
437444
{
438-
return $this->provide;
445+
return $this->provideLinks;
439446
}
440447

441448
/**
442449
* @return Collection<int, MetadataReplaceLink>
443450
*/
444-
public function getReplace(): Collection
451+
public function getReplaceLinks(): Collection
445452
{
446-
return $this->replace;
453+
return $this->replaceLinks;
447454
}
448455

449456
/**
450457
* @return Collection<int, MetadataSuggestLink>
451458
*/
452-
public function getSuggest(): Collection
459+
public function getSuggestLinks(): Collection
453460
{
454-
return $this->suggest;
461+
return $this->suggestLinks;
455462
}
456463

457464
/**
@@ -615,19 +622,10 @@ public function toComposerArray(): array
615622
];
616623

617624
// Set links
618-
$supportedLinkTypes = [
619-
'require' => $this->require,
620-
'require-dev' => $this->devRequire,
621-
'suggest' => $this->suggest,
622-
'conflict' => $this->conflict,
623-
'provide' => $this->provide,
624-
'replace' => $this->replace,
625-
];
626-
627-
foreach ($supportedLinkTypes as $linkType => $linkCollection) {
625+
foreach (MetadataLinkType::cases() as $linkType) {
628626
/** @var AbstractMetadataLink $link */
629-
foreach ($linkCollection as $link) {
630-
$data[$linkType][$link->getLinkedPackageName()] = $link->getLinkedVersionConstraint();
627+
foreach ($linkType->getMetadataLinks($this) as $link) {
628+
$data[$linkType->value][$link->getLinkedPackageName()] = $link->getLinkedVersionConstraint();
631629
}
632630
}
633631

src/Doctrine/Entity/MetadataConflictLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataConflictLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'conflict')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'conflictLinks')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
1313
}

src/Doctrine/Entity/MetadataDevRequireLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataDevRequireLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'devRequire')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'devRequireLinks')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
1313
}

src/Doctrine/Entity/MetadataProvideLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataProvideLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'provide')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'provideLinks')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
1313

src/Doctrine/Entity/MetadataReplaceLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataReplaceLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'replace')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'replaceLinks')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
1313
}

src/Doctrine/Entity/MetadataRequireLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataRequireLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'require')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'requireLinks')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
1313
}

src/Doctrine/Entity/MetadataSuggestLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataSuggestLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'suggest')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'suggestLinks')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
1313
}

0 commit comments

Comments
 (0)