blob: 6e8e532b32aeb7a8b0ae9d9382d0899e9ad76d10 [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.phoenix.expression;
import static org.junit.Assert.assertEquals;
import java.sql.SQLException;
import java.util.List;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.phoenix.expression.function.StringToArrayFunction;
import org.apache.phoenix.schema.SortOrder;
import org.apache.phoenix.schema.types.*;
import org.junit.Test;
import com.google.common.collect.Lists;
public class StringToArrayFunctionTest {
private static void testExpression(LiteralExpression array, LiteralExpression delimiter, LiteralExpression nullString, PhoenixArray expected)
throws SQLException {
List<Expression> expressions = Lists.newArrayList((Expression) array);
expressions.add(delimiter);
expressions.add(nullString);
Expression stringToArrayFunction = new StringToArrayFunction(expressions);
ImmutableBytesWritable ptr = new ImmutableBytesWritable();
stringToArrayFunction.evaluate(null, ptr);
PhoenixArray result = (PhoenixArray) stringToArrayFunction.getDataType().toObject(ptr, stringToArrayFunction.getSortOrder(), stringToArrayFunction.getMaxLength(), stringToArrayFunction.getScale());
assertEquals(expected, result);
}
private static void test(String string, String delimiter, String nullString, PhoenixArray expected, SortOrder stringSortOrder, SortOrder delimiterSortOrder, SortOrder nullStringSortOrder, PDataType stringType, PDataType delimiterType, PDataType nullStringType) throws SQLException {
LiteralExpression arrayLiteral, delimiterLiteral, nullStringLiteral;
arrayLiteral = LiteralExpression.newConstant(string, stringType, null, null, stringSortOrder, Determinism.ALWAYS);
delimiterLiteral = LiteralExpression.newConstant(delimiter, delimiterType, null, null, delimiterSortOrder, Determinism.ALWAYS);
nullStringLiteral = LiteralExpression.newConstant(nullString, nullStringType, null, null, nullStringSortOrder, Determinism.ALWAYS);
testExpression(arrayLiteral, delimiterLiteral, nullStringLiteral, expected);
}
@Test
public void testStringToArrayFunction1() throws SQLException {
String string = "1,2,3,4,5";
Object[] o1 = new Object[]{"1", "2", "3", "4", "5"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = ",";
String nullString = "*";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction2() throws SQLException {
String string = "1,2,3,4,5";
Object[] o1 = new Object[]{"1", "2", "3", "4", "5"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = ",";
String nullString = "";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction3() throws SQLException {
String string = "1234";
Object[] o1 = new Object[]{"1", "2", "3", "4"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = null;
String nullString = "";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction4() throws SQLException {
String string = "1";
Object[] o1 = new Object[]{"1"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = ",";
String nullString = "";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction5() throws SQLException {
String string = "hello, hello, hello";
Object[] o1 = new Object[]{"hello", "hello", "hello"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = ", ";
String nullString = "";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction6() throws SQLException {
String string = "1.2...2.3...5.6";
Object[] o1 = new Object[]{"1.2", "2.3", "5.6"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = "...";
String nullString = "";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction7() throws SQLException {
String string = "a\\b\\c\\d\\e\\f";
Object[] o1 = new Object[]{"a", "b", "c", "d", "e", "f"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = "\\";
String nullString = "";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction8() throws SQLException {
String string = "a-b-c-d-e-f-";
Object[] o1 = new Object[]{"a", "b", "c", "d", "e", "f"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = "-";
String nullString = "";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction9() throws SQLException {
String string = "a b c d e f";
Object[] o1 = new Object[]{"a", "b", "c", "d", "e", "f"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = " ";
String nullString = "";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction10() throws SQLException {
String string = "axbxcxdxexf";
Object[] o1 = new Object[]{"a", "b", "c", "d", "e", "f"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = "x";
String nullString = "";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction11() throws SQLException {
String string = "axbxcxdxexfx*";
Object[] o1 = new Object[]{"a", "b", "c", "d", "e", "f", null};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = "x";
String nullString = "*";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction12() throws SQLException {
String string = "* a b c d e f";
Object[] o1 = new Object[]{null, "a", "b", "c", "d", "e", "f"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = " ";
String nullString = "*";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction13() throws SQLException {
String string = "a * b * c d e f";
Object[] o1 = new Object[]{"a", null, "b", null, "c", "d", "e", "f"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = " ";
String nullString = "*";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction14() throws SQLException {
String string = "null a null";
Object[] o1 = new Object[]{null, "a", null};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = " ";
String nullString = "null";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction16() throws SQLException {
String string = "null a null";
Object[] o1 = new Object[]{null, "a", null};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = " ";
String nullString = "null";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction17() throws SQLException {
String string = "null a null";
Object[] o1 = new Object[]{null, "a", null};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = " ";
String nullString = "null";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PChar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PChar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction18() throws SQLException {
String string = "null,a,null";
Object[] o1 = new Object[]{null, "a", null};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = ",";
String nullString = "null";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PChar.INSTANCE, PChar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PChar.INSTANCE, PChar.INSTANCE, PVarchar.INSTANCE);
}
@Test
public void testStringToArrayFunction19() throws SQLException {
String string = "null,a,null";
Object[] o1 = new Object[]{null, "a", null};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = ",";
String nullString = "null";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PChar.INSTANCE, PChar.INSTANCE, PChar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PChar.INSTANCE, PChar.INSTANCE, PChar.INSTANCE);
}
@Test
public void testStringToArrayFunction20() throws SQLException {
String string = "abc";
Object[] o1 = new Object[]{"a", "b", "c"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = null;
String nullString = "null";
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PChar.INSTANCE, PChar.INSTANCE, PChar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PChar.INSTANCE, PChar.INSTANCE, PChar.INSTANCE);
}
@Test
public void testStringToArrayFunction21() throws SQLException {
String string = "(?!^)";
Object[] o1 = new Object[]{"(", "?", "!", "^", ")"};
PhoenixArray expected = new PhoenixArray(PVarchar.INSTANCE, o1);
String delimiter = null;
String nullString = null;
test(string, delimiter, nullString, expected, SortOrder.ASC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
test(string, delimiter, nullString, expected, SortOrder.DESC, SortOrder.ASC, SortOrder.ASC, PVarchar.INSTANCE, PVarchar.INSTANCE, PVarchar.INSTANCE);
}
}