From 2c958511c41f53fb7de49ed4662eec966e0b76a5 Mon Sep 17 00:00:00 2001
From: Dan McGee <dan@archlinux.org>
Date: Tue, 22 Jan 2013 16:48:49 -0600
Subject: Use a subquery rather than two queries in attach_maintainers

Now that we are using a database that doesn't stink, it makes more sense
to do all of the stuff we need to do down at the database level. This
helps a lot when 500+ packages are in play at a given time, such as
some of our larger rebuild todo lists.

Signed-off-by: Dan McGee <dan@archlinux.org>
---
 packages/utils.py | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/packages/utils.py b/packages/utils.py
index a72404f4..49aeb8ce 100644
--- a/packages/utils.py
+++ b/packages/utils.py
@@ -6,6 +6,7 @@ import re
 from django.core.serializers.json import DjangoJSONEncoder
 from django.db import connection
 from django.db.models import Count, Max, F
+from django.db.models.query import QuerySet
 from django.contrib.auth.models import User
 
 from main.models import Package, PackageFile, Arch, Repo
@@ -253,8 +254,11 @@ def attach_maintainers(packages):
     '''Given a queryset or something resembling it of package objects, find all
     the maintainers and attach them to the packages to prevent N+1 query
     cascading.'''
-    packages = list(packages)
-    pkgbases = {p.pkgbase for p in packages if p is not None}
+    if isinstance(packages, QuerySet):
+        pkgbases = packages.values('pkgbase')
+    else:
+        packages = list(packages)
+        pkgbases = {p.pkgbase for p in packages if p is not None}
     rels = PackageRelation.objects.filter(type=PackageRelation.MAINTAINER,
             pkgbase__in=pkgbases).values_list(
             'pkgbase', 'user_id').order_by().distinct()
-- 
cgit v1.2.3-2-g168b