This is an automated email from the ASF dual-hosted git repository.
rongr 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 fd95f75d3e add array element at function (#9554)
fd95f75d3e is described below
commit fd95f75d3ea2f85b00c174e1f60a50649293ebd2
Author: Rong Rong <[email protected]>
AuthorDate: Sun Oct 9 10:47:36 2022 -0700
add array element at function (#9554)
* add array element at function
* fix test
Co-authored-by: Rong Rong <[email protected]>
---
.../common/function/scalar/ArrayFunctions.java | 26 ++++++
.../ScalarTransformFunctionWrapperTest.java | 92 ++++++++++++++++++++++
2 files changed, 118 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 85033860ac..454fbe5912 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
@@ -25,6 +25,7 @@ import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet;
import it.unimi.dsi.fastutil.objects.ObjectSet;
import java.util.Arrays;
import org.apache.commons.lang3.ArrayUtils;
+import org.apache.pinot.common.utils.DataSchema;
import org.apache.pinot.spi.annotations.ScalarFunction;
@@ -151,4 +152,29 @@ public class ArrayFunctions {
public static String[] arrayConcatString(String[] values1, String[] values2)
{
return ArrayUtils.addAll(values1, values2);
}
+
+ @ScalarFunction
+ public static int arrayElementAtInt(int[] arr, int idx) {
+ return idx > 0 && idx <= arr.length ? arr[idx - 1] : (int)
DataSchema.ColumnDataType.INT.getNullPlaceholder();
+ }
+
+ @ScalarFunction
+ public static long arrayElementAtLong(long[] arr, int idx) {
+ return idx > 0 && idx <= arr.length ? arr[idx - 1] : (long)
DataSchema.ColumnDataType.LONG.getNullPlaceholder();
+ }
+
+ @ScalarFunction
+ public static float arrayElementAtFloat(float[] arr, int idx) {
+ return idx > 0 && idx <= arr.length ? arr[idx - 1] : (float)
DataSchema.ColumnDataType.FLOAT.getNullPlaceholder();
+ }
+
+ @ScalarFunction
+ public static double arrayElementAtDouble(double[] arr, int idx) {
+ return idx > 0 && idx <= arr.length ? arr[idx - 1] : (double)
DataSchema.ColumnDataType.DOUBLE.getNullPlaceholder();
+ }
+
+ @ScalarFunction
+ public static String arrayElementAtString(String[] arr, int idx) {
+ return idx > 0 && idx <= arr.length ? arr[idx - 1] : (String)
DataSchema.ColumnDataType.STRING.getNullPlaceholder();
+ }
}
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 844fc208de..7053d9a901 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
@@ -24,11 +24,13 @@ import java.nio.charset.StandardCharsets;
import java.text.Normalizer;
import java.util.Arrays;
import java.util.Base64;
+import java.util.Random;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.pinot.common.request.context.ExpressionContext;
import org.apache.pinot.common.request.context.RequestContextUtils;
+import org.apache.pinot.common.utils.DataSchema;
import org.apache.pinot.spi.data.FieldSpec.DataType;
import org.apache.pinot.spi.utils.ArrayCopyUtils;
import org.apache.pinot.spi.utils.BigDecimalUtils;
@@ -865,6 +867,96 @@ public class ScalarTransformFunctionWrapperTest extends
BaseTransformFunctionTes
testTransformFunctionMV(transformFunction, expectedValues);
}
+ @Test
+ public void testArrayElementAtInt() {
+ Random rand = new Random();
+ int index = rand.nextInt(MAX_NUM_MULTI_VALUES);
+ ExpressionContext expression = RequestContextUtils.getExpression(
+ String.format("array_element_at_int(%s, %d)", INT_MV_COLUMN, index +
1));
+ TransformFunction transformFunction =
TransformFunctionFactory.get(expression, _dataSourceMap);
+ assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
+ assertEquals(transformFunction.getResultMetadata().getDataType(),
DataType.INT);
+ assertTrue(transformFunction.getResultMetadata().isSingleValue());
+ int[] expectedValues = new int[NUM_ROWS];
+ for (int i = 0; i < NUM_ROWS; i++) {
+ expectedValues[i] = _intMVValues[i].length > index ?
_intMVValues[i][index]
+ : (Integer) DataSchema.ColumnDataType.INT.getNullPlaceholder();
+ }
+ testTransformFunction(transformFunction, expectedValues);
+ }
+
+ @Test
+ public void testArrayElementAtLong() {
+ Random rand = new Random();
+ int index = rand.nextInt(MAX_NUM_MULTI_VALUES);
+ ExpressionContext expression = RequestContextUtils.getExpression(
+ String.format("array_element_at_long(%s, %d)", LONG_MV_COLUMN, index +
1));
+ TransformFunction transformFunction =
TransformFunctionFactory.get(expression, _dataSourceMap);
+ assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
+ assertEquals(transformFunction.getResultMetadata().getDataType(),
DataType.LONG);
+ assertTrue(transformFunction.getResultMetadata().isSingleValue());
+ long[] expectedValues = new long[NUM_ROWS];
+ for (int i = 0; i < NUM_ROWS; i++) {
+ expectedValues[i] = _longMVValues[i].length > index ?
_longMVValues[i][index]
+ : (Long) DataSchema.ColumnDataType.LONG.getNullPlaceholder();
+ }
+ testTransformFunction(transformFunction, expectedValues);
+ }
+
+ @Test
+ public void testArrayElementAtFloat() {
+ Random rand = new Random();
+ int index = rand.nextInt(MAX_NUM_MULTI_VALUES);
+ ExpressionContext expression = RequestContextUtils.getExpression(
+ String.format("array_element_at_float(%s, %d)", FLOAT_MV_COLUMN, index
+ 1));
+ TransformFunction transformFunction =
TransformFunctionFactory.get(expression, _dataSourceMap);
+ assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
+ assertEquals(transformFunction.getResultMetadata().getDataType(),
DataType.FLOAT);
+ assertTrue(transformFunction.getResultMetadata().isSingleValue());
+ float[] expectedValues = new float[NUM_ROWS];
+ for (int i = 0; i < NUM_ROWS; i++) {
+ expectedValues[i] = _floatMVValues[i].length > index ?
_floatMVValues[i][index]
+ : (Float) DataSchema.ColumnDataType.FLOAT.getNullPlaceholder();
+ }
+ testTransformFunction(transformFunction, expectedValues);
+ }
+
+ @Test
+ public void testArrayElementAtDouble() {
+ Random rand = new Random();
+ int index = rand.nextInt(MAX_NUM_MULTI_VALUES);
+ ExpressionContext expression = RequestContextUtils.getExpression(
+ String.format("array_element_at_double(%s, %d)", DOUBLE_MV_COLUMN,
index + 1));
+ TransformFunction transformFunction =
TransformFunctionFactory.get(expression, _dataSourceMap);
+ assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
+ assertEquals(transformFunction.getResultMetadata().getDataType(),
DataType.DOUBLE);
+ assertTrue(transformFunction.getResultMetadata().isSingleValue());
+ double[] expectedValues = new double[NUM_ROWS];
+ for (int i = 0; i < NUM_ROWS; i++) {
+ expectedValues[i] = _doubleMVValues[i].length > index ?
_doubleMVValues[i][index]
+ : (Double) DataSchema.ColumnDataType.DOUBLE.getNullPlaceholder();
+ }
+ testTransformFunction(transformFunction, expectedValues);
+ }
+
+ @Test
+ public void testArrayElementAtString() {
+ Random rand = new Random();
+ int index = rand.nextInt(MAX_NUM_MULTI_VALUES);
+ ExpressionContext expression = RequestContextUtils.getExpression(
+ String.format("array_element_at_string(%s, %d)", STRING_MV_COLUMN,
index + 1));
+ TransformFunction transformFunction =
TransformFunctionFactory.get(expression, _dataSourceMap);
+ assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
+ assertEquals(transformFunction.getResultMetadata().getDataType(),
DataType.STRING);
+ assertTrue(transformFunction.getResultMetadata().isSingleValue());
+ String[] expectedValues = new String[NUM_ROWS];
+ for (int i = 0; i < NUM_ROWS; i++) {
+ expectedValues[i] = _stringMVValues[i].length > index ?
_stringMVValues[i][index]
+ : (String) DataSchema.ColumnDataType.STRING.getNullPlaceholder();
+ }
+ testTransformFunction(transformFunction, expectedValues);
+ }
+
@Test
public void testBase64TransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("toBase64(%s)",
BYTES_SV_COLUMN));
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]