backend: improve removeMentionedRemoteUsersColumn revert query
ci/woodpecker/push/lint-foundkey-js Pipeline was successful Details
ci/woodpecker/push/lint-client Pipeline was successful Details
ci/woodpecker/push/lint-backend Pipeline was successful Details
ci/woodpecker/push/build Pipeline was successful Details
ci/woodpecker/push/lint-sw Pipeline was successful Details
ci/woodpecker/pr/build Pipeline was successful Details
ci/woodpecker/pr/lint-backend Pipeline was successful Details
ci/woodpecker/pr/lint-client Pipeline was successful Details
ci/woodpecker/pr/lint-foundkey-js Pipeline was successful Details
ci/woodpecker/pr/lint-sw Pipeline was successful Details
ci/woodpecker/pr/test Pipeline was successful Details
ci/woodpecker/push/test Pipeline was successful Details

This is an optimized version made by Volpeon that should run faster if
the instance has a lot of notes.

See <https://is-a.wyvern.rip/notes/9habqldl6j> for a comparison of the
EXPLAIN ANALYZE of the old and new queries.

Co-authored-by: Volpeon <git@volpeon.ink>
This commit is contained in:
Norm 2023-07-17 12:15:15 -04:00
parent 456a86af8d
commit de7c94a13e
Signed by: norm
GPG Key ID: 41288320096BE045
1 changed files with 9 additions and 1 deletions

View File

@ -7,6 +7,14 @@ export class removeMentionedRemoteUsersColumn1661376843000 {
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "note" ADD "mentionedRemoteUsers" TEXT NOT NULL DEFAULT '[]'::text`);
await queryRunner.query(`UPDATE "note" SET "mentionedRemoteUsers" = (SELECT COALESCE(json_agg(row_to_json("data"))::text, '[]') FROM (SELECT "url", "uri", "username", "host" FROM "user" JOIN "user_profile" ON "user"."id" = "user_profile". "userId" WHERE "user"."host" IS NOT NULL AND "user"."id" = ANY("note"."mentions")) AS "data")`);
await queryRunner.query(`CREATE TEMP TABLE IF NOT EXISTS "temp_mentions" AS
SELECT "id", "url", "uri", "username", "host"
FROM "user"
JOIN "user_profile" ON "user"."id" = "user_profile". "userId" WHERE "user"."host" IS NOT NULL`);
await queryRunner.query(`CREATE UNIQUE INDEX "temp_mentions_id" ON "temp_mentions"("id")`);
await queryRunner.query(`UPDATE "note" SET "mentionedRemoteUsers" = (
SELECT COALESCE(json_agg(row_to_json("data")::jsonb - 'id')::text, '[]') FROM "temp_mentions" AS "data"
WHERE "data"."id" = ANY("note"."mentions")
)`);
}
}