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

Reply via email to