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]

Reply via email to