diff options
author | Dan McGee <dan@archlinux.org> | 2012-04-27 15:59:00 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2012-04-27 16:12:26 +0200 |
commit | dc94eade03022ce3a5286f5e781576321a5f1653 (patch) | |
tree | 604b10eaba12f066fa6a843a4f5342a89eb11fb5 | |
parent | 3f150dcfade9443b3435309cb928f330966eb749 (diff) | |
download | archweb-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.py | 3 | ||||
-rw-r--r-- | todolists/utils.py | 8 |
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) |