Skip to content

Commit 2c24ef3

Browse files
committed
Optimize fetching of package update data
1 parent a284641 commit 2c24ef3

File tree

4 files changed

+44
-27
lines changed

4 files changed

+44
-27
lines changed

src/Doctrine/Entity/Package.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,19 @@ public function getDevBranchVersions(): array
520520
return array_filter($this->getSortedVersions(), static fn (Version $version) => str_starts_with($version->getNormalizedName(), 'dev-'));
521521
}
522522

523+
public function getVersionByNormalizedName(string $normalizedName): ?Version
524+
{
525+
$normalizedName = strtolower($normalizedName);
526+
527+
foreach ($this->versions as $version) {
528+
if ($normalizedName === strtolower($version->getNormalizedName())) {
529+
return $version;
530+
}
531+
}
532+
533+
return null;
534+
}
535+
523536
/**
524537
* Sort versions from newest to oldest.
525538
*/

src/Doctrine/Repository/PackageRepository.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class PackageRepository extends ServiceEntityRepository
2828

2929
public function __construct(
3030
ManagerRegistry $registry,
31+
private readonly MetadataRepository $metadataRepository,
3132
#[Autowire(param: 'dirigent.packages.periodic_update_interval')]
3233
?string $periodicUpdateInterval,
3334
) {
@@ -174,4 +175,24 @@ public function deletePackageLinks(Package $package): void
174175
$connection->executeStatement('DELETE FROM package_suggest_link WHERE package_id = :id', $queryParameters);
175176
});
176177
}
178+
179+
public function fetchPackageDataForUpdate(Package $package): void
180+
{
181+
/** @var Version[] $versions */
182+
$versions = $this->getEntityManager()->createQueryBuilder()
183+
->select('version', 'currentMetadata')
184+
->from(Version::class, 'version')
185+
->leftJoin('version.currentMetadata', 'currentMetadata')
186+
->where('version.package = :package')
187+
->setParameter('package', $package)
188+
->getQuery()
189+
->getResult();
190+
191+
$metadataCollection = array_map(
192+
static fn (Version $version) => $version->getCurrentMetadata(),
193+
$versions
194+
);
195+
196+
$this->metadataRepository->fetchMetadataCollections(...$metadataCollection);
197+
}
177198
}

src/Doctrine/Repository/VersionRepository.php

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,4 @@ public function findOneByNormalizedName(Package $package, string $name): ?Versio
4444
{
4545
return $this->findOneBy(['package' => $package, 'normalizedName' => $name]);
4646
}
47-
48-
/**
49-
* @return array<string, int>
50-
*/
51-
public function getVersionMetadataForUpdate(Package $package): array
52-
{
53-
$rows = $this->getEntityManager()->getConnection()->fetchAllAssociative(
54-
'SELECT id, normalized_name FROM version v WHERE v.package_id = :id',
55-
['id' => $package->getId()],
56-
);
57-
58-
$versions = [];
59-
foreach ($rows as $row) {
60-
$key = strtolower((string) $row['normalized_name']);
61-
$versions[$key] = $row['id'];
62-
}
63-
64-
return $versions;
65-
}
6647
}

src/Package/PackageMetadataResolver.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
use CodedMonkey\Dirigent\Doctrine\Entity\RegistryPackageMirroring;
1313
use CodedMonkey\Dirigent\Doctrine\Entity\Version;
1414
use CodedMonkey\Dirigent\Doctrine\Repository\KeywordRepository;
15+
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
1516
use CodedMonkey\Dirigent\Doctrine\Repository\RegistryRepository;
16-
use CodedMonkey\Dirigent\Doctrine\Repository\VersionRepository;
1717
use CodedMonkey\Dirigent\Entity\MetadataLinkType;
1818
use CodedMonkey\Dirigent\Message\DumpPackageProvider;
1919
use CodedMonkey\Dirigent\Message\UpdatePackageLinks;
@@ -35,7 +35,7 @@ public function __construct(
3535
private EntityManagerInterface $entityManager,
3636
private KeywordRepository $keywordRepository,
3737
private RegistryRepository $registryRepository,
38-
private VersionRepository $versionRepository,
38+
private PackageRepository $packageRepository,
3939
) {
4040
}
4141

@@ -142,7 +142,12 @@ private function resolveVcsRepository(Package $package): void
142142
*/
143143
private function updatePackage(Package $package, array $composerPackages, ?VcsDriverInterface $driver = null): void
144144
{
145-
$existingVersionMetadata = $this->versionRepository->getVersionMetadataForUpdate($package);
145+
$this->packageRepository->fetchPackageDataForUpdate($package);
146+
147+
$existingVersionMetadata = [];
148+
foreach ($package->getVersions() as $version) {
149+
$existingVersionMetadata[strtolower($version->getNormalizedName())] = $version;
150+
}
146151

147152
/** @var ?Version $primaryVersion Version to use as the package info source */
148153
$primaryVersion = null;
@@ -156,9 +161,7 @@ private function updatePackage(Package $package, array $composerPackages, ?VcsDr
156161
}
157162

158163
$key = strtolower($composerPackage->getVersion());
159-
if ($versionId = $existingVersionMetadata[$key] ?? null) {
160-
$version = $this->entityManager->getReference(Version::class, $versionId);
161-
} else {
164+
if (null === $version = $existingVersionMetadata[$key] ?? null) {
162165
$version = new Version($package);
163166
$version->setName($composerPackage->getPrettyVersion());
164167
$version->setNormalizedName($composerPackage->getVersion());
@@ -200,8 +203,7 @@ private function updatePackage(Package $package, array $composerPackages, ?VcsDr
200203
}
201204

202205
// Remove outdated versions
203-
foreach ($existingVersionMetadata as $versionId) {
204-
$version = $this->entityManager->getReference(Version::class, $versionId);
206+
foreach ($existingVersionMetadata as $version) {
205207
$this->entityManager->remove($version);
206208
}
207209

0 commit comments

Comments
 (0)