From 13696f9575ba6cbfef1865bad1c8ecafc4d2776a Mon Sep 17 00:00:00 2001 From: Luke Granger-Brown Date: Wed, 22 May 2024 10:52:58 +0000 Subject: [PATCH] Try to speed up cfp-review by getting the database to count tagged proposals Previously we were fetching every proposal containing each tag type in a separate query, where we actually just want the global count of proposals with a particular tag. --- apps/cfp_review/base.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/cfp_review/base.py b/apps/cfp_review/base.py index e79d45e70..2e89d97ac 100644 --- a/apps/cfp_review/base.py +++ b/apps/cfp_review/base.py @@ -40,7 +40,7 @@ Venue, WorkshopProposal, ) -from models.cfp_tag import Tag +from models.cfp_tag import Tag, ProposalTag from models.user import User from models.purchase import Ticket from .forms import ( @@ -188,7 +188,16 @@ def proposals(): if "reverse" in non_sort_query_string: del non_sort_query_string["reverse"] - tag_counts = {t.tag: [0, len(t.proposals)] for t in Tag.query.all()} + tag_counts = dict( + db.session + .query(Tag.tag, db.func.count(ProposalTag.c.proposal_id)) + .select_from(Tag) + .outerjoin(ProposalTag) + .group_by(Tag.tag) + .order_by(Tag.tag) + .all() + ) + tag_counts = {tag: [0, prop_count] for tag, prop_count in tag_counts.items()} for prop in proposals: for t in prop.tags: tag_counts[t.tag][0] = tag_counts[t.tag][0] + 1