From 1d620eba49d117b2c2842da442bb1e28ce085631 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Mon, 26 Feb 2024 13:57:28 +0000 Subject: [PATCH] * Replace tsvector generated column with triggers. * reason: due to typeorm generated column metadata bug --- .../src/core/page/entities/page.entity.ts | 5 ++-- .../1706450034470-AddTsvectorColumn.ts | 13 +++++++++ .../1706450034471-AddTsvectorTrigger.ts | 28 +++++++++++++++++++ .../1706453158729-AddIndexTSVColumn.ts | 5 ++-- 4 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 apps/server/src/database/migrations/1706450034470-AddTsvectorColumn.ts create mode 100644 apps/server/src/database/migrations/1706450034471-AddTsvectorTrigger.ts diff --git a/apps/server/src/core/page/entities/page.entity.ts b/apps/server/src/core/page/entities/page.entity.ts index e1820177..0067e180 100644 --- a/apps/server/src/core/page/entities/page.entity.ts +++ b/apps/server/src/core/page/entities/page.entity.ts @@ -8,6 +8,7 @@ import { JoinColumn, OneToMany, DeleteDateColumn, + Index, } from 'typeorm'; import { User } from '../../user/entities/user.entity'; import { Workspace } from '../../workspace/entities/workspace.entity'; @@ -15,6 +16,7 @@ import { Comment } from '../../comment/entities/comment.entity'; import { PageHistory } from './page-history.entity'; @Entity('pages') +@Index('pages_tsv_idx', ['tsv']) export class Page { @PrimaryGeneratedColumn('uuid') id: string; @@ -36,9 +38,6 @@ export class Page { @Column({ type: 'tsvector', - generatedType: 'STORED', - asExpression: - "setweight(to_tsvector('english', coalesce(pages.title, '')), 'A') || setweight(to_tsvector('english', coalesce(pages.\"textContent\", '')), 'B')", select: false, nullable: true, }) diff --git a/apps/server/src/database/migrations/1706450034470-AddTsvectorColumn.ts b/apps/server/src/database/migrations/1706450034470-AddTsvectorColumn.ts new file mode 100644 index 00000000..d335dba6 --- /dev/null +++ b/apps/server/src/database/migrations/1706450034470-AddTsvectorColumn.ts @@ -0,0 +1,13 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddTsvectorColumn1706450034470 implements MigrationInterface { + name = 'AddTsvectorColumn1706450034470'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "pages" ADD "tsv" tsvector`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "pages" DROP COLUMN "tsv"`); + } +} diff --git a/apps/server/src/database/migrations/1706450034471-AddTsvectorTrigger.ts b/apps/server/src/database/migrations/1706450034471-AddTsvectorTrigger.ts new file mode 100644 index 00000000..f0b2c744 --- /dev/null +++ b/apps/server/src/database/migrations/1706450034471-AddTsvectorTrigger.ts @@ -0,0 +1,28 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddTsvectorTrigger1706450034471 implements MigrationInterface { + name = 'AddTsvectorTrigger1706450034471'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + CREATE FUNCTION pages_tsvector_trigger() RETURNS trigger AS $$ + begin + new.tsv := + setweight(to_tsvector('english', coalesce(new.title, '')), 'A') || + setweight(to_tsvector('english', coalesce(new.\"textContent\", '')), 'B'); + return new; + end; + $$ LANGUAGE plpgsql; + `); + + await queryRunner.query(` + CREATE TRIGGER pages_tsvector_update BEFORE INSERT OR UPDATE + ON pages FOR EACH ROW EXECUTE FUNCTION pages_tsvector_trigger(); + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TRIGGER pages_tsvector_update ON Pages`); + await queryRunner.query(`DROP FUNCTION pages_tsvector_trigger`); + } +} diff --git a/apps/server/src/database/migrations/1706453158729-AddIndexTSVColumn.ts b/apps/server/src/database/migrations/1706453158729-AddIndexTSVColumn.ts index 4ecb2520..22dfd584 100644 --- a/apps/server/src/database/migrations/1706453158729-AddIndexTSVColumn.ts +++ b/apps/server/src/database/migrations/1706453158729-AddIndexTSVColumn.ts @@ -4,10 +4,11 @@ export class AddIndexTSVColumn1706453158729 implements MigrationInterface { name = 'AddIndexTSVColumn1706453158729' public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE INDEX pages_tsv_index ON pages USING GIN ("tsv");`); + await queryRunner.query(`DROP INDEX IF EXISTS pages_tsv_idx;`); + await queryRunner.query(`CREATE INDEX pages_tsv_idx ON pages USING GIN ("tsv");`); } public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DROP INDEX IF EXISTS pages_tsv_index;`); + await queryRunner.query(`DROP INDEX IF EXISTS pages_tsv_idx;`); } }