# Generated by Django 5.0.6 on 2024-08-16 06:44 from django.db import connection, migrations from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.migrations.state import StateApps BATCH_SIZE = 1000 def backfill_group_size_field_for_direct_message_groups( apps: StateApps, schema_editor: BaseDatabaseSchemaEditor ) -> None: Recipient = apps.get_model("zerver", "Recipient") RECIPIENT_DIRECT_MESSAGE_GROUP = 3 direct_message_group_recipient_entries = Recipient.objects.filter( type=RECIPIENT_DIRECT_MESSAGE_GROUP ) if not direct_message_group_recipient_entries.exists(): return recipient_id_lower_bound = direct_message_group_recipient_entries.earliest("id").id max_recipient_id = Recipient.objects.latest("id").id # We would like to set the upper bound significantly past the # maximum recipient id, because it is likely that new Direct # Message Groups are created during this transaction, and their # recipient id is assigned as the one right after the max id. max_recipient_id += BATCH_SIZE while recipient_id_lower_bound <= max_recipient_id: do_backfill_group_size_field_for_direct_message_groups( recipient_id_lower_bound, min(recipient_id_lower_bound + BATCH_SIZE, max_recipient_id), ) recipient_id_lower_bound += BATCH_SIZE + 1 def do_backfill_group_size_field_for_direct_message_groups( recipient_id_lower_bound: int, recipient_id_upper_bound: int, ) -> None: with connection.cursor() as cursor: update_query = """ UPDATE zerver_huddle SET group_size = ( SELECT COUNT(*) FROM zerver_subscription WHERE zerver_subscription.recipient_id = zerver_huddle.recipient_id ) WHERE zerver_huddle.recipient_id BETWEEN %(lower_bound)s AND %(upper_bound)s AND zerver_huddle.group_size IS NULL """ cursor.execute( update_query, { "lower_bound": recipient_id_lower_bound, "upper_bound": recipient_id_upper_bound, }, ) class Migration(migrations.Migration): atomic = False dependencies = [ ("zerver", "0573_directmessagegroup_group_size"), ] operations = [ migrations.RunPython( backfill_group_size_field_for_direct_message_groups, elidable=True, reverse_code=migrations.RunPython.noop, ), ]