Skip to content

Commit 2b92855

Browse files
committed
AP-25344: Option to remove failed tools from combined tools workflow
AP-25344 (Properly handle failing tools in combined tools workflow)
1 parent 74920b9 commit 2b92855

File tree

5 files changed

+15
-11
lines changed

5 files changed

+15
-11
lines changed

org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/CloseablePythonNodeProxy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ public PythonToolResult execute_tool(final PurePythonTablePortObject toolTable,
555555

556556
@Override
557557
public CombinedToolsWorkflowInfo init_combined_tools_workflow(final List<PythonPortObject> inputs,
558-
final String execMode) {
558+
final String execMode, final boolean removeFailedTools) {
559559
throw new UnsupportedOperationException(
560560
"Initializing a combined tools workflow is not supported here.");
561561
}

org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/DefaultViewContext.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ public PythonToolResult execute_tool(final PurePythonTablePortObject toolTable,
114114

115115
@Override
116116
public CombinedToolsWorkflowInfo init_combined_tools_workflow(final List<PythonPortObject> inputs,
117-
final String execMode) {
118-
return m_toolExecutor.initCombinedToolsWorkflow(inputs, execMode);
117+
final String execMode, final boolean removeFailedTools) {
118+
return m_toolExecutor.initCombinedToolsWorkflow(inputs, execMode, removeFailedTools);
119119
}
120120

121121
@Override

org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/ToolExecutor.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ PythonToolResult executeTool(final PurePythonTablePortObject pythonToolTable, fi
181181
}
182182

183183
CombinedToolsWorkflowInfo initCombinedToolsWorkflow(final List<PythonPortObject> inputs,
184-
final String execModeString) {
184+
final String execModeString, final boolean removeFailedTools) {
185185
m_fileStoreSwitcher.switchFileStoreHandler(m_nodeContainer, false);
186186

187187
Map<String, FileStore> dummyFileStoreMap = Map.of();
@@ -194,7 +194,7 @@ CombinedToolsWorkflowInfo initCombinedToolsWorkflow(final List<PythonPortObject>
194194
.toArray(PortObject[]::new);
195195
m_workflowExecutor =
196196
WorkflowSegmentExecutor.builder(m_nodeContainer, execMode, "Combined tools workflow", warning -> {
197-
}, m_exec, false).combined(inputPortObjects).build();
197+
}, m_exec, false).combined(inputPortObjects).removeFailedSegments(removeFailedTools).build();
198198
var combinedToolsWorkflowId = m_workflowExecutor.getWorkflow().getID();
199199
m_disposeCombinedToolsWorkflowOnClose = true;
200200
m_combinedToolsWorkflow = new VirtualProject(combinedToolsWorkflowId);
@@ -203,7 +203,8 @@ CombinedToolsWorkflowInfo initCombinedToolsWorkflow(final List<PythonPortObject>
203203
} else {
204204
m_workflowExecutor =
205205
WorkflowSegmentExecutor.builder(m_nodeContainer, execMode, "Combined tools workflow", warning -> {
206-
}, m_exec, false).combined(m_combinedToolsWorkflow.loadAndGetWorkflow()).build();
206+
}, m_exec, false).combined(m_combinedToolsWorkflow.loadAndGetWorkflow())
207+
.removeFailedSegments(removeFailedTools).build();
207208
assert inputs.isEmpty();
208209
inputPortIds = List.of();
209210
}
@@ -411,8 +412,7 @@ private static WorkflowSegment createWorkflowSegmentWithRemovedIONodes(final Wor
411412
segmentWfm = createEmptyWorkflow("workflow_segment");
412413
var copyContent = WorkflowCopyContent.builder()
413414
.setNodeIDs(wfm.getNodeContainers().stream().map(NodeContainer::getID).toArray(NodeID[]::new)).build();
414-
var persistor = wfm.copy(copyContent);
415-
segmentWfm.paste(persistor);
415+
segmentWfm.copyFromAndPasteHere(wfm, copyContent);
416416
List<Input> inputs = new ArrayList<>();
417417
List<Output> outputs = new ArrayList<>();
418418
removeAndCollectContainerInputsAndOutputs(segmentWfm, inputs, inputIds, outputs, outputIds);

org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/proxy/PythonToolContext.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,11 @@ public record CombinedToolsWorkflowInfo(String projectId, String workflowId, Lis
100100
*
101101
* @param inputs the source inputs of the combined-tools workflow
102102
* @param execMode DEFAUTL, DETACHED or DEBUG
103+
* @param removeFailedTools whether to remove failed tools from the combined workflow
103104
* @return info about the initialized combined-tools workflow
104105
*/
105-
CombinedToolsWorkflowInfo init_combined_tools_workflow(List<PythonPortObject> inputs, String execMode);
106+
CombinedToolsWorkflowInfo init_combined_tools_workflow(List<PythonPortObject> inputs, String execMode,
107+
boolean removeFailedTools);
106108

107109
/**
108110
* @return the combined-tools workflow as a Python port object

org.knime.python3.nodes/src/main/python/_node_backend_launcher.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,13 +1473,15 @@ def execute_tool(self, tool, parameters: dict, inputs: List, execution_hints: di
14731473

14741474
return result.message(), outputs, result.viewNodeIds()
14751475

1476-
def init_combined_tools_workflow(self, inputs: List, execution_mode: str):
1476+
def init_combined_tools_workflow(
1477+
self, inputs: List, execution_mode: str, remove_failed_tools: bool
1478+
):
14771479
prepared_inputs = []
14781480
for input in inputs:
14791481
prepared_input = self._type_registry.table_from_python(input)
14801482
prepared_inputs.append(prepared_input)
14811483
result = self._java_ctx.init_combined_tools_workflow(
1482-
prepared_inputs, execution_mode
1484+
prepared_inputs, execution_mode, remove_failed_tools
14831485
)
14841486
return result.projectId(), result.workflowId(), result.inputPortIds()
14851487

0 commit comments

Comments
 (0)