-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: noteテーブルのインデックス整理と配列カラムへのクエリでインデックスを使うように (#12993)
* Optimize note model index * enhance(backend): ANY()をやめる (MisskeyIO#239) * add small e2e test drive endpoint --------- Co-authored-by: まっちゃとーにゅ <[email protected]>
- Loading branch information
Showing
9 changed files
with
188 additions
and
27 deletions.
There are no files selected for viewing
24 changes: 24 additions & 0 deletions
24
packages/backend/migration/1705222772858-optimize-note-index-for-array-column.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
/* | ||
* SPDX-FileCopyrightText: syuilo and other misskey contributors | ||
* SPDX-License-Identifier: AGPL-3.0-only | ||
*/ | ||
|
||
export class OptimizeNoteIndexForArrayColumns1705222772858 { | ||
name = 'OptimizeNoteIndexForArrayColumns1705222772858' | ||
|
||
async up(queryRunner) { | ||
await queryRunner.query(`DROP INDEX "public"."IDX_796a8c03959361f97dc2be1d5c"`); | ||
await queryRunner.query(`DROP INDEX "public"."IDX_54ebcb6d27222913b908d56fd8"`); | ||
await queryRunner.query(`DROP INDEX "public"."IDX_88937d94d7443d9a99a76fa5c0"`); | ||
await queryRunner.query(`DROP INDEX "public"."IDX_51c063b6a133a9cb87145450f5"`); | ||
await queryRunner.query(`CREATE INDEX "IDX_NOTE_FILE_IDS" ON "note" using gin ("fileIds")`) | ||
} | ||
|
||
async down(queryRunner) { | ||
await queryRunner.query(`DROP INDEX "IDX_NOTE_FILE_IDS"`) | ||
await queryRunner.query(`CREATE INDEX "IDX_51c063b6a133a9cb87145450f5" ON "note" ("fileIds") `); | ||
await queryRunner.query(`CREATE INDEX "IDX_88937d94d7443d9a99a76fa5c0" ON "note" ("tags") `); | ||
await queryRunner.query(`CREATE INDEX "IDX_54ebcb6d27222913b908d56fd8" ON "note" ("mentions") `); | ||
await queryRunner.query(`CREATE INDEX "IDX_796a8c03959361f97dc2be1d5c" ON "note" ("visibleUserIds") `); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/* | ||
* SPDX-FileCopyrightText: syuilo and other misskey contributors | ||
* SPDX-License-Identifier: AGPL-3.0-only | ||
*/ | ||
|
||
process.env.NODE_ENV = 'test'; | ||
|
||
import * as assert from 'assert'; | ||
import { MiNote } from '@/models/Note.js'; | ||
import { api, initTestDb, makeStreamCatcher, post, signup, uploadFile } from '../utils.js'; | ||
import type * as misskey from 'misskey-js'; | ||
import type{ Repository } from 'typeorm' | ||
import type { Packed } from '@/misc/json-schema.js'; | ||
|
||
|
||
describe('Drive', () => { | ||
let Notes: Repository<MiNote>; | ||
|
||
let alice: misskey.entities.SignupResponse; | ||
let bob: misskey.entities.SignupResponse; | ||
|
||
beforeAll(async () => { | ||
const connection = await initTestDb(true); | ||
Notes = connection.getRepository(MiNote); | ||
alice = await signup({ username: 'alice' }); | ||
bob = await signup({ username: 'bob' }); | ||
}, 1000 * 60 * 2); | ||
|
||
test('ファイルURLからアップロードできる', async () => { | ||
// utils.js uploadUrl の処理だがAPIレスポンスも見るためここで同様の処理を書いている | ||
|
||
const marker = Math.random().toString(); | ||
|
||
const url = 'https://raw.githubusercontent.com/misskey-dev/misskey/develop/packages/backend/test/resources/Lenna.jpg' | ||
|
||
const catcher = makeStreamCatcher( | ||
alice, | ||
'main', | ||
(msg) => msg.type === 'urlUploadFinished' && msg.body.marker === marker, | ||
(msg) => msg.body.file as Packed<'DriveFile'>, | ||
10 * 1000); | ||
|
||
const res = await api('drive/files/upload-from-url', { | ||
url, | ||
marker, | ||
force: true, | ||
}, alice); | ||
|
||
const file = await catcher; | ||
|
||
assert.strictEqual(res.status, 204); | ||
assert.strictEqual(file.name, 'Lenna.jpg'); | ||
assert.strictEqual(file.type, 'image/jpeg'); | ||
}) | ||
|
||
test('ローカルからアップロードできる', async () => { | ||
// APIレスポンスを直接使用するので utils.js uploadFile が通過することで成功とする | ||
|
||
const res = await uploadFile(alice, { path: 'Lenna.jpg', name: 'テスト画像' }); | ||
|
||
assert.strictEqual(res.body?.name, 'テスト画像.jpg'); | ||
assert.strictEqual(res.body?.type, 'image/jpeg'); | ||
}) | ||
|
||
test('添付ノート一覧を取得できる', async () => { | ||
const ids = (await Promise.all([uploadFile(alice), uploadFile(alice), uploadFile(alice)])).map(elm => elm.body!.id) | ||
|
||
const note0 = await post(alice, { fileIds: [ids[0]] }); | ||
const note1 = await post(alice, { fileIds: [ids[0], ids[1]] }); | ||
|
||
const attached0 = await api('drive/files/attached-notes', { fileId: ids[0] }, alice); | ||
assert.strictEqual(attached0.body.length, 2); | ||
assert.strictEqual(attached0.body[0].id, note1.id) | ||
assert.strictEqual(attached0.body[1].id, note0.id) | ||
|
||
const attached1 = await api('drive/files/attached-notes', { fileId: ids[1] }, alice); | ||
assert.strictEqual(attached1.body.length, 1); | ||
assert.strictEqual(attached1.body[0].id, note1.id) | ||
|
||
const attached2 = await api('drive/files/attached-notes', { fileId: ids[2] }, alice); | ||
assert.strictEqual(attached2.body.length, 0) | ||
}) | ||
|
||
test('添付ノート一覧は他の人から見えない', async () => { | ||
const file = await uploadFile(alice); | ||
|
||
await post(alice, { fileIds: [file.body!.id] }); | ||
|
||
const res = await api('drive/files/attached-notes', { fileId: file.body!.id }, bob); | ||
assert.strictEqual(res.status, 400); | ||
assert.strictEqual('error' in res.body, true); | ||
|
||
}) | ||
}); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters