Skip to content

Commit 89afd5e

Browse files
Merge pull request #1717 from learning-unlimited/catalog-query-2
Change catalog _num_students subquery to a faster aggregate
2 parents 61b4675 + 72453dd commit 89afd5e

File tree

1 file changed

+5
-7
lines changed

1 file changed

+5
-7
lines changed

esp/esp/program/models/class_.py

+5-7
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
from django.conf import settings
4242
from django.db import models
4343
from django.db.models.query import Q
44-
from django.db.models import signals
44+
from django.db.models import signals, Sum
4545
from django.db.models.manager import Manager
4646
from django.utils.datastructures import SortedDict
4747
from django.template.loader import render_to_string
@@ -209,20 +209,18 @@ def catalog_cached(self, program, ts=None, force_all=False, initial_queryset=Non
209209

210210
if ts is not None:
211211
classes = classes.filter(sections__meeting_times=ts)
212+
213+
classes = classes.annotate(_num_students=Sum('sections__enrolled_students'))
212214

213215
# Retrieve the content type for finding class documents (generic relation)
214216
content_type_id = ContentType.objects.get_for_model(ClassSubject).id
215217

216-
select = SortedDict([( '_num_students', 'SELECT COUNT(DISTINCT "program_studentregistration"."user_id") FROM "program_studentregistration", "program_classsection" WHERE ("program_studentregistration"."relationship_id" = %s AND "program_studentregistration"."section_id" = "program_classsection"."id" AND "program_classsection"."parent_class_id" = "program_class"."id" AND ("program_studentregistration"."start_date" IS NULL OR "program_studentregistration"."start_date" <= %s) AND ("program_studentregistration"."end_date" IS NULL OR "program_studentregistration"."end_date" >= %s))'),
217-
('teacher_ids', 'SELECT list(DISTINCT espuser_id) FROM program_class_teachers Where program_class_teachers.classsubject_id=program_class.id'),
218+
select = SortedDict([('teacher_ids', 'SELECT list(DISTINCT espuser_id) FROM program_class_teachers Where program_class_teachers.classsubject_id=program_class.id'),
218219
('media_count', 'SELECT COUNT(*) FROM "qsdmedia_media" WHERE ("qsdmedia_media"."owner_id" = "program_class"."id") AND ("qsdmedia_media"."owner_type_id" = %s)'),
219220
('_index_qsd', 'SELECT list("qsd_quasistaticdata"."id") FROM "qsd_quasistaticdata" WHERE ("qsd_quasistaticdata"."name" = \'learn:index\' AND "qsd_quasistaticdata"."url" LIKE %s AND "qsd_quasistaticdata"."url" SIMILAR TO %s || "program_class"."id" || %s)'),
220221
('_studentapps_count', 'SELECT COUNT(*) FROM "program_studentappquestion" WHERE ("program_studentappquestion"."subject_id" = "program_class"."id")')])
221222

222-
select_params = [ enrolled_type.id,
223-
now,
224-
now,
225-
content_type_id,
223+
select_params = [ content_type_id,
226224
'%/Classes/%',
227225
'%[A-Z]',
228226
'/%',

0 commit comments

Comments
 (0)