Skip to content

Commit

Permalink
fix(core): Add missing primary key to execution annotation tags table (
Browse files Browse the repository at this point in the history
  • Loading branch information
burivuhster authored Oct 18, 2024
1 parent 09954f6 commit b4b543d
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ export class CreateAnnotationTables1724753530828 implements ReversibleMigration
.withIndexOn('name', true).withTimestamps;

await createTable(annotationTagMappingsTableName)
.withColumns(column('annotationId').int.notNull, column('tagId').varchar(24).notNull)
.withColumns(
column('annotationId').int.notNull.primary,
column('tagId').varchar(24).notNull.primary,
)
.withForeignKey('annotationId', {
tableName: annotationsTableName,
columnName: 'id',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import assert from 'node:assert';

import type { IrreversibleMigration, MigrationContext } from '@/databases/types';

export class AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644
implements IrreversibleMigration
{
async up({ queryRunner, tablePrefix }: MigrationContext) {
// Check if the primary key already exists
const table = await queryRunner.getTable(`${tablePrefix}execution_annotation_tags`);

assert(table, 'execution_annotation_tags table not found');

const hasPrimaryKey = table.primaryColumns.length > 0;

if (!hasPrimaryKey) {
await queryRunner.createPrimaryKey(`${tablePrefix}execution_annotation_tags`, [
'annotationId',
'tagId',
]);
}
}
}
2 changes: 2 additions & 0 deletions packages/cli/src/databases/migrations/mysqldb/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ import { CreateAnnotationTables1724753530828 } from '../common/1724753530828-Cre
import { AddApiKeysTable1724951148974 } from '../common/1724951148974-AddApiKeysTable';
import { CreateProcessedDataTable1726606152711 } from '../common/1726606152711-CreateProcessedDataTable';
import { SeparateExecutionCreationFromStart1727427440136 } from '../common/1727427440136-SeparateExecutionCreationFromStart';
import { AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644 } from '../common/1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping';

export const mysqlMigrations: Migration[] = [
InitialMigration1588157391238,
Expand Down Expand Up @@ -134,4 +135,5 @@ export const mysqlMigrations: Migration[] = [
AddApiKeysTable1724951148974,
SeparateExecutionCreationFromStart1727427440136,
CreateProcessedDataTable1726606152711,
AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644,
];
2 changes: 2 additions & 0 deletions packages/cli/src/databases/migrations/postgresdb/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ import { CreateAnnotationTables1724753530828 } from '../common/1724753530828-Cre
import { AddApiKeysTable1724951148974 } from '../common/1724951148974-AddApiKeysTable';
import { CreateProcessedDataTable1726606152711 } from '../common/1726606152711-CreateProcessedDataTable';
import { SeparateExecutionCreationFromStart1727427440136 } from '../common/1727427440136-SeparateExecutionCreationFromStart';
import { AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644 } from '../common/1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping';

export const postgresMigrations: Migration[] = [
InitialMigration1587669153312,
Expand Down Expand Up @@ -134,4 +135,5 @@ export const postgresMigrations: Migration[] = [
AddApiKeysTable1724951148974,
SeparateExecutionCreationFromStart1727427440136,
CreateProcessedDataTable1726606152711,
AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644,
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import assert from 'node:assert';

import type { IrreversibleMigration, MigrationContext } from '@/databases/types';

const annotationsTableName = 'execution_annotations';
const annotationTagsTableName = 'annotation_tag_entity';
const annotationTagMappingsTableName = 'execution_annotation_tags';

export class AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644
implements IrreversibleMigration
{
async up({
queryRunner,
tablePrefix,
schemaBuilder: { createTable, column, dropIndex },
}: MigrationContext) {
// Check if the primary key already exists
const table = await queryRunner.getTable(`${tablePrefix}execution_annotation_tags`);

assert(table, 'execution_annotation_tags table not found');

const hasPrimaryKey = table.primaryColumns.length > 0;

// Do nothing if the primary key already exists
if (hasPrimaryKey) {
return;
}

// 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);
}
}
2 changes: 2 additions & 0 deletions packages/cli/src/databases/migrations/sqlite/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 { AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644 } from './1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping';
import { UniqueWorkflowNames1620821879465 } from '../common/1620821879465-UniqueWorkflowNames';
import { UpdateWorkflowCredentials1630330987096 } from '../common/1630330987096-UpdateWorkflowCredentials';
import { AddNodeIds1658930531669 } from '../common/1658930531669-AddNodeIds';
Expand Down Expand Up @@ -128,6 +129,7 @@ const sqliteMigrations: Migration[] = [
AddApiKeysTable1724951148974,
SeparateExecutionCreationFromStart1727427440136,
CreateProcessedDataTable1726606152711,
AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644,
];

export { sqliteMigrations };
Original file line number Diff line number Diff line change
Expand Up @@ -563,10 +563,10 @@ describe('ExecutionService', () => {
{
...summaryShape,
annotation: {
tags: [
tags: expect.arrayContaining([
expect.objectContaining({ name: 'tag1' }),
expect.objectContaining({ name: 'tag2' }),
],
]),
vote: 'up',
},
},
Expand Down Expand Up @@ -646,10 +646,10 @@ describe('ExecutionService', () => {
{
...summaryShape,
annotation: {
tags: [
tags: expect.arrayContaining([
expect.objectContaining({ name: 'tag1' }),
expect.objectContaining({ name: 'tag2' }),
],
]),
vote: 'up',
},
},
Expand Down Expand Up @@ -691,10 +691,10 @@ describe('ExecutionService', () => {
{
...summaryShape,
annotation: {
tags: [
tags: expect.arrayContaining([
expect.objectContaining({ name: 'tag1' }),
expect.objectContaining({ name: 'tag2' }),
],
]),
vote: 'up',
},
},
Expand Down

0 comments on commit b4b543d

Please sign in to comment.