1 |
commit: 43ce171f72aa969fd1d2d87449789867065ae8f1 |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Thu Jun 28 12:26:12 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Thu Jun 28 12:26:12 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=43ce171f |
7 |
|
8 |
Add custom prefetch for keywords. |
9 |
|
10 |
--- |
11 |
gpackages/apps/packages/managers.py | 51 +++++++++++++++++++++- |
12 |
gpackages/apps/packages/models.py | 11 +++-- |
13 |
gpackages/apps/packages/templatetags/packages.py | 2 +- |
14 |
gpackages/apps/packages/views.py | 8 ++- |
15 |
gpackages/templates/ebuilds.html | 2 +- |
16 |
gpackages/templates/packages.html | 2 +- |
17 |
6 files changed, 65 insertions(+), 11 deletions(-) |
18 |
|
19 |
diff --git a/gpackages/apps/packages/managers.py b/gpackages/apps/packages/managers.py |
20 |
index 557cd48..012b40d 100644 |
21 |
--- a/gpackages/apps/packages/managers.py |
22 |
+++ b/gpackages/apps/packages/managers.py |
23 |
@@ -3,6 +3,7 @@ from package_info.abstract import AbstarctPackage, AbstractEbuild, \ |
24 |
AbstractKeywords |
25 |
import packages.models |
26 |
from package_info.generic import get_from_kwargs_and_del |
27 |
+from collections import defaultdict |
28 |
|
29 |
def _gen_query_and_manager(MixinClass, QueryClassName, ManagerClassName): |
30 |
QueryClass = type(QueryClassName, (MixinClass, models.query.QuerySet), {}) |
31 |
@@ -68,7 +69,7 @@ class KeywordMixin(object):#{{{ |
32 |
|
33 |
|
34 |
class EbuildMixin(object):#{{{ |
35 |
- |
36 |
+ |
37 |
def get(self, ebuild=None, package = None, *args, **kwargs): |
38 |
if ebuild is not None and isinstance(ebuild, AbstractEbuild): |
39 |
if package is None: |
40 |
@@ -84,6 +85,54 @@ class EbuildMixin(object):#{{{ |
41 |
def all_by_numbers(self): |
42 |
return super(EbuildMixin, self).order_by('version', 'revision') |
43 |
|
44 |
+ def __init__(self, *args, **kwargs): |
45 |
+ super(EbuildMixin, self).__init__(*args, **kwargs) |
46 |
+ self._arches_set = None |
47 |
+ self._cache_keywords = None |
48 |
+ |
49 |
+ # Maybe use https://github.com/ionelmc/django-prefetch ? |
50 |
+ def prefetch_with_keywords(self, arch_list): |
51 |
+ arch_set = set(arch_list) |
52 |
+ arch_set.add('*') |
53 |
+ self._arches_set = arch_set |
54 |
+ return self |
55 |
+ |
56 |
+ def __old_iter__(self): |
57 |
+ return super(EbuildMixin, self).__iter__() |
58 |
+ |
59 |
+ def _clone(self, *args, **kwargs): |
60 |
+ c = super(EbuildMixin, self)._clone(*args, **kwargs) |
61 |
+ c._arches_set = self._arches_set |
62 |
+ return c |
63 |
+ |
64 |
+ def _prefetch_keywords(self): |
65 |
+ arch_set = self._arches_set |
66 |
+ pk_keys = [ebuild.pk for ebuild in self.__old_iter__()] |
67 |
+ query = packages.models.Keyword.objects.filter(ebuild__in = pk_keys, |
68 |
+ arch__name__in = arch_set).select_related('arch') |
69 |
+ |
70 |
+ cache_query = defaultdict(list) |
71 |
+ for keyword in query: |
72 |
+ cache_query[keyword.ebuild_id].append(keyword) |
73 |
+ |
74 |
+ self._cache_keywords = cache_query |
75 |
+ |
76 |
+ def __iter__(self): |
77 |
+ arch_set = self._arches_set |
78 |
+ if arch_set is None: |
79 |
+ for ebuild in self.__old_iter__(): |
80 |
+ yield ebuild |
81 |
+ else: |
82 |
+ if self._cache_keywords is None: |
83 |
+ self._prefetch_keywords() |
84 |
+ |
85 |
+ cache_query = self._cache_keywords |
86 |
+ |
87 |
+ for ebuild in self.__old_iter__(): |
88 |
+ ebuild._prefetched_keywords = cache_query[ebuild.pk] |
89 |
+ yield ebuild |
90 |
+ |
91 |
+ |
92 |
|
93 |
class HerdsMixin(object):#{{{ |
94 |
def filter(self, *args, **kwargs): |
95 |
|
96 |
diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py |
97 |
index 187088e..caa7156 100644 |
98 |
--- a/gpackages/apps/packages/models.py |
99 |
+++ b/gpackages/apps/packages/models.py |
100 |
@@ -312,7 +312,6 @@ class PackageModel(AbstractDateTimeModel): |
101 |
l.extend(ebuild.get_ebuilds_and_keywords(arch_list)) |
102 |
return l |
103 |
|
104 |
- |
105 |
class Meta: |
106 |
unique_together = ('virtual_package', 'repository') |
107 |
ordering = ('-updated_datetime',) |
108 |
@@ -381,6 +380,7 @@ class EbuildModel(AbstractDateTimeModel): |
109 |
super(EbuildModel, self).__init__(*args, **kwargs) |
110 |
if isinstance(ebuild, AbstractEbuild): |
111 |
self.init_by_ebuild(ebuild) |
112 |
+ self._prefetched_keywords = None |
113 |
|
114 |
def __unicode__(self): |
115 |
return self.cpv |
116 |
@@ -470,9 +470,12 @@ class EbuildModel(AbstractDateTimeModel): |
117 |
|
118 |
return keywords_dict |
119 |
|
120 |
- def load_keywords(self, arch_set): |
121 |
- arch_set.add('*') |
122 |
- return self.keyword_set.filter(arch__name__in = arch_set).select_related('arch') |
123 |
+ def load_keywords(self, arch_set, flush_cache = False): |
124 |
+ if self._prefetched_keywords is None or flush_cache: |
125 |
+ arch_set.add('*') |
126 |
+ self._prefetched_keywords = self.keyword_set. \ |
127 |
+ filter(arch__name__in = arch_set).select_related('arch') |
128 |
+ return self._prefetched_keywords |
129 |
|
130 |
def get_ebuilds_and_keywords(self, arch_list): |
131 |
# Maybe copy object ? !! |
132 |
|
133 |
diff --git a/gpackages/apps/packages/templatetags/packages.py b/gpackages/apps/packages/templatetags/packages.py |
134 |
index 45c756d..e381cb0 100644 |
135 |
--- a/gpackages/apps/packages/templatetags/packages.py |
136 |
+++ b/gpackages/apps/packages/templatetags/packages.py |
137 |
@@ -11,7 +11,7 @@ def last_updated(): |
138 |
return {'last_updated': l.updated_datetime} |
139 |
|
140 |
@register.inclusion_tag('keywords_table.html') |
141 |
-def render_keywords_table(obj, *arch_list): |
142 |
+def render_keywords_table(obj, arch_list): |
143 |
ebuilds = obj.get_ebuilds_and_keywords(arch_list) |
144 |
return {'arches': arch_list, 'ebuilds' : ebuilds} |
145 |
|
146 |
|
147 |
diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py |
148 |
index 6f73fdd..16c74e2 100644 |
149 |
--- a/gpackages/apps/packages/views.py |
150 |
+++ b/gpackages/apps/packages/views.py |
151 |
@@ -35,18 +35,20 @@ class LicenseGroupsView(ContextListView): |
152 |
context_object_name = 'license_groups' |
153 |
|
154 |
class EbuildsListView(ContextListView): |
155 |
+ arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86'] |
156 |
paginate_by = 40 |
157 |
- extra_context = {'page_name': 'Ebuilds',} |
158 |
+ extra_context = {'page_name': 'Ebuilds', 'arches' : arches} |
159 |
template_name = 'ebuilds.html' |
160 |
context_object_name = 'ebuilds' |
161 |
queryset = EbuildModel.objects.all(). \ |
162 |
select_related('package', |
163 |
'package__virtual_package', |
164 |
- 'package__virtual_package__category') |
165 |
+ 'package__virtual_package__category').prefetch_with_keywords(arches) |
166 |
|
167 |
class PackagesListsView(ContextListView): |
168 |
+ arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86'] |
169 |
paginate_by = 40 |
170 |
- extra_context = {'page_name': 'Packages',} |
171 |
+ extra_context = {'page_name': 'Packages', 'arches': arches} |
172 |
template_name = 'packages.html' |
173 |
context_object_name = 'packages' |
174 |
queryset = PackageModel.objects.all(). \ |
175 |
|
176 |
diff --git a/gpackages/templates/ebuilds.html b/gpackages/templates/ebuilds.html |
177 |
index ef51a43..94e1ecd 100644 |
178 |
--- a/gpackages/templates/ebuilds.html |
179 |
+++ b/gpackages/templates/ebuilds.html |
180 |
@@ -9,7 +9,7 @@ |
181 |
<span class="package_update_datetime">{{ ebuild.updated_datetime }}</span> |
182 |
</div> |
183 |
<div style="padding-bottom: 10px; margin 10px;">{{ ebuild.description }}</div> |
184 |
- {% render_keywords_table ebuild 'alpha' 'amd64' 'arm' 'hppa' 'ia64' 'ppc' 'ppc64' 'sparc' 'x86' %} |
185 |
+ {% render_keywords_table ebuild arches %} |
186 |
</div> |
187 |
{% endfor %} |
188 |
{% include 'paginator.html' %} |
189 |
|
190 |
diff --git a/gpackages/templates/packages.html b/gpackages/templates/packages.html |
191 |
index b6600dc..ec6d22a 100644 |
192 |
--- a/gpackages/templates/packages.html |
193 |
+++ b/gpackages/templates/packages.html |
194 |
@@ -11,7 +11,7 @@ |
195 |
{% if package.description %} |
196 |
<div style="padding-bottom: 10px; margin 10px;">{{ package.description }}</div> |
197 |
{% endif %} |
198 |
- {% render_keywords_table package 'alpha' 'amd64' 'arm' 'hppa' 'ia64' 'ppc' 'ppc64' 'sparc' 'x86' %} |
199 |
+ {% render_keywords_table package arches %} |
200 |
</div> |
201 |
{% endfor %} |
202 |
{% include 'paginator.html' %} |