fix(editor): Fix unnecessary execution of nodes when there is pin data (#8567)

Co-authored-by: Omar Ajoue <krynble@gmail.com>
This commit is contained in:
Csaba Tuncsik
2024-02-16 17:24:07 +01:00
committed by GitHub
parent 9c0fe413d9
commit 46fe544b9a
3 changed files with 224 additions and 41 deletions

View File

@@ -7,7 +7,9 @@ import type {
IRunData,
IRunExecutionData,
ITaskData,
IPinData,
IWorkflowBase,
Workflow,
} from 'n8n-workflow';
import {
NodeHelpers,
@@ -29,6 +31,55 @@ import { useExternalHooks } from '@/composables/useExternalHooks';
import { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';
import { useRouter } from 'vue-router';
export const consolidateRunDataAndStartNodes = (
directParentNodes: string[],
runData: IRunData | null,
pinData: IPinData | undefined,
workflow: Workflow,
): { runData: IRunData | undefined; startNodes: string[] } => {
const startNodes: string[] = [];
let newRunData: IRunData | undefined;
if (runData !== null && Object.keys(runData).length !== 0) {
newRunData = {};
// Go over the direct parents of the node
for (const directParentNode of directParentNodes) {
// Go over the parents of that node so that we can get a start
// node for each of the branches
const parentNodes = workflow.getParentNodes(directParentNode, NodeConnectionType.Main);
// Add also the enabled direct parent to be checked
if (workflow.nodes[directParentNode].disabled) continue;
parentNodes.push(directParentNode);
for (const parentNode of parentNodes) {
if (
(runData[parentNode] === undefined || runData[parentNode].length === 0) &&
pinData?.[parentNode].length === 0
) {
// When we hit a node which has no data we stop and set it
// as a start node the execution from and then go on with other
// direct input nodes
startNodes.push(parentNode);
break;
}
if (runData[parentNode] !== undefined) {
newRunData[parentNode] = runData[parentNode]?.slice(0, 1);
}
}
}
if (Object.keys(newRunData).length === 0) {
// If there is no data for any of the parent nodes make sure
// that run data is empty that it runs regularly
newRunData = undefined;
}
}
return { runData: newRunData, startNodes };
};
export const workflowRun = defineComponent({
setup() {
const nodeHelpers = useNodeHelpers();
@@ -181,43 +232,21 @@ export const workflowRun = defineComponent({
const runData = this.workflowsStore.getWorkflowRunData;
let newRunData: IRunData | undefined;
const startNodes: string[] = [];
if (runData !== null && Object.keys(runData).length !== 0) {
newRunData = {};
// Go over the direct parents of the node
for (const directParentNode of directParentNodes) {
// Go over the parents of that node so that we can get a start
// node for each of the branches
const parentNodes = workflow.getParentNodes(directParentNode, NodeConnectionType.Main);
// Add also the enabled direct parent to be checked
if (workflow.nodes[directParentNode].disabled) continue;
parentNodes.push(directParentNode);
for (const parentNode of parentNodes) {
if (runData[parentNode] === undefined || runData[parentNode].length === 0) {
// When we hit a node which has no data we stop and set it
// as a start node the execution from and then go on with other
// direct input nodes
startNodes.push(parentNode);
break;
}
newRunData[parentNode] = runData[parentNode].slice(0, 1);
}
}
if (Object.keys(newRunData).length === 0) {
// If there is no data for any of the parent nodes make sure
// that run data is empty that it runs regularly
newRunData = undefined;
}
if (this.workflowsStore.isNewWorkflow) {
await this.workflowHelpers.saveCurrentWorkflow();
}
const workflowData = await this.workflowHelpers.getWorkflowDataToSave();
const consolidatedData = consolidateRunDataAndStartNodes(
directParentNodes,
runData,
workflowData.pinData,
workflow,
);
const { startNodes } = consolidatedData;
let { runData: newRunData } = consolidatedData;
let executedNode: string | undefined;
if (
startNodes.length === 0 &&
@@ -236,12 +265,6 @@ export const workflowRun = defineComponent({
executedNode = options.triggerNode;
}
if (this.workflowsStore.isNewWorkflow) {
await this.workflowHelpers.saveCurrentWorkflow();
}
const workflowData = await this.workflowHelpers.getWorkflowDataToSave();
const startRunData: IStartRunData = {
workflowData,
runData: newRunData,