Skip to content

Commit e9bebe1

Browse files
committed
Merged in [18103] from olau@iola.dk:
Prefetch a couple of things in the agenda view to reduce the number of queries for IETF 106 from about 3800 to about 235. - Legacy-Id: 18452 Note: SVN reference [18103] has been migrated to Git commit a373f1d
2 parents 21cd74a + 4678f0b commit e9bebe1

4 files changed

Lines changed: 22 additions & 17 deletions

File tree

ietf/meeting/helpers.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from tempfile import mkstemp
1010

1111
from django.http import HttpRequest, Http404
12-
from django.db.models import Max, Q, Prefetch
12+
from django.db.models import F, Max, Q, Prefetch
1313
from django.conf import settings
1414
from django.core.cache import cache
1515
from django.urls import reverse
@@ -171,13 +171,17 @@ def get_schedule_by_name(meeting, owner, name):
171171
return meeting.schedule_set.filter(name = name).first()
172172

173173
def preprocess_assignments_for_agenda(assignments_queryset, meeting, extra_prefetches=()):
174-
assignments_queryset = assignments_queryset.select_related(
175-
"timeslot", "timeslot__location", "timeslot__type",
176-
).prefetch_related(
174+
assignments_queryset = assignments_queryset.prefetch_related(
175+
'timeslot', 'timeslot__type', 'timeslot__meeting',
176+
'timeslot__location', 'timeslot__location__floorplan', 'timeslot__location__urlresource_set',
177177
Prefetch(
178178
"session",
179179
queryset=add_event_info_to_session_qs(Session.objects.all().prefetch_related(
180180
'group', 'group__charter', 'group__charter__group',
181+
Prefetch('materials',
182+
queryset=Document.objects.exclude(states__type=F("type"), states__slug='deleted').order_by('sessionpresentation__order').prefetch_related('states'),
183+
to_attr='prefetched_active_materials'
184+
)
181185
))
182186
),
183187
*extra_prefetches
@@ -222,6 +226,12 @@ def preprocess_assignments_for_agenda(assignments_queryset, meeting, extra_prefe
222226
if a.session and a.session.historic_group and a.session.historic_group.parent_id:
223227
a.session.historic_group.historic_parent = parent_replacements.get(a.session.historic_group.parent_id)
224228

229+
for d in a.session.prefetched_active_materials:
230+
# make sure these are precomputed with the meeting instead
231+
# of having to look it up
232+
d.get_href(meeting=meeting)
233+
d.get_versionless_href(meeting=meeting)
234+
225235
return assignments
226236

227237
def read_session_file(type, num, doc):

ietf/meeting/models.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -398,14 +398,14 @@ def functional_display_name(self):
398398
return self.functional_name
399399
# audio stream support
400400
def audio_stream_url(self):
401-
urlresource = self.urlresource_set.filter(name_id='audiostream').first()
402-
return urlresource.url if urlresource else None
401+
urlresources = [ur for ur in self.urlresource_set.all() if ur.name_id == 'audiostream']
402+
return urlresources[0].url if urlresources else None
403403
def video_stream_url(self):
404-
urlresource = self.urlresource_set.filter(name_id__in=['meetecho', ]).first()
405-
return urlresource.url if urlresource else None
404+
urlresources = [ur for ur in self.urlresource_set.all() if ur.name_id in ['meetecho']]
405+
return urlresources[0].url if urlresources else None
406406
def webex_url(self):
407-
urlresource = self.urlresource_set.filter(name_id__in=['webex', ]).first()
408-
return urlresource.url if urlresource else None
407+
urlresources = [ur for ur in self.urlresource_set.all() if ur.name_id in ['webex']]
408+
return urlresources[0].url if urlresources else None
409409
#
410410
class Meta:
411411
ordering = ["-id"]

ietf/meeting/views.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
from django.core.exceptions import ValidationError
3333
from django.core.validators import URLValidator
3434
from django.urls import reverse,reverse_lazy
35-
from django.db.models import F, Min, Max, Prefetch, Q
35+
from django.db.models import F, Min, Max, Q
3636
from django.forms.models import modelform_factory, inlineformset_factory
3737
from django.template import TemplateDoesNotExist
3838
from django.template.loader import render_to_string
@@ -1319,11 +1319,6 @@ def agenda_json(request, num=None ):
13191319
# Update the assignments with historic information, i.e., valid at the
13201320
# time of the meeting
13211321
assignments = preprocess_assignments_for_agenda(assignments, meeting, extra_prefetches=[
1322-
# sadly, these prefetches aren't enough to get rid of all implicit queries below
1323-
Prefetch("session__materials",
1324-
queryset=Document.objects.exclude(states__type=F("type"),states__slug='deleted').select_related("group").order_by("sessionpresentation__order"),
1325-
to_attr="prefetched_active_materials",
1326-
),
13271322
"session__materials__docevent_set",
13281323
"session__sessionpresentation_set",
13291324
"timeslot__meeting"

ietf/templates/meeting/edit_meeting_schedule_session.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div id="session{{ session.pk }}" class="session {% if not session.group.parent.scheduling_color %}untoggleable{% endif %} {% if session.parent_acronym %}parent-{{ session.parent_acronym }}{% endif %}" style="width:{{ session.layout_width }}em;" data-duration="{{ session.requested_duration.total_seconds }}" {% if session.attendees != None %}data-attendees="{{ session.attendees }}"{% endif %}>
1+
<div id="session{{ session.pk }}" class="session {% if not session.group.parent.scheduling_color %}untoggleable{% endif %} {% if session.parent_acronym %}parent-{{ session.parent_acronym }}{% endif %} {% if session.is_tombstone %}tombstone{% endif %}" style="width:{{ session.layout_width }}em;" data-duration="{{ session.requested_duration.total_seconds }}" {% if session.attendees != None %}data-attendees="{{ session.attendees }}"{% endif %}>
22
<div class="session-label {% if session.group and session.group.is_bof %}bof-session{% endif %}">
33
{{ session.scheduling_label }}
44
</div>

0 commit comments

Comments
 (0)