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]