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();