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'] |