summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2012-04-27 15:59:00 +0200
committerDan McGee <dan@archlinux.org>2012-04-27 16:12:26 +0200
commitdc94eade03022ce3a5286f5e781576321a5f1653 (patch)
tree604b10eaba12f066fa6a843a4f5342a89eb11fb5
parent3f150dcfade9443b3435309cb928f330966eb749 (diff)
downloadarchweb-dc94eade03022ce3a5286f5e781576321a5f1653.tar.gz
archweb-dc94eade03022ce3a5286f5e781576321a5f1653.tar.xz
Incomplete-only todolists optimization
We can push this down to the database if we know in advance we only need the incomplete lists. This helps our call on the developer dashboard quite a bit; the time of the single query in question drops from >1300ms to around 40ms. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--devel/views.py3
-rw-r--r--todolists/utils.py8
2 files changed, 7 insertions, 4 deletions
diff --git a/devel/views.py b/devel/views.py
index d2ce65d..39f28a6 100644
--- a/devel/views.py
+++ b/devel/views.py
@@ -49,8 +49,7 @@ def index(request):
todopkgs = todopkgs.filter(pkg__pkgbase__in=inner_q).order_by(
'list__name', 'pkg__pkgname')
- todolists = get_annotated_todolists()
- todolists = [todolist for todolist in todolists if todolist.incomplete_count > 0]
+ todolists = get_annotated_todolists(incomplete_only=True)
signoffs = sorted(get_signoff_groups(user=request.user),
key=operator.attrgetter('pkgbase'))
diff --git a/todolists/utils.py b/todolists/utils.py
index 24101e8..94f39f7 100644
--- a/todolists/utils.py
+++ b/todolists/utils.py
@@ -3,7 +3,7 @@ from django.db.models import Count
from main.models import Todolist
-def get_annotated_todolists():
+def get_annotated_todolists(incomplete_only=False):
qs = Todolist.objects.all()
lists = qs.select_related('creator').defer(
'creator__email', 'creator__password', 'creator__is_staff',
@@ -13,8 +13,12 @@ def get_annotated_todolists():
incomplete = qs.filter(todolistpkg__complete=False).annotate(
Count('todolistpkg')).values_list('id', 'todolistpkg__count')
- # tag each list with an incomplete package count
lookup = dict(incomplete)
+
+ if incomplete_only:
+ lists = lists.filter(id__in=lookup.keys())
+
+ # tag each list with an incomplete package count
for todolist in lists:
todolist.incomplete_count = lookup.get(todolist.id, 0)