This is an automated email from the ASF dual-hosted git repository.
linxinyuan pushed a commit to branch xinyuan-support-mutilink
in repository https://gitbox.apache.org/repos/asf/texera.git
The following commit(s) were added to refs/heads/xinyuan-support-mutilink by
this push:
new 6cc4c41828 update
6cc4c41828 is described below
commit 6cc4c41828d38ed70dc4a205303da547b4f1e665
Author: Xinyuan Lin <[email protected]>
AuthorDate: Sat Mar 28 23:21:29 2026 -0700
update
---
...[Example] Machine Learning on Iris Dataset.json | 35 --------------
.../apache/texera/amber/operator/LogicalOp.scala | 2 -
.../texera/amber/operator/union/UnionOpDesc.scala | 53 ---------------------
.../texera/amber/operator/union/UnionOpExec.scala | 29 -----------
.../workflow-editor/workflow-editor.component.ts | 6 +--
frontend/src/assets/operator_images/Union.png | Bin 5713 -> 0 bytes
6 files changed, 2 insertions(+), 123 deletions(-)
diff --git a/bin/single-node/examples/workflows/[Example] Machine Learning on
Iris Dataset.json b/bin/single-node/examples/workflows/[Example] Machine
Learning on Iris Dataset.json
index d36d35dae5..65f1c442e4 100644
--- a/bin/single-node/examples/workflows/[Example] Machine Learning on Iris
Dataset.json
+++ b/bin/single-node/examples/workflows/[Example] Machine Learning on Iris
Dataset.json
@@ -15,7 +15,6 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -43,7 +42,6 @@
{
"portID": "input-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
}
@@ -52,7 +50,6 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -86,7 +83,6 @@
{
"portID": "input-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
}
@@ -95,7 +91,6 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -128,7 +123,6 @@
{
"portID": "input-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
}
@@ -137,7 +131,6 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -160,7 +153,6 @@
{
"portID": "input-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
}
@@ -169,13 +161,11 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
},
{
"portID": "output-1",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -198,7 +188,6 @@
{
"portID": "input-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
}
@@ -207,13 +196,11 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
},
{
"portID": "output-1",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -236,14 +223,12 @@
{
"portID": "input-0",
"displayName": "training",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
},
{
"portID": "input-1",
"displayName": "testing",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": [
{
@@ -257,7 +242,6 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -280,14 +264,12 @@
{
"portID": "input-0",
"displayName": "model",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
},
{
"portID": "input-1",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": [
{
@@ -301,7 +283,6 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -324,14 +305,12 @@
{
"portID": "input-0",
"displayName": "model",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
},
{
"portID": "input-1",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": [
{
@@ -345,7 +324,6 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -371,7 +349,6 @@
{
"portID": "input-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
}
@@ -380,7 +357,6 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -406,7 +382,6 @@
{
"portID": "input-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
}
@@ -415,7 +390,6 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -438,7 +412,6 @@
{
"portID": "input-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
}
@@ -447,13 +420,11 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
},
{
"portID": "output-1",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -476,7 +447,6 @@
{
"portID": "input-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
}
@@ -485,13 +455,11 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
},
{
"portID": "output-1",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
@@ -514,14 +482,12 @@
{
"portID": "input-0",
"displayName": "training",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": []
},
{
"portID": "input-1",
"displayName": "testing",
- "allowMultiInputs": false,
"isDynamicPort": false,
"dependencies": [
{
@@ -535,7 +501,6 @@
{
"portID": "output-0",
"displayName": "",
- "allowMultiInputs": false,
"isDynamicPort": false
}
],
diff --git
a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/LogicalOp.scala
b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/LogicalOp.scala
index 931596b1bf..7abf56b0b1 100644
---
a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/LogicalOp.scala
+++
b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/LogicalOp.scala
@@ -93,7 +93,6 @@ import org.apache.texera.amber.operator.udf.java.JavaUDFOpDesc
import org.apache.texera.amber.operator.udf.python._
import
org.apache.texera.amber.operator.udf.python.source.PythonUDFSourceOpDescV2
import org.apache.texera.amber.operator.udf.r.{RUDFOpDesc, RUDFSourceOpDesc}
-import org.apache.texera.amber.operator.union.UnionOpDesc
import org.apache.texera.amber.operator.unneststring.UnnestStringOpDesc
import org.apache.texera.amber.operator.visualization.DotPlot.DotPlotOpDesc
import
org.apache.texera.amber.operator.visualization.IcicleChart.IcicleChartOpDesc
@@ -181,7 +180,6 @@ trait StateTransferFunc
new Type(value = classOf[SpecializedFilterOpDesc], name = "Filter"),
new Type(value = classOf[ProjectionOpDesc], name = "Projection"),
new Type(value = classOf[StripChartOpDesc], name = "StripChart"),
- new Type(value = classOf[UnionOpDesc], name = "Union"),
new Type(value = classOf[KeywordSearchOpDesc], name = "KeywordSearch"),
new Type(value = classOf[SubstringSearchOpDesc], name = "SubstringSearch"),
new Type(value = classOf[AggregateOpDesc], name = "Aggregate"),
diff --git
a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/union/UnionOpDesc.scala
b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/union/UnionOpDesc.scala
deleted file mode 100644
index 4294732f60..0000000000
---
a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/union/UnionOpDesc.scala
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.texera.amber.operator.union
-
-import org.apache.texera.amber.core.executor.OpExecWithClassName
-import org.apache.texera.amber.core.virtualidentity.{ExecutionIdentity,
WorkflowIdentity}
-import org.apache.texera.amber.core.workflow.{InputPort, OutputPort,
PhysicalOp, PortIdentity}
-import org.apache.texera.amber.operator.LogicalOp
-import org.apache.texera.amber.operator.metadata.{OperatorGroupConstants,
OperatorInfo}
-
-class UnionOpDesc extends LogicalOp {
-
- override def getPhysicalOp(
- workflowId: WorkflowIdentity,
- executionId: ExecutionIdentity
- ): PhysicalOp = {
- PhysicalOp
- .oneToOnePhysicalOp(
- workflowId,
- executionId,
- operatorIdentifier,
-
OpExecWithClassName("org.apache.texera.amber.operator.union.UnionOpExec")
- )
- .withInputPorts(operatorInfo.inputPorts)
- .withOutputPorts(operatorInfo.outputPorts)
- }
-
- override def operatorInfo: OperatorInfo =
- OperatorInfo(
- "Union",
- "Unions the output rows from multiple input operators",
- OperatorGroupConstants.SET_GROUP,
- inputPorts = List(InputPort()),
- outputPorts = List(OutputPort())
- )
-}
diff --git
a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/union/UnionOpExec.scala
b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/union/UnionOpExec.scala
deleted file mode 100644
index aa9d585c46..0000000000
---
a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/union/UnionOpExec.scala
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.texera.amber.operator.union
-
-import org.apache.texera.amber.core.executor.OperatorExecutor
-import org.apache.texera.amber.core.tuple.{Tuple, TupleLike}
-
-class UnionOpExec extends OperatorExecutor {
- override def processTuple(tuple: Tuple, port: Int): Iterator[TupleLike] = {
- Iterator(tuple)
- }
-}
diff --git
a/frontend/src/app/workspace/component/workflow-editor/workflow-editor.component.ts
b/frontend/src/app/workspace/component/workflow-editor/workflow-editor.component.ts
index a7d3e60900..6e1ba0da41 100644
---
a/frontend/src/app/workspace/component/workflow-editor/workflow-editor.component.ts
+++
b/frontend/src/app/workspace/component/workflow-editor/workflow-editor.component.ts
@@ -1042,10 +1042,8 @@ export class WorkflowEditorComponent implements OnInit,
AfterViewInit, OnDestroy
connectedLinksToTargetPort.filter(
link => link.source.operatorID === sourceCellID && link.source.portID
=== sourcePortID
).length > 0;
- if (isDuplicateLink) {
- return false;
- }
- return !(connectedLinksToTargetPort.length > 0);
+
+ return !isDuplicateLink;
}
/**
diff --git a/frontend/src/assets/operator_images/Union.png
b/frontend/src/assets/operator_images/Union.png
deleted file mode 100644
index 6076c0a09d..0000000000
Binary files a/frontend/src/assets/operator_images/Union.png and /dev/null
differ