mirror of
https://github.com/zulip/zulip.git
synced 2025-11-15 19:31:58 +00:00
actions: Split out zerver.lib.user_message.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
(cherry picked from commit 05195c02c1)
This commit is contained in:
committed by
Tim Abbott
parent
36fa5e0385
commit
f3c9a5019b
@@ -36,7 +36,6 @@ from django.utils.timezone import now as timezone_now
|
|||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
from django.utils.translation import gettext_lazy
|
from django.utils.translation import gettext_lazy
|
||||||
from django.utils.translation import override as override_language
|
from django.utils.translation import override as override_language
|
||||||
from psycopg2.extras import execute_values
|
|
||||||
from psycopg2.sql import SQL
|
from psycopg2.sql import SQL
|
||||||
from typing_extensions import TypedDict
|
from typing_extensions import TypedDict
|
||||||
|
|
||||||
@@ -200,6 +199,7 @@ from zerver.lib.user_groups import (
|
|||||||
create_user_group,
|
create_user_group,
|
||||||
get_system_user_group_for_user,
|
get_system_user_group_for_user,
|
||||||
)
|
)
|
||||||
|
from zerver.lib.user_message import UserMessageLite, bulk_insert_ums
|
||||||
from zerver.lib.user_mutes import add_user_mute, get_muting_users, get_user_mutes
|
from zerver.lib.user_mutes import add_user_mute, get_muting_users, get_user_mutes
|
||||||
from zerver.lib.user_status import update_user_status
|
from zerver.lib.user_status import update_user_status
|
||||||
from zerver.lib.user_topics import (
|
from zerver.lib.user_topics import (
|
||||||
@@ -2350,22 +2350,6 @@ def do_send_messages(
|
|||||||
return [send_request.message.id for send_request in send_message_requests]
|
return [send_request.message.id for send_request in send_message_requests]
|
||||||
|
|
||||||
|
|
||||||
class UserMessageLite:
|
|
||||||
"""
|
|
||||||
The Django ORM is too slow for bulk operations. This class
|
|
||||||
is optimized for the simple use case of inserting a bunch of
|
|
||||||
rows into zerver_usermessage.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, user_profile_id: int, message_id: int, flags: int) -> None:
|
|
||||||
self.user_profile_id = user_profile_id
|
|
||||||
self.message_id = message_id
|
|
||||||
self.flags = flags
|
|
||||||
|
|
||||||
def flags_list(self) -> List[str]:
|
|
||||||
return UserMessage.flags_list_for_flags(self.flags)
|
|
||||||
|
|
||||||
|
|
||||||
def create_user_messages(
|
def create_user_messages(
|
||||||
message: Message,
|
message: Message,
|
||||||
rendering_result: MessageRenderingResult,
|
rendering_result: MessageRenderingResult,
|
||||||
@@ -2441,29 +2425,6 @@ def create_user_messages(
|
|||||||
return user_messages
|
return user_messages
|
||||||
|
|
||||||
|
|
||||||
def bulk_insert_ums(ums: List[UserMessageLite]) -> None:
|
|
||||||
"""
|
|
||||||
Doing bulk inserts this way is much faster than using Django,
|
|
||||||
since we don't have any ORM overhead. Profiling with 1000
|
|
||||||
users shows a speedup of 0.436 -> 0.027 seconds, so we're
|
|
||||||
talking about a 15x speedup.
|
|
||||||
"""
|
|
||||||
if not ums:
|
|
||||||
return
|
|
||||||
|
|
||||||
vals = [(um.user_profile_id, um.message_id, um.flags) for um in ums]
|
|
||||||
query = SQL(
|
|
||||||
"""
|
|
||||||
INSERT into
|
|
||||||
zerver_usermessage (user_profile_id, message_id, flags)
|
|
||||||
VALUES %s
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
|
|
||||||
with connection.cursor() as cursor:
|
|
||||||
execute_values(cursor.cursor, query, vals)
|
|
||||||
|
|
||||||
|
|
||||||
def verify_submessage_sender(
|
def verify_submessage_sender(
|
||||||
*,
|
*,
|
||||||
message_id: int,
|
message_id: int,
|
||||||
|
|||||||
@@ -16,12 +16,7 @@ from psycopg2.extras import execute_values
|
|||||||
from psycopg2.sql import SQL, Identifier
|
from psycopg2.sql import SQL, Identifier
|
||||||
|
|
||||||
from analytics.models import RealmCount, StreamCount, UserCount
|
from analytics.models import RealmCount, StreamCount, UserCount
|
||||||
from zerver.lib.actions import (
|
from zerver.lib.actions import do_change_avatar_fields, do_change_realm_plan_type
|
||||||
UserMessageLite,
|
|
||||||
bulk_insert_ums,
|
|
||||||
do_change_avatar_fields,
|
|
||||||
do_change_realm_plan_type,
|
|
||||||
)
|
|
||||||
from zerver.lib.avatar_hash import user_avatar_path_from_ids
|
from zerver.lib.avatar_hash import user_avatar_path_from_ids
|
||||||
from zerver.lib.bulk_create import bulk_create_users, bulk_set_users_or_streams_recipient_fields
|
from zerver.lib.bulk_create import bulk_create_users, bulk_set_users_or_streams_recipient_fields
|
||||||
from zerver.lib.export import DATE_FIELDS, Field, Path, Record, TableData, TableName
|
from zerver.lib.export import DATE_FIELDS, Field, Path, Record, TableData, TableName
|
||||||
@@ -33,6 +28,7 @@ from zerver.lib.streams import render_stream_description
|
|||||||
from zerver.lib.timestamp import datetime_to_timestamp
|
from zerver.lib.timestamp import datetime_to_timestamp
|
||||||
from zerver.lib.upload import BadImageError, get_bucket, sanitize_name, upload_backend
|
from zerver.lib.upload import BadImageError, get_bucket, sanitize_name, upload_backend
|
||||||
from zerver.lib.user_groups import create_system_user_groups_for_realm
|
from zerver.lib.user_groups import create_system_user_groups_for_realm
|
||||||
|
from zerver.lib.user_message import UserMessageLite, bulk_insert_ums
|
||||||
from zerver.lib.utils import generate_api_key, process_list_in_batches
|
from zerver.lib.utils import generate_api_key, process_list_in_batches
|
||||||
from zerver.models import (
|
from zerver.models import (
|
||||||
AlertWord,
|
AlertWord,
|
||||||
|
|||||||
46
zerver/lib/user_message.py
Normal file
46
zerver/lib/user_message.py
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
from typing import List
|
||||||
|
|
||||||
|
from django.db import connection
|
||||||
|
from psycopg2.extras import execute_values
|
||||||
|
from psycopg2.sql import SQL
|
||||||
|
|
||||||
|
from zerver.models import UserMessage
|
||||||
|
|
||||||
|
|
||||||
|
class UserMessageLite:
|
||||||
|
"""
|
||||||
|
The Django ORM is too slow for bulk operations. This class
|
||||||
|
is optimized for the simple use case of inserting a bunch of
|
||||||
|
rows into zerver_usermessage.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, user_profile_id: int, message_id: int, flags: int) -> None:
|
||||||
|
self.user_profile_id = user_profile_id
|
||||||
|
self.message_id = message_id
|
||||||
|
self.flags = flags
|
||||||
|
|
||||||
|
def flags_list(self) -> List[str]:
|
||||||
|
return UserMessage.flags_list_for_flags(self.flags)
|
||||||
|
|
||||||
|
|
||||||
|
def bulk_insert_ums(ums: List[UserMessageLite]) -> None:
|
||||||
|
"""
|
||||||
|
Doing bulk inserts this way is much faster than using Django,
|
||||||
|
since we don't have any ORM overhead. Profiling with 1000
|
||||||
|
users shows a speedup of 0.436 -> 0.027 seconds, so we're
|
||||||
|
talking about a 15x speedup.
|
||||||
|
"""
|
||||||
|
if not ums:
|
||||||
|
return
|
||||||
|
|
||||||
|
vals = [(um.user_profile_id, um.message_id, um.flags) for um in ums]
|
||||||
|
query = SQL(
|
||||||
|
"""
|
||||||
|
INSERT into
|
||||||
|
zerver_usermessage (user_profile_id, message_id, flags)
|
||||||
|
VALUES %s
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
with connection.cursor() as cursor:
|
||||||
|
execute_values(cursor.cursor, query, vals)
|
||||||
Reference in New Issue
Block a user