Revert "Reduce query count when retrieving satisfiers and providers"
This reverts commit 20b64e4267
.
Django 1.5 fixed this issue and now parent objects are automatically
attached to their children when queries go through the related manager.
See "Caching of related model instances" in the release notes.
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
10462425f9
commit
271d1babbf
@ -277,10 +277,10 @@ def get_depends(self):
|
||||
# TODO: we can use list comprehension and an 'in' query to make this
|
||||
# more effective
|
||||
for dep in self.depends.all():
|
||||
pkg = dep.get_best_satisfier(self)
|
||||
pkg = dep.get_best_satisfier()
|
||||
providers = None
|
||||
if not pkg:
|
||||
providers = dep.get_providers(self)
|
||||
providers = dep.get_providers()
|
||||
deps.append({'dep': dep, 'pkg': pkg, 'providers': providers})
|
||||
# sort the list; deptype sorting makes this tricker than expected
|
||||
sort_order = {'D': 0, 'O': 1, 'M': 2, 'C': 3}
|
||||
|
@ -357,16 +357,14 @@ class RelatedToBase(models.Model):
|
||||
name = models.CharField(max_length=255, db_index=True)
|
||||
version = models.CharField(max_length=255, default='')
|
||||
|
||||
def get_best_satisfier(self, main_pkg=None):
|
||||
def get_best_satisfier(self):
|
||||
'''Find a satisfier for this related package that best matches the
|
||||
given criteria. It will not search provisions, but will find packages
|
||||
named and matching repo characteristics if possible.'''
|
||||
if main_pkg is None:
|
||||
main_pkg = self.pkg
|
||||
pkgs = Package.objects.normal().filter(pkgname=self.name)
|
||||
if not main_pkg.arch.agnostic:
|
||||
if not self.pkg.arch.agnostic:
|
||||
# make sure we match architectures if possible
|
||||
arches = main_pkg.applicable_arches()
|
||||
arches = self.pkg.applicable_arches()
|
||||
pkgs = pkgs.filter(arch__in=arches)
|
||||
# if we have a comparison operation, make sure the packages we grab
|
||||
# actually satisfy the requirements
|
||||
@ -386,27 +384,25 @@ def get_best_satisfier(self, main_pkg=None):
|
||||
pkg = pkgs[0]
|
||||
# prevents yet more DB queries, these lists should be short;
|
||||
# after each grab the best available in case we remove all entries
|
||||
pkgs = [p for p in pkgs if p.repo.staging == main_pkg.repo.staging]
|
||||
pkgs = [p for p in pkgs if p.repo.staging == self.pkg.repo.staging]
|
||||
if len(pkgs) > 0:
|
||||
pkg = pkgs[0]
|
||||
|
||||
pkgs = [p for p in pkgs if p.repo.testing == main_pkg.repo.testing]
|
||||
pkgs = [p for p in pkgs if p.repo.testing == self.pkg.repo.testing]
|
||||
if len(pkgs) > 0:
|
||||
pkg = pkgs[0]
|
||||
|
||||
return pkg
|
||||
|
||||
def get_providers(self, main_pkg=None):
|
||||
def get_providers(self):
|
||||
'''Return providers of this related package. Does *not* include exact
|
||||
matches as it checks the Provision names only, use get_best_satisfier()
|
||||
instead for exact matches.'''
|
||||
if main_pkg is None:
|
||||
main_pkg = self.pkg
|
||||
pkgs = Package.objects.normal().filter(
|
||||
provides__name=self.name).order_by().distinct()
|
||||
if not main_pkg.arch.agnostic:
|
||||
if not self.pkg.arch.agnostic:
|
||||
# make sure we match architectures if possible
|
||||
arches = main_pkg.applicable_arches()
|
||||
arches = self.pkg.applicable_arches()
|
||||
pkgs = pkgs.filter(arch__in=arches)
|
||||
|
||||
# If we have a comparison operation, make sure the packages we grab
|
||||
|
Loading…
Reference in New Issue
Block a user