Gentoo Archives: gentoo-commits

From: Slava Bacherikov <slava@××××××××××××××.ua>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/
Date: Fri, 29 Jun 2012 00:00:04
Message-Id: 1340916315.ecd1dd1c2c3cc2a556bd7dd7d1367eab669bd993.bacher09@gentoo
1 commit: ecd1dd1c2c3cc2a556bd7dd7d1367eab669bd993
2 Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
3 AuthorDate: Thu Jun 28 20:20:03 2012 +0000
4 Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
5 CommitDate: Thu Jun 28 20:45:15 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=ecd1dd1c
7
8 Use prefetcher for keywords prefetch in ebuilds
9
10 ---
11 gpackages/apps/packages/managers.py | 81 ++++++++++++-----------------------
12 gpackages/apps/packages/views.py | 2 +-
13 2 files changed, 29 insertions(+), 54 deletions(-)
14
15 diff --git a/gpackages/apps/packages/managers.py b/gpackages/apps/packages/managers.py
16 index cfe0166..c1fd5e9 100644
17 --- a/gpackages/apps/packages/managers.py
18 +++ b/gpackages/apps/packages/managers.py
19 @@ -30,7 +30,9 @@ class EbuildsWithKeywrods(Prefetcher):
20 self.keywords = keywords
21
22 def filter(self, ids):
23 - return packages.models.EbuildModel.objects.filter(package__in = ids).order_by('-version', '-revision').prefetch_with_keywords(self.keywords)
24 + return packages.models.EbuildModel.objects. \
25 + filter(package__in = ids).order_by('-version', '-revision'). \
26 + prefetch_keywords(self.keywords)
27
28 def reverse_mapper(self, ebuild):
29 return [ebuild.package_id]
30 @@ -38,6 +40,21 @@ class EbuildsWithKeywrods(Prefetcher):
31 def decorator(self, package, ebuilds = ()):
32 setattr(package, 'ebuilds', ebuilds)
33
34 +class KeywordsPrefetch(Prefetcher):
35 + def __init__(self, arches):
36 + self.arches = arches
37 +
38 + def filter(self, ids):
39 + return packages.models.Keyword.objects. \
40 + filter(ebuild__in = ids, arch__name__in = self.arches). \
41 + select_related('arch')
42 +
43 + def reverse_mapper(self, keyword):
44 + return [keyword.ebuild_id]
45 +
46 + def decorator(self, ebuild, keywords = ()):
47 + setattr(ebuild, '_prefetched_keywords', keywords)
48 +
49
50 class PackageMixin(object):
51 def get(self, package = None, *args, **kwargs):
52 @@ -110,59 +127,17 @@ class EbuildMixin(object):
53 def all_by_numbers(self):
54 return super(EbuildMixin, self).order_by('version', 'revision')
55
56 -class EbuildQuerySet(EbuildMixin, models.query.QuerySet):
57 -
58 - def __init__(self, *args, **kwargs):
59 - super(EbuildQuerySet, self).__init__(*args, **kwargs)
60 - self._arches_set = None
61 - self._cache_keywords = None
62 -
63 - # Maybe use https://github.com/ionelmc/django-prefetch ?
64 - def prefetch_with_keywords(self, arch_list):
65 - arch_set = set(arch_list)
66 - arch_set.add('*')
67 - self._arches_set = arch_set
68 - return self
69 -
70 - def __old_iter__(self):
71 - return super(EbuildQuerySet, self).__iter__()
72 -
73 - def _clone(self, *args, **kwargs):
74 - c = super(EbuildQuerySet, self)._clone(*args, **kwargs)
75 - c._arches_set = self._arches_set
76 - return c
77 -
78 - def _prefetch_keywords(self):
79 - arch_set = self._arches_set
80 - pk_keys = [ebuild.pk for ebuild in self.__old_iter__()]
81 - query = packages.models.Keyword.objects.\
82 - filter(ebuild__in = pk_keys, arch__name__in = arch_set). \
83 - select_related('arch')
84 +class EbuildQuerySet(EbuildMixin, PrefetchQuerySet):
85 +
86 + def prefetch_keywords(self, arch_list):
87 + return self.prefetch(P('keywords', arches = arch_list))
88
89 - cache_query = defaultdict(list)
90 - for keyword in query:
91 - cache_query[keyword.ebuild_id].append(keyword)
92 -
93 - self._cache_keywords = cache_query
94 -
95 - def __iter__(self):
96 - arch_set = self._arches_set
97 - if arch_set is None:
98 - for ebuild in self.__old_iter__():
99 - yield ebuild
100 - else:
101 - if self._cache_keywords is None:
102 - self._prefetch_keywords()
103 -
104 - cache_query = self._cache_keywords
105 -
106 - for ebuild in self.__old_iter__():
107 - ebuild._prefetched_keywords = cache_query[ebuild.pk]
108 - yield ebuild
109 -
110 -class EbuildManager(EbuildMixin, models.Manager):
111 - def get_query_set(self):
112 - return EbuildQuerySet(self.model, using = self._db)
113 +class EbuildManager(EbuildMixin, PrefetchManagerMixin):
114 + prefetch_definitions = {'keywords': KeywordsPrefetch}
115 +
116 + @classmethod
117 + def get_query_set_class(cls):
118 + return EbuildQuerySet
119
120 class HerdsMixin(object):#{{{
121 def filter(self, *args, **kwargs):
122
123 diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
124 index 21fa07c..4639555 100644
125 --- a/gpackages/apps/packages/views.py
126 +++ b/gpackages/apps/packages/views.py
127 @@ -43,7 +43,7 @@ class EbuildsListView(ContextListView):
128 queryset = EbuildModel.objects.all(). \
129 select_related('package',
130 'package__virtual_package',
131 - 'package__virtual_package__category').prefetch_with_keywords(arches)
132 + 'package__virtual_package__category').prefetch_keywords(arches)
133
134 class PackagesListsView(ContextListView):
135 arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']