From f8010d5220d94d26ce3a05cc191d5d0a1d8e82dc Mon Sep 17 00:00:00 2001 From: Michael Thessel Date: Wed, 20 Nov 2019 14:58:28 -0800 Subject: [PATCH 1/3] Improved hasPackage() performance --- src/Composer/Repository/ArrayRepository.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php index 4f0409a60..815bc0087 100644 --- a/src/Composer/Repository/ArrayRepository.php +++ b/src/Composer/Repository/ArrayRepository.php @@ -28,6 +28,7 @@ class ArrayRepository extends BaseRepository { /** @var PackageInterface[] */ protected $packages; + protected $packageMap; public function __construct(array $packages = array()) { @@ -121,15 +122,13 @@ class ArrayRepository extends BaseRepository */ public function hasPackage(PackageInterface $package) { - $packageId = $package->getUniqueName(); - - foreach ($this->getPackages() as $repoPackage) { - if ($packageId === $repoPackage->getUniqueName()) { - return true; + if (empty($this->packageMap)) { + foreach ($this->getPackages() as $repoPackage) { + $this->packageMap[$repoPackage->getUniqueName()] = $repoPackage; } } - return false; + return isset($this->packageMap[$package->getUniqueName()]); } /** From 96af98370093c18ebd9ad7e1cdb4b021da73f4b0 Mon Sep 17 00:00:00 2001 From: Michael Thessel Date: Thu, 21 Nov 2019 10:08:09 -0800 Subject: [PATCH 2/3] Fixed map initialization --- src/Composer/Repository/ArrayRepository.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php index 815bc0087..3d9e22d14 100644 --- a/src/Composer/Repository/ArrayRepository.php +++ b/src/Composer/Repository/ArrayRepository.php @@ -122,7 +122,8 @@ class ArrayRepository extends BaseRepository */ public function hasPackage(PackageInterface $package) { - if (empty($this->packageMap)) { + if ($this->packageMap === null) { + $this->packageMap = array(); foreach ($this->getPackages() as $repoPackage) { $this->packageMap[$repoPackage->getUniqueName()] = $repoPackage; } From 44cdc37c0cb7023dbdd2e124f65a5b544f2650d2 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 23 Nov 2019 12:07:29 +0100 Subject: [PATCH 3/3] Invalidate map cache when addPackage/removePackage is called --- src/Composer/Repository/ArrayRepository.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php index 3d9e22d14..c11c7fe68 100644 --- a/src/Composer/Repository/ArrayRepository.php +++ b/src/Composer/Repository/ArrayRepository.php @@ -28,6 +28,10 @@ class ArrayRepository extends BaseRepository { /** @var PackageInterface[] */ protected $packages; + + /** + * @var PackageInterface[] indexed by package unique name and used to cache hasPackage calls + */ protected $packageMap; public function __construct(array $packages = array()) @@ -151,6 +155,9 @@ class ArrayRepository extends BaseRepository $this->addPackage($aliasedPackage); } } + + // invalidate package map cache + $this->packageMap = null; } protected function createAliasPackage(PackageInterface $package, $alias, $prettyAlias) @@ -171,6 +178,9 @@ class ArrayRepository extends BaseRepository if ($packageId === $repoPackage->getUniqueName()) { array_splice($this->packages, $key, 1); + // invalidate package map cache + $this->packageMap = null; + return; } }