1
0
Fork 0

Merge pull request #8438 from MichaelThessel/master

Improve hasPackage() performance
pull/8458/head
Jordi Boggiano 2019-11-23 12:16:51 +01:00 committed by GitHub
commit 0f7a64839e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 16 additions and 6 deletions

View File

@ -29,6 +29,11 @@ class ArrayRepository extends BaseRepository
/** @var PackageInterface[] */ /** @var PackageInterface[] */
protected $packages; protected $packages;
/**
* @var PackageInterface[] indexed by package unique name and used to cache hasPackage calls
*/
protected $packageMap;
public function __construct(array $packages = array()) public function __construct(array $packages = array())
{ {
foreach ($packages as $package) { foreach ($packages as $package) {
@ -121,15 +126,14 @@ class ArrayRepository extends BaseRepository
*/ */
public function hasPackage(PackageInterface $package) public function hasPackage(PackageInterface $package)
{ {
$packageId = $package->getUniqueName(); if ($this->packageMap === null) {
$this->packageMap = array();
foreach ($this->getPackages() as $repoPackage) { foreach ($this->getPackages() as $repoPackage) {
if ($packageId === $repoPackage->getUniqueName()) { $this->packageMap[$repoPackage->getUniqueName()] = $repoPackage;
return true;
} }
} }
return false; return isset($this->packageMap[$package->getUniqueName()]);
} }
/** /**
@ -151,6 +155,9 @@ class ArrayRepository extends BaseRepository
$this->addPackage($aliasedPackage); $this->addPackage($aliasedPackage);
} }
} }
// invalidate package map cache
$this->packageMap = null;
} }
protected function createAliasPackage(PackageInterface $package, $alias, $prettyAlias) protected function createAliasPackage(PackageInterface $package, $alias, $prettyAlias)
@ -171,6 +178,9 @@ class ArrayRepository extends BaseRepository
if ($packageId === $repoPackage->getUniqueName()) { if ($packageId === $repoPackage->getUniqueName()) {
array_splice($this->packages, $key, 1); array_splice($this->packages, $key, 1);
// invalidate package map cache
$this->packageMap = null;
return; return;
} }
} }