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

xiangfu0 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 95e18b145fe Support STRING_ARRAY literal rendering (#19246)
95e18b145fe is described below

commit 95e18b145fe17e52b8bffc599d4a0a0980d79b96
Author: Xiang Fu <[email protected]>
AuthorDate: Thu Aug 13 12:58:13 2026 -0700

    Support STRING_ARRAY literal rendering (#19246)
---
 .../common/request/context/LiteralContext.java     |  2 ++
 .../common/request/context/LiteralContextTest.java | 11 ++++++
 .../pinot/integration/tests/custom/ArrayTest.java  | 39 ++++++++++++++++++++++
 3 files changed, 52 insertions(+)

diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java
 
b/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java
index 15c56cffddc..3f5b09f0274 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java
@@ -331,6 +331,8 @@ public class LiteralContext {
         return "'" + Arrays.toString((float[]) _value) + "'";
       case PRIMITIVE_DOUBLE_ARRAY:
         return "'" + Arrays.toString((double[]) _value) + "'";
+      case STRING_ARRAY:
+        return "'" + Arrays.toString((String[]) _value) + "'";
       default:
         throw new IllegalStateException("Unsupported PinotDataType: " + 
_pinotDataType);
     }
diff --git 
a/pinot-common/src/test/java/org/apache/pinot/common/request/context/LiteralContextTest.java
 
b/pinot-common/src/test/java/org/apache/pinot/common/request/context/LiteralContextTest.java
index e1ac283c440..a89180cf566 100644
--- 
a/pinot-common/src/test/java/org/apache/pinot/common/request/context/LiteralContextTest.java
+++ 
b/pinot-common/src/test/java/org/apache/pinot/common/request/context/LiteralContextTest.java
@@ -20,6 +20,7 @@ package org.apache.pinot.common.request.context;
 
 import java.math.BigDecimal;
 import java.sql.Timestamp;
+import java.util.List;
 import java.util.UUID;
 import org.apache.pinot.common.request.Literal;
 import org.apache.pinot.spi.data.FieldSpec.DataType;
@@ -210,6 +211,16 @@ public class LiteralContextTest {
     assertEquals(new LiteralContext(DataType.STRING, 
"deadbeef").getBytesValue(), BytesUtils.toBytes("deadbeef"));
   }
 
+  @Test
+  public void testStringArrayLiteral() {
+    LiteralContext literalContext = new 
LiteralContext(Literal.stringArrayValue(List.of("foo", "bar")));
+
+    assertFalse(literalContext.isSingleValue());
+    assertEquals(literalContext.getType(), DataType.STRING);
+    assertEquals(literalContext.getValue(), new String[]{"foo", "bar"});
+    assertEquals(literalContext.toString(), "'[foo, bar]'");
+  }
+
   @Test
   public void testBytesLiteral() {
     LiteralContext literalContext = new LiteralContext(DataType.BYTES, 
BytesUtils.toBytes("deadbeef"));
diff --git 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/ArrayTest.java
 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/ArrayTest.java
index 6a8d3770868..f1958413607 100644
--- 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/ArrayTest.java
+++ 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/ArrayTest.java
@@ -526,6 +526,45 @@ public class ArrayTest extends 
CustomDataQueryClusterIntegrationTest {
     assertEquals(row.get(0).get(2).asText(), "t3");
   }
 
+  @Test(dataProvider = "useBothQueryEngines")
+  public void testFoldedStringArrayLiteralWithIngestedColumn(boolean 
useMultiStageQueryEngine)
+      throws Exception {
+    setUseMultiStageQueryEngine(useMultiStageQueryEngine);
+    // Selecting an ingested column sends the single-stage query to the 
servers, where the folded STRING_ARRAY literal
+    // is rendered. The returned column also verifies the Avro multi-value 
STRING data was ingested correctly.
+    String query = String.format("SELECT %s, %s, ARRAY['query-a','query-b'] 
FROM %s "
+            + "WHERE %s = 0 AND ARRAYS_OVERLAP(%s, 
ARRAY['/home','/not-present']) LIMIT 1",
+        INT_COLUMN, STRING_ARRAY_COLUMN, getTableName(), INT_COLUMN, 
STRING_ARRAY_COLUMN);
+    JsonNode result = postQuery(query).get("resultTable");
+    JsonNode columnDataTypes = result.get("dataSchema").get("columnDataTypes");
+    assertEquals(columnDataTypes.get(0).textValue(), "INT");
+    assertEquals(columnDataTypes.get(1).textValue(), "STRING_ARRAY");
+    assertEquals(columnDataTypes.get(2).textValue(), "STRING_ARRAY");
+
+    JsonNode rows = result.get("rows");
+    assertEquals(rows.size(), 1);
+    JsonNode row = rows.get(0);
+    assertEquals(row.size(), 3);
+    assertEquals(row.get(0).intValue(), 0);
+
+    JsonNode ingestedValues = row.get(1);
+    assertEquals(ingestedValues.size(), 4);
+    assertEquals(ingestedValues.get(0).textValue(), "/api/v1");
+    assertEquals(ingestedValues.get(1).textValue(), "/home");
+    assertEquals(ingestedValues.get(2).textValue(), "/api/v2");
+    assertEquals(ingestedValues.get(3).textValue(), "/metrics");
+
+    JsonNode literalValues = row.get(2);
+    assertEquals(literalValues.size(), 2);
+    assertEquals(literalValues.get(0).textValue(), "query-a");
+    assertEquals(literalValues.get(1).textValue(), "query-b");
+
+    String nonMatchingQuery = String.format(
+        "SELECT COUNT(*) FROM %s WHERE ARRAYS_OVERLAP(%s, 
ARRAY['/not-present','/also-not-present'])",
+        getTableName(), STRING_ARRAY_COLUMN);
+    
assertEquals(postQuery(nonMatchingQuery).get("resultTable").get("rows").get(0).get(0).longValue(),
 0L);
+  }
+
   @Test(dataProvider = "useBothQueryEngines")
   public void testIntArrayLiteral(boolean useMultiStageQueryEngine)
       throws Exception {


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

Reply via email to