From ee5f1918df447fc5cbe6cab6805a3950cc0e07b9 Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:38:46 -0400 Subject: [PATCH 1/6] turn it off and back on --- server/src/migrations/1718486162779-AddFaceSearchRelation.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts index 5bf3fcd97b1ba..ab4ea7e127606 100644 --- a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts +++ b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts @@ -24,6 +24,9 @@ export class AddFaceSearchRelation1718486162779 implements MigrationInterface { await queryRunner.query(`ALTER TABLE asset_faces DROP COLUMN "embedding"`); + await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE real[]`); + await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE vector(512)`); + await queryRunner.query(` CREATE INDEX face_index ON face_search USING hnsw (embedding vector_cosine_ops) From 43f18685980f090ad2d1811b43769ee2b773cc24 Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Wed, 3 Jul 2024 19:00:05 -0400 Subject: [PATCH 2/6] handle missing smart search embedding column --- .../src/migrations/1718486162779-AddFaceSearchRelation.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts index ab4ea7e127606..0cf900e91c194 100644 --- a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts +++ b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts @@ -15,6 +15,7 @@ export class AddFaceSearchRelation1718486162779 implements MigrationInterface { embedding vector(512) NOT NULL )`); await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET STORAGE EXTERNAL`); + await queryRunner.query(`ALTER TABLE smart_search ADD COLUMN IF NOT EXISTS embedding vector(512)`); await queryRunner.query(`ALTER TABLE smart_search ALTER COLUMN embedding SET STORAGE EXTERNAL`); await queryRunner.query(` @@ -27,6 +28,11 @@ export class AddFaceSearchRelation1718486162779 implements MigrationInterface { await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE real[]`); await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE vector(512)`); + await queryRunner.query(` + CREATE INDEX IF NOT EXISTS clip_index ON smart_search + USING hnsw (embedding vector_cosine_ops) + WITH (ef_construction = 300, m = 16)`); + await queryRunner.query(` CREATE INDEX face_index ON face_search USING hnsw (embedding vector_cosine_ops) From 90709b4788594992c22049921d57bbc3135e061d Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Wed, 3 Jul 2024 19:43:14 -0400 Subject: [PATCH 3/6] handle missing face embedding column --- .../1718486162779-AddFaceSearchRelation.ts | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts index 0cf900e91c194..289b6c9c8c6f7 100644 --- a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts +++ b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts @@ -10,20 +10,27 @@ export class AddFaceSearchRelation1718486162779 implements MigrationInterface { } await queryRunner.query(` - CREATE TABLE face_search ( - "faceId" uuid PRIMARY KEY REFERENCES asset_faces(id) ON DELETE CASCADE, - embedding vector(512) NOT NULL )`); + CREATE TABLE face_search ( + "faceId" uuid PRIMARY KEY REFERENCES asset_faces(id) ON DELETE CASCADE, + embedding vector(512) NOT NULL )`); await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET STORAGE EXTERNAL`); await queryRunner.query(`ALTER TABLE smart_search ADD COLUMN IF NOT EXISTS embedding vector(512)`); await queryRunner.query(`ALTER TABLE smart_search ALTER COLUMN embedding SET STORAGE EXTERNAL`); - await queryRunner.query(` - INSERT INTO face_search("faceId", embedding) - SELECT id, embedding - FROM asset_faces faces`); + const assetFacesColumns = await queryRunner.query( + `SELECT column_name as name + FROM information_schema.columns + WHERE table_name = 'asset_faces'`); + const hasFaceEmbeddings = assetFacesColumns.some((column: { name: string }) => column.name === 'embedding'); + if (hasFaceEmbeddings) { + await queryRunner.query(` + INSERT INTO face_search("faceId", embedding) + SELECT id, embedding + FROM asset_faces faces`); + } - await queryRunner.query(`ALTER TABLE asset_faces DROP COLUMN "embedding"`); + await queryRunner.query(`ALTER TABLE asset_faces DROP COLUMN IF EXISTS embedding`); await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE real[]`); await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE vector(512)`); @@ -34,9 +41,9 @@ export class AddFaceSearchRelation1718486162779 implements MigrationInterface { WITH (ef_construction = 300, m = 16)`); await queryRunner.query(` - CREATE INDEX face_index ON face_search - USING hnsw (embedding vector_cosine_ops) - WITH (ef_construction = 300, m = 16)`); + CREATE INDEX face_index ON face_search + USING hnsw (embedding vector_cosine_ops) + WITH (ef_construction = 300, m = 16)`); } public async down(queryRunner: QueryRunner): Promise { @@ -49,15 +56,15 @@ export class AddFaceSearchRelation1718486162779 implements MigrationInterface { await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET STORAGE DEFAULT`); await queryRunner.query(`ALTER TABLE smart_search ALTER COLUMN embedding SET STORAGE DEFAULT`); await queryRunner.query(` - UPDATE asset_faces - SET embedding = fs.embedding - FROM face_search fs - WHERE id = fs."faceId"`); + UPDATE asset_faces + SET embedding = fs.embedding + FROM face_search fs + WHERE id = fs."faceId"`); await queryRunner.query(`DROP TABLE face_search`); await queryRunner.query(` - CREATE INDEX face_index ON asset_faces - USING hnsw (embedding vector_cosine_ops) - WITH (ef_construction = 300, m = 16)`); + CREATE INDEX face_index ON asset_faces + USING hnsw (embedding vector_cosine_ops) + WITH (ef_construction = 300, m = 16)`); } } From 8322af0baf2be8d59f868db9868b9694f999e615 Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Wed, 3 Jul 2024 19:54:08 -0400 Subject: [PATCH 4/6] simplify --- .../1718486162779-AddFaceSearchRelation.ts | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts index 289b6c9c8c6f7..e4ed38e9df472 100644 --- a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts +++ b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts @@ -9,26 +9,22 @@ export class AddFaceSearchRelation1718486162779 implements MigrationInterface { await queryRunner.query(`SET vectors.pgvector_compatibility=on`); } + await queryRunner.query(`ALTER TABLE asset_faces ADD COLUMN IF NOT EXISTS embedding vector(512)`); + await queryRunner.query(`ALTER TABLE smart_search ADD COLUMN IF NOT EXISTS embedding vector(512) NOT NULL`); + await queryRunner.query(` CREATE TABLE face_search ( "faceId" uuid PRIMARY KEY REFERENCES asset_faces(id) ON DELETE CASCADE, embedding vector(512) NOT NULL )`); await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET STORAGE EXTERNAL`); - await queryRunner.query(`ALTER TABLE smart_search ADD COLUMN IF NOT EXISTS embedding vector(512)`); await queryRunner.query(`ALTER TABLE smart_search ALTER COLUMN embedding SET STORAGE EXTERNAL`); - const assetFacesColumns = await queryRunner.query( - `SELECT column_name as name - FROM information_schema.columns - WHERE table_name = 'asset_faces'`); - const hasFaceEmbeddings = assetFacesColumns.some((column: { name: string }) => column.name === 'embedding'); - if (hasFaceEmbeddings) { - await queryRunner.query(` - INSERT INTO face_search("faceId", embedding) - SELECT id, embedding - FROM asset_faces faces`); - } + await queryRunner.query(` + INSERT INTO face_search("faceId", embedding) + SELECT id, embedding + FROM asset_faces faces + WHERE faces.embedding IS NOT NULL`); await queryRunner.query(`ALTER TABLE asset_faces DROP COLUMN IF EXISTS embedding`); From 82dfaaa4990d491c9d1bd3b39d404ce60af0587e Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Wed, 3 Jul 2024 20:00:01 -0400 Subject: [PATCH 5/6] Revert "simplify" This reverts commit 8322af0baf2be8d59f868db9868b9694f999e615. --- .../1718486162779-AddFaceSearchRelation.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts index e4ed38e9df472..289b6c9c8c6f7 100644 --- a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts +++ b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts @@ -9,22 +9,26 @@ export class AddFaceSearchRelation1718486162779 implements MigrationInterface { await queryRunner.query(`SET vectors.pgvector_compatibility=on`); } - await queryRunner.query(`ALTER TABLE asset_faces ADD COLUMN IF NOT EXISTS embedding vector(512)`); - await queryRunner.query(`ALTER TABLE smart_search ADD COLUMN IF NOT EXISTS embedding vector(512) NOT NULL`); - await queryRunner.query(` CREATE TABLE face_search ( "faceId" uuid PRIMARY KEY REFERENCES asset_faces(id) ON DELETE CASCADE, embedding vector(512) NOT NULL )`); await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET STORAGE EXTERNAL`); + await queryRunner.query(`ALTER TABLE smart_search ADD COLUMN IF NOT EXISTS embedding vector(512)`); await queryRunner.query(`ALTER TABLE smart_search ALTER COLUMN embedding SET STORAGE EXTERNAL`); - await queryRunner.query(` - INSERT INTO face_search("faceId", embedding) - SELECT id, embedding - FROM asset_faces faces - WHERE faces.embedding IS NOT NULL`); + const assetFacesColumns = await queryRunner.query( + `SELECT column_name as name + FROM information_schema.columns + WHERE table_name = 'asset_faces'`); + const hasFaceEmbeddings = assetFacesColumns.some((column: { name: string }) => column.name === 'embedding'); + if (hasFaceEmbeddings) { + await queryRunner.query(` + INSERT INTO face_search("faceId", embedding) + SELECT id, embedding + FROM asset_faces faces`); + } await queryRunner.query(`ALTER TABLE asset_faces DROP COLUMN IF EXISTS embedding`); From 497af14bfb9d4b96a55cc72470686c964d84b99a Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Wed, 3 Jul 2024 20:04:42 -0400 Subject: [PATCH 6/6] fix migration --- .../1718486162779-AddFaceSearchRelation.ts | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts index 289b6c9c8c6f7..c8e02ec0c5e5a 100644 --- a/server/src/migrations/1718486162779-AddFaceSearchRelation.ts +++ b/server/src/migrations/1718486162779-AddFaceSearchRelation.ts @@ -9,20 +9,29 @@ export class AddFaceSearchRelation1718486162779 implements MigrationInterface { await queryRunner.query(`SET vectors.pgvector_compatibility=on`); } + const hasEmbeddings = async (tableName: string): Promise => { + const columns = await queryRunner.query( + `SELECT column_name as name + FROM information_schema.columns + WHERE table_name = '${tableName}'`); + return columns.some((column: { name: string }) => column.name === 'embedding'); + } + + const hasAssetEmbeddings = await hasEmbeddings('smart_search'); + if (!hasAssetEmbeddings) { + await queryRunner.query(`TRUNCATE smart_search`); + await queryRunner.query(`ALTER TABLE smart_search ADD COLUMN IF NOT EXISTS embedding vector(512) NOT NULL`); + } + await queryRunner.query(` CREATE TABLE face_search ( "faceId" uuid PRIMARY KEY REFERENCES asset_faces(id) ON DELETE CASCADE, embedding vector(512) NOT NULL )`); await queryRunner.query(`ALTER TABLE face_search ALTER COLUMN embedding SET STORAGE EXTERNAL`); - await queryRunner.query(`ALTER TABLE smart_search ADD COLUMN IF NOT EXISTS embedding vector(512)`); await queryRunner.query(`ALTER TABLE smart_search ALTER COLUMN embedding SET STORAGE EXTERNAL`); - const assetFacesColumns = await queryRunner.query( - `SELECT column_name as name - FROM information_schema.columns - WHERE table_name = 'asset_faces'`); - const hasFaceEmbeddings = assetFacesColumns.some((column: { name: string }) => column.name === 'embedding'); + const hasFaceEmbeddings = await hasEmbeddings('asset_faces') if (hasFaceEmbeddings) { await queryRunner.query(` INSERT INTO face_search("faceId", embedding)