blob: 83c6d4dc1b0eefd01cdfd4f44544c3fb5034e4aa [file] [log] [blame]
/**
* 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.core.operator.transform.function;
import it.unimi.dsi.fastutil.ints.IntLinkedOpenHashSet;
import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet;
import java.nio.charset.StandardCharsets;
import java.text.Normalizer;
import java.util.Arrays;
import java.util.Base64;
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.spi.data.FieldSpec.DataType;
import org.apache.pinot.spi.utils.ArrayCopyUtils;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
public class ScalarTransformFunctionWrapperTest extends BaseTransformFunctionTest {
@Test
public void testStringLowerTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("lower(%s)", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "lower");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringAlphaNumericSVValues[i].toLowerCase();
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringUpperTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("UPPER(%s)", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "upper");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringAlphaNumericSVValues[i].toUpperCase();
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringReverseTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("rEvErSe(%s)", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "reverse");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = new StringBuilder(_stringAlphaNumericSVValues[i]).reverse().toString();
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringSubStrTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("sub_str(%s, 0, 2)", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "substr");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringAlphaNumericSVValues[i].substring(0, 2);
}
testTransformFunction(transformFunction, expectedValues);
expression =
RequestContextUtils.getExpression(String.format("substr(%s, '2', '-1')", STRING_ALPHANUM_SV_COLUMN));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "substr");
expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringAlphaNumericSVValues[i].substring(2);
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringConcatTransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("concat(%s, %s, '-')", STRING_ALPHANUM_SV_COLUMN, STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "concat");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringAlphaNumericSVValues[i] + "-" + _stringAlphaNumericSVValues[i];
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringReplaceTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("replace(%s, 'A', 'B')", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "replace");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.replace(_stringAlphaNumericSVValues[i], "A", "B");
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringPadTransformFunction() {
int padLength = 50;
String padString = "#";
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("lpad(%s, %d, '%s')", STRING_ALPHANUM_SV_COLUMN, padLength, padString));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "lpad");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.leftPad(_stringAlphaNumericSVValues[i], padLength, padString);
}
testTransformFunction(transformFunction, expectedValues);
expression = RequestContextUtils.getExpression(
String.format("rpad(%s, %d, '%s')", STRING_ALPHANUM_SV_COLUMN, padLength, padString));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "rpad");
expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.rightPad(_stringAlphaNumericSVValues[i], padLength, padString);
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringTrimTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("ltrim(lpad(%s, 50, ' '))", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "ltrim");
testTransformFunction(transformFunction, _stringAlphaNumericSVValues);
expression =
RequestContextUtils.getExpression(String.format("rtrim(rpad(%s, 50, ' '))", STRING_ALPHANUM_SV_COLUMN));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "rtrim");
testTransformFunction(transformFunction, _stringAlphaNumericSVValues);
expression = RequestContextUtils.getExpression(
String.format("trim(rpad(lpad(%s, 50, ' '), 100, ' '))", STRING_ALPHANUM_SV_COLUMN));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "trim");
testTransformFunction(transformFunction, _stringAlphaNumericSVValues);
expression = RequestContextUtils.getExpression(
String.format("trim(leading ' _&|' from lpad(%s, 10, '& |_'))", STRING_ALPHANUM_SV_COLUMN));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "trim");
testTransformFunction(transformFunction, _stringAlphaNumericSVValues);
}
@Test
public void testShaTransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(String.format("sha(%s)", BYTES_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "sha");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = DigestUtils.shaHex(_bytesSVValues[i]);
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testSha256TransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("sha256(%s)", BYTES_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "sha256");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = DigestUtils.sha256Hex(_bytesSVValues[i]);
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testSha512TransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("sha512(%s)", BYTES_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "sha512");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = DigestUtils.sha512Hex(_bytesSVValues[i]);
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testMd5TransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(String.format("md5(%s)", BYTES_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "md5");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = DigestUtils.md5Hex(_bytesSVValues[i]);
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testIsNullOperator() {
ExpressionContext expression = RequestContextUtils.getExpression(String.format("%s IS NULL",
BIG_DECIMAL_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof IsNullTransformFunction);
assertEquals(transformFunction.getName(), "is_null");
int[] expectedValues = new int[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = (_bigDecimalSVValues[i] == null) ? 1 : 0;
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringContainsTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("contains(%s, 'a')", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "contains");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.BOOLEAN);
assertTrue(transformFunction.getResultMetadata().isSingleValue());
int[] expectedValues = new int[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringAlphaNumericSVValues[i].contains("a") ? 1 : 0;
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringSplitTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("split(%s, ',')", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "split");
String[][] expectedValues = new String[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.split(_stringAlphaNumericSVValues[i], ",");
}
testTransformFunctionMV(transformFunction, expectedValues);
expression = RequestContextUtils.getExpression(
String.format("split(%s, ',', %s)", STRING_ALPHANUM_SV_COLUMN, INT_SV_COLUMN));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "split");
expectedValues = new String[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.split(_stringAlphaNumericSVValues[i], ",", _intSVValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testStringSplitPartTransformFunction() {
int index = 2;
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("split_part(%s, ',', %d)", STRING_ALPHANUM_SV_COLUMN, index));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "splitPart");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
String[] splitString = StringUtils.split(_stringAlphaNumericSVValues[i], ",");
if (splitString.length > index) {
expectedValues[i] = splitString[i];
} else {
expectedValues[i] = "null";
}
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringRepeatTransformFunction() {
int timesToRepeat = 21;
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("repeat(%s, %d)", STRING_ALPHANUM_SV_COLUMN, timesToRepeat));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "repeat");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.repeat(_stringAlphaNumericSVValues[i], timesToRepeat);
}
testTransformFunction(transformFunction, expectedValues);
String seperator = "::";
expression = RequestContextUtils.getExpression(
String.format("repeat(%s, '%s', %d)", STRING_ALPHANUM_SV_COLUMN, seperator, timesToRepeat));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "repeat");
expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.repeat(_stringAlphaNumericSVValues[i], seperator, timesToRepeat);
}
testTransformFunction(transformFunction, expectedValues);
timesToRepeat = -1;
expression = RequestContextUtils.getExpression(
String.format("repeat(%s, '%s', %d)", STRING_ALPHANUM_SV_COLUMN, seperator, timesToRepeat));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "repeat");
expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = "";
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringHammingDistanceTransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("hamming_distance(%s, %s)", STRING_ALPHANUM_SV_COLUMN, STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "hammingDistance");
int[] expectedValues = new int[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
int distance = 0;
for (int j = 0; j < _stringAlphaNumericSVValues[i].length(); j++) {
if (_stringAlphaNumericSVValues[i].charAt(j) != _stringAlphaNumericSVValues[i].charAt(j)) {
distance++;
}
}
expectedValues[i] = distance;
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringToUTFTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("to_utf8(%s)", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "toUtf8");
byte[][] expectedValues = new byte[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringAlphaNumericSVValues[i].getBytes(StandardCharsets.UTF_8);
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringStrPositionTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("str_pos(%s, 'A')", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "strpos");
int[] expectedValues = new int[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.indexOf(_stringAlphaNumericSVValues[i], 'A');
}
testTransformFunction(transformFunction, expectedValues);
expression =
RequestContextUtils.getExpression(String.format("str_r_pos(%s, 'A')", STRING_ALPHANUM_SV_COLUMN));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "strrpos");
expectedValues = new int[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.lastIndexOf(_stringAlphaNumericSVValues[i], 'A');
}
testTransformFunction(transformFunction, expectedValues);
expression =
RequestContextUtils.getExpression(String.format("str_r_pos(%s, 'A', 1)", STRING_ALPHANUM_SV_COLUMN));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "strrpos");
expectedValues = new int[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.lastIndexOf(_stringAlphaNumericSVValues[i], 'A', 1);
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringStartsWithTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("starts_with(%s, 'A')", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "startsWith");
int[] expectedValues = new int[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.startsWith(_stringAlphaNumericSVValues[i], "A") ? 1 : 0;
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringEndsWithTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("ends_with(%s, 'A')", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "endsWith");
int[] expectedValues = new int[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = StringUtils.endsWith(_stringAlphaNumericSVValues[i], "A") ? 1 : 0;
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testStringNormalizeTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("normalize(%s)", STRING_ALPHANUM_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "normalize");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = Normalizer.normalize(_stringAlphaNumericSVValues[i], Normalizer.Form.NFC);
}
testTransformFunction(transformFunction, expectedValues);
expression =
RequestContextUtils.getExpression(String.format("normalize(%s, 'NFC')", STRING_ALPHANUM_SV_COLUMN));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "normalize");
expectedValues = new String[NUM_ROWS];
Normalizer.Form targetForm = Normalizer.Form.valueOf("NFC");
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = Normalizer.normalize(_stringAlphaNumericSVValues[i], targetForm);
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testArrayReverseIntTransformFunction() {
{
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_reverse_int(%s)", INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayReverseInt");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.INT);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
int[][] expectedValues = new int[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _intMVValues[i].clone();
ArrayUtils.reverse(expectedValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
{
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_reverse_int(%s)", LONG_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayReverseInt");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.INT);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
int[][] expectedValues = new int[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = new int[_longMVValues[i].length];
ArrayCopyUtils.copy(_longMVValues[i], expectedValues[i], _longMVValues[i].length);
ArrayUtils.reverse(expectedValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
}
@Test
public void testArrayReverseStringTransformFunction() {
{
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_reverse_string(%s)", STRING_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayReverseString");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.STRING);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
String[][] expectedValues = new String[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringMVValues[i].clone();
ArrayUtils.reverse(expectedValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
{
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_reverse_string(%s)", INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayReverseString");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.STRING);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
String[][] expectedValues = new String[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = new String[_intMVValues[i].length];
ArrayCopyUtils.copy(_intMVValues[i], expectedValues[i], _longMVValues[i].length);
ArrayUtils.reverse(expectedValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
}
@Test
public void testArraySortIntTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_sort_int(%s)", INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arraySortInt");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.INT);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
int[][] expectedValues = new int[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _intMVValues[i].clone();
Arrays.sort(expectedValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArraySortStringTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_sort_string(%s)", STRING_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arraySortString");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.STRING);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
String[][] expectedValues = new String[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringMVValues[i].clone();
Arrays.sort(expectedValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArrayIndexOfIntTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_index_of_int(%s, 2)", INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayIndexOfInt");
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] = ArrayUtils.indexOf(_intMVValues[i], 2);
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testArrayIndexOfStringTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_index_of_string(%s, 'a')", INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayIndexOfString");
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] = ArrayUtils.indexOf(_intMVValues[i], 'a');
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testArrayContainsIntTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_contains_int(%s, 2)", INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayContainsInt");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.BOOLEAN);
assertTrue(transformFunction.getResultMetadata().isSingleValue());
int[] expectedValues = new int[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = ArrayUtils.contains(_intMVValues[i], 2) ? 1 : 0;
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testArrayContainsStringTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_contains_string(%s, 'a')", INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayContainsString");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.BOOLEAN);
assertTrue(transformFunction.getResultMetadata().isSingleValue());
int[] expectedValues = new int[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = ArrayUtils.contains(_intMVValues[i], 'a') ? 1 : 0;
}
testTransformFunction(transformFunction, expectedValues);
}
@Test
public void testArraySliceIntTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_slice_int(%s, 1, 3)", INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arraySliceInt");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.INT);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
int[][] expectedValues = new int[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _intMVValues[i].clone();
expectedValues[i] = Arrays.copyOfRange(expectedValues[i], 1, 3);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArraySliceStringTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_slice_string(%s, 1, 2)", STRING_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arraySliceString");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.STRING);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
String[][] expectedValues = new String[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringMVValues[i].clone();
expectedValues[i] = Arrays.copyOfRange(expectedValues[i], 1, 2);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArrayDistinctIntTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_distinct_int(%s)", INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayDistinctInt");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.INT);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
int[][] expectedValues = new int[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = new IntLinkedOpenHashSet(_intMVValues[i]).toIntArray();
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArrayDistinctStringTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_distinct_string(%s)", STRING_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayDistinctString");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.STRING);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
String[][] expectedValues = new String[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = new ObjectLinkedOpenHashSet<>(_stringMVValues[i]).toArray(new String[0]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArrayRemoveIntTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_remove_int(%s, 2)", INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayRemoveInt");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.INT);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
int[][] expectedValues = new int[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _intMVValues[i].clone();
expectedValues[i] = ArrayUtils.removeElement(expectedValues[i], 2);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArrayRemoveStringTransformFunction() {
ExpressionContext expression =
RequestContextUtils.getExpression(String.format("array_remove_string(%s, 2)", STRING_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayRemoveString");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.STRING);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
String[][] expectedValues = new String[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringMVValues[i].clone();
expectedValues[i] = ArrayUtils.removeElement(expectedValues[i], 2);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArrayUnionIntTransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("array_union_int(%s, %s)", INT_MV_COLUMN, INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayUnionInt");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.INT);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
int[][] expectedValues = new int[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = new IntLinkedOpenHashSet(_intMVValues[i]).toIntArray();
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testUnionStringTransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("array_union_string(%s, %s)", STRING_MV_COLUMN, STRING_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayUnionString");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.STRING);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
String[][] expectedValues = new String[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = new ObjectLinkedOpenHashSet<>(_stringMVValues[i]).toArray(new String[0]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArrayConcatIntTransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("array_concat_int(%s, %s)", INT_MV_COLUMN, INT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayConcatInt");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.INT);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
int[][] expectedValues = new int[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _intMVValues[i].clone();
expectedValues[i] = ArrayUtils.addAll(expectedValues[i], expectedValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArrayConcatLongTransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("array_concat_long(%s, %s)", LONG_MV_COLUMN, LONG_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayConcatLong");
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] = _longMVValues[i].clone();
expectedValues[i] = ArrayUtils.addAll(expectedValues[i], expectedValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArrayConcatFloatTransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("array_concat_float(%s, %s)", FLOAT_MV_COLUMN, FLOAT_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayConcatFloat");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.FLOAT);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
float[][] expectedValues = new float[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _floatMVValues[i].clone();
expectedValues[i] = ArrayUtils.addAll(expectedValues[i], expectedValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testArrayConcatDoubleTransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("array_concat_double(%s, %s)", DOUBLE_MV_COLUMN, DOUBLE_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayConcatDouble");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.DOUBLE);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
double[][] expectedValues = new double[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _doubleMVValues[i].clone();
expectedValues[i] = ArrayUtils.addAll(expectedValues[i], expectedValues[i]);
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testConcatStringTransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(
String.format("array_concat_string(%s, %s)", STRING_MV_COLUMN, STRING_MV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "arrayConcatString");
assertEquals(transformFunction.getResultMetadata().getDataType(), DataType.STRING);
assertFalse(transformFunction.getResultMetadata().isSingleValue());
String[][] expectedValues = new String[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = _stringMVValues[i].clone();
expectedValues[i] = ArrayUtils.addAll(expectedValues[i], expectedValues[i]);
;
}
testTransformFunctionMV(transformFunction, expectedValues);
}
@Test
public void testBase64TransformFunction() {
ExpressionContext expression = RequestContextUtils.getExpression(String.format("toBase64(%s)", BYTES_SV_COLUMN));
TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "toBase64");
String[] expectedValues = new String[NUM_ROWS];
for (int i = 0; i < NUM_ROWS; i++) {
expectedValues[i] = Base64.getEncoder().encodeToString(_bytesSVValues[i]);
}
testTransformFunction(transformFunction, expectedValues);
expression = RequestContextUtils.getExpression(String.format("fromBase64(toBase64(%s))", BYTES_SV_COLUMN));
transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);
assertTrue(transformFunction instanceof ScalarTransformFunctionWrapper);
assertEquals(transformFunction.getName(), "fromBase64");
byte[][] expectedBinaryValues = new byte[NUM_ROWS][];
for (int i = 0; i < NUM_ROWS; i++) {
expectedBinaryValues[i] = Base64.getDecoder().decode(Base64.getEncoder().encodeToString(_bytesSVValues[i]));
}
testTransformFunction(transformFunction, expectedBinaryValues);
}
}