From: "Slava Bacherikov" <slava@bacherikov.org.ua>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/
Date: Thu, 28 Jun 2012 23:59:53 +0000 (UTC) [thread overview]
Message-ID: <1340916315.ecd1dd1c2c3cc2a556bd7dd7d1367eab669bd993.bacher09@gentoo> (raw)
commit: ecd1dd1c2c3cc2a556bd7dd7d1367eab669bd993
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Thu Jun 28 20:20:03 2012 +0000
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Thu Jun 28 20:45:15 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=ecd1dd1c
Use prefetcher for keywords prefetch in ebuilds
---
gpackages/apps/packages/managers.py | 81 ++++++++++++-----------------------
gpackages/apps/packages/views.py | 2 +-
2 files changed, 29 insertions(+), 54 deletions(-)
diff --git a/gpackages/apps/packages/managers.py b/gpackages/apps/packages/managers.py
index cfe0166..c1fd5e9 100644
--- a/gpackages/apps/packages/managers.py
+++ b/gpackages/apps/packages/managers.py
@@ -30,7 +30,9 @@ class EbuildsWithKeywrods(Prefetcher):
self.keywords = keywords
def filter(self, ids):
- return packages.models.EbuildModel.objects.filter(package__in = ids).order_by('-version', '-revision').prefetch_with_keywords(self.keywords)
+ return packages.models.EbuildModel.objects. \
+ filter(package__in = ids).order_by('-version', '-revision'). \
+ prefetch_keywords(self.keywords)
def reverse_mapper(self, ebuild):
return [ebuild.package_id]
@@ -38,6 +40,21 @@ class EbuildsWithKeywrods(Prefetcher):
def decorator(self, package, ebuilds = ()):
setattr(package, 'ebuilds', ebuilds)
+class KeywordsPrefetch(Prefetcher):
+ def __init__(self, arches):
+ self.arches = arches
+
+ def filter(self, ids):
+ return packages.models.Keyword.objects. \
+ filter(ebuild__in = ids, arch__name__in = self.arches). \
+ select_related('arch')
+
+ def reverse_mapper(self, keyword):
+ return [keyword.ebuild_id]
+
+ def decorator(self, ebuild, keywords = ()):
+ setattr(ebuild, '_prefetched_keywords', keywords)
+
class PackageMixin(object):
def get(self, package = None, *args, **kwargs):
@@ -110,59 +127,17 @@ class EbuildMixin(object):
def all_by_numbers(self):
return super(EbuildMixin, self).order_by('version', 'revision')
-class EbuildQuerySet(EbuildMixin, models.query.QuerySet):
-
- def __init__(self, *args, **kwargs):
- super(EbuildQuerySet, self).__init__(*args, **kwargs)
- self._arches_set = None
- self._cache_keywords = None
-
- # Maybe use https://github.com/ionelmc/django-prefetch ?
- def prefetch_with_keywords(self, arch_list):
- arch_set = set(arch_list)
- arch_set.add('*')
- self._arches_set = arch_set
- return self
-
- def __old_iter__(self):
- return super(EbuildQuerySet, self).__iter__()
-
- def _clone(self, *args, **kwargs):
- c = super(EbuildQuerySet, self)._clone(*args, **kwargs)
- c._arches_set = self._arches_set
- return c
-
- def _prefetch_keywords(self):
- arch_set = self._arches_set
- pk_keys = [ebuild.pk for ebuild in self.__old_iter__()]
- query = packages.models.Keyword.objects.\
- filter(ebuild__in = pk_keys, arch__name__in = arch_set). \
- select_related('arch')
+class EbuildQuerySet(EbuildMixin, PrefetchQuerySet):
+
+ def prefetch_keywords(self, arch_list):
+ return self.prefetch(P('keywords', arches = arch_list))
- cache_query = defaultdict(list)
- for keyword in query:
- cache_query[keyword.ebuild_id].append(keyword)
-
- self._cache_keywords = cache_query
-
- def __iter__(self):
- arch_set = self._arches_set
- if arch_set is None:
- for ebuild in self.__old_iter__():
- yield ebuild
- else:
- if self._cache_keywords is None:
- self._prefetch_keywords()
-
- cache_query = self._cache_keywords
-
- for ebuild in self.__old_iter__():
- ebuild._prefetched_keywords = cache_query[ebuild.pk]
- yield ebuild
-
-class EbuildManager(EbuildMixin, models.Manager):
- def get_query_set(self):
- return EbuildQuerySet(self.model, using = self._db)
+class EbuildManager(EbuildMixin, PrefetchManagerMixin):
+ prefetch_definitions = {'keywords': KeywordsPrefetch}
+
+ @classmethod
+ def get_query_set_class(cls):
+ return EbuildQuerySet
class HerdsMixin(object):#{{{
def filter(self, *args, **kwargs):
diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
index 21fa07c..4639555 100644
--- a/gpackages/apps/packages/views.py
+++ b/gpackages/apps/packages/views.py
@@ -43,7 +43,7 @@ class EbuildsListView(ContextListView):
queryset = EbuildModel.objects.all(). \
select_related('package',
'package__virtual_package',
- 'package__virtual_package__category').prefetch_with_keywords(arches)
+ 'package__virtual_package__category').prefetch_keywords(arches)
class PackagesListsView(ContextListView):
arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
next reply other threads:[~2012-06-29 0:00 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-28 23:59 Slava Bacherikov [this message]
-- strict thread matches above, loose matches on Subject: below --
2012-09-23 19:35 [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/ Slava Bacherikov
2012-09-13 22:17 Slava Bacherikov
2012-08-26 23:00 Slava Bacherikov
2012-08-20 13:03 Slava Bacherikov
2012-08-20 13:03 Slava Bacherikov
2012-08-11 22:30 Slava Bacherikov
2012-08-11 22:30 Slava Bacherikov
2012-08-07 0:10 Slava Bacherikov
2012-07-31 23:20 Slava Bacherikov
2012-07-30 23:30 Slava Bacherikov
2012-07-30 12:59 Slava Bacherikov
2012-07-25 22:47 Slava Bacherikov
2012-07-25 22:47 Slava Bacherikov
2012-07-22 23:46 Slava Bacherikov
2012-07-19 23:50 Slava Bacherikov
2012-07-19 23:50 Slava Bacherikov
2012-07-18 23:20 Slava Bacherikov
2012-07-18 23:20 Slava Bacherikov
2012-07-15 23:08 Slava Bacherikov
2012-07-15 23:08 Slava Bacherikov
2012-07-12 22:16 Slava Bacherikov
2012-07-08 19:54 Slava Bacherikov
2012-07-05 23:27 Slava Bacherikov
2012-07-04 22:13 Slava Bacherikov
2012-07-03 21:08 Slava Bacherikov
2012-07-02 22:25 Slava Bacherikov
2012-06-29 17:29 Slava Bacherikov
2012-06-29 17:29 Slava Bacherikov
2012-06-28 23:59 Slava Bacherikov
2012-06-27 22:52 Slava Bacherikov
2012-06-25 22:23 Slava Bacherikov
2012-06-24 23:21 Slava Bacherikov
2012-06-20 23:23 Slava Bacherikov
2012-06-20 23:23 Slava Bacherikov
2012-06-20 23:23 Slava Bacherikov
2012-06-13 22:15 Slava Bacherikov
2012-06-12 18:34 Slava Bacherikov
2012-06-10 22:56 Slava Bacherikov
2012-06-10 17:51 Slava Bacherikov
2012-06-09 18:19 Slava Bacherikov
2012-06-09 18:19 Slava Bacherikov
2012-06-07 22:48 Slava Bacherikov
2012-06-07 18:37 Slava Bacherikov
2012-06-07 18:37 Slava Bacherikov
2012-06-07 18:37 Slava Bacherikov
2012-06-07 18:37 Slava Bacherikov
2012-06-07 11:27 Slava Bacherikov
2012-06-06 22:48 Slava Bacherikov
2012-06-05 20:48 Slava Bacherikov
2012-06-05 20:48 Slava Bacherikov
2012-06-05 20:48 Slava Bacherikov
2012-06-05 15:49 Slava Bacherikov
2012-06-05 15:49 Slava Bacherikov
2012-06-03 16:19 Slava Bacherikov
2012-06-03 13:19 Slava Bacherikov
2012-05-31 13:34 Slava Bacherikov
2012-05-29 21:34 Slava Bacherikov
2012-05-29 13:38 Slava Bacherikov
2012-05-29 12:24 Slava Bacherikov
2012-05-29 12:24 Slava Bacherikov
2012-05-29 12:24 Slava Bacherikov
2012-05-28 20:32 Slava Bacherikov
2012-05-28 17:00 Slava Bacherikov
2012-05-28 17:00 Slava Bacherikov
2012-05-28 17:00 Slava Bacherikov
2012-05-28 10:39 Slava Bacherikov
2012-05-28 10:39 Slava Bacherikov
2012-05-27 22:48 Slava Bacherikov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1340916315.ecd1dd1c2c3cc2a556bd7dd7d1367eab669bd993.bacher09@gentoo \
--to=slava@bacherikov.org.ua \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox