Compare commits

...

5 Commits

Author SHA1 Message Date
fly_mc
a95c96f25f change migrate
Some checks failed
Check copyright year / check_copyright_year (push) Has been cancelled
Dockle / dockle (push) Has been cancelled
Check SPDX-License-Identifier / check-spdx-license-id (push) Has been cancelled
Lint / pnpm_install (push) Has been cancelled
Storybook / build (push) Has been cancelled
Test (backend) / unit (20.16.0) (push) Has been cancelled
Test (backend) / e2e (20.16.0) (push) Has been cancelled
Test (frontend) / vitest (20.16.0) (push) Has been cancelled
Test (frontend) / e2e (chrome, 20.16.0) (push) Has been cancelled
Test (production install and build) / production (20.16.0) (push) Has been cancelled
Test (backend) / validate-api-json (20.16.0) (push) Has been cancelled
Lint / lint (misskey-reversi) (push) Has been cancelled
Lint / lint (backend) (push) Has been cancelled
Lint / lint (frontend) (push) Has been cancelled
Lint / lint (frontend-embed) (push) Has been cancelled
Lint / lint (frontend-shared) (push) Has been cancelled
Lint / lint (misskey-bubble-game) (push) Has been cancelled
Lint / lint (misskey-js) (push) Has been cancelled
Lint / lint (sw) (push) Has been cancelled
Lint / typecheck (backend) (push) Has been cancelled
Lint / typecheck (misskey-js) (push) Has been cancelled
Lint / typecheck (sw) (push) Has been cancelled
2024-09-30 23:05:36 +08:00
fly_mc
f905b1a9d1 add cw index 2024-09-30 23:05:36 +08:00
fly_mc
c4760bffa4 remove old patches 2024-09-30 23:05:36 +08:00
fly_mc
adc0531e48 use PGroonga 2024-09-30 23:05:36 +08:00
871e0f8efd Default disable CondensedLine 2024-09-30 23:05:36 +08:00
8 changed files with 34 additions and 6 deletions

View File

@ -0,0 +1,18 @@
export class Pgroonga1727542814599 {
name = 'Pgroonga1727542814599'
async up(queryRunner) {
await queryRunner.query(`CREATE INDEX "IDX_f27f5d88941e57442be75ba9c8" ON "note" USING "pgroonga" ("text")`);
await queryRunner.query(`CREATE INDEX "IDX_7cc8d9b0ee7861b4e5dc86ad85" ON "note" USING "pgroonga" ("cw" pgroonga_varchar_full_text_search_ops_v2)`);
await queryRunner.query(`CREATE INDEX "IDX_065d4d8f3b5adb4a08841eae3c" ON "user" USING "pgroonga" ("name" pgroonga_varchar_full_text_search_ops_v2)`);
await queryRunner.query(`CREATE INDEX "IDX_fcb770976ff8240af5799e3ffc" ON "user_profile" USING "pgroonga" ("description" pgroonga_varchar_full_text_search_ops_v2) `);
}
async down(queryRunner) {
await queryRunner.query(`DROP INDEX "public"."IDX_f27f5d88941e57442be75ba9c8"`);
await queryRunner.query(`DROP INDEX "public"."IDX_7cc8d9b0ee7861b4e5dc86ad85"`);
await queryRunner.query(`DROP INDEX "public"."IDX_065d4d8f3b5adb4a08841eae3c"`);
await queryRunner.query(`DROP INDEX "public"."IDX_fcb770976ff8240af5799e3ffc"`);
}
}

View File

@ -215,7 +215,7 @@ export class SearchService {
} }
query query
.andWhere('note.text ILIKE :q', { q: `%${ sqlLikeEscape(q) }%` }) .andWhere('note.text &@~ :q', { q: sqlLikeEscape(q) })
.innerJoinAndSelect('note.user', 'user') .innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('note.reply', 'reply') .leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote') .leftJoinAndSelect('note.renote', 'renote')

View File

@ -50,6 +50,7 @@ export class MiNote {
public threadId: string | null; public threadId: string | null;
// TODO: varcharにしたい // TODO: varcharにしたい
@Index() // USING pgroonga
@Column('text', { @Column('text', {
nullable: true, nullable: true,
}) })
@ -60,6 +61,7 @@ export class MiNote {
}) })
public name: string | null; public name: string | null;
@Index() // USING pgroonga pgroonga_varchar_full_text_search_ops_v2
@Column('varchar', { @Column('varchar', {
length: 512, nullable: true, length: 512, nullable: true,
}) })

View File

@ -49,6 +49,7 @@ export class MiUser {
}) })
public usernameLower: string; public usernameLower: string;
@Index() // USING pgroonga pgroonga_varchar_full_text_search_ops_v2
@Column('varchar', { @Column('varchar', {
length: 128, nullable: true, length: 128, nullable: true,
comment: 'The name of the User.', comment: 'The name of the User.',

View File

@ -36,6 +36,7 @@ export class MiUserProfile {
}) })
public birthday: string | null; public birthday: string | null;
@Index() // USING pgroonga pgroonga_varchar_full_text_search_ops_v2
@Column('varchar', { @Column('varchar', {
length: 2048, nullable: true, length: 2048, nullable: true,
comment: 'The description (bio) of the User.', comment: 'The description (bio) of the User.',

View File

@ -31,6 +31,11 @@ export const meta = {
code: 'UNAVAILABLE', code: 'UNAVAILABLE',
id: '0b44998d-77aa-4427-80d0-d2c9b8523011', id: '0b44998d-77aa-4427-80d0-d2c9b8523011',
}, },
noSuchNote: {
message: 'Query is empty.',
code: 'QUERY_IS_EMPTY',
id: 'd0410b51-f409-4667-8118-cfe999e453c3',
},
}, },
} as const; } as const;
@ -62,6 +67,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
private roleService: RoleService, private roleService: RoleService,
) { ) {
super(meta, paramDef, async (ps, me) => { super(meta, paramDef, async (ps, me) => {
if (ps.query.trim().length === 0) throw new ApiError(meta.errors.noSuchNote);
const policies = await this.roleService.getUserPolicies(me ? me.id : null); const policies = await this.roleService.getUserPolicies(me ? me.id : null);
if (!policies.canSearchNotes) { if (!policies.canSearchNotes) {
throw new ApiError(meta.errors.unavailable); throw new ApiError(meta.errors.unavailable);

View File

@ -63,12 +63,12 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
const nameQuery = this.usersRepository.createQueryBuilder('user') const nameQuery = this.usersRepository.createQueryBuilder('user')
.where(new Brackets(qb => { .where(new Brackets(qb => {
qb.where('user.name ILIKE :query', { query: '%' + sqlLikeEscape(ps.query) + '%' }); qb.where('user.name &@~ :query', { query: ps.query });
if (isUsername) { if (isUsername) {
qb.orWhere('user.usernameLower LIKE :username', { username: sqlLikeEscape(ps.query.replace('@', '').toLowerCase()) + '%' }); qb.orWhere('user.usernameLower LIKE :username', { username: sqlLikeEscape(ps.query.replace('@', '').toLowerCase()) + '%' });
} else if (this.userEntityService.validateLocalUsername(ps.query)) { // Also search username if it qualifies as username } else if (userEntityService.validateLocalUsername(ps.query)) { // Also search username if it qualifies as username
qb.orWhere('user.usernameLower LIKE :username', { username: '%' + sqlLikeEscape(ps.query.toLowerCase()) + '%' }); qb.orWhere('user.usernameLower LIKE :username', { username: ps.query.toLowerCase() + '%' });
} }
})) }))
.andWhere(new Brackets(qb => { .andWhere(new Brackets(qb => {
@ -93,7 +93,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
if (users.length < ps.limit) { if (users.length < ps.limit) {
const profQuery = this.userProfilesRepository.createQueryBuilder('prof') const profQuery = this.userProfilesRepository.createQueryBuilder('prof')
.select('prof.userId') .select('prof.userId')
.where('prof.description ILIKE :query', { query: '%' + sqlLikeEscape(ps.query) + '%' }); .where('prof.description &@~ :query', { query: ps.query });
if (ps.origin === 'local') { if (ps.origin === 'local') {
profQuery.andWhere('prof.userHost IS NULL'); profQuery.andWhere('prof.userHost IS NULL');

View File

@ -394,7 +394,7 @@ export const defaultStore = markRaw(new Storage('base', {
}, },
enableCondensedLine: { enableCondensedLine: {
where: 'device', where: 'device',
default: true, default: false,
}, },
additionalUnicodeEmojiIndexes: { additionalUnicodeEmojiIndexes: {
where: 'device', where: 'device',