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 2ed2e47ddf Issues #6626 : table compare CTE improvements (#6629)
2ed2e47ddf is described below

commit 2ed2e47ddf0f90ca7764a93586f253013e5d509a
Author: Matt Casters <[email protected]>
AuthorDate: Mon Feb 23 09:05:54 2026 +0100

    Issues #6626 : table compare CTE improvements (#6629)
    
    Co-authored-by: Matt Casters <[email protected]>
---
 .../pages/pipeline/transforms/tablecompare.adoc    |  4 ++
 .../transforms/tablecompare/TableCompare.java      | 78 +++++++++++++++++-----
 .../transforms/tablecompare/TableCompareData.java  |  2 +
 .../tablecompare/TableCompareDialog.java           | 34 ++++++++++
 .../transforms/tablecompare/TableCompareMeta.java  | 12 ++++
 .../messages/messages_en_US.properties             |  6 ++
 6 files changed, 118 insertions(+), 18 deletions(-)

diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/tablecompare.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/tablecompare.adoc
index 6eeb781333..ca686f8689 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/tablecompare.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/tablecompare.adoc
@@ -52,6 +52,10 @@ TIP: You can click on the red error handling arrow to 
configure additional infor
 |Reference schema field / Compare schema field|contain the schema names for 
the reference/compare table.
 |Reference table field / Compare table field|contain the actual table names.
 This means that you could compare two tables with a different name, as long as 
they have the same column names.
+|Reference CTE field / Compare CTE field|Specify the Common Table Expression 
to use with the table queries to compare values.
+This CTE clause will be pre-pended to the generated SQL.
+You can specify multiple CTEs but the one being read from must be called 
`_<table name>`
+(with an underscore in front of the table name in other words).
 |===
 
 === Other fields tab
diff --git 
a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompare.java
 
b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompare.java
index 25e0969246..e19145988c 100644
--- 
a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompare.java
+++ 
b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompare.java
@@ -18,6 +18,7 @@
 package org.apache.hop.pipeline.transforms.tablecompare;
 
 import java.sql.ResultSet;
+import org.apache.commons.lang.StringUtils;
 import org.apache.hop.core.Const;
 import org.apache.hop.core.database.Database;
 import org.apache.hop.core.database.DatabaseMeta;
@@ -95,6 +96,8 @@ public class TableCompare extends 
BaseTransform<TableCompareMeta, TableCompareDa
                 CONST_TABLE_COMPARE_EXCEPTION_CAN_NOT_FIND_FIELD,
                 meta.getReferenceTableField()));
       }
+      // Optional CTE
+      data.refCteIndex = 
getInputRowMeta().indexOfValue(meta.getReferenceCteField());
 
       // Compare schema
       //
@@ -125,6 +128,8 @@ public class TableCompare extends 
BaseTransform<TableCompareMeta, TableCompareDa
                 CONST_TABLE_COMPARE_EXCEPTION_CAN_NOT_FIND_FIELD,
                 meta.getCompareTableField()));
       }
+      // Optional CTE
+      data.cmpCteIndex = 
getInputRowMeta().indexOfValue(meta.getCompareCteField());
 
       // Key fields
       //
@@ -210,8 +215,17 @@ public class TableCompare extends 
BaseTransform<TableCompareMeta, TableCompareDa
     try {
       String referenceSchema = getInputRowMeta().getString(r, 
data.refSchemaIndex);
       String referenceTable = getInputRowMeta().getString(r, 
data.refTableIndex);
+
+      String referenceCte = "";
+      if (data.refCteIndex >= 0) {
+        referenceCte = getInputRowMeta().getString(r, data.refCteIndex);
+      }
       String compareSchema = getInputRowMeta().getString(r, 
data.cmpSchemaIndex);
       String compareTable = getInputRowMeta().getString(r, data.cmpTableIndex);
+      String compareCte = "";
+      if (data.cmpCteIndex >= 0) {
+        compareCte = getInputRowMeta().getString(r, data.cmpCteIndex);
+      }
       String keyFields = getInputRowMeta().getString(r, data.keyFieldsIndex);
       String excludeFields = getInputRowMeta().getString(r, 
data.excludeFieldsIndex);
 
@@ -220,8 +234,10 @@ public class TableCompare extends 
BaseTransform<TableCompareMeta, TableCompareDa
           r,
           referenceSchema,
           referenceTable,
+          referenceCte,
           compareSchema,
           compareTable,
+          compareCte,
           keyFields,
           excludeFields);
     } catch (Exception e) {
@@ -235,8 +251,10 @@ public class TableCompare extends 
BaseTransform<TableCompareMeta, TableCompareDa
       Object[] r,
       String referenceSchema,
       String referenceTable,
+      String referenceCte,
       String compareSchema,
       String compareTable,
+      String compareCte,
       String keyFields,
       String excludeFields)
       throws HopException {
@@ -315,7 +333,9 @@ public class TableCompare extends 
BaseTransform<TableCompareMeta, TableCompareDa
 
     try {
       IRowMeta refFields = 
data.referenceDb.getTableFieldsMeta(referenceSchema, referenceTable);
+      IRowMeta allRefFields = refFields.clone();
       IRowMeta cmpFields = data.compareDb.getTableFieldsMeta(compareSchema, 
compareTable);
+      IRowMeta allCmpFields = cmpFields.clone();
 
       // Remove the excluded fields from these fields...
       //
@@ -350,7 +370,7 @@ public class TableCompare extends 
BaseTransform<TableCompareMeta, TableCompareDa
         // See if all the key fields exist in the reference & compare tables...
         //
         for (String key : keys) {
-          if (refFields.indexOfValue(key) < 0) {
+          if (allRefFields.indexOfValue(key) < 0) {
             if (getTransformMeta().isDoingErrorHandling()) {
               Object[] errorRowData = constructErrorRow(rowMeta, r, null, 
null, null);
               putError(
@@ -369,7 +389,7 @@ public class TableCompare extends 
BaseTransform<TableCompareMeta, TableCompareDa
           }
         }
         for (String key : keys) {
-          if (cmpFields.indexOfValue(key) < 0) {
+          if (allCmpFields.indexOfValue(key) < 0) {
             if (getTransformMeta().isDoingErrorHandling()) {
               Object[] errorRowData = constructErrorRow(rowMeta, r, null, 
null, null);
               putError(
@@ -403,10 +423,18 @@ public class TableCompare extends 
BaseTransform<TableCompareMeta, TableCompareDa
 
         int[] keyNrs = new int[keys.length];
 
+        // The reference SQL
         StringBuilder refSql = new StringBuilder();
+        if (StringUtils.isNotEmpty(referenceCte)) {
+          refSql.append(referenceCte);
+        }
         refSql.append("SELECT ");
-        StringBuilder cmpSql = new StringBuilder();
 
+        // The compare SQL
+        StringBuilder cmpSql = new StringBuilder();
+        if (StringUtils.isNotEmpty(compareCte)) {
+          cmpSql.append(compareCte);
+        }
         cmpSql.append("SELECT ");
         for (int i = 0; i < keys.length; i++) {
           if (i > 0) {
@@ -417,25 +445,39 @@ public class TableCompare extends 
BaseTransform<TableCompareMeta, TableCompareDa
           refSql.append(refConnectionDatabaseMeta.quoteField(keys[i]));
           cmpSql.append(refConnectionDatabaseMeta.quoteField(keys[i]));
         }
-        int[] valueNrs = new int[refFields.size() - keys.length];
-        int valueNr = keys.length;
-        int valueIndex = 0;
-        for (int i = 0; i < refFields.getFieldNames().length; i++) {
-          String field = refFields.getFieldNames()[i];
-          if (Const.indexOfString(field, keys) < 0) {
-            refSql.append(", 
").append(refConnectionDatabaseMeta.quoteField(field));
-            valueRowMeta.addValueMeta(refFields.searchValueMeta(field));
-            valueNrs[valueIndex++] = valueNr++;
+
+        // We only compare values if there are any to compare
+        //
+        int[] valueNrs = new int[0];
+        if (refFields.size() - keys.length > 0) {
+          valueNrs = new int[refFields.size() - keys.length];
+          int valueNr = keys.length;
+          int valueIndex = 0;
+          for (int i = 0; i < refFields.getFieldNames().length; i++) {
+            String field = refFields.getFieldNames()[i];
+            if (Const.indexOfString(field, keys) < 0) {
+              refSql.append(", 
").append(refConnectionDatabaseMeta.quoteField(field));
+              valueRowMeta.addValueMeta(refFields.searchValueMeta(field));
+              valueNrs[valueIndex++] = valueNr++;
+            }
           }
-        }
 
-        for (String field : cmpFields.getFieldNames()) {
-          if (Const.indexOfString(field, keys) < 0) {
-            cmpSql.append(", 
").append(compConnectionDatabaseMeta.quoteField(field));
+          for (String field : cmpFields.getFieldNames()) {
+            if (Const.indexOfString(field, keys) < 0) {
+              cmpSql.append(", 
").append(compConnectionDatabaseMeta.quoteField(field));
+            }
           }
         }
-        refSql.append(" FROM ").append(refSchemaTable).append(" ORDER BY ");
-        cmpSql.append(" FROM ").append(cmpSchemaTable).append(" ORDER BY ");
+        refSql.append(" FROM ");
+        if (StringUtils.isNotEmpty(referenceCte)) {
+          refSql.append("_");
+        }
+        refSql.append(refSchemaTable).append(" ORDER BY ");
+        cmpSql.append(" FROM ");
+        if (StringUtils.isNotEmpty(compareCte)) {
+          cmpSql.append("_");
+        }
+        cmpSql.append(cmpSchemaTable).append(" ORDER BY ");
         for (int i = 0; i < keys.length; i++) {
           if (i > 0) {
             refSql.append(", ");
diff --git 
a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareData.java
 
b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareData.java
index 37d3ea91df..c17833128d 100644
--- 
a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareData.java
+++ 
b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareData.java
@@ -30,8 +30,10 @@ public class TableCompareData extends BaseTransformData 
implements ITransformDat
 
   public int refSchemaIndex;
   public int refTableIndex;
+  public int refCteIndex;
   public int cmpSchemaIndex;
   public int cmpTableIndex;
+  public int cmpCteIndex;
   public int keyFieldsIndex;
   public int excludeFieldsIndex;
 
diff --git 
a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareDialog.java
 
b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareDialog.java
index 3c6090e62d..36584e367b 100644
--- 
a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareDialog.java
+++ 
b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareDialog.java
@@ -62,10 +62,12 @@ public class TableCompareDialog extends BaseTransformDialog 
{
   private MetaSelectionLine<DatabaseMeta> wReferenceDB;
   private LabelCombo wReferenceSchema;
   private LabelCombo wReferenceTable;
+  private LabelCombo wReferenceCte;
 
   private MetaSelectionLine<DatabaseMeta> wCompareDB;
   private LabelCombo wCompareSchema;
   private LabelCombo wCompareTable;
+  private LabelCombo wCompareCte;
 
   private LabelCombo wKeyFields;
   private LabelCombo wExcludeFields;
@@ -166,6 +168,19 @@ public class TableCompareDialog extends 
BaseTransformDialog {
     fdReferenceTable.top = new FormAttachment(lastControl, margin);
     fdReferenceTable.right = new FormAttachment(100, 0);
     wReferenceTable.setLayoutData(fdReferenceTable);
+    lastControl = wReferenceTable;
+
+    wReferenceCte =
+        new LabelCombo(
+            wReferenceComp,
+            BaseMessages.getString(PKG, 
"TableCompareDialog.ReferenceCteField.Label"),
+            BaseMessages.getString(PKG, 
"TableCompareDialog.ReferenceCteField.Tooltip"));
+    PropsUi.setLook(wReferenceCte);
+    FormData fdReferenceCte = new FormData();
+    fdReferenceCte.left = new FormAttachment(0, 0);
+    fdReferenceCte.top = new FormAttachment(lastControl, margin);
+    fdReferenceCte.right = new FormAttachment(100, 0);
+    wReferenceCte.setLayoutData(fdReferenceCte);
 
     FormData fdReferenceComp = new FormData();
     fdReferenceComp.left = new FormAttachment(0, 0);
@@ -236,6 +251,19 @@ public class TableCompareDialog extends 
BaseTransformDialog {
     fdCompareTable.top = new FormAttachment(lastControl, margin);
     fdCompareTable.right = new FormAttachment(100, 0);
     wCompareTable.setLayoutData(fdCompareTable);
+    lastControl = wCompareTable;
+
+    wCompareCte =
+        new LabelCombo(
+            wComparisonComp,
+            BaseMessages.getString(PKG, 
"TableCompareDialog.CompareCteField.Label"),
+            BaseMessages.getString(PKG, 
"TableCompareDialog.CompareCteField.Tooltip"));
+    PropsUi.setLook(wCompareCte);
+    FormData fdCompareCte = new FormData();
+    fdCompareCte.left = new FormAttachment(0, 0);
+    fdCompareCte.top = new FormAttachment(lastControl, margin);
+    fdCompareCte.right = new FormAttachment(100, 0);
+    wCompareCte.setLayoutData(fdCompareCte);
 
     FormData fdComparisonComp = new FormData();
     fdComparisonComp.left = new FormAttachment(0, 0);
@@ -521,8 +549,10 @@ public class TableCompareDialog extends 
BaseTransformDialog {
 
               wReferenceSchema.setItems(prevTransformFieldNames);
               wReferenceTable.setItems(prevTransformFieldNames);
+              wReferenceCte.setItems(prevTransformFieldNames);
               wCompareSchema.setItems(prevTransformFieldNames);
               wCompareTable.setItems(prevTransformFieldNames);
+              wCompareCte.setItems(prevTransformFieldNames);
               wKeyFields.setItems(prevTransformFieldNames);
               wExcludeFields.setItems(prevTransformFieldNames);
               wKeyDesc.setItems(prevTransformFieldNames);
@@ -541,9 +571,11 @@ public class TableCompareDialog extends 
BaseTransformDialog {
         input.getReferenceConnection() != null ? 
input.getReferenceConnection() : "");
     wReferenceSchema.setText(Const.NVL(input.getReferenceSchemaField(), ""));
     wReferenceTable.setText(Const.NVL(input.getReferenceTableField(), ""));
+    wReferenceCte.setText(Const.NVL(input.getReferenceCteField(), ""));
     wCompareDB.setText(input.getCompareConnection() != null ? 
input.getCompareConnection() : "");
     wCompareSchema.setText(Const.NVL(input.getCompareSchemaField(), ""));
     wCompareTable.setText(Const.NVL(input.getCompareTableField(), ""));
+    wCompareCte.setText(Const.NVL(input.getCompareCteField(), ""));
     wKeyFields.setText(Const.NVL(input.getKeyFieldsField(), ""));
     wExcludeFields.setText(Const.NVL(input.getExcludeFieldsField(), ""));
 
@@ -576,9 +608,11 @@ public class TableCompareDialog extends 
BaseTransformDialog {
     input.setReferenceConnection(wReferenceDB.getText());
     input.setReferenceSchemaField(wReferenceSchema.getText());
     input.setReferenceTableField(wReferenceTable.getText());
+    input.setReferenceCteField(wReferenceCte.getText());
     input.setCompareConnection(wCompareDB.getText());
     input.setCompareSchemaField(wCompareSchema.getText());
     input.setCompareTableField(wCompareTable.getText());
+    input.setCompareCteField(wCompareCte.getText());
     input.setKeyFieldsField(wKeyFields.getText());
     input.setExcludeFieldsField(wExcludeFields.getText());
 
diff --git 
a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareMeta.java
 
b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareMeta.java
index 4e374f1983..fd44271bbc 100644
--- 
a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareMeta.java
+++ 
b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareMeta.java
@@ -70,6 +70,12 @@ public class TableCompareMeta extends 
BaseTransformMeta<TableCompare, TableCompa
       hopMetadataPropertyType = HopMetadataPropertyType.RDBMS_TABLE)
   private String referenceTableField;
 
+  @HopMetadataProperty(
+      key = "reference_cte_field",
+      injectionKeyDescription = " 
TableCompareMeta.Injection.ReferenceCteField",
+      hopMetadataPropertyType = HopMetadataPropertyType.RDBMS_TABLE)
+  private String referenceCteField;
+
   @HopMetadataProperty(
       key = "compare_connection",
       injectionKeyDescription = "TableCompareMeta.Injection.CompareConnection",
@@ -88,6 +94,12 @@ public class TableCompareMeta extends 
BaseTransformMeta<TableCompare, TableCompa
       hopMetadataPropertyType = HopMetadataPropertyType.RDBMS_TABLE)
   private String compareTableField;
 
+  @HopMetadataProperty(
+      key = "compare_cte_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.CompareCteField",
+      hopMetadataPropertyType = HopMetadataPropertyType.RDBMS_TABLE)
+  private String compareCteField;
+
   @HopMetadataProperty(
       key = "key_fields_field",
       injectionKeyDescription = "TableCompareMeta.Injection.KeyFieldsField")
diff --git 
a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_en_US.properties
 
b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_en_US.properties
index 5a9864455a..29a6e5a861 100644
--- 
a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_en_US.properties
+++ 
b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_en_US.properties
@@ -51,6 +51,8 @@ TableCompareDialog.CompareSchemaField.Label=Compare schema 
field
 TableCompareDialog.CompareSchemaField.Tooltip=Select the field to get the 
compare schema values from
 TableCompareDialog.CompareTableField.Label=Compare table field
 TableCompareDialog.CompareTableField.Tooltip=Select the field to get the 
compare table values from
+TableCompareDialog.CompareCteField.Label=Compare CTE field
+TableCompareDialog.CompareCteField.Tooltip=Select the field to get the compare 
CTE values from
 TableCompareDialog.CompareValueField.Label=Error handling compare value input 
field
 TableCompareDialog.CompareValueField.Tooltip=The name of the field that will 
be used by the error handling of this transform to describe the compare value 
that caused an error.
 TableCompareDialog.DoMapping.UnableToFindInput=Error getting fields from 
incoming stream\!
@@ -82,6 +84,8 @@ TableCompareDialog.ReferenceSchemaField.Label=Reference 
schema field
 TableCompareDialog.ReferenceSchemaField.Tooltip=Select the field to get the 
reference schema values from
 TableCompareDialog.ReferenceTableField.Label=Reference table field
 TableCompareDialog.ReferenceTableField.Tooltip=Select the field to get the 
reference table values from
+TableCompareDialog.ReferenceCteField.Label=Reference CTE field
+TableCompareDialog.ReferenceCteField.Tooltip=Select the field to get the 
reference CTE values from
 TableCompareDialog.ReferenceValueField.Label=Error handling reference value 
input field
 TableCompareDialog.ReferenceValueField.Tooltip=The name of the field that will 
be used by the error handling of this transform to describe the reference value 
that caused an error.
 TableCompareDialog.Shell.Title=Table compare
@@ -95,6 +99,7 @@ 
TableCompareMeta.Exception.NrRecordsReferenceFieldNotSpecified=The name of the r
 TableCompareMeta.Injection.CompareConnection=Comparison connection
 TableCompareMeta.Injection.CompareSchemaField=Comparison schema field
 TableCompareMeta.Injection.CompareTableField=Compare table field
+TableCompareMeta.Injection.CompareCteField=Compare CTE field
 TableCompareMeta.Injection.ExcludeFieldsField=Exclude fields field
 TableCompareMeta.Injection.KeyDescriptionField=Error handling key description 
input field
 TableCompareMeta.Injection.KeyFieldsField=Key fields field
@@ -107,6 +112,7 @@ TableCompareMeta.Injection.NrRecordsReferenceField=Number 
of reference table rec
 TableCompareMeta.Injection.ReferenceConnection=Reference connection
 TableCompareMeta.Injection.ReferenceSchemaField=Reference schema field
 TableCompareMeta.Injection.ReferenceTableField=Reference table field
+TableCompareMeta.Injection.ReferenceCteField=Reference CTE field
 TableCompareMeta.Injection.ValueCompareField=Error handling compare value 
input field
 TableCompareMeta.Injection.ValueReferenceField=Error handling reference value 
input field
 TableCompareMeta.keyword=table,compare

Reply via email to