Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(editor): Execution filter #5496

Merged
merged 76 commits into from
Mar 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
80cf38e
wip: workflow execution filtering
valya Feb 13, 2023
24f6ac2
fix: import type failing to build
valya Feb 13, 2023
80c7ac8
fix: remove console.logs
valya Feb 14, 2023
677126b
feat: execution metadata migrations
valya Feb 14, 2023
4729b5c
fix(editor): Move global executions filter to its own component
cstuncsik Feb 16, 2023
e385f70
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Feb 17, 2023
f58e071
fix(editor): Using the same filter component in workflow level
cstuncsik Feb 17, 2023
fddb840
fix(editor): a small housekeeping
cstuncsik Feb 17, 2023
7885743
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Feb 20, 2023
3357a74
Merge remote-tracking branch 'origin/master' into pay-36-store-execut…
cstuncsik Feb 20, 2023
2c42a0d
checking workflowId in filter applied
cstuncsik Feb 23, 2023
8871c38
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Feb 23, 2023
6455ef2
Merge remote-tracking branch 'origin/master' into pay-36-store-execut…
cstuncsik Feb 23, 2023
bdfc3d3
fix(editor): update filter after resolving merge conflicts
cstuncsik Feb 23, 2023
e77f27e
fix(editor): unify empy filter status
cstuncsik Feb 23, 2023
a1be679
Merge remote-tracking branch 'origin/master' into pay-36-store-execut…
cstuncsik Feb 27, 2023
7958e3e
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Feb 27, 2023
38b04a9
feat(editor): add datetime picker to filter
cstuncsik Feb 28, 2023
4497ea0
feat(editor): add meta fields
cstuncsik Feb 28, 2023
8a1b9b3
fix: fix button override in datepicker panel
alexgrozav Feb 28, 2023
44555da
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Feb 28, 2023
e724de0
feat(editor): add filter metadata
cstuncsik Mar 1, 2023
de56350
Merge remote-tracking branch 'origin/master' into pay-36-store-execut…
cstuncsik Mar 1, 2023
b11077b
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Mar 1, 2023
fbcb4bc
feat(core): add 'startedBefore' execution filter prop
cstuncsik Mar 1, 2023
a7b9680
feat(core): add 'tags' execution query filter
cstuncsik Mar 1, 2023
b787c13
Merge remote-tracking branch 'origin/pay-36-store-execution-metadata'…
cstuncsik Mar 1, 2023
d8911b3
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Mar 1, 2023
48c4923
Revert "feat(core): add 'tags' execution query filter"
cstuncsik Mar 1, 2023
7cfdcc2
feat(editor): add translations and tooltip and counting selected filt…
cstuncsik Mar 2, 2023
e0a4afd
fix(editor): fix label layouts
cstuncsik Mar 2, 2023
35e8887
fix(editor): update custom data docs link
cstuncsik Mar 2, 2023
cd67e1a
fix(editor): update custom data tooltip position
cstuncsik Mar 2, 2023
67aaa42
fix(editor): update tooltip text
cstuncsik Mar 2, 2023
dfb3fcd
fix(editor): fix after merge conflict
cstuncsik Mar 3, 2023
00a9682
Merge remote-tracking branch 'origin/master' into pay-36-store-execut…
cstuncsik Mar 8, 2023
86e37e8
refactor: Ignore metadata if not enabled by license
krynble Mar 9, 2023
a08e4f4
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Mar 9, 2023
fd3cf93
Merge remote-tracking branch 'origin/pay-36-store-execution-metadata'…
cstuncsik Mar 9, 2023
102d718
fix(editor): Add paywall states to advanced execution filter
cstuncsik Mar 9, 2023
4f8a324
refactor: Save custom data also for worker mode
krynble Mar 9, 2023
203ebf6
fix: Remove duplicate migration name from list
krynble Mar 9, 2023
f500671
fix(editor): Reducing filter complexity and add debounce to text inputs
cstuncsik Mar 10, 2023
c932ceb
Merge branch 'pay-149-execution-filter' of github.com:n8n-io/n8n into…
cstuncsik Mar 10, 2023
b972bdc
fix(editor): Remove unused import, add comment
cstuncsik Mar 10, 2023
7eb9bdb
fix(editor): simplify event listener
cstuncsik Mar 10, 2023
9c028c4
fix: Prevent error when there are running executions
krynble Mar 14, 2023
11b438c
test(editor): Add advanced execution filter basic unit test
cstuncsik Mar 15, 2023
a202b0e
Merge branch 'pay-149-execution-filter' of github.com:n8n-io/n8n into…
cstuncsik Mar 15, 2023
a22d5e2
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Mar 15, 2023
789b199
test(editor): Add advanced execution filter state change unit test
cstuncsik Mar 15, 2023
940d95d
fix: Small lint issue
krynble Mar 16, 2023
f1b44b2
feat: Add indices to speed up queries
krynble Mar 16, 2023
b671849
feat: add customData limits
valya Mar 16, 2023
fc511b9
Merge branch 'pay-149-execution-filter' of github.com:n8n-io/n8n into…
valya Mar 16, 2023
a1083b9
refactor: put metadata save in transaction
valya Mar 16, 2023
3d5a4d2
chore: remove unneed comment
valya Mar 16, 2023
bc2d4cb
test: add tests for execution metadata
valya Mar 16, 2023
acd7a26
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Mar 17, 2023
bb2cab1
Merge branch 'pay-149-execution-filter' of github.com:n8n-io/n8n into…
cstuncsik Mar 17, 2023
41ddbd5
fix(editor): Fixes after merge conflict
cstuncsik Mar 17, 2023
38c39d5
fix(editor): Remove unused import
cstuncsik Mar 17, 2023
d058006
wordings and ui fixes
romainminaud Mar 20, 2023
2616fea
fix(editor): type fixes
cstuncsik Mar 20, 2023
cf4d37a
feat: add code node autocompletions for customData
valya Mar 20, 2023
cabc8be
fix: Prevent transaction issues and ambiguous ID in sql clauses
krynble Mar 20, 2023
d240626
Merge branch 'pay-149-execution-filter' of github.com:n8n-io/n8n into…
krynble Mar 20, 2023
b75b52d
Merge remote-tracking branch 'origin/master' into pay-149-execution-f…
cstuncsik Mar 21, 2023
0abfcf9
fix(editor): Suppress requesting current executions if metadata is us…
cstuncsik Mar 21, 2023
4037eb9
refactor: Improve performance by correcting database indices
krynble Mar 21, 2023
6db72e9
Merge branch 'pay-149-execution-filter' of github.com:n8n-io/n8n into…
krynble Mar 21, 2023
9b5d643
fix: Lint issue
krynble Mar 21, 2023
19237bb
test: Fix broken test
krynble Mar 22, 2023
41a669c
fix: Broken test
krynble Mar 22, 2023
2eee5fd
test: add call data check for saveExecutionMetadata test
valya Mar 22, 2023
55f02dd
Merge branch 'master' into pay-149-execution-filter
krynble Mar 23, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/cli/src/Db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ export async function init(
collections.InstalledPackages = linkRepository(entities.InstalledPackages);
collections.InstalledNodes = linkRepository(entities.InstalledNodes);
collections.WorkflowStatistics = linkRepository(entities.WorkflowStatistics);
collections.ExecutionMetadata = linkRepository(entities.ExecutionMetadata);

collections.EventDestinations = linkRepository(entities.EventDestinations);

isInitialized = true;
Expand Down
2 changes: 2 additions & 0 deletions packages/cli/src/Interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ import type { WebhookEntity } from '@db/entities/WebhookEntity';
import type { WorkflowEntity } from '@db/entities/WorkflowEntity';
import type { WorkflowStatistics } from '@db/entities/WorkflowStatistics';
import type { EventDestinations } from '@db/entities/MessageEventBusDestinationEntity';
import type { ExecutionMetadata } from './databases/entities/ExecutionMetadata';

export interface IActivationError {
time: number;
Expand Down Expand Up @@ -88,6 +89,7 @@ export interface IDatabaseCollections {
InstalledNodes: Repository<InstalledNodes>;
WorkflowStatistics: Repository<WorkflowStatistics>;
EventDestinations: Repository<EventDestinations>;
ExecutionMetadata: Repository<ExecutionMetadata>;
}

// ----------------------------------
Expand Down
33 changes: 33 additions & 0 deletions packages/cli/src/WorkflowExecuteAdditionalData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ import { PermissionChecker } from './UserManagement/PermissionChecker';
import { WorkflowsService } from './workflows/workflows.services';
import { Container } from 'typedi';
import { InternalHooks } from '@/InternalHooks';
import type { ExecutionMetadata } from './databases/entities/ExecutionMetadata';

const ERROR_TRIGGER_TYPE = config.getEnv('nodes.errorTriggerType');

Expand Down Expand Up @@ -264,6 +265,22 @@ async function pruneExecutionData(this: WorkflowHooks): Promise<void> {
}
}

export async function saveExecutionMetadata(
executionId: string,
executionMetadata: Record<string, string>,
): Promise<ExecutionMetadata[]> {
const metadataRows = [];
for (const [key, value] of Object.entries(executionMetadata)) {
metadataRows.push({
execution: { id: executionId },
key,
value,
});
}

return Db.collections.ExecutionMetadata.save(metadataRows);
}

/**
* Returns hook functions to push data to Editor-UI
*
Expand Down Expand Up @@ -657,6 +674,14 @@ function hookFunctionsSave(parentProcessMode?: string): IWorkflowExecuteHooks {
executionData as IExecutionFlattedDb,
);

try {
if (fullRunData.data.resultData.metadata) {
await saveExecutionMetadata(this.executionId, fullRunData.data.resultData.metadata);
}
} catch (e) {
Logger.error(`Failed to save metadata for execution ID ${this.executionId}`, e);
}

if (fullRunData.finished === true && this.retryOf !== undefined) {
// If the retry was successful save the reference it on the original execution
// await Db.collections.Execution.save(executionData as IExecutionFlattedDb);
Expand Down Expand Up @@ -789,6 +814,14 @@ function hookFunctionsSaveWorker(): IWorkflowExecuteHooks {
status: executionData.status,
});

try {
if (fullRunData.data.resultData.metadata) {
await saveExecutionMetadata(this.executionId, fullRunData.data.resultData.metadata);
}
} catch (e) {
Logger.error(`Failed to save metadata for execution ID ${this.executionId}`, e);
}

if (fullRunData.finished === true && this.retryOf !== undefined) {
// If the retry was successful save the reference it on the original execution
await Db.collections.Execution.update(this.retryOf, {
Expand Down
6 changes: 5 additions & 1 deletion packages/cli/src/databases/entities/ExecutionEntity.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { ExecutionStatus, WorkflowExecuteMode } from 'n8n-workflow';
import { Column, Entity, Generated, Index, PrimaryColumn } from 'typeorm';
import { Column, Entity, Generated, Index, OneToMany, PrimaryColumn } from 'typeorm';
import { datetimeColumnType, jsonColumnType } from './AbstractEntity';
import { IWorkflowDb } from '@/Interfaces';
import type { IExecutionFlattedDb } from '@/Interfaces';
import { idStringifier } from '../utils/transformers';
import type { ExecutionMetadata } from './ExecutionMetadata';

@Entity()
@Index(['workflowId', 'id'])
Expand Down Expand Up @@ -49,4 +50,7 @@ export class ExecutionEntity implements IExecutionFlattedDb {

@Column({ type: datetimeColumnType, nullable: true })
waitTill: Date;

@OneToMany('ExecutionMetadata', 'execution')
metadata: ExecutionMetadata[];
}
22 changes: 22 additions & 0 deletions packages/cli/src/databases/entities/ExecutionMetadata.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn, RelationId } from 'typeorm';
import { ExecutionEntity } from './ExecutionEntity';

@Entity()
export class ExecutionMetadata {
@PrimaryGeneratedColumn()
id: number;

@ManyToOne('ExecutionEntity', 'metadata', {
onDelete: 'CASCADE',
})
execution: ExecutionEntity;

@RelationId((executionMetadata: ExecutionMetadata) => executionMetadata.execution)
executionId: number;

@Column('text')
key: string;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should either use stricter typing on this column, and add an index for faster searching, or get move this data to a simple json column on the executions table.
in this current form, the additional table/entity feels unnecessary.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The goal of this field is not to be a json, it's intentionally simply basic text. About the performance, I'll check to see if something can be improved.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let me rephrase: Does this really need to be a separate table?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I think so - you can save multiple key-value pairs for each execution. The goal is to allow users to save and read data during execution and afterwards, search for this data in the executions panel.

When querying, you can query by some of the keys (initial implementation is a single key-value search but this can be changed in the future)

Screenshot 2023-03-16 at 13 28 52


@Column('text')
value: string;
}
2 changes: 2 additions & 0 deletions packages/cli/src/databases/entities/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { User } from './User';
import { WebhookEntity } from './WebhookEntity';
import { WorkflowEntity } from './WorkflowEntity';
import { WorkflowStatistics } from './WorkflowStatistics';
import { ExecutionMetadata } from './ExecutionMetadata';

export const entities = {
AuthIdentity,
Expand All @@ -33,4 +34,5 @@ export const entities = {
WebhookEntity,
WorkflowEntity,
WorkflowStatistics,
ExecutionMetadata,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { MigrationInterface, QueryRunner, Table } from 'typeorm';
import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers';

export class CreateExecutionMetadataTable1679416281779 implements MigrationInterface {
name = 'CreateExecutionMetadataTable1679416281779';

public async up(queryRunner: QueryRunner): Promise<void> {
logMigrationStart(this.name);
const tablePrefix = getTablePrefix();

await queryRunner.query(
`CREATE TABLE ${tablePrefix}execution_metadata (
id int(11) auto_increment NOT NULL PRIMARY KEY,
executionId int(11) NOT NULL,
\`key\` TEXT NOT NULL,
value TEXT NOT NULL,
CONSTRAINT \`${tablePrefix}execution_metadata_FK\` FOREIGN KEY (\`executionId\`) REFERENCES \`${tablePrefix}execution_entity\` (\`id\`) ON DELETE CASCADE,
INDEX \`IDX_${tablePrefix}6d44376da6c1058b5e81ed8a154e1fee106046eb\` (\`executionId\` ASC)
)
ENGINE=InnoDB`,
);

// Remove indices that are no longer needed since the addition of the status column
await queryRunner.query(
`DROP INDEX \`IDX_${tablePrefix}06da892aaf92a48e7d3e400003\` ON \`${tablePrefix}execution_entity\``,
);
await queryRunner.query(
`DROP INDEX \`IDX_${tablePrefix}78d62b89dc1433192b86dce18a\` ON \`${tablePrefix}execution_entity\``,
);
await queryRunner.query(
`DROP INDEX \`IDX_${tablePrefix}1688846335d274033e15c846a4\` ON \`${tablePrefix}execution_entity\``,
);
await queryRunner.query(
`DROP INDEX \`IDX_${tablePrefix}cefb067df2402f6aed0638a6c1\` ON \`${tablePrefix}execution_entity\``,
);

// Add index to the new status column
await queryRunner.query(
`CREATE INDEX \`IDX_${tablePrefix}8b6f3f9ae234f137d707b98f3bf43584\` ON \`${tablePrefix}execution_entity\` (\`status\`, \`workflowId\`)`,
);

logMigrationEnd(this.name);
}

public async down(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();

await queryRunner.query(`DROP TABLE "${tablePrefix}execution_metadata"`);
await queryRunner.query(
`CREATE INDEX \`IDX_${tablePrefix}06da892aaf92a48e7d3e400003\` ON \`${tablePrefix}execution_entity\` (\`workflowId\`, \`waitTill\`, \`id\`)`,
);
await queryRunner.query(
`CREATE INDEX \`IDX_${tablePrefix}78d62b89dc1433192b86dce18a\` ON \`${tablePrefix}execution_entity\` (\`workflowId\`, \`finished\`, \`id\`)`,
);
await queryRunner.query(
`CREATE INDEX \`IDX_${tablePrefix}1688846335d274033e15c846a4\` ON \`${tablePrefix}execution_entity\` (\`finished\`, \`id\`)`,
);
await queryRunner.query(
'CREATE INDEX `IDX_' +
tablePrefix +
'cefb067df2402f6aed0638a6c1` ON `' +
tablePrefix +
'execution_entity` (`stoppedAt`)',
);
await queryRunner.query(
`DROP INDEX \`IDX_${tablePrefix}8b6f3f9ae234f137d707b98f3bf43584\` ON \`${tablePrefix}execution_entity\``,
);
}
}
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 @@ -34,6 +34,7 @@ import { PurgeInvalidWorkflowConnections1675940580449 } from './1675940580449-Pu
import { AddStatusToExecutions1674138566000 } from './1674138566000-AddStatusToExecutions';
import { MigrateExecutionStatus1676996103000 } from './1676996103000-MigrateExecutionStatus';
import { UpdateRunningExecutionStatus1677236788851 } from './1677236788851-UpdateRunningExecutionStatus';
import { CreateExecutionMetadataTable1679416281779 } from './1679416281779-CreateExecutionMetadataTable';

export const mysqlMigrations = [
InitialMigration1588157391238,
Expand Down Expand Up @@ -72,4 +73,5 @@ export const mysqlMigrations = [
AddStatusToExecutions1674138566000,
MigrateExecutionStatus1676996103000,
UpdateRunningExecutionStatus1677236788851,
CreateExecutionMetadataTable1679416281779,
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { MigrationInterface, QueryRunner, Table } from 'typeorm';
import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers';

export class CreateExecutionMetadataTable1679416281778 implements MigrationInterface {
name = 'CreateExecutionMetadataTable1679416281778';

public async up(queryRunner: QueryRunner): Promise<void> {
logMigrationStart(this.name);
const tablePrefix = getTablePrefix();

await queryRunner.query(
`CREATE TABLE ${tablePrefix}execution_metadata (
"id" serial4 NOT NULL PRIMARY KEY,
"executionId" int4 NOT NULL,
"key" text NOT NULL,
"value" text NOT NULL,
CONSTRAINT ${tablePrefix}execution_metadata_fk FOREIGN KEY ("executionId") REFERENCES ${tablePrefix}execution_entity(id) ON DELETE CASCADE
)`,
);

await queryRunner.query(
`CREATE INDEX "IDX_${tablePrefix}6d44376da6c1058b5e81ed8a154e1fee106046eb" ON "${tablePrefix}execution_metadata" ("executionId");`,
);

// Remove indices that are no longer needed since the addition of the status column
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_${tablePrefix}33228da131bb1112247cf52a42"`);
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_${tablePrefix}72ffaaab9f04c2c1f1ea86e662"`);
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_${tablePrefix}58154df94c686818c99fb754ce"`);
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_${tablePrefix}4f474ac92be81610439aaad61e"`);

// Create new index for status
await queryRunner.query(
`CREATE INDEX "IDX_${tablePrefix}8b6f3f9ae234f137d707b98f3bf43584" ON "${tablePrefix}execution_entity" ("status", "workflowId");`,
);

logMigrationEnd(this.name);
}

public async down(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();

// Re-add removed indices
await queryRunner.query(
`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefix}33228da131bb1112247cf52a42" ON ${tablePrefix}execution_entity ("stoppedAt") `,
);
await queryRunner.query(
`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefix}72ffaaab9f04c2c1f1ea86e662" ON ${tablePrefix}execution_entity ("finished", "id") `,
);
await queryRunner.query(
`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefix}58154df94c686818c99fb754ce" ON ${tablePrefix}execution_entity ("workflowId", "waitTill", "id") `,
);
await queryRunner.query(
`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefix}4f474ac92be81610439aaad61e" ON ${tablePrefix}execution_entity ("workflowId", "finished", "id") `,
);

await queryRunner.query(
`DROP INDEX IF EXISTS "IDX_${tablePrefix}8b6f3f9ae234f137d707b98f3bf43584"`,
);

await queryRunner.query(`DROP TABLE "${tablePrefix}execution_metadata"`);
}
}
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 @@ -32,6 +32,7 @@ import { PurgeInvalidWorkflowConnections1675940580449 } from './1675940580449-Pu
import { AddStatusToExecutions1674138566000 } from './1674138566000-AddStatusToExecutions';
import { MigrateExecutionStatus1676996103000 } from './1676996103000-MigrateExecutionStatus';
import { UpdateRunningExecutionStatus1677236854063 } from './1677236854063-UpdateRunningExecutionStatus';
import { CreateExecutionMetadataTable1679416281778 } from './1679416281778-CreateExecutionMetadataTable';

export const postgresMigrations = [
InitialMigration1587669153312,
Expand Down Expand Up @@ -68,4 +69,5 @@ export const postgresMigrations = [
AddStatusToExecutions1674138566000,
MigrateExecutionStatus1676996103000,
UpdateRunningExecutionStatus1677236854063,
CreateExecutionMetadataTable1679416281778,
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { MigrationInterface, QueryRunner, Table } from 'typeorm';
import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers';

export class CreateExecutionMetadataTable1679416281777 implements MigrationInterface {
name = 'CreateExecutionMetadataTable1679416281777';

public async up(queryRunner: QueryRunner): Promise<void> {
logMigrationStart(this.name);
const tablePrefix = getTablePrefix();

await queryRunner.query(
`CREATE TABLE "${tablePrefix}execution_metadata" (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
executionId INTEGER NOT NULL,
"key" TEXT NOT NULL,
value TEXT NOT NULL,
CONSTRAINT ${tablePrefix}execution_metadata_entity_FK FOREIGN KEY (executionId) REFERENCES ${tablePrefix}execution_entity(id) ON DELETE CASCADE
)`,
);

await queryRunner.query(
`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefix}6d44376da6c1058b5e81ed8a154e1fee106046eb" ON "${tablePrefix}execution_metadata" ("executionId");`,
);

// Re add some lost indices from migration DeleteExecutionsWithWorkflows.ts
// that were part of AddExecutionEntityIndexes.ts
// not all were needed since we added the `status` column to execution_entity
await queryRunner.query(
`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}b94b45ce2c73ce46c54f20b5f9' ON '${tablePrefix}execution_entity' ('waitTill', 'id') `,
);
await queryRunner.query(
`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}81fc04c8a17de15835713505e4' ON '${tablePrefix}execution_entity' ('workflowId', 'id') `,
);

// Also add index to the new status column
await queryRunner.query(
`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}8b6f3f9ae234f137d707b98f3bf43584' ON '${tablePrefix}execution_entity' ('status', 'workflowId') `,
);

// Remove no longer needed index to waitTill since it's already covered by the index b94b45ce2c73ce46c54f20b5f9 above
await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2'`);
// Remove index for stoppedAt since it's not used anymore
await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}cefb067df2402f6aed0638a6c1'`);

logMigrationEnd(this.name);
}

public async down(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();

await queryRunner.query(`DROP TABLE "${tablePrefix}execution_metadata"`);
await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}b94b45ce2c73ce46c54f20b5f9'`);
await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}81fc04c8a17de15835713505e4'`);
await queryRunner.query(
`DROP INDEX IF EXISTS 'IDX_${tablePrefix}8b6f3f9ae234f137d707b98f3bf43584'`,
);
await queryRunner.query(
`CREATE INDEX "IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2" ON "${tablePrefix}execution_entity" ("waitTill")`,
);
await queryRunner.query(
`CREATE INDEX "IDX_${tablePrefix}cefb067df2402f6aed0638a6c1" ON "${tablePrefix}execution_entity" ("stoppedAt")`,
);
}
}
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 @@ -31,6 +31,7 @@ import { PurgeInvalidWorkflowConnections1675940580449 } from './1675940580449-Pu
import { AddStatusToExecutions1674138566000 } from './1674138566000-AddStatusToExecutions';
import { MigrateExecutionStatus1676996103000 } from './1676996103000-MigrateExecutionStatus';
import { UpdateRunningExecutionStatus1677237073720 } from './1677237073720-UpdateRunningExecutionStatus';
import { CreateExecutionMetadataTable1679416281777 } from './1679416281777-CreateExecutionMetadataTable';

const sqliteMigrations = [
InitialMigration1588102412422,
Expand Down Expand Up @@ -66,6 +67,7 @@ const sqliteMigrations = [
AddStatusToExecutions1674138566000,
MigrateExecutionStatus1676996103000,
UpdateRunningExecutionStatus1677237073720,
CreateExecutionMetadataTable1679416281777,
];

export { sqliteMigrations };
Loading