This is an automated email from the ASF dual-hosted git repository.

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new d6623a8b2f The Formula transformation does not detect changes, fixes 
#7704 (#7723)
d6623a8b2f is described below

commit d6623a8b2f342382bc9034595ff5a29341f17b4a
Author: Hans Van Akelyen <[email protected]>
AuthorDate: Fri Jul 31 17:39:28 2026 +0200

    The Formula transformation does not detect changes, fixes #7704 (#7723)
---
 .../pipeline/transforms/formula/FormulaMeta.java   | 10 +++++-
 .../transforms/formula/FormulaMetaFunction.java    | 37 ++++++++++++++++------
 .../transforms/formula/FormulaMetaTest.java        | 20 ++++++++++++
 3 files changed, 56 insertions(+), 11 deletions(-)

diff --git 
a/plugins/transforms/formula/src/main/java/org/apache/hop/pipeline/transforms/formula/FormulaMeta.java
 
b/plugins/transforms/formula/src/main/java/org/apache/hop/pipeline/transforms/formula/FormulaMeta.java
index de7a9fd37b..a901f297cd 100644
--- 
a/plugins/transforms/formula/src/main/java/org/apache/hop/pipeline/transforms/formula/FormulaMeta.java
+++ 
b/plugins/transforms/formula/src/main/java/org/apache/hop/pipeline/transforms/formula/FormulaMeta.java
@@ -59,7 +59,15 @@ public class FormulaMeta extends BaseTransformMeta<Formula, 
FormulaData> {
   }
 
   public FormulaMeta(FormulaMeta m) {
-    this.formulas = m.formulas;
+    this();
+    for (FormulaMetaFunction formula : m.formulas) {
+      this.formulas.add(new FormulaMetaFunction(formula));
+    }
+  }
+
+  @Override
+  public FormulaMeta clone() {
+    return new FormulaMeta(this);
   }
 
   @Override
diff --git 
a/plugins/transforms/formula/src/main/java/org/apache/hop/pipeline/transforms/formula/FormulaMetaFunction.java
 
b/plugins/transforms/formula/src/main/java/org/apache/hop/pipeline/transforms/formula/FormulaMetaFunction.java
index 6c76e42ed4..bec2cbb0a5 100644
--- 
a/plugins/transforms/formula/src/main/java/org/apache/hop/pipeline/transforms/formula/FormulaMetaFunction.java
+++ 
b/plugins/transforms/formula/src/main/java/org/apache/hop/pipeline/transforms/formula/FormulaMetaFunction.java
@@ -99,19 +99,36 @@ public class FormulaMetaFunction {
     valuePrecision = -1;
   }
 
-  @Override
-  public int hashCode() {
-    return Objects.hash(
-        fieldName, formula, valueType, valueLength, valuePrecision, 
replaceField, setNa);
+  public FormulaMetaFunction(FormulaMetaFunction f) {
+    this.fieldName = f.fieldName;
+    this.formula = f.formula;
+    this.valueType = f.valueType;
+    this.valueLength = f.valueLength;
+    this.valuePrecision = f.valuePrecision;
+    this.replaceField = f.replaceField;
+    this.setNa = f.setNa;
   }
 
   @Override
-  public Object clone() {
-    try {
-      FormulaMetaFunction retval = (FormulaMetaFunction) super.clone();
-      return retval;
-    } catch (CloneNotSupportedException e) {
-      return null;
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof FormulaMetaFunction that)) {
+      return false;
     }
+    return valueType == that.valueType
+        && valueLength == that.valueLength
+        && valuePrecision == that.valuePrecision
+        && setNa == that.setNa
+        && Objects.equals(fieldName, that.fieldName)
+        && Objects.equals(formula, that.formula)
+        && Objects.equals(replaceField, that.replaceField);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        fieldName, formula, valueType, valueLength, valuePrecision, 
replaceField, setNa);
   }
 }
diff --git 
a/plugins/transforms/formula/src/test/java/org/apache/hop/pipeline/transforms/formula/FormulaMetaTest.java
 
b/plugins/transforms/formula/src/test/java/org/apache/hop/pipeline/transforms/formula/FormulaMetaTest.java
index 1bbee0cf36..0578758480 100644
--- 
a/plugins/transforms/formula/src/test/java/org/apache/hop/pipeline/transforms/formula/FormulaMetaTest.java
+++ 
b/plugins/transforms/formula/src/test/java/org/apache/hop/pipeline/transforms/formula/FormulaMetaTest.java
@@ -18,6 +18,7 @@
 package org.apache.hop.pipeline.transforms.formula;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -57,6 +58,25 @@ class FormulaMetaTest {
     assertEquals(formulaMeta.getFormulas(), copy.getFormulas());
   }
 
+  @Test
+  void testCloneIsDeep() {
+    List<FormulaMetaFunction> formulas = new ArrayList<>();
+    formulas.add(new FormulaMetaFunction("test", "1+1", 1, 10, 2, "", false));
+    formulaMeta.setFormulas(formulas);
+
+    // This is what the transform dialog does when snapshotting the "before" 
state: the snapshot
+    // must survive the dialog clearing and repopulating the live list, 
otherwise the change goes
+    // unnoticed and the pipeline can't be saved.
+    FormulaMeta before = formulaMeta.clone();
+
+    formulaMeta.getFormulas().clear();
+    formulaMeta.getFormulas().add(new FormulaMetaFunction("test", "2+2", 1, 
10, 2, "", false));
+
+    assertEquals(1, before.getFormulas().size());
+    assertEquals("1+1", before.getFormulas().get(0).getFormula());
+    assertNotEquals(formulaMeta.getFormulas(), before.getFormulas());
+  }
+
   @Test
   void testGetFields_ReplaceField() throws Exception {
     IRowMeta rowMeta = new RowMeta();

Reply via email to