From dfadbcd3bc951f0861358d330757079b1b16b154 Mon Sep 17 00:00:00 2001 From: Steve Howell Date: Fri, 2 Nov 2018 18:17:07 +0000 Subject: [PATCH] bugdown: Avoid ORM when there are no group names. This change avoids hitting the Django ORM when we don't find any possible group mentions in the message content. Django doesn't necessarily actually hit the database, but it's still slow and shows up in profiles. --- zerver/lib/bugdown/__init__.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/zerver/lib/bugdown/__init__.py b/zerver/lib/bugdown/__init__.py index e34f4c4424..d17dd1d951 100644 --- a/zerver/lib/bugdown/__init__.py +++ b/zerver/lib/bugdown/__init__.py @@ -1846,12 +1846,22 @@ class MentionData: row['id']: row for row in self.full_name_info.values() } + self.init_user_group_data(realm_id=realm_id, content=content) + def init_user_group_data(self, + realm_id: int, + content: str) -> None: user_group_names = possible_user_group_mentions(content) self.user_group_name_info = get_user_group_name_info(realm_id, user_group_names) - group_ids = [group.id for group in self.user_group_name_info.values()] - membership = UserGroupMembership.objects.filter(user_group_id__in=group_ids) self.user_group_members = defaultdict(list) # type: Dict[int, List[int]] + group_ids = [group.id for group in self.user_group_name_info.values()] + + if not group_ids: + # Early-return to avoid the cost of hitting the ORM, + # which shows up in profiles. + return + + membership = UserGroupMembership.objects.filter(user_group_id__in=group_ids) for info in membership.values('user_group_id', 'user_profile_id'): group_id = info['user_group_id'] user_profile_id = info['user_profile_id']