summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2013-01-20 12:43:33 -0600
committerDan McGee <dan@archlinux.org>2013-02-09 16:20:38 -0600
commit271d1babbf8038e17d9dc5cfc3cd659463848400 (patch)
treebd563e669d8cf3cc730b223e366b9d07990e9e42
parent10462425f989dc74653179f0845978a6b5e30045 (diff)
downloadarchweb-271d1babbf8038e17d9dc5cfc3cd659463848400.tar.gz
archweb-271d1babbf8038e17d9dc5cfc3cd659463848400.zip
Revert "Reduce query count when retrieving satisfiers and providers"
This reverts commit 20b64e42672d185821cc584dfa4b133ee259a144. 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>
-rw-r--r--main/models.py4
-rw-r--r--packages/models.py20
2 files changed, 10 insertions, 14 deletions
diff --git a/main/models.py b/main/models.py
index 46fd3a63..da9d8b6e 100644
--- a/main/models.py
+++ b/main/models.py
@@ -277,10 +277,10 @@ class Package(models.Model):
# 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}
diff --git a/packages/models.py b/packages/models.py
index ff677883..7bcdc000 100644
--- a/packages/models.py
+++ b/packages/models.py
@@ -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 @@ class RelatedToBase(models.Model):
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