public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
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: <1340897674.3c76d3040d63aaaa34905be0c486c8e28ae455e1.bacher09@gentoo> (raw)

commit:     3c76d3040d63aaaa34905be0c486c8e28ae455e1
Author:     Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Thu Jun 28 15:34:34 2012 +0000
Commit:     Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Thu Jun 28 15:34:34 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=3c76d304

Add prefetch keywords for packages manager

---
 gpackages/apps/packages/managers.py |   48 ++++++++++++++++++++++++++++------
 gpackages/apps/packages/models.py   |    9 +++++-
 gpackages/apps/packages/views.py    |    4 +-
 3 files changed, 48 insertions(+), 13 deletions(-)

diff --git a/gpackages/apps/packages/managers.py b/gpackages/apps/packages/managers.py
index 012b40d..cfe0166 100644
--- a/gpackages/apps/packages/managers.py
+++ b/gpackages/apps/packages/managers.py
@@ -4,6 +4,8 @@ from package_info.abstract import AbstarctPackage, AbstractEbuild, \
 import packages.models
 from package_info.generic import get_from_kwargs_and_del
 from collections import defaultdict
+from prefetch import PrefetchManagerMixin, PrefetchManager, PrefetchQuerySet, \
+                     Prefetcher, P
 
 def _gen_query_and_manager(MixinClass, QueryClassName, ManagerClassName):
     QueryClass = type(QueryClassName, (MixinClass, models.query.QuerySet), {})
@@ -23,6 +25,19 @@ def _gen_all_query_and_manager(mixin_name, name_for_query, name_for_manager, *ar
         q, m = _gen_query_and_manager(arg, q_name, m_name)
         globals()[q_name], globals()[m_name] = q, m
         
+class EbuildsWithKeywrods(Prefetcher):
+    def __init__(self, keywords):
+        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)
+
+    def reverse_mapper(self, ebuild):
+        return [ebuild.package_id]
+
+    def decorator(self, package, ebuilds = ()):
+        setattr(package, 'ebuilds', ebuilds)
+
 
 class PackageMixin(object):
     def get(self, package = None, *args, **kwargs):
@@ -54,6 +69,16 @@ class PackageMixin(object):
 
         return super(PackageMixin, self).filter(**kwargs)
 
+class PackageQuerySet(PackageMixin, PrefetchQuerySet):
+    def prefetch_keywords(self, arch_list):
+        return self.prefetch(P('ebuilds', keywords = arch_list))
+
+class PackageManager(PackageMixin, PrefetchManagerMixin):
+    @classmethod
+    def get_query_set_class(cls):
+        return PackageQuerySet
+
+    prefetch_definitions = {'ebuilds': EbuildsWithKeywrods}
 
 class KeywordMixin(object):#{{{
     def get_or_create(self, keyword=None,  **kwargs):
@@ -68,7 +93,7 @@ class KeywordMixin(object):#{{{
         return super(KeywordMixin, self).get_or_create(**kwargs)#}}}
 
 
-class EbuildMixin(object):#{{{
+class EbuildMixin(object):
 
     def get(self, ebuild=None, package = None, *args, **kwargs):
         if ebuild is not None and isinstance(ebuild, AbstractEbuild):
@@ -80,13 +105,15 @@ class EbuildMixin(object):#{{{
                 kwargs.update({'package': package})
             kwargs.update({ 'version': ebuild.version,
                             'revision': ebuild.revision })
-        return super(EbuildMixin, self).get(*args, **kwargs)#}}}
+        return super(EbuildMixin, self).get(*args, **kwargs)
 
     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(EbuildMixin, self).__init__(*args, **kwargs)
+        super(EbuildQuerySet, self).__init__(*args, **kwargs)
         self._arches_set = None
         self._cache_keywords = None
     
@@ -98,18 +125,19 @@ class EbuildMixin(object):#{{{
         return self
 
     def __old_iter__(self):
-        return super(EbuildMixin, self).__iter__()
+        return super(EbuildQuerySet, self).__iter__()
 
     def _clone(self, *args, **kwargs):
-        c = super(EbuildMixin, self)._clone(*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')
+        query = packages.models.Keyword.objects.\
+            filter(ebuild__in = pk_keys, arch__name__in = arch_set). \
+            select_related('arch')
 
         cache_query = defaultdict(list)
         for keyword in query:
@@ -132,7 +160,9 @@ class EbuildMixin(object):#{{{
                 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 HerdsMixin(object):#{{{
     def filter(self, *args, **kwargs):
@@ -174,6 +204,6 @@ class RepositoryMixin(object):
 
 
 _gen_all_query_and_manager('Mixin', 'QuerySet', 'Manager',
-                           PackageMixin, KeywordMixin, EbuildMixin, HerdsMixin,
+                           KeywordMixin, HerdsMixin,
                            MaintainerMixin, VirtualPackageMixin,
                            RepositoryMixin)

diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py
index caa7156..aa7bd65 100644
--- a/gpackages/apps/packages/models.py
+++ b/gpackages/apps/packages/models.py
@@ -12,6 +12,7 @@ from django.core.exceptions import ValidationError
 
 validate_url = URLValidator()
 
+
 class AbstractDateTimeModel(models.Model):
     created_datetime = models.DateTimeField(auto_now_add = True)
     updated_datetime = models.DateTimeField(auto_now = True)
@@ -308,8 +309,12 @@ class PackageModel(AbstractDateTimeModel):
 
     def get_ebuilds_and_keywords(self, arch_list):
         l = []
-        for ebuild in self.ebuildmodel_set.order_by('-version', '-revision'):
-            l.extend(ebuild.get_ebuilds_and_keywords(arch_list))
+        if not hasattr(self, 'ebuilds'):
+            for ebuild in self.ebuildmodel_set.order_by('-version', '-revision'):
+                l.extend(ebuild.get_ebuilds_and_keywords(arch_list))
+        else:
+            for ebuild in self.ebuilds:
+                l.extend(ebuild.get_ebuilds_and_keywords(arch_list))
         return l
             
     class Meta:

diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
index 16c74e2..21fa07c 100644
--- a/gpackages/apps/packages/views.py
+++ b/gpackages/apps/packages/views.py
@@ -52,5 +52,5 @@ class PackagesListsView(ContextListView):
     template_name = 'packages.html'
     context_object_name = 'packages'
     queryset = PackageModel.objects.all(). \
-        select_related('virtual_package', 'virtual_package__category')
-        #prefetch_related('ebuildmodel_set')
+        select_related('virtual_package', 'virtual_package__category'). \
+        prefetch_keywords(arches)



             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=1340897674.3c76d3040d63aaaa34905be0c486c8e28ae455e1.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