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 5ca1d97bce Fix [Type]ArrayList elements() method usage (#13354)
5ca1d97bce is described below

commit 5ca1d97bced079055f26acb40c80eb5c511930cf
Author: Xiang Fu <xiangfu.1...@gmail.com>
AuthorDate: Tue Jun 11 08:50:53 2024 -0700

    Fix [Type]ArrayList elements() method usage (#13354)
---
 .../apache/pinot/common/utils/ArrayListUtils.java  | 139 ++++++++++++++++++++
 .../org/apache/pinot/common/utils/DataSchema.java  |  10 +-
 .../pinot/common/utils/ArrayListUtilsTest.java     | 146 +++++++++++++++++++++
 .../blocks/results/AggregationResultsBlock.java    |  11 +-
 .../blocks/results/GroupByResultsBlock.java        |  11 +-
 .../function/HistogramAggregationFunction.java     |   7 +-
 .../query/runtime/operator/utils/TypeUtils.java    |  11 +-
 7 files changed, 309 insertions(+), 26 deletions(-)

diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/utils/ArrayListUtils.java 
b/pinot-common/src/main/java/org/apache/pinot/common/utils/ArrayListUtils.java
new file mode 100644
index 0000000000..f74f326555
--- /dev/null
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/utils/ArrayListUtils.java
@@ -0,0 +1,139 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pinot.common.utils;
+
+import it.unimi.dsi.fastutil.doubles.DoubleArrayList;
+import it.unimi.dsi.fastutil.floats.FloatArrayList;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.longs.LongArrayList;
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+
+
+/**
+ * Utility class for {@link IntArrayList}, {@link LongArrayList}, {@link 
FloatArrayList}, {@link DoubleArrayList},
+ * {@link ObjectArrayList}.
+ */
+public class ArrayListUtils {
+  private ArrayListUtils() {
+  }
+
+  /**
+   * Best effort extract the given {@link IntArrayList} to an int array 
without copying the elements.
+   * The {@link IntArrayList#elements()} returned int array may be longer than 
the actual size of the
+   * {@link IntArrayList}, and the actual size of the {@link IntArrayList} can 
be retrieved using
+   * {@link IntArrayList#size()}.
+   * This method checks the length of the returned int array and returns the 
same if it is equal to the size of the
+   * {@link IntArrayList}, otherwise, it copies the elements to a new int 
array and returns it.
+   *
+   * <p>Use this method only if you are sure that the returned int array will 
not be modified.
+   * <p>Otherwise, use {@link IntArrayList#toIntArray()}.
+   *
+   * @param intArrayList Input {@link IntArrayList}
+   * @return Best effort extracted int array without copying the elements
+   */
+  public static int[] toIntArray(IntArrayList intArrayList) {
+    int[] intArrayListElements = intArrayList.elements();
+    return intArrayListElements.length == intArrayList.size() ? 
intArrayListElements : intArrayList.toIntArray();
+  }
+
+  /**
+   * Best effort extract the given {@link LongArrayList} to a long array 
without copying the elements.
+   * The {@link LongArrayList#elements()} returned long array may be longer 
than the actual size of the
+   * {@link LongArrayList}, and the actual size of the {@link LongArrayList} 
can be retrieved using
+   * {@link LongArrayList#size()}.
+   * This method checks the length of the returned long array and returns the 
same if it is equal to the size of the
+   * {@link LongArrayList}, otherwise, it copies the elements to a new long 
array and returns it.
+   *
+   * <p>Use this method only if you are sure that the returned long array will 
not be modified.
+   * <p>Otherwise, use {@link LongArrayList#toLongArray()}.
+   *
+   * @param longArrayList Input {@link LongArrayList}
+   * @return Best effort extracted long array without copying the elements
+   */
+  public static long[] toLongArray(LongArrayList longArrayList) {
+    long[] longArrayListElements = longArrayList.elements();
+    return longArrayListElements.length == longArrayList.size() ? 
longArrayListElements : longArrayList.toLongArray();
+  }
+
+  /**
+   * Best effort extract the given {@link FloatArrayList} to a float array 
without copying the elements.
+   * The {@link FloatArrayList#elements()} returned float array may be longer 
than the actual size of the
+   * {@link FloatArrayList}, and the actual size of the {@link FloatArrayList} 
can be retrieved using
+   * {@link FloatArrayList#size()}.
+   * This method checks the length of the returned float array and returns the 
same if it is equal to the size of the
+   * {@link FloatArrayList}, otherwise, it copies the elements to a new float 
array and returns it.
+   *
+   * <p>Use this method only if you are sure that the returned float array 
will not be modified.
+   * <p>Otherwise, use {@link FloatArrayList#toFloatArray()}.
+   *
+   * @param floatArrayList Input {@link FloatArrayList}
+   * @return Best effort extracted float array without copying the elements
+   */
+  public static float[] toFloatArray(FloatArrayList floatArrayList) {
+    float[] floatArrayListElements = floatArrayList.elements();
+    return floatArrayListElements.length == floatArrayList.size() ? 
floatArrayListElements
+        : floatArrayList.toFloatArray();
+  }
+
+  /**
+   * Best effort extract the given {@link DoubleArrayList} to a double array 
without copying the elements.
+   * The {@link DoubleArrayList#elements()} returned double array may be 
longer than the actual size of the
+   * {@link DoubleArrayList}, and the actual size of the {@link 
DoubleArrayList} can be retrieved using
+   * {@link DoubleArrayList#size()}.
+   * This method checks the length of the returned double array and returns 
the same if it is equal to the size of the
+   * {@link DoubleArrayList}, otherwise, it copies the elements to a new 
double array and returns it.
+   *
+   * <p>Use this method only if you are sure that the returned double array 
will not be modified.
+   * <p>Otherwise, use {@link DoubleArrayList#toDoubleArray()}.
+   *
+   * @param doubleArrayList Input {@link DoubleArrayList}
+   * @return Best effort extracted double array without copying the elements
+   */
+  public static double[] toDoubleArray(DoubleArrayList doubleArrayList) {
+    double[] doubleArrayListElements = doubleArrayList.elements();
+    return doubleArrayListElements.length == doubleArrayList.size() ? 
doubleArrayListElements
+        : doubleArrayList.toDoubleArray();
+  }
+
+  /**
+   * Convert the given {@link ObjectArrayList} to a string array.
+   * The method {@link ObjectArrayList#elements()} could return either 
Object[] or String[]. The casting to String[]
+   * is not guaranteed to work, and it may throw {@link ClassCastException} if 
the internal object is not a String
+   * array.
+   * <p>
+   *   This method first get `elements` as Object, then check if it's instance 
of String[].
+   *   Only return the reference when the internal object is a String array 
and the length equals to ObjectArrayList
+   *   size.
+   *   For all the other scenarios, just copy the elements to a new string 
array and returns it.
+   * <p>
+   *
+   * @param stringArrayList Input {@link ObjectArrayList}
+   * @return Copied string array
+   */
+  public static String[] toStringArray(ObjectArrayList<String> 
stringArrayList) {
+    Object elements = stringArrayList.elements();
+    if (elements instanceof String[]) {
+      String[] stringArrayListElements = (String[]) elements;
+      if (stringArrayListElements.length == stringArrayList.size()) {
+        return stringArrayListElements;
+      }
+    }
+    return stringArrayList.toArray(new String[0]);
+  }
+}
diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/utils/DataSchema.java 
b/pinot-common/src/main/java/org/apache/pinot/common/utils/DataSchema.java
index 9bd8dacef1..f6c1bc398c 100644
--- a/pinot-common/src/main/java/org/apache/pinot/common/utils/DataSchema.java
+++ b/pinot-common/src/main/java/org/apache/pinot/common/utils/DataSchema.java
@@ -523,7 +523,7 @@ public class DataSchema {
         return (int[]) value;
       } else if (value instanceof IntArrayList) {
         // For ArrayAggregationFunction
-        return ((IntArrayList) value).elements();
+        return ArrayListUtils.toIntArray((IntArrayList) value);
       }
       throw new IllegalStateException(String.format("Cannot convert: '%s' to 
int[]", value));
     }
@@ -533,7 +533,7 @@ public class DataSchema {
         return (float[]) value;
       } else if (value instanceof FloatArrayList) {
         // For ArrayAggregationFunction
-        return ((FloatArrayList) value).elements();
+        return ArrayListUtils.toFloatArray((FloatArrayList) value);
       }
       throw new IllegalStateException(String.format("Cannot convert: '%s' to 
float[]", value));
     }
@@ -543,7 +543,7 @@ public class DataSchema {
         return (double[]) value;
       } else if (value instanceof DoubleArrayList) {
         // For HistogramAggregationFunction and ArrayAggregationFunction
-        return ((DoubleArrayList) value).elements();
+        return ArrayListUtils.toDoubleArray((DoubleArrayList) value);
       } else if (value instanceof int[]) {
         int[] intValues = (int[]) value;
         int length = intValues.length;
@@ -576,7 +576,7 @@ public class DataSchema {
         return (long[]) value;
       } else if (value instanceof LongArrayList) {
         // For FunnelCountAggregationFunction and ArrayAggregationFunction
-        return ((LongArrayList) value).elements();
+        return ArrayListUtils.toLongArray((LongArrayList) value);
       } else {
         int[] intValues = (int[]) value;
         int length = intValues.length;
@@ -593,7 +593,7 @@ public class DataSchema {
         return (String[]) value;
       } else if (value instanceof ObjectArrayList) {
         // For ArrayAggregationFunction
-        return ((ObjectArrayList<String>) value).toArray(new String[0]);
+        return ArrayListUtils.toStringArray((ObjectArrayList<String>) value);
       }
       throw new IllegalStateException(String.format("Cannot convert: '%s' to 
String[]", value));
     }
diff --git 
a/pinot-common/src/test/java/org/apache/pinot/common/utils/ArrayListUtilsTest.java
 
b/pinot-common/src/test/java/org/apache/pinot/common/utils/ArrayListUtilsTest.java
new file mode 100644
index 0000000000..815114e899
--- /dev/null
+++ 
b/pinot-common/src/test/java/org/apache/pinot/common/utils/ArrayListUtilsTest.java
@@ -0,0 +1,146 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pinot.common.utils;
+
+import it.unimi.dsi.fastutil.doubles.DoubleArrayList;
+import it.unimi.dsi.fastutil.floats.FloatArrayList;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.longs.LongArrayList;
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+
+
+public class ArrayListUtilsTest {
+  @Test
+  public void testToIntArray() {
+    // Test empty list
+    IntArrayList intArrayList = new IntArrayList();
+    int[] intArray = ArrayListUtils.toIntArray(intArrayList);
+    assertEquals(intArray.length, 0);
+
+    // Test list with one element
+    intArrayList.add(1);
+    intArray = ArrayListUtils.toIntArray(intArrayList);
+    assertEquals(intArray.length, 1);
+    assertEquals(intArray[0], 1);
+
+    // Test list with multiple elements
+    intArrayList.add(2);
+    intArrayList.add(3);
+    intArray = ArrayListUtils.toIntArray(intArrayList);
+    assertEquals(intArray.length, 3);
+    assertEquals(intArray[0], 1);
+    assertEquals(intArray[1], 2);
+    assertEquals(intArray[2], 3);
+  }
+
+  @Test
+  public void testToLongArray() {
+    // Test empty list
+    LongArrayList longArrayList = new LongArrayList();
+    long[] longArray = ArrayListUtils.toLongArray(longArrayList);
+    assertEquals(longArray.length, 0);
+
+    // Test list with one element
+    longArrayList.add(1L);
+    longArray = ArrayListUtils.toLongArray(longArrayList);
+    assertEquals(longArray.length, 1);
+    assertEquals(longArray[0], 1L);
+
+    // Test list with multiple elements
+    longArrayList.add(2L);
+    longArrayList.add(3L);
+    longArray = ArrayListUtils.toLongArray(longArrayList);
+    assertEquals(longArray.length, 3);
+    assertEquals(longArray[0], 1L);
+    assertEquals(longArray[1], 2L);
+    assertEquals(longArray[2], 3L);
+  }
+
+  @Test
+  public void testToFloatArray() {
+    // Test empty list
+    FloatArrayList floatArrayList = new FloatArrayList();
+    float[] floatArray = ArrayListUtils.toFloatArray(floatArrayList);
+    assertEquals(floatArray.length, 0);
+
+    // Test list with one element
+    floatArrayList.add(1.0f);
+    floatArray = ArrayListUtils.toFloatArray(floatArrayList);
+    assertEquals(floatArray.length, 1);
+    assertEquals(floatArray[0], 1.0f);
+
+    // Test list with multiple elements
+    floatArrayList.add(2.0f);
+    floatArrayList.add(3.0f);
+    floatArray = ArrayListUtils.toFloatArray(floatArrayList);
+    assertEquals(floatArray.length, 3);
+    assertEquals(floatArray[0], 1.0f);
+    assertEquals(floatArray[1], 2.0f);
+    assertEquals(floatArray[2], 3.0f);
+  }
+
+  @Test
+  public void testToDoubleArray() {
+    // Test empty list
+    DoubleArrayList doubleArrayList = new DoubleArrayList();
+    double[] doubleArray = ArrayListUtils.toDoubleArray(doubleArrayList);
+    assertEquals(doubleArray.length, 0);
+
+    // Test list with one element
+    doubleArrayList.add(1.0);
+    doubleArray = ArrayListUtils.toDoubleArray(doubleArrayList);
+    assertEquals(doubleArray.length, 1);
+    assertEquals(doubleArray[0], 1.0);
+
+    // Test list with multiple elements
+    doubleArrayList.add(2.0);
+    doubleArrayList.add(3.0);
+    doubleArray = ArrayListUtils.toDoubleArray(doubleArrayList);
+    assertEquals(doubleArray.length, 3);
+    assertEquals(doubleArray[0], 1.0);
+    assertEquals(doubleArray[1], 2.0);
+    assertEquals(doubleArray[2], 3.0);
+  }
+
+  @Test
+  public void testToStringArray() {
+    // Test empty list
+    ObjectArrayList<String> stringArrayList = new ObjectArrayList<String>();
+    String[] stringArray = ArrayListUtils.toStringArray(stringArrayList);
+    assertEquals(stringArray.length, 0);
+
+    // Test list with one element
+    stringArrayList.add("1");
+    stringArray = ArrayListUtils.toStringArray(stringArrayList);
+    assertEquals(stringArray.length, 1);
+    assertEquals(stringArray[0], "1");
+
+    // Test list with multiple elements
+    stringArrayList.add("2");
+    stringArrayList.add("3");
+    stringArray = ArrayListUtils.toStringArray(stringArrayList);
+    assertEquals(stringArray.length, 3);
+    assertEquals(stringArray[0], "1");
+    assertEquals(stringArray[1], "2");
+    assertEquals(stringArray[2], "3");
+  }
+}
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/blocks/results/AggregationResultsBlock.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/blocks/results/AggregationResultsBlock.java
index 8c3e025af3..4e0a1b3063 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/blocks/results/AggregationResultsBlock.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/blocks/results/AggregationResultsBlock.java
@@ -30,6 +30,7 @@ import java.util.List;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.pinot.common.datatable.DataTable;
 import org.apache.pinot.common.request.context.FilterContext;
+import org.apache.pinot.common.utils.ArrayListUtils;
 import org.apache.pinot.common.utils.DataSchema;
 import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
 import org.apache.pinot.core.common.datatable.DataTableBuilder;
@@ -195,19 +196,19 @@ public class AggregationResultsBlock extends 
BaseResultsBlock {
         dataTableBuilder.setColumn(index, (ByteArray) result);
         break;
       case INT_ARRAY:
-        dataTableBuilder.setColumn(index, ((IntArrayList) result).elements());
+        dataTableBuilder.setColumn(index, 
ArrayListUtils.toIntArray((IntArrayList) result));
         break;
       case LONG_ARRAY:
-        dataTableBuilder.setColumn(index, ((LongArrayList) result).elements());
+        dataTableBuilder.setColumn(index, 
ArrayListUtils.toLongArray((LongArrayList) result));
         break;
       case FLOAT_ARRAY:
-        dataTableBuilder.setColumn(index, ((FloatArrayList) 
result).elements());
+        dataTableBuilder.setColumn(index, 
ArrayListUtils.toFloatArray((FloatArrayList) result));
         break;
       case DOUBLE_ARRAY:
-        dataTableBuilder.setColumn(index, ((DoubleArrayList) 
result).elements());
+        dataTableBuilder.setColumn(index, 
ArrayListUtils.toDoubleArray((DoubleArrayList) result));
         break;
       case STRING_ARRAY:
-        dataTableBuilder.setColumn(index, ((ObjectArrayList<String>) 
result).elements());
+        dataTableBuilder.setColumn(index, 
ArrayListUtils.toStringArray((ObjectArrayList<String>) result));
         break;
       default:
         throw new IllegalStateException("Illegal column data type in final 
result: " + columnDataType);
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/blocks/results/GroupByResultsBlock.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/blocks/results/GroupByResultsBlock.java
index 81f46e6277..dfc5faa289 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/blocks/results/GroupByResultsBlock.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/blocks/results/GroupByResultsBlock.java
@@ -33,6 +33,7 @@ import java.util.List;
 import java.util.Map;
 import org.apache.pinot.common.datatable.DataTable;
 import org.apache.pinot.common.datatable.DataTable.MetadataKey;
+import org.apache.pinot.common.utils.ArrayListUtils;
 import org.apache.pinot.common.utils.DataSchema;
 import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
 import org.apache.pinot.core.common.datatable.DataTableBuilder;
@@ -251,28 +252,28 @@ public class GroupByResultsBlock extends BaseResultsBlock 
{
         break;
       case INT_ARRAY:
         if (value instanceof IntArrayList) {
-          dataTableBuilder.setColumn(columnIndex, ((IntArrayList) 
value).elements());
+          dataTableBuilder.setColumn(columnIndex, 
ArrayListUtils.toIntArray((IntArrayList) value));
         } else {
           dataTableBuilder.setColumn(columnIndex, (int[]) value);
         }
         break;
       case LONG_ARRAY:
         if (value instanceof LongArrayList) {
-          dataTableBuilder.setColumn(columnIndex, ((LongArrayList) 
value).elements());
+          dataTableBuilder.setColumn(columnIndex, 
ArrayListUtils.toLongArray((LongArrayList) value));
         } else {
           dataTableBuilder.setColumn(columnIndex, (long[]) value);
         }
         break;
       case FLOAT_ARRAY:
         if (value instanceof FloatArrayList) {
-          dataTableBuilder.setColumn(columnIndex, ((FloatArrayList) 
value).elements());
+          dataTableBuilder.setColumn(columnIndex, 
ArrayListUtils.toFloatArray((FloatArrayList) value));
         } else {
           dataTableBuilder.setColumn(columnIndex, (float[]) value);
         }
         break;
       case DOUBLE_ARRAY:
         if (value instanceof DoubleArrayList) {
-          dataTableBuilder.setColumn(columnIndex, ((DoubleArrayList) 
value).elements());
+          dataTableBuilder.setColumn(columnIndex, 
ArrayListUtils.toDoubleArray((DoubleArrayList) value));
         } else {
           dataTableBuilder.setColumn(columnIndex, (double[]) value);
         }
@@ -280,7 +281,7 @@ public class GroupByResultsBlock extends BaseResultsBlock {
       case STRING_ARRAY:
         if (value instanceof ObjectArrayList) {
           //noinspection unchecked
-          dataTableBuilder.setColumn(columnIndex, ((ObjectArrayList<String>) 
value).elements());
+          dataTableBuilder.setColumn(columnIndex, 
ArrayListUtils.toStringArray((ObjectArrayList<String>) value));
         } else {
           dataTableBuilder.setColumn(columnIndex, (String[]) value);
         }
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/HistogramAggregationFunction.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/HistogramAggregationFunction.java
index 77f5363fb8..f72e42903c 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/HistogramAggregationFunction.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/HistogramAggregationFunction.java
@@ -225,12 +225,7 @@ public class HistogramAggregationFunction extends 
BaseSingleInputAggregationFunc
 
   @Override
   public DoubleArrayList extractFinalResult(DoubleArrayList doubleArrayList) {
-    int count = doubleArrayList.size();
-    if (count < 1L) {
-      throw new IllegalStateException("histogram result shouldn't be empty!");
-    } else {
-      return new DoubleArrayList(doubleArrayList.elements());
-    }
+    return doubleArrayList;
   }
 
   @Override
diff --git 
a/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/utils/TypeUtils.java
 
b/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/utils/TypeUtils.java
index 933c3be95f..80841b8554 100644
--- 
a/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/utils/TypeUtils.java
+++ 
b/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/utils/TypeUtils.java
@@ -23,6 +23,7 @@ import it.unimi.dsi.fastutil.floats.FloatArrayList;
 import it.unimi.dsi.fastutil.ints.IntArrayList;
 import it.unimi.dsi.fastutil.longs.LongArrayList;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import org.apache.pinot.common.utils.ArrayListUtils;
 import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
 
 
@@ -51,21 +52,21 @@ public class TypeUtils {
       case INT_ARRAY:
         if (value instanceof IntArrayList) {
           // For ArrayAggregationFunction
-          return ((IntArrayList) value).elements();
+          return ArrayListUtils.toIntArray((IntArrayList) value);
         } else {
           return value;
         }
       case LONG_ARRAY:
         if (value instanceof LongArrayList) {
           // For FunnelCountAggregationFunction and ArrayAggregationFunction
-          return ((LongArrayList) value).elements();
+          return ArrayListUtils.toLongArray((LongArrayList) value);
         } else {
           return value;
         }
       case FLOAT_ARRAY:
         if (value instanceof FloatArrayList) {
           // For ArrayAggregationFunction
-          return ((FloatArrayList) value).elements();
+          return ArrayListUtils.toFloatArray((FloatArrayList) value);
         } else if (value instanceof double[]) {
           // This is due to for parsing array literal value like [0.1, 0.2, 
0.3].
           // The parsed value is stored as double[] in java, however the 
calcite type is FLOAT_ARRAY.
@@ -80,14 +81,14 @@ public class TypeUtils {
       case DOUBLE_ARRAY:
         if (value instanceof DoubleArrayList) {
           // For HistogramAggregationFunction and ArrayAggregationFunction
-          return ((DoubleArrayList) value).elements();
+          return ArrayListUtils.toDoubleArray((DoubleArrayList) value);
         } else {
           return value;
         }
       case STRING_ARRAY:
         if (value instanceof ObjectArrayList) {
           // For ArrayAggregationFunction
-          return ((ObjectArrayList<String>) value).toArray(new String[0]);
+          return ArrayListUtils.toStringArray((ObjectArrayList<String>) value);
         } else {
           return value;
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to