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 887dd4d118d feat(array): add arraySliceLong scalar function (#18591)
887dd4d118d is described below
commit 887dd4d118dd19aa9a7e31deb1224dc16e5c9538
Author: rohit <[email protected]>
AuthorDate: Wed May 27 20:02:17 2026 +0530
feat(array): add arraySliceLong scalar function (#18591)
Add arraySliceLong(long[], int, int) to complement the existing
arraySliceInt and arraySliceString functions, filling a gap in the
LONG-typed array function family.
- ArrayFunctions.java: new @ScalarFunction arraySliceLong delegating to
Arrays.copyOfRange
- ArrayFunctionsTest: unit test via InbuiltFunctionEvaluator
- ScalarTransformFunctionWrapperTest: transform-layer test against LONG MV
column
- ArrayTest: integration test through broker→server pipeline, both query
engines
- all-functions.yaml: updated UDF snapshot to include arrayslicelong
Co-authored-by: Claude Sonnet 4.6 (1M context) <[email protected]>
---
.../pinot/common/function/scalar/ArrayFunctions.java | 5 +++++
.../pinot/core/data/function/ArrayFunctionsTest.java | 4 ++++
.../function/ScalarTransformFunctionWrapperTest.java | 16 ++++++++++++++++
.../pinot/integration/tests/custom/ArrayTest.java | 17 +++++++++++++++++
.../test/resources/udf-test-results/all-functions.yaml | 4 ++++
5 files changed, 46 insertions(+)
diff --git
a/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/ArrayFunctions.java
b/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/ArrayFunctions.java
index 3e272171c07..e7eb6baf798 100644
---
a/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/ArrayFunctions.java
+++
b/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/ArrayFunctions.java
@@ -139,6 +139,11 @@ public class ArrayFunctions {
return Arrays.copyOfRange(values, start, end);
}
+ @ScalarFunction
+ public static long[] arraySliceLong(long[] values, int start, int end) {
+ return Arrays.copyOfRange(values, start, end);
+ }
+
@ScalarFunction
public static String[] arraySliceString(String[] values, int start, int end)
{
return Arrays.copyOfRange(values, start, end);
diff --git
a/pinot-core/src/test/java/org/apache/pinot/core/data/function/ArrayFunctionsTest.java
b/pinot-core/src/test/java/org/apache/pinot/core/data/function/ArrayFunctionsTest.java
index fffa66c4ada..5b9f95221f3 100644
---
a/pinot-core/src/test/java/org/apache/pinot/core/data/function/ArrayFunctionsTest.java
+++
b/pinot-core/src/test/java/org/apache/pinot/core/data/function/ArrayFunctionsTest.java
@@ -54,6 +54,7 @@ public class ArrayFunctionsTest {
GenericRow row = new GenericRow();
row.putValue("intArray", new int[]{3, 2, 10, 6, 1, 12});
row.putValue("integerArray", new Integer[]{3, 2, 10, 6, 1, 12});
+ row.putValue("longArray", new long[]{3L, 2L, 10L, 6L, 1L, 12L});
row.putValue("stringArray", new String[]{"3", "2", "10", "6", "1", "12"});
row.putValue("stringArrayWithNulls", new String[]{"3", "2", "10", "6",
"1", "12", "", null});
@@ -129,6 +130,9 @@ public class ArrayFunctionsTest {
inputs.add(new Object[]{
"array_slice_int(integerArray, 1, 2)",
Collections.singletonList("integerArray"), row, new int[]{2}
});
+ inputs.add(new Object[]{
+ "array_slice_long(longArray, 1, 3)",
Collections.singletonList("longArray"), row, new long[]{2L, 10L}
+ });
inputs.add(new Object[]{
"array_slice_string(stringArray, 1, 2)",
Collections.singletonList("stringArray"), row, new String[]{"2"}
});
diff --git
a/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/ScalarTransformFunctionWrapperTest.java
b/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/ScalarTransformFunctionWrapperTest.java
index 8d8d951f3d9..e44a74f4647 100644
---
a/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/ScalarTransformFunctionWrapperTest.java
+++
b/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/ScalarTransformFunctionWrapperTest.java
@@ -691,6 +691,22 @@ public class ScalarTransformFunctionWrapperTest extends
BaseTransformFunctionTes
testTransformFunctionMV(transformFunction, expectedValues);
}
+ @Test
+ public void testArraySliceLongTransformFunction() {
+ ExpressionContext expression =
+ RequestContextUtils.getExpression(String.format("array_slice_long(%s,
1, 3)", LONG_MV_COLUMN));
+ TransformFunction transformFunction =
TransformFunctionFactory.get(expression, _dataSourceMap);
+ assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
+ assertEquals(transformFunction.getName(), "arraySliceLong");
+ assertEquals(transformFunction.getResultMetadata().getDataType(),
DataType.LONG);
+ assertFalse(transformFunction.getResultMetadata().isSingleValue());
+ long[][] expectedValues = new long[NUM_ROWS][];
+ for (int i = 0; i < NUM_ROWS; i++) {
+ expectedValues[i] = Arrays.copyOfRange(_longMVValues[i], 1, 3);
+ }
+ testTransformFunctionMV(transformFunction, expectedValues);
+ }
+
@Test
public void testArrayDistinctIntTransformFunction() {
ExpressionContext expression =
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 739058d5945..6a8d3770868 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
@@ -1015,6 +1015,23 @@ public class ArrayTest extends
CustomDataQueryClusterIntegrationTest {
}
}
+ @Test(dataProvider = "useBothQueryEngines")
+ public void testArraySliceLong(boolean useMultiStageQueryEngine)
+ throws Exception {
+ setUseMultiStageQueryEngine(useMultiStageQueryEngine);
+ // LONG_ARRAY_COLUMN contains [0, 1, 2, 3]; slicing [1, 3) yields [1, 2]
+ String query = String.format("SELECT array_slice_long(%s, 1, 3) FROM %s
WHERE %s = 0 LIMIT 1",
+ LONG_ARRAY_COLUMN, getTableName(), INT_COLUMN);
+ JsonNode result = postQuery(query).get("resultTable");
+
assertEquals(result.get("dataSchema").get("columnDataTypes").get(0).textValue(),
"LONG_ARRAY");
+ JsonNode rows = result.get("rows");
+ assertEquals(rows.size(), 1);
+ JsonNode values = rows.get(0).get(0);
+ assertEquals(values.size(), 2);
+ assertEquals(values.get(0).longValue(), 1L);
+ assertEquals(values.get(1).longValue(), 2L);
+ }
+
@Test(dataProvider = "useV1QueryEngine")
public void testGenerateIntArray(boolean useMultiStageQueryEngine)
throws Exception {
diff --git
a/pinot-integration-tests/src/test/resources/udf-test-results/all-functions.yaml
b/pinot-integration-tests/src/test/resources/udf-test-results/all-functions.yaml
index 27d9e7226d1..606f79f6d12 100644
---
a/pinot-integration-tests/src/test/resources/udf-test-results/all-functions.yaml
+++
b/pinot-integration-tests/src/test/resources/udf-test-results/all-functions.yaml
@@ -218,6 +218,10 @@ arraysliceint:
scalar:
"ArgumentCountBasedScalarFunction{org.apache.pinot.common.function.scalar.ArrayFunctions.arraySliceInt}"
transform: null
udf: null
+arrayslicelong:
+ scalar:
"ArgumentCountBasedScalarFunction{org.apache.pinot.common.function.scalar.ArrayFunctions.arraySliceLong}"
+ transform: null
+ udf: null
arrayslicestring:
scalar:
"ArgumentCountBasedScalarFunction{org.apache.pinot.common.function.scalar.ArrayFunctions.arraySliceString}"
transform: null
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]