From 81846031cb2e5411a80837eb4b348f6b166f7e49 Mon Sep 17 00:00:00 2001 From: Eugene Molodkin Date: Tue, 8 Oct 2024 17:12:17 +0200 Subject: [PATCH] wip: Add missing composite primary key --- ...MissingPrimaryKeyOnAnnotationTagMapping.ts | 12 ++++ .../src/databases/migrations/mysqldb/index.ts | 2 + .../databases/migrations/postgresdb/index.ts | 2 + ...MissingPrimaryKeyOnAnnotationTagMapping.ts | 63 +++++++++++++++++++ .../src/databases/migrations/sqlite/index.ts | 2 + 5 files changed, 81 insertions(+) create mode 100644 packages/cli/src/databases/migrations/common/1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping.ts create mode 100644 packages/cli/src/databases/migrations/sqlite/1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping.ts diff --git a/packages/cli/src/databases/migrations/common/1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping.ts b/packages/cli/src/databases/migrations/common/1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping.ts new file mode 100644 index 0000000000000..c70dff43c2767 --- /dev/null +++ b/packages/cli/src/databases/migrations/common/1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping.ts @@ -0,0 +1,12 @@ +import type { IrreversibleMigration, MigrationContext } from '@/databases/types'; + +export class AddMissingPrimaryKeyOnAnnotationTagMapping1728396464278 + implements IrreversibleMigration +{ + async up({ queryRunner, tablePrefix }: MigrationContext) { + await queryRunner.createPrimaryKey(`${tablePrefix}execution_annotation_tags`, [ + 'annotationId', + 'tagId', + ]); + } +} diff --git a/packages/cli/src/databases/migrations/mysqldb/index.ts b/packages/cli/src/databases/migrations/mysqldb/index.ts index 07b910b949389..7bfd34783116a 100644 --- a/packages/cli/src/databases/migrations/mysqldb/index.ts +++ b/packages/cli/src/databases/migrations/mysqldb/index.ts @@ -65,6 +65,7 @@ import { RefactorExecutionIndices1723796243146 } from '../common/1723796243146-R import { CreateAnnotationTables1724753530828 } from '../common/1724753530828-CreateExecutionAnnotationTables'; import { AddApiKeysTable1724951148974 } from '../common/1724951148974-AddApiKeysTable'; import { SeparateExecutionCreationFromStart1727427440136 } from '../common/1727427440136-SeparateExecutionCreationFromStart'; +import { AddMissingPrimaryKeyOnAnnotationTagMapping1728396464278 } from '../common/1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping'; export const mysqlMigrations: Migration[] = [ InitialMigration1588157391238, @@ -132,4 +133,5 @@ export const mysqlMigrations: Migration[] = [ CreateAnnotationTables1724753530828, AddApiKeysTable1724951148974, SeparateExecutionCreationFromStart1727427440136, + AddMissingPrimaryKeyOnAnnotationTagMapping1728396464278, ]; diff --git a/packages/cli/src/databases/migrations/postgresdb/index.ts b/packages/cli/src/databases/migrations/postgresdb/index.ts index 21b90e201d0c0..527d834533e7d 100644 --- a/packages/cli/src/databases/migrations/postgresdb/index.ts +++ b/packages/cli/src/databases/migrations/postgresdb/index.ts @@ -65,6 +65,7 @@ import { RefactorExecutionIndices1723796243146 } from '../common/1723796243146-R import { CreateAnnotationTables1724753530828 } from '../common/1724753530828-CreateExecutionAnnotationTables'; import { AddApiKeysTable1724951148974 } from '../common/1724951148974-AddApiKeysTable'; import { SeparateExecutionCreationFromStart1727427440136 } from '../common/1727427440136-SeparateExecutionCreationFromStart'; +import { AddMissingPrimaryKeyOnAnnotationTagMapping1728396464278 } from '../common/1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping'; export const postgresMigrations: Migration[] = [ InitialMigration1587669153312, @@ -132,4 +133,5 @@ export const postgresMigrations: Migration[] = [ CreateAnnotationTables1724753530828, AddApiKeysTable1724951148974, SeparateExecutionCreationFromStart1727427440136, + AddMissingPrimaryKeyOnAnnotationTagMapping1728396464278, ]; diff --git a/packages/cli/src/databases/migrations/sqlite/1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping.ts b/packages/cli/src/databases/migrations/sqlite/1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping.ts new file mode 100644 index 0000000000000..da0d1341f8224 --- /dev/null +++ b/packages/cli/src/databases/migrations/sqlite/1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping.ts @@ -0,0 +1,63 @@ +import type { IrreversibleMigration, MigrationContext } from '@/databases/types'; + +const annotationsTableName = 'execution_annotations'; +const annotationTagsTableName = 'annotation_tag_entity'; +const annotationTagMappingsTableName = 'execution_annotation_tags'; + +export class AddMissingPrimaryKeyOnAnnotationTagMapping1728396464278 + implements IrreversibleMigration +{ + async up({ + queryRunner, + tablePrefix, + schemaBuilder: { createTable, column, dropIndex }, + }: MigrationContext) { + await queryRunner.createPrimaryKey(`${tablePrefix}${annotationTagMappingsTableName}`, [ + 'annotationId', + 'tagId', + ]); + + // SQLite doesn't support adding a primary key to an existing table + // So we have to do the following steps: + + // 1. Rename the existing table + await queryRunner.query( + `ALTER TABLE ${tablePrefix}${annotationTagMappingsTableName} RENAME TO ${tablePrefix}${annotationTagMappingsTableName}_tmp;`, + ); + + // 1.1 Drop the existing indices + await dropIndex(`${annotationTagMappingsTableName}_tmp`, ['tagId'], { + customIndexName: 'IDX_a3697779b366e131b2bbdae297', + }); + await dropIndex(`${annotationTagMappingsTableName}_tmp`, ['annotationId'], { + customIndexName: 'IDX_c1519757391996eb06064f0e7c', + }); + + // 2. Create a new table with the desired structure + await createTable(annotationTagMappingsTableName) + .withColumns( + column('annotationId').int.notNull.primary, + column('tagId').varchar(24).notNull.primary, + ) + .withForeignKey('annotationId', { + tableName: annotationsTableName, + columnName: 'id', + onDelete: 'CASCADE', + }) + .withIndexOn('tagId') + .withIndexOn('annotationId') + .withForeignKey('tagId', { + tableName: annotationTagsTableName, + columnName: 'id', + onDelete: 'CASCADE', + }); + + // 3. Copy data from the old table to the new one + await queryRunner.query( + `INSERT INTO ${tablePrefix}${annotationTagMappingsTableName} SELECT * FROM ${tablePrefix}${annotationTagMappingsTableName}_tmp;`, + ); + + // 4. Drop the old table + await queryRunner.dropTable(`${tablePrefix}${annotationTagMappingsTableName}_tmp`, true); + } +} diff --git a/packages/cli/src/databases/migrations/sqlite/index.ts b/packages/cli/src/databases/migrations/sqlite/index.ts index 2828bb3f59129..155cf467f750d 100644 --- a/packages/cli/src/databases/migrations/sqlite/index.ts +++ b/packages/cli/src/databases/migrations/sqlite/index.ts @@ -38,6 +38,7 @@ import { ExecutionSoftDelete1693491613982 } from './1693491613982-ExecutionSoftD import { DropRoleMapping1705429061930 } from './1705429061930-DropRoleMapping'; import { AddActivatedAtUserSetting1717498465931 } from './1717498465931-AddActivatedAtUserSetting'; import { AddApiKeysTable1724951148974 } from './1724951148974-AddApiKeysTable'; +import { AddMissingPrimaryKeyOnAnnotationTagMapping1728396464278 } from './1728396464278-AddMissingPrimaryKeyOnAnnotationTagMapping'; import { UniqueWorkflowNames1620821879465 } from '../common/1620821879465-UniqueWorkflowNames'; import { UpdateWorkflowCredentials1630330987096 } from '../common/1630330987096-UpdateWorkflowCredentials'; import { AddNodeIds1658930531669 } from '../common/1658930531669-AddNodeIds'; @@ -126,6 +127,7 @@ const sqliteMigrations: Migration[] = [ CreateAnnotationTables1724753530828, AddApiKeysTable1724951148974, SeparateExecutionCreationFromStart1727427440136, + AddMissingPrimaryKeyOnAnnotationTagMapping1728396464278, ]; export { sqliteMigrations };