1
0
Fork 0

Reduce whatProvides overhead

pull/2734/head
Nils Adermann 2014-02-21 14:42:56 +01:00
parent ee56db8767
commit 0daaa1a902
1 changed files with 17 additions and 8 deletions

View File

@ -45,6 +45,7 @@ class Pool
protected $providerRepos = array(); protected $providerRepos = array();
protected $packages = array(); protected $packages = array();
protected $packageByName = array(); protected $packageByName = array();
protected $packageByExactName = array();
protected $acceptableStabilities; protected $acceptableStabilities;
protected $stabilityFlags; protected $stabilityFlags;
protected $versionParser; protected $versionParser;
@ -122,6 +123,7 @@ class Pool
$package['id'] = $this->id++; $package['id'] = $this->id++;
$package['stability'] = $stability; $package['stability'] = $stability;
$this->packages[] = $package; $this->packages[] = $package;
$this->packageByExactName[$package->getName()][$package['id']] = $this->packages[$this->id - 2];
foreach ($names as $provided) { foreach ($names as $provided) {
$this->packageByName[$provided][$package['id']] = $this->packages[$this->id - 2]; $this->packageByName[$provided][$package['id']] = $this->packages[$this->id - 2];
@ -144,6 +146,7 @@ class Pool
$alias['id'] = $this->id++; $alias['id'] = $this->id++;
$alias['root_alias'] = true; $alias['root_alias'] = true;
$this->packages[] = $alias; $this->packages[] = $alias;
$this->packageByExactName[$package->getName()][$alias['id']] = $this->packages[$this->id - 2];
foreach ($names as $provided) { foreach ($names as $provided) {
$this->packageByName[$provided][$alias['id']] = $this->packages[$this->id - 2]; $this->packageByName[$provided][$alias['id']] = $this->packages[$this->id - 2];
@ -159,6 +162,7 @@ class Pool
$alias['alias_of'] = $package['id']; $alias['alias_of'] = $package['id'];
$alias['id'] = $this->id++; $alias['id'] = $this->id++;
$this->packages[] = $alias; $this->packages[] = $alias;
$this->packageByExactName[$package->getName()][$alias['id']] = $this->packages[$this->id - 2];
foreach ($names as $provided) { foreach ($names as $provided) {
$this->packageByName[$provided][$alias['id']] = $this->packages[$this->id - 2]; $this->packageByName[$provided][$alias['id']] = $this->packages[$this->id - 2];
@ -173,6 +177,7 @@ class Pool
if ($exempt || $this->isPackageAcceptable($names, $stability)) { if ($exempt || $this->isPackageAcceptable($names, $stability)) {
$package->setId($this->id++); $package->setId($this->id++);
$this->packages[] = $package; $this->packages[] = $package;
$this->packageByExactName[$package->getName()][$package->getId()] = $package;
foreach ($names as $provided) { foreach ($names as $provided) {
$this->packageByName[$provided][] = $package; $this->packageByName[$provided][] = $package;
@ -191,6 +196,7 @@ class Pool
$package->getRepository()->addPackage($aliasPackage); $package->getRepository()->addPackage($aliasPackage);
$this->packages[] = $aliasPackage; $this->packages[] = $aliasPackage;
$this->packageByExactName[$aliasPackage->getName()][$aliasPackage->getId()] = $aliasPackage;
foreach ($aliasPackage->getNames() as $name) { foreach ($aliasPackage->getNames() as $name) {
$this->packageByName[$name][] = $aliasPackage; $this->packageByName[$name][] = $aliasPackage;
@ -261,9 +267,18 @@ class Pool
} }
} }
if ($mustMatchName) {
$candidates = array_filter($candidates, function ($candidate) use ($name) {
return $candidate->getName() == $name;
});
if (isset($this->packageByExactName[$name])) {
$candidates = array_merge($candidates, $this->packageByExactName[$name]);
}
} else {
if (isset($this->packageByName[$name])) { if (isset($this->packageByName[$name])) {
$candidates = array_merge($candidates, $this->packageByName[$name]); $candidates = array_merge($candidates, $this->packageByName[$name]);
} }
}
$matches = $provideMatches = array(); $matches = $provideMatches = array();
$nameMatch = false; $nameMatch = false;
@ -313,12 +328,6 @@ class Pool
} }
} }
if ($mustMatchName) {
return array_filter($matches, function ($match) use ($name) {
return $match->getName() == $name;
});
}
// if a package with the required name exists, we ignore providers // if a package with the required name exists, we ignore providers
if ($nameMatch) { if ($nameMatch) {
return $matches; return $matches;