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

xiangfu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 624b90b6d15 Fix ExpressionTransformer collection handling (#17363)
624b90b6d15 is described below

commit 624b90b6d15073257221426ec74cd014145d994e
Author: Xiang Fu <[email protected]>
AuthorDate: Fri Dec 12 16:42:56 2025 -0800

    Fix ExpressionTransformer collection handling (#17363)
---
 .../recordtransformer/ExpressionTransformer.java   |  6 +--
 .../ExpressionTransformerTest.java                 | 56 ++++++++++++++++++++++
 2 files changed, 59 insertions(+), 3 deletions(-)

diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/recordtransformer/ExpressionTransformer.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/recordtransformer/ExpressionTransformer.java
index 7c62372f409..3e7649f663f 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/recordtransformer/ExpressionTransformer.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/recordtransformer/ExpressionTransformer.java
@@ -20,7 +20,7 @@ package org.apache.pinot.segment.local.recordtransformer;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
-import java.util.Collections;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -154,7 +154,7 @@ public class ExpressionTransformer implements 
RecordTransformer {
           _throttledLogger.warn("Caught exception while evaluation transform 
function for column: " + column, e);
           record.markIncomplete();
         }
-      } else if (existingValue.getClass().isArray() || existingValue 
instanceof Collections
+      } else if (existingValue.getClass().isArray() || existingValue 
instanceof Collection
           || existingValue instanceof Map) {
         try {
           Object transformedValue = 
transformFunctionEvaluator.evaluate(record);
@@ -174,7 +174,7 @@ public class ExpressionTransformer implements 
RecordTransformer {
     if (transformedValue.getClass() == existingValue.getClass()) {
       return true;
     }
-    if (transformedValue instanceof Collections && existingValue instanceof 
Collections) {
+    if (transformedValue instanceof Collection && existingValue instanceof 
Collection) {
       return true;
     }
     if (transformedValue instanceof Map && existingValue instanceof Map) {
diff --git 
a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/recordtransformer/ExpressionTransformerTest.java
 
b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/recordtransformer/ExpressionTransformerTest.java
index 70935130b92..c8601a71a6e 100644
--- 
a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/recordtransformer/ExpressionTransformerTest.java
+++ 
b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/recordtransformer/ExpressionTransformerTest.java
@@ -241,6 +241,34 @@ public class ExpressionTransformerTest {
     Assert.assertEquals(genericRow.getValue("outgoing"), "123");
   }
 
+  @Test
+  public void testExistingCollectionIsTransformedWhenIncompatibleType() {
+    Schema schema = new Schema.SchemaBuilder()
+        .addMultiValueDimension("rawBids", FieldSpec.DataType.INT)
+        .addMultiValueDimension("bids", FieldSpec.DataType.INT)
+        .build();
+
+    IngestionConfig ingestionConfig = new IngestionConfig();
+    ingestionConfig.setTransformConfigs(Collections.singletonList(
+        new TransformConfig("bids", "Groovy({rawBids.toArray()}, rawBids)")));
+    TableConfig tableConfig = new TableConfigBuilder(TableType.OFFLINE)
+        .setTableName("testExistingCollectionIsTransformed")
+        .setIngestionConfig(ingestionConfig)
+        .build();
+
+    ExpressionTransformer expressionTransformer = new 
ExpressionTransformer(tableConfig, schema);
+    GenericRow genericRow = new GenericRow();
+    genericRow.putValue("rawBids", Arrays.asList(1, 2, 3));
+    // Simulate pre-existing collection value that should be overwritten by 
transform
+    genericRow.putValue("bids", Arrays.asList(10, 20));
+
+    expressionTransformer.transform(genericRow);
+
+    Object transformedValue = genericRow.getValue("bids");
+    Assert.assertTrue(transformedValue.getClass().isArray());
+    Assert.assertEquals(Arrays.asList((Object[]) transformedValue), 
Arrays.asList(1, 2, 3));
+  }
+
   @Test
   public void testTransformFunctionSortOrder() {
     Schema schema = new Schema.SchemaBuilder().addSingleValueDimension("a", 
FieldSpec.DataType.STRING)
@@ -430,4 +458,32 @@ public class ExpressionTransformerTest {
     Assert.assertEquals(map.get("a"), 1);
     Assert.assertEquals(map.get("b"), "x");
   }
+
+  @Test
+  public void testJsonToArrayIngestionTransform() {
+    Schema schema = new Schema.SchemaBuilder()
+        .addSingleValueDimension("columnJson", FieldSpec.DataType.STRING)
+        .addMultiValueDimension("columnArray", FieldSpec.DataType.STRING)
+        .build();
+
+    IngestionConfig ingestionConfig = new IngestionConfig();
+    ingestionConfig.setTransformConfigs(Collections.singletonList(
+        new TransformConfig("columnArray", "jsonPathArray(columnJson, '$')")));
+    TableConfig tableConfig = new TableConfigBuilder(TableType.OFFLINE)
+        .setTableName("testJsonToArrayIngestionTransform")
+        .setIngestionConfig(ingestionConfig)
+        .build();
+
+    ExpressionTransformer expressionTransformer = new 
ExpressionTransformer(tableConfig, schema);
+
+    GenericRow row = new GenericRow();
+    row.putValue("columnJson", "[\"a\",\"b\",\"c\"]");
+    // Pre-existing collection should be overwritten because transform returns 
an array (incompatible type)
+    row.putValue("columnArray", Arrays.asList("preExisting"));
+
+    expressionTransformer.transform(row);
+    Object transformedValue = row.getValue("columnArray");
+    Assert.assertTrue(transformedValue.getClass().isArray());
+    Assert.assertEquals(Arrays.asList((Object[]) transformedValue), 
Arrays.asList("a", "b", "c"));
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to