diff --git a/migration/1621479946000-add-note-indexes.ts b/migration/1621479946000-add-note-indexes.ts new file mode 100644 index 000000000..53d49964a --- /dev/null +++ b/migration/1621479946000-add-note-indexes.ts @@ -0,0 +1,16 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class addNoteIndexes1621479946000 implements MigrationInterface { + name = 'addNoteIndexes1621479946000' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE INDEX "IDX_NOTE_MENTIONS" ON "note" USING gin ("mentions")`, undefined); + await queryRunner.query(`CREATE INDEX "IDX_NOTE_VISIBLE_USER_IDS" ON "note" USING gin ("visibleUserIds")`, undefined); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "IDX_NOTE_MENTIONS"`, undefined); + await queryRunner.query(`DROP INDEX "IDX_NOTE_VISIBLE_USER_IDS"`, undefined); + } + +} diff --git a/src/models/entities/note.ts b/src/models/entities/note.ts index 2be7d2b33..9a8553263 100644 --- a/src/models/entities/note.ts +++ b/src/models/entities/note.ts @@ -7,6 +7,8 @@ import { Channel } from './channel'; @Entity() @Index('IDX_NOTE_TAGS', { synchronize: false }) +@Index('IDX_NOTE_MENTIONS', { synchronize: false }) +@Index('IDX_NOTE_VISIBLE_USER_IDS', { synchronize: false }) export class Note { @PrimaryColumn(id()) public id: string; diff --git a/src/server/api/common/generate-visibility-query.ts b/src/server/api/common/generate-visibility-query.ts index 72ed1c46e..00a50f821 100644 --- a/src/server/api/common/generate-visibility-query.ts +++ b/src/server/api/common/generate-visibility-query.ts @@ -22,7 +22,7 @@ export function generateVisibilityQuery(q: SelectQueryBuilder, me?: { id: U // または 自分自身 .orWhere('note.userId = :userId1', { userId1: me.id }) // または 自分宛て - .orWhere(':userId2 = ANY(note.visibleUserIds)', { userId2: me.id }) + .orWhere(`'{"${me.id}"}' <@ note.visibleUserIds`) .orWhere(new Brackets(qb => { qb // または フォロワー宛ての投稿であり、 .where('note.visibility = \'followers\'') diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts index 34936c9b5..dddd08eee 100644 --- a/src/server/api/endpoints/notes/mentions.ts +++ b/src/server/api/endpoints/notes/mentions.ts @@ -60,8 +60,8 @@ export default define(meta, async (ps, user) => { const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId) .andWhere(new Brackets(qb => { qb - .where(`:meId = ANY(note.mentions)`, { meId: user.id }) - .orWhere(`:meId = ANY(note.visibleUserIds)`, { meId: user.id }); + .where(`'{"${user.id}"}' <@ note.mentions`) + .orWhere(`'{"${user.id}"}' <@ note.visibleUserIds`); })) .innerJoinAndSelect('note.user', 'user') .leftJoinAndSelect('note.reply', 'reply')