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:
Dan McGee 2013-01-20 12:43:33 -06:00
parent 10462425f9
commit 271d1babbf
2 changed files with 10 additions and 14 deletions

View File

@ -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}

View File

@ -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