diff --git a/.changeset/fuzzy-buttons-yawn.md b/.changeset/fuzzy-buttons-yawn.md new file mode 100644 index 00000000000..5b93e8721d0 --- /dev/null +++ b/.changeset/fuzzy-buttons-yawn.md @@ -0,0 +1,5 @@ +--- +"@atproto/ozone": patch +--- + +Improve indexing for "chat.bsky.moderation.getMessageContext" diff --git a/packages/ozone/src/api/chat/getMessageContext.ts b/packages/ozone/src/api/chat/getMessageContext.ts index a0e70855215..476d5a8fd54 100644 --- a/packages/ozone/src/api/chat/getMessageContext.ts +++ b/packages/ozone/src/api/chat/getMessageContext.ts @@ -19,6 +19,8 @@ export default function (server: Server, ctx: AppContext) { .selectFrom('moderation_event') .select('id') .where('subjectMessageId', '=', params.messageId) + // uses "moderation_event_message_id_idx" index + .where('subjectMessageId', 'is not', null) .where('action', '=', 'tools.ozone.moderation.defs#modEventReport') .limit(1) .executeTakeFirst() diff --git a/packages/ozone/src/db/migrations/20250211T132135150Z-moderation-event-message-partial-idx.ts b/packages/ozone/src/db/migrations/20250211T132135150Z-moderation-event-message-partial-idx.ts new file mode 100644 index 00000000000..a3edc00891d --- /dev/null +++ b/packages/ozone/src/db/migrations/20250211T132135150Z-moderation-event-message-partial-idx.ts @@ -0,0 +1,26 @@ +import { Kysely, sql } from 'kysely' + +// support lookup for chat.bsky.moderation.getMessageContext + +export async function up(db: Kysely): Promise { + // @NOTE: These queries should be run with the "CONCURRENTLY" option in + // production to avoid locking the table. This is not supported by Kysely. + await db.schema.dropIndex('moderation_event_message_id_index').execute() + await db.schema + .createIndex('moderation_event_message_id_idx') + .on('moderation_event') + // https://github.com/kysely-org/kysely/issues/302 + .expression( + sql`"subjectMessageId") WHERE ("subjectMessageId" IS NOT NULL AND "action" = 'tools.ozone.moderation.defs#modEventReport'`, + ) + .execute() +} + +export async function down(db: Kysely): Promise { + await db.schema.dropIndex('moderation_event_message_id_idx').execute() + await db.schema + .createIndex('moderation_event_message_id_index') + .on('moderation_event') + .column('subjectMessageId') + .execute() +} diff --git a/packages/ozone/src/db/migrations/index.ts b/packages/ozone/src/db/migrations/index.ts index 609f4366572..82923722c54 100644 --- a/packages/ozone/src/db/migrations/index.ts +++ b/packages/ozone/src/db/migrations/index.ts @@ -19,3 +19,4 @@ export * as _20241018T205730722Z from './20241018T205730722Z-setting' export * as _20241026T205730722Z from './20241026T205730722Z-add-hosting-status-to-subject-status' export * as _20241220T144630860Z from './20241220T144630860Z-stats-materialized-views' export * as _20250204T003647759Z from './20250204T003647759Z-add-subject-priority-score' +export * as _20250211T132135150Z from './20250211T132135150Z-moderation-event-message-partial-idx'