Files
zulip/zerver/lib/default_streams.py
Steve Howell 1156a50109 signup: Avoid bloated Stream objects for default streams.
Basically, I eliminate the use of select_all() in a query
that still makes a single round trip.  We have good test
enforcement that Django never needs to lazily fetch
objects off the Stream object. (It used to be common
to fetch stream.realm a while back, but we upgraded
bulk_add_subscription, in particular, a while back.)
2023-07-10 13:41:28 -07:00

33 lines
1.3 KiB
Python

from typing import List, Set
from zerver.lib.types import APIStreamDict
from zerver.models import DefaultStream, Stream
def get_slim_realm_default_streams(realm_id: int) -> List[Stream]:
# We really want this query to be simple and just get "thin" Stream objects
# in one round trip.
#
# The above is enforced by at least three tests that verify query counts,
# and test_query_count in test_subs.py makes sure that the query itself is
# not like 11000 bytes, which is what we had in a prior version that used
# select_related() with not arguments (and thus joined to too many tables).
#
# Please be careful about modifying this code, as it has had a history
# of performance problems.
return list(Stream.objects.filter(defaultstream__realm_id=realm_id))
def get_default_stream_ids_for_realm(realm_id: int) -> Set[int]:
return set(DefaultStream.objects.filter(realm_id=realm_id).values_list("stream_id", flat=True))
def get_default_streams_for_realm_as_dicts(realm_id: int) -> List[APIStreamDict]:
"""
Return all the default streams for a realm using a list of dictionaries sorted
by stream name.
"""
streams = get_slim_realm_default_streams(realm_id)
stream_dicts = [stream.to_dict() for stream in streams]
return sorted(stream_dicts, key=lambda stream: stream["name"])