blob: 955b80028eb6a586f99fe84de0544d58704d9dfc [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.drill.exec.hive.complex_types;
import java.math.BigDecimal;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.drill.categories.HiveStorageTest;
import org.apache.drill.categories.SlowTest;
import org.apache.drill.exec.ExecConstants;
import org.apache.drill.exec.hive.HiveTestFixture;
import org.apache.drill.exec.hive.HiveTestUtilities;
import org.apache.drill.exec.util.StoragePluginTestUtils;
import org.apache.drill.exec.util.Text;
import org.apache.drill.test.ClusterFixture;
import org.apache.drill.test.ClusterTest;
import org.apache.drill.test.TestBuilder;
import org.apache.hadoop.hive.ql.Driver;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.apache.drill.exec.expr.fn.impl.DateUtility.parseBest;
import static org.apache.drill.exec.expr.fn.impl.DateUtility.parseLocalDate;
import static org.apache.drill.exec.hive.HiveTestUtilities.assertNativeScanUsed;
import static org.apache.drill.test.TestBuilder.listOf;
import static org.apache.drill.test.TestBuilder.mapOfObject;
@Category({SlowTest.class, HiveStorageTest.class})
public class TestHiveArrays extends ClusterTest {
private static HiveTestFixture hiveTestFixture;
private static final String[] TYPES = {"int", "string", "varchar(5)", "char(2)", "tinyint",
"smallint", "decimal(9,3)", "boolean", "bigint", "float", "double", "date", "timestamp"};
@BeforeClass
public static void setUp() throws Exception {
startCluster(ClusterFixture.builder(dirTestWatcher)
.sessionOption(ExecConstants.HIVE_OPTIMIZE_PARQUET_SCAN_WITH_NATIVE_READER, true));
hiveTestFixture = HiveTestFixture.builder(dirTestWatcher).build();
hiveTestFixture.getDriverManager().runWithinSession(TestHiveArrays::generateData);
hiveTestFixture.getPluginManager().addHivePluginTo(cluster.drillbit());
}
@AfterClass
public static void tearDown() throws Exception {
if (hiveTestFixture != null) {
hiveTestFixture.getPluginManager().removeHivePluginFrom(cluster.drillbit());
}
}
private static void generateData(Driver d) {
Stream.of(TYPES).forEach(type -> {
createJsonTable(d, type);
createParquetTable(d, type);
});
// binary_array
HiveTestUtilities.executeQuery(d, "CREATE TABLE binary_array(arr_n_0 ARRAY<BINARY>) STORED AS TEXTFILE");
HiveTestUtilities.executeQuery(d, "insert into binary_array select array(binary('First'),binary('Second'),binary('Third'))");
HiveTestUtilities.executeQuery(d, "insert into binary_array select array(binary('First'))");
// arr_hive_view
HiveTestUtilities.executeQuery(d, "CREATE VIEW arr_view AS " +
"SELECT " +
" int_array.rid as vwrid," +
" int_array.arr_n_0 as int_n0," +
" int_array.arr_n_1 as int_n1," +
" string_array.arr_n_0 as string_n0," +
" string_array.arr_n_1 as string_n1," +
" varchar_array.arr_n_0 as varchar_n0," +
" varchar_array.arr_n_1 as varchar_n1," +
" char_array.arr_n_0 as char_n0," +
" char_array.arr_n_1 as char_n1," +
" tinyint_array.arr_n_0 as tinyint_n0," +
" tinyint_array.arr_n_1 as tinyint_n1," +
" smallint_array.arr_n_0 as smallint_n0," +
" smallint_array.arr_n_1 as smallint_n1," +
" decimal_array.arr_n_0 as decimal_n0," +
" decimal_array.arr_n_1 as decimal_n1," +
" boolean_array.arr_n_0 as boolean_n0," +
" boolean_array.arr_n_1 as boolean_n1," +
" bigint_array.arr_n_0 as bigint_n0," +
" bigint_array.arr_n_1 as bigint_n1," +
" float_array.arr_n_0 as float_n0," +
" float_array.arr_n_1 as float_n1," +
" double_array.arr_n_0 as double_n0," +
" double_array.arr_n_1 as double_n1," +
" date_array.arr_n_0 as date_n0," +
" date_array.arr_n_1 as date_n1," +
" timestamp_array.arr_n_0 as timestamp_n0," +
" timestamp_array.arr_n_1 as timestamp_n1 " +
"FROM " +
" int_array," +
" string_array," +
" varchar_array," +
" char_array," +
" tinyint_array," +
" smallint_array," +
" decimal_array," +
" boolean_array," +
" bigint_array," +
" float_array," +
" double_array," +
" date_array," +
" timestamp_array " +
"WHERE " +
" int_array.rid=string_array.rid AND" +
" int_array.rid=varchar_array.rid AND" +
" int_array.rid=char_array.rid AND" +
" int_array.rid=tinyint_array.rid AND" +
" int_array.rid=smallint_array.rid AND" +
" int_array.rid=decimal_array.rid AND" +
" int_array.rid=boolean_array.rid AND" +
" int_array.rid=bigint_array.rid AND" +
" int_array.rid=float_array.rid AND" +
" int_array.rid=double_array.rid AND" +
" int_array.rid=date_array.rid AND" +
" int_array.rid=timestamp_array.rid "
);
HiveTestUtilities.executeQuery(d,
"CREATE TABLE struct_array(rid INT, " +
"arr_n_0 ARRAY<STRUCT<a:INT,b:BOOLEAN,c:STRING>>," +
"arr_n_1 ARRAY<ARRAY<STRUCT<x:DOUBLE,y:DOUBLE>>>, " +
"arr_n_2 ARRAY<ARRAY<ARRAY<STRUCT<t:INT,d:DATE>>>>" +
") " +
"ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS TEXTFILE"
);
HiveTestUtilities.loadData(d, "struct_array", Paths.get("complex_types/array/struct_array.json"));
HiveTestUtilities.executeQuery(d,
"CREATE TABLE struct_array_p(rid INT, " +
"arr_n_0 ARRAY<STRUCT<a:INT,b:BOOLEAN,c:STRING>>," +
"arr_n_1 ARRAY<ARRAY<STRUCT<x:DOUBLE,y:DOUBLE>>>, " +
"arr_n_2 ARRAY<ARRAY<ARRAY<STRUCT<t:INT,d:DATE>>>>" +
") " +
"STORED AS PARQUET");
HiveTestUtilities.insertData(d, "struct_array", "struct_array_p");
HiveTestUtilities.executeQuery(d,
"CREATE TABLE map_array(rid INT, " +
"arr_n_0 ARRAY<MAP<INT,BOOLEAN>>," +
"arr_n_1 ARRAY<ARRAY<MAP<CHAR(2),INT>>>, " +
"arr_n_2 ARRAY<ARRAY<ARRAY<MAP<INT,DATE>>>>" +
") " +
"ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS TEXTFILE");
HiveTestUtilities.loadData(d, "map_array", Paths.get("complex_types/array/map_array.json"));
String arrayUnionDdl = "CREATE TABLE " +
"union_array(rid INT, un_arr ARRAY<UNIONTYPE<INT, STRING, BOOLEAN, FLOAT>>) " +
"ROW FORMAT DELIMITED" +
" FIELDS TERMINATED BY ','" +
" COLLECTION ITEMS TERMINATED BY '&'" +
" MAP KEYS TERMINATED BY '#'" +
" LINES TERMINATED BY '\\n'" +
" STORED AS TEXTFILE";
HiveTestUtilities.executeQuery(d, arrayUnionDdl);
HiveTestUtilities.loadData(d,"union_array", Paths.get("complex_types/array/union_array.txt"));
}
private static void createJsonTable(Driver d, String type) {
String tableName = getTableNameFromType(type);
String ddl = String.format(
"CREATE TABLE %s(rid INT, arr_n_0 ARRAY<%2$s>, arr_n_1 ARRAY<ARRAY<%2$s>>, arr_n_2 ARRAY<ARRAY<ARRAY<%2$s>>>) " +
"ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS TEXTFILE",
tableName, type.toUpperCase());
HiveTestUtilities.executeQuery(d, ddl);
HiveTestUtilities.loadData(d, tableName, Paths.get(String.format("complex_types/array/%s.json", tableName)));
}
private static void createParquetTable(Driver d, String type) {
String from = getTableNameFromType(type);
String to = from.concat("_p");
String ddl = String.format(
"CREATE TABLE %s(rid INT, arr_n_0 ARRAY<%2$s>, arr_n_1 ARRAY<ARRAY<%2$s>>, arr_n_2 ARRAY<ARRAY<ARRAY<%2$s>>>) STORED AS PARQUET",
to, type.toUpperCase());
HiveTestUtilities.executeQuery(d, ddl);
HiveTestUtilities.insertData(d, from, to);
}
private static String getTableNameFromType(String type) {
String tblType = type.split("\\(")[0];
return tblType.toLowerCase() + "_array";
}
@Test
public void intArray() throws Exception {
checkIntArrayInTable("int_array");
}
@Test
public void intArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "int_array_p");
checkIntArrayInTable("int_array_p");
}
private void checkIntArrayInTable(String tableName) throws Exception {
// Nesting 0: reading ARRAY<INT>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", tableName)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(-1, 0, 1))
.baselineValues(emptyList())
.baselineValues(asList(100500))
.go();
// Nesting 1: reading ARRAY<ARRAY<INT>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", tableName)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(asList(-1, 0, 1), asList(-2, 1)))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asList(100500, 500100)))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<INT>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", tableName)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList(
asList(asList(7, 81), asList(-92, 54, -83), asList(-10, -59)),
asList(asList(-43, -80)),
asList(asList(-70, -62))
))
.baselineValues(asList(
asList(asList(34, -18)),
asList(asList(-87, 87), asList(52, 58), asList(58, 20, -81), asList(-94, -93))
))
.baselineValues(asList(
asList(asList(-56, 9), asList(39, 5)),
asList(asList(28, 88, -28))
))
.go();
}
@Test
public void intArrayInJoin() throws Exception {
testBuilder()
.sqlQuery("SELECT a.rid as gid, a.arr_n_0 as an0, b.arr_n_0 as bn0 " +
"FROM hive.int_array a " +
"INNER JOIN hive.int_array b " +
"ON a.rid=b.rid WHERE a.rid=1")
.unOrdered()
.baselineColumns("gid", "an0", "bn0")
.baselineValues(1, asList(-1, 0, 1), asList(-1, 0, 1))
.go();
testBuilder()
.sqlQuery("SELECT * FROM (SELECT a.rid as gid, a.arr_n_0 as an0, b.arr_n_0 as bn0,c.arr_n_0 as cn0 " +
"FROM hive.int_array a,hive.int_array b, hive.int_array c " +
"WHERE a.rid=b.rid AND a.rid=c.rid) WHERE gid=1")
.unOrdered()
.baselineColumns("gid", "an0", "bn0", "cn0")
.baselineValues(1, asList(-1, 0, 1), asList(-1, 0, 1), asList(-1, 0, 1))
.go();
}
@Test
public void intArrayByIndex() throws Exception {
// arr_n_0 array<int>, arr_n_1 array<array<int>>
testBuilder()
.sqlQuery("SELECT arr_n_0[0], arr_n_0[1], arr_n_1[0], arr_n_1[1], arr_n_0[3], arr_n_1[3] FROM hive.`int_array`")
.unOrdered()
.baselineColumns("EXPR$0", "EXPR$1", "EXPR$2", "EXPR$3", "EXPR$4", "EXPR$5")
.baselineValues(-1, 0, asList(-1, 0, 1), asList(-2, 1), null, emptyList())
.baselineValues(null, null, emptyList(), emptyList(), null, emptyList())
.baselineValues(100500, null, asList(100500, 500100), emptyList(), null, emptyList())
.go();
}
@Test
public void intArrayFlatten() throws Exception {
// arr_n_0 array<int>, arr_n_1 array<array<int>>
testBuilder()
.sqlQuery("SELECT rid, FLATTEN(arr_n_0) FROM hive.`int_array`")
.unOrdered()
.baselineColumns("rid", "EXPR$1")
.baselineValues(1, -1)
.baselineValues(1, 0)
.baselineValues(1, 1)
.baselineValues(3, 100500)
.go();
testBuilder()
.sqlQuery("SELECT rid, FLATTEN(arr_n_1) FROM hive.`int_array`")
.unOrdered()
.baselineColumns("rid", "EXPR$1")
.baselineValues(1, asList(-1, 0, 1))
.baselineValues(1, asList(-2, 1))
.baselineValues(2, emptyList())
.baselineValues(2, emptyList())
.baselineValues(3, asList(100500, 500100))
.go();
testBuilder()
.sqlQuery("SELECT rid, FLATTEN(FLATTEN(arr_n_1)) FROM hive.`int_array`")
.unOrdered()
.baselineColumns("rid", "EXPR$1")
.baselineValues(1, -1)
.baselineValues(1, 0)
.baselineValues(1, 1)
.baselineValues(1, -2)
.baselineValues(1, 1)
.baselineValues(3, 100500)
.baselineValues(3, 500100)
.go();
}
@Test
public void intArrayRepeatedCount() throws Exception {
testBuilder()
.sqlQuery("SELECT rid, REPEATED_COUNT(arr_n_0), REPEATED_COUNT(arr_n_1) FROM hive.`int_array`")
.unOrdered()
.baselineColumns("rid", "EXPR$1", "EXPR$2")
.baselineValues(1, 3, 2)
.baselineValues(2, 0, 2)
.baselineValues(3, 1, 1)
.go();
}
@Test
public void intArrayRepeatedContains() throws Exception {
testBuilder()
.sqlQuery("SELECT rid FROM hive.`int_array` WHERE REPEATED_CONTAINS(arr_n_0, 100500)")
.unOrdered()
.baselineColumns("rid")
.baselineValues(3)
.go();
}
@Test
public void intArrayDescribe() throws Exception {
testBuilder()
.sqlQuery("DESCRIBE hive.`int_array` arr_n_0")
.unOrdered()
.baselineColumns("COLUMN_NAME", "DATA_TYPE", "IS_NULLABLE")
.baselineValues("arr_n_0", "ARRAY", "YES")//todo: fix to ARRAY<INTEGER>
.go();
testBuilder()
.sqlQuery("DESCRIBE hive.`int_array` arr_n_1")
.unOrdered()
.baselineColumns("COLUMN_NAME", "DATA_TYPE", "IS_NULLABLE")
.baselineValues("arr_n_1", "ARRAY", "YES") // todo: ARRAY<ARRAY<INTEGER>>
.go();
}
@Test
public void intArrayTypeOfKindFunctions() throws Exception {
testBuilder()
.sqlQuery("select " +
"sqlTypeOf(arr_n_0), sqlTypeOf(arr_n_1), " +
"typeOf(arr_n_0), typeOf(arr_n_1), " +
"modeOf(arr_n_0), modeOf(arr_n_1), " +
"drillTypeOf(arr_n_0), drillTypeOf(arr_n_1) " +
"from hive.`int_array` limit 1")
.unOrdered()
.baselineColumns(
"EXPR$0", "EXPR$1",
"EXPR$2", "EXPR$3",
"EXPR$4", "EXPR$5",
"EXPR$6", "EXPR$7"
)
.baselineValues(
"ARRAY", "ARRAY", // why not ARRAY<INTEGER> | ARRAY<ARRAY<INTEGER>> ?
"INT", "LIST", // todo: is it ok ?
"ARRAY", "ARRAY",
"INT", "LIST" // todo: is it ok ?
)
.go();
}
@Test
public void stringArray() throws Exception {
checkStringArrayInTable("string_array");
}
@Test
public void stringArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "string_array_p");
checkStringArrayInTable("string_array_p");
}
private void checkStringArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<STRING>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asTextList("First Value Of Array", "komlnp", "The Last Value"))
.baselineValues(emptyList())
.baselineValues(asTextList("ABCaBcA-1-2-3"))
.go();
// Nesting 1: reading ARRAY<ARRAY<STRING>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(asTextList("Array 0, Value 0", "Array 0, Value 1"), asTextList("Array 1")))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asTextList("One")))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<STRING>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList(
asList(asTextList("dhMGOr1QVO", "NZpzBl", "LC8mjYyOJ7l8dHUpk")),
asList(asTextList("JH"), asTextList("aVxgfxAu"), asTextList("fF amN8z8")),
asList(asTextList("denwte5R39dSb2PeG", "Gbosj97RXTvBK1w", "S3whFvN"), asTextList("2sNbYGQhkt303Gnu", "rwG", "SQH766A8XwHg2pTA6a")),
asList(asTextList("L", "khGFDtDluFNoo5hT"), asTextList("b8"), asTextList("Z")),
asList(asTextList("DTEuW", "b0Wt84hIl", "A1H"), asTextList("h2zXh3Qc", "NOcgU8", "RGfVgv2rvDG"), asTextList("Hfn1ov9hB7fZN", "0ZgCD3"))
))
.baselineValues(asList(
asList(asTextList("nk", "HA", "CgAZCxTbTrFWJL3yM"), asTextList("T7fGXYwtBb", "G6vc"), asTextList("GrwB5j3LBy9"),
asTextList("g7UreegD1H97", "dniQ5Ehhps7c1pBuM", "S wSNMGj7c"), asTextList("iWTEJS0", "4F")),
asList(asTextList("YpRcC01u6i6KO", "ujpMrvEfUWfKm", "2d"), asTextList("2", "HVDH", "5Qx Q6W112"))
))
.baselineValues(asList(
asList(asTextList("S8d2vjNu680hSim6iJ"), asTextList("lRLaT9RvvgzhZ3C", "igSX1CP", "FFZMwMvAOod8"),
asTextList("iBX", "sG"), asTextList("ChRjuDPz99WeU9", "2gBBmMUXV9E5E", " VkEARI2upO")),
asList(asTextList("UgMok3Q5wmd"), asTextList("8Zf9CLfUSWK", "", "NZ7v"), asTextList("vQE3I5t26", "251BeQJue")),
asList(asTextList("Rpo8")),
asList(asTextList("jj3njyupewOM Ej0pu", "aePLtGgtyu4aJ5", "cKHSvNbImH1MkQmw0Cs"), asTextList("VSO5JgI2x7TnK31L5", "hIub", "eoBSa0zUFlwroSucU"),
asTextList("V8Gny91lT", "5hBncDZ")),
asList(asTextList("Y3", "StcgywfU", "BFTDChc"), asTextList("5JNwXc2UHLld7", "v"), asTextList("9UwBhJMSDftPKuGC"),
asTextList("E hQ9NJkc0GcMlB", "IVND1Xp1Nnw26DrL9"))
))
.go();
}
@Test
public void stringArrayByIndex() throws Exception {
// arr_n_0 array<string>, arr_n_1 array<array<string>>
testBuilder()
.sqlQuery("SELECT arr_n_0[0], arr_n_0[1], arr_n_1[0], arr_n_1[1], arr_n_0[3], arr_n_1[3] FROM hive.`string_array`")
.unOrdered()
.baselineColumns("EXPR$0", "EXPR$1", "EXPR$2", "EXPR$3", "EXPR$4", "EXPR$5")
.baselineValues("First Value Of Array", "komlnp", asTextList("Array 0, Value 0", "Array 0, Value 1"), asTextList("Array 1"), null, emptyList())
.baselineValues(null, null, emptyList(), emptyList(), null, emptyList())
.baselineValues("ABCaBcA-1-2-3", null, asTextList("One"), emptyList(), null, emptyList())
.go();
}
@Test
public void varcharArray() throws Exception {
// Nesting 0: reading ARRAY<VARCHAR(5)>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`varchar_array`")
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asTextList("Five", "One", "T"))
.baselineValues(emptyList())
.baselineValues(asTextList("ZZ0", "-c54g", "ooo", "k22k"))
.go();
// Nesting 1: reading ARRAY<ARRAY<VARCHAR(5)>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`varchar_array`")
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(asTextList("Five", "One", "$42"), asTextList("T", "K", "O")))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asTextList("-c54g")))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<VARCHAR(5)>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`varchar_array` order by rid")
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList(
asList(asTextList(""), asTextList("Gt", "", ""), asTextList("9R3y"), asTextList("X3a4")),
asList(asTextList("o", "6T", "QKAZ"), asTextList("", "xf8r", "As"), asTextList("5kS3")),
asList(asTextList("", "S7Gx"), asTextList("ml", "27pL", "VPxr"), asTextList(""), asTextList("e", "Dj")),
asList(asTextList("", "XYO", "fEWz"), asTextList("", "oU"), asTextList("o 8", "", ""),
asTextList("giML", "H7g"), asTextList("SWX9", "H", "emwt")),
asList(asTextList("Sp"))
))
.baselineValues(asList(
asList(asTextList("GCx"), asTextList("", "V"), asTextList("pF", "R7", ""), asTextList("", "AKal"))
))
.baselineValues(asList(
asList(asTextList("m", "MBAv", "7R9F"), asTextList("ovv"), asTextList("p 7l"))
))
.go();
}
@Test
public void varcharArrayByIndex() throws Exception {
// arr_n_0 array<varchar>, arr_n_1 array<array<varchar>>
testBuilder()
.sqlQuery("SELECT arr_n_0[0], arr_n_0[1], arr_n_1[0], arr_n_1[1], arr_n_0[3], arr_n_1[3] FROM hive.`varchar_array`")
.unOrdered()
.baselineColumns("EXPR$0", "EXPR$1", "EXPR$2", "EXPR$3", "EXPR$4", "EXPR$5")
.baselineValues("Five", "One", asTextList("Five", "One", "$42"), asTextList("T", "K", "O"), null, emptyList())
.baselineValues(null, null, emptyList(), emptyList(), null, emptyList())
.baselineValues("ZZ0", "-c54g", asTextList("-c54g"), emptyList(), "k22k", emptyList())
.go();
}
@Test
public void charArray() throws Exception {
checkCharArrayInTable("char_array");
}
@Test
public void charArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "char_array_p");
checkCharArrayInTable("char_array_p");
}
private void checkCharArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<CHAR(2)>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asTextList("aa", "cc", "ot"))
.baselineValues(emptyList())
.baselineValues(asTextList("+a", "-c", "*t"))
.go();
// Nesting 1: reading ARRAY<ARRAY<CHAR(2)>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(asTextList("aa"), asTextList("cc", "ot")))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asTextList("*t")))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<CHAR(2)>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList(
asList(asTextList("eT")),
asList(asTextList("w9", "fC", "ww"), asTextList("3o", "f7", "Za"), asTextList("lX", "iv", "jI")),
asList(asTextList("S3", "Qa", "aG"), asTextList("bj", "gc", "NO"))
))
.baselineValues(asList(
asList(asTextList("PV", "tH", "B7"), asTextList("uL"), asTextList("7b", "uf"), asTextList("zj"), asTextList("sA", "hf", "hR"))
))
.baselineValues(asList(
asList(asTextList("W1", "FS"), asTextList("le", "c0"), asTextList("", "0v")),
asList(asTextList("gj"))
))
.go();
}
@Test
public void charArrayByIndex() throws Exception {
// arr_n_0 array<char>, arr_n_1 array<array<char>>
testBuilder()
.sqlQuery("SELECT arr_n_0[0], arr_n_0[1], arr_n_1[0], arr_n_1[1], arr_n_0[3], arr_n_1[3] FROM hive.`char_array`")
.unOrdered()
.baselineColumns("EXPR$0", "EXPR$1", "EXPR$2", "EXPR$3", "EXPR$4", "EXPR$5")
.baselineValues("aa", "cc", asTextList("aa"), asTextList("cc", "ot"), null, emptyList())
.baselineValues(null, null, emptyList(), emptyList(), null, emptyList())
.baselineValues("+a", "-c", asTextList("*t"), emptyList(), null, emptyList())
.go();
}
@Test
public void tinyintArray() throws Exception {
checkTinyintArrayInTable("tinyint_array");
}
@Test
public void tinyintArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "tinyint_array_p");
checkTinyintArrayInTable("tinyint_array_p");
}
private void checkTinyintArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<TINYINT>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(-128, 0, 127))
.baselineValues(emptyList())
.baselineValues(asList(-101))
.go();
// Nesting 1: reading ARRAY<ARRAY<TINYINT>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(asList(-128, -127), asList(0, 1), asList(127, 126)))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asList(-102)))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<TINYINT>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList(
asList(asList(31, 65, 54), asList(66), asList(22), asList(-33, -125, 116)),
asList(asList(-5, -10)),
asList(asList(78), asList(86), asList(90, 34), asList(32)),
asList(asList(103, -49, -33), asList(-30), asList(107, 24, 74), asList(16, -58)),
asList(asList(-119, -8), asList(50, -99, 26), asList(-119))
))
.baselineValues(asList(
asList(asList(-90, -113), asList(71, -65)),
asList(asList(88, -83)),
asList(asList(11), asList(121, -57)),
asList(asList(-79), asList(16, -111, -111), asList(90, 106), asList(33, 29, 42), asList(74))
))
.baselineValues(asList(
asList(asList(74, -115), asList(19, 85, 3))
))
.go();
}
@Test
public void tinyintArrayByIndex() throws Exception {
// arr_n_0 array<tinyint>, arr_n_1 array<array<tinyint>>
testBuilder()
.sqlQuery("SELECT arr_n_0[0], arr_n_0[1], arr_n_1[0], arr_n_1[1], arr_n_0[3], arr_n_1[3] FROM hive.`tinyint_array`")
.unOrdered()
.baselineColumns("EXPR$0", "EXPR$1", "EXPR$2", "EXPR$3", "EXPR$4", "EXPR$5")
.baselineValues(-128, 0, asList(-128, -127), asList(0, 1), null, emptyList())
.baselineValues(null, null, emptyList(), emptyList(), null, emptyList())
.baselineValues(-101, null, asList(-102), emptyList(), null, emptyList())
.go();
}
@Test
public void smallintArray() throws Exception {
checkSmallintArrayInTable("smallint_array");
}
@Test
public void smallintArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "smallint_array_p");
checkSmallintArrayInTable("smallint_array_p");
}
private void checkSmallintArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<SMALLINT>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(-32768, 0, 32767))
.baselineValues(emptyList())
.baselineValues(asList(10500))
.go();
// Nesting 1: reading ARRAY<ARRAY<SMALLINT>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(asList(-32768, -32768), asList(0, 0), asList(32767, 32767)))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asList(10500, 5010)))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<SMALLINT>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList(
asList(asList(-28752)),
asList(asList(17243, 15652), asList(-9684), asList(10176, 18123), asList(-15404, 15420), asList(11136, -19435)),
asList(asList(-29634, -12695), asList(4350, -24289, -10889)),
asList(asList(13731), asList(27661, -15794, 21784), asList(14341, -4635), asList(1601, -29973), asList(2750, 30373, -11630)),
asList(asList(-11383))
))
.baselineValues(asList(
asList(asList(23860), asList(-27345, 19068), asList(-7174, 286, 14673)),
asList(asList(14844, -9087), asList(-25185, 219), asList(26875), asList(-4699), asList(-3853, -15729, 11472)),
asList(asList(-29142), asList(-13859), asList(-23073, 31368, -26542)),
asList(asList(14914, 14656), asList(4636, 6289))
))
.baselineValues(asList(
asList(asList(10426, 31865), asList(-19088), asList(-4774), asList(17988)),
asList(asList(-6214, -26836, 30715)),
asList(asList(-4231), asList(31742, -661), asList(-22842, 4203), asList(18278))
))
.go();
}
@Test
public void decimalArray() throws Exception {
checkDecimalArrayInTable("decimal_array");
}
@Test
public void decimalArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "decimal_array_p");
checkDecimalArrayInTable("decimal_array_p");
}
private void checkDecimalArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<DECIMAL(9,3)>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(new BigDecimal("-100000.000"), new BigDecimal("102030.001"), new BigDecimal("0.001")))
.baselineValues(emptyList())
.baselineValues(asList(new BigDecimal("-10.500")))
.go();
// Nesting 1: reading ARRAY<ARRAY<DECIMAL(9,3)>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(
asList(new BigDecimal("-100000.000"), new BigDecimal("102030.001")),
asList(new BigDecimal("0.101"), new BigDecimal("0.102")),
asList(new BigDecimal("0.001"), new BigDecimal("327670.001"))))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asList(new BigDecimal("10.500"), new BigDecimal("5.010"))))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<DECIMAL(9,3)>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList( // row
asList( // [0]
asList(new BigDecimal("9.453")),//[0][0]
asList(new BigDecimal("8.233"), new BigDecimal("-146577.465")),//[0][1]
asList(new BigDecimal("-911144.423"), new BigDecimal("-862766.866"), new BigDecimal("-129948.784"))//[0][2]
),
asList( // [1]
asList(new BigDecimal("931346.867"))//[1][0]
),
asList( // [2]
asList(new BigDecimal("81.750")),//[2][0]
asList(new BigDecimal("587225.077"), new BigDecimal("-3.930")),//[2][1]
asList(new BigDecimal("0.042")),//[2][2]
asList(new BigDecimal("-342346.511"))//[2][3]
)
))
.baselineValues(asList( // row
asList( // [0]
asList(new BigDecimal("375098.406"), new BigDecimal("84.509")),//[0][0]
asList(new BigDecimal("-446325.287"), new BigDecimal("3.671")),//[0][1]
asList(new BigDecimal("286958.380"), new BigDecimal("314821.890"), new BigDecimal("18513.303")),//[0][2]
asList(new BigDecimal("-444023.971"), new BigDecimal("827746.528"), new BigDecimal("-54.986")),//[0][3]
asList(new BigDecimal("-44520.406"))//[0][4]
)
))
.baselineValues(asList( // row
asList( // [0]
asList(new BigDecimal("906668.849"), new BigDecimal("1.406")),//[0][0]
asList(new BigDecimal("-494177.333"), new BigDecimal("952997.058"))//[0][1]
),
asList( // [1]
asList(new BigDecimal("642385.159"), new BigDecimal("369753.830"), new BigDecimal("634889.981")),//[1][0]
asList(new BigDecimal("83970.515"), new BigDecimal("-847315.758"), new BigDecimal("-0.600")),//[1][1]
asList(new BigDecimal("73013.870")),//[1][2]
asList(new BigDecimal("337872.675"), new BigDecimal("375940.114"), new BigDecimal("-2.670")),//[1][3]
asList(new BigDecimal("-7.899"), new BigDecimal("755611.538"))//[1][4]
)
))
.go();
}
@Test
public void booleanArray() throws Exception {
checkBooleanArrayInTable("boolean_array");
}
@Test
public void booleanArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "boolean_array_p");
checkBooleanArrayInTable("boolean_array_p");
}
private void checkBooleanArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<BOOLEAN>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(false, true, false, true, false))
.baselineValues(emptyList())
.baselineValues(Collections.singletonList(true))
.go();
// Nesting 1: reading ARRAY<ARRAY<BOOLEAN>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(asList(true, false, true), asList(false, false)))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asList(false, true)))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<BOOLEAN>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList(
asList(asList(false, true)),
asList(asList(true), asList(false, true), asList(true), asList(true)),
asList(asList(false), asList(true, false, false), asList(true, true), asList(false, true, false)),
asList(asList(false, true), asList(true, false), asList(true, false, true)),
asList(asList(false), asList(false), asList(false))
))
.baselineValues(asList(
asList(asList(false, true), asList(false), asList(false, false), asList(true, true, true), asList(false)),
asList(asList(false, false, true)),
asList(asList(false, true), asList(true, false))
))
.baselineValues(asList(
asList(asList(true, true), asList(false, true, false), asList(true), asList(true, true, false)),
asList(asList(false), asList(false, true), asList(false), asList(false)),
asList(asList(true, true, true), asList(true, true, true), asList(false), asList(false)),
asList(asList(false, false))
))
.go();
}
@Test
public void bigintArray() throws Exception {
checkBigintArrayInTable("bigint_array");
}
@Test
public void bigintArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "bigint_array_p");
checkBigintArrayInTable("bigint_array_p");
}
private void checkBigintArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<BIGINT>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(-9223372036854775808L, 0L, 10000000010L, 9223372036854775807L))
.baselineValues(emptyList())
.baselineValues(asList(10005000L))
.go();
// Nesting 1: reading ARRAY<ARRAY<BIGINT>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(asList(-9223372036854775808L, 0L, 10000000010L), asList(9223372036854775807L, 9223372036854775807L)))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asList(10005000L, 100050010L)))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<BIGINT>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList(
asList( // [0]
asList(7345032157033769004L),//[0][0]
asList(-2306607274383855051L, 3656249581579032003L)//[0][1]
),
asList( // [1]
asList(6044100897358387146L, 4737705104728607904L)//[1][0]
)
))
.baselineValues(asList(
asList( // [0]
asList(4833583793282587107L, -8917877693351417844L, -3226305034926780974L)//[0][0]
)
))
.baselineValues(asList(
asList( // [0]
asList(8679405200896733338L, 8581721713860760451L, 1150622751848016114L),//[0][0]
asList(-6672104994192826124L, 4807952216371616134L),//[0][1]
asList(-7874492057876324257L)//[0][2]
),
asList( // [1]
asList(8197656735200560038L),//[1][0]
asList(7643173300425098029L, -3186442699228156213L, -8370345321491335247L),//[1][1]
asList(8781633305391982544L, -7187468334864189662L)//[1][2]
),
asList( // [2]
asList(6685428436181310098L),//[2][0]
asList(1358587806266610826L),//[2][1]
asList(-2077124879355227614L, -6787493227661516341L),//[2][2]
asList(3713296190482954025L, -3890396613053404789L),//[2][3]
asList(4636761050236625699L, 5268453104977816600L)//[2][4]
)
))
.go();
}
@Test
public void floatArray() throws Exception {
checkFloatArrayInTable("float_array");
}
@Test
public void floatArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "float_array_p");
checkFloatArrayInTable("float_array_p");
}
private void checkFloatArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<FLOAT>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(-32.058f, 94.47389f, 16.107912f))
.baselineValues(emptyList())
.baselineValues(Collections.singletonList(25.96484f))
.go();
// Nesting 1: reading ARRAY<ARRAY<FLOAT>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(asList(-82.399826f, 12.633938f, 86.19402f), asList(-13.03544f, 64.65487f)))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asList(15.259451f, -15.259451f)))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<FLOAT>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList(
asList(asList(-5.6506114f), asList(26.546333f, 3724.8389f), asList(-53.65775f, 686.8335f, -0.99032f))
))
.baselineValues(asList(
asList(asList(29.042528f), asList(3524.3398f, -8856.58f, 6.8508215f)),
asList(asList(-0.73994386f, -2.0008986f), asList(-9.903006f, -271.26172f), asList(-131.80347f),
asList(39.721367f, -4870.5444f), asList(-1.4830998f, -766.3066f, -0.1659732f)),
asList(asList(3467.0298f, -240.64255f), asList(2.4072556f, -85.89145f))
))
.baselineValues(asList(
asList(asList(-888.68243f, -38.09065f), asList(-6948.154f, -185.64319f, 0.7401936f), asList(-705.2718f, -932.4041f)),
asList(asList(-2.581712f, 0.28686252f, -0.98652786f), asList(-57.448563f, -0.0057083773f, -0.21712556f),
asList(-8.076653f, -8149.519f, -7.5968184f), asList(8.823492f), asList(-9134.323f, 467.53275f, -59.763447f)),
asList(asList(0.33596575f, 6805.2256f, -3087.9531f), asList(9816.865f, -164.90712f, -1.9071647f)),
asList(asList(-0.23883149f), asList(-5.3763375f, -4.7661624f)),
asList(asList(-52.42167f, 247.91452f), asList(9499.771f), asList(-0.6549191f, 4340.83f))
))
.go();
}
@Test
public void doubleArray() throws Exception {
checkDoubleArrayInTable("double_array");
}
@Test
public void doubleArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "double_array_p");
checkDoubleArrayInTable("double_array_p");
}
private void checkDoubleArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<DOUBLE>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(-13.241563769628, 0.3436367772981237, 9.73366))
.baselineValues(emptyList())
.baselineValues(asList(15.581409176959358))
.go();
// Nesting 1: reading ARRAY<ARRAY<DOUBLE>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(asList(-24.049666910012498, 14.975034200, 1.19975056092457), asList(-2.293376758961259, 80.783)))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asList(0.47745359256854, -0.47745359256854)))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<DOUBLE>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(
asList( // row
asList( // [0]
asList(-9.269519394436928),//[0][0]
asList(0.7319990286742192, 55.53357952933713, -4.450389221972496)//[0][1]
),
asList( // [1]
asList(0.8453724066773386)//[1][0]
)
)
)
.baselineValues(
asList( // row
asList( // [0]
asList(-7966.1700155142025, 2519.664646202656),//[0][0]
asList(-0.4584683555041169),//[0][1]
asList(-860.4673046946417, 6.371900064750405, 0.4722917366204724)//[0][2]
),
asList( // [1]
asList(-62.76596817199298),//[1][0]
asList(712.7880069076203, -5.14172156610055),//[1][1]
asList(3891.128276893486, -0.5008908018575201)//[1][2]
),
asList( // [2]
asList(246.42074787345825, -0.7252828610111548),//[2][0]
asList(-845.6633966327038, -436.5267842528363)//[2][1]
),
asList( // [3]
asList(5.177407969462521),//[3][0]
asList(0.10545048230228471, 0.7364424942282094),//[3][1]
asList(-373.3798205258425, -79.65616885610245)//[3][2]
),
asList( // [4]
asList(-744.3464669962211, 3.8376055596419754),//[4][0]
asList(5784.252615154324, -4792.10612059247, -2535.4093308546435)//[4][1]
)
)
)
.baselineValues(
asList( // row
asList( // [0]
asList(0.054727088545119096, 0.3289046600776335, -183.0613955159468)//[0][0]
),
asList( // [1]
asList(-1653.1119499932845, 5132.117249049659),//[1][0]
asList(735.8474815185632, -5.4205625353286795),//[1][1]
asList(2.9513430741605107, -7513.09536433704),//[1][2]
asList(1660.4238619967039),//[1][3]
asList(472.7475322920831)//[1][4]
)
)
)
.go();
}
@Test
public void dateArray() throws Exception {
checkDateArrayInTable("date_array");
}
@Test
public void dateArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "date_array_p");
checkDateArrayInTable("date_array_p");
}
private void checkDateArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<DATE>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(
parseLocalDate("2018-10-21"),
parseLocalDate("2017-07-11"),
parseLocalDate("2018-09-23")))
.baselineValues(emptyList())
.baselineValues(asList(parseLocalDate("2018-07-14")))
.go();
// Nesting 1: reading ARRAY<ARRAY<DATE>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(
asList(parseLocalDate("2017-03-21"), parseLocalDate("2017-09-10"), parseLocalDate("2018-01-17")),
asList(parseLocalDate("2017-03-24"), parseLocalDate("2018-09-22"))))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asList(parseLocalDate("2017-08-09"), parseLocalDate("2017-08-28"))))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<DATE>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList( // row
asList( // [0]
asList(parseLocalDate("1952-08-24")),//[0][0]
asList(parseLocalDate("1968-10-05"), parseLocalDate("1951-07-27")),//[0][1]
asList(parseLocalDate("1943-11-18"), parseLocalDate("1991-04-27"))//[0][2]
),
asList( // [1]
asList(parseLocalDate("1981-12-27"), parseLocalDate("1984-02-03")),//[1][0]
asList(parseLocalDate("1953-04-15"), parseLocalDate("2002-08-15"), parseLocalDate("1926-12-10")),//[1][1]
asList(parseLocalDate("2009-08-09"), parseLocalDate("1919-08-30"), parseLocalDate("1906-04-10")),//[1][2]
asList(parseLocalDate("1995-10-28"), parseLocalDate("1989-09-07")),//[1][3]
asList(parseLocalDate("2002-01-03"), parseLocalDate("1929-03-17"), parseLocalDate("1939-10-23"))//[1][4]
)
))
.baselineValues(asList( // row
asList( // [0]
asList(parseLocalDate("1936-05-05"), parseLocalDate("1941-04-12"), parseLocalDate("1914-04-15"))//[0][0]
),
asList( // [1]
asList(parseLocalDate("1944-05-09"), parseLocalDate("2002-02-11"))//[1][0]
)
))
.baselineValues(asList( // row
asList( // [0]
asList(parseLocalDate("1965-04-18"), parseLocalDate("2012-11-07"), parseLocalDate("1961-03-15")),//[0][0]
asList(parseLocalDate("1922-05-22"), parseLocalDate("1978-03-25")),//[0][1]
asList(parseLocalDate("1935-05-29"))//[0][2]
),
asList( // [1]
asList(parseLocalDate("1904-07-08"), parseLocalDate("1968-05-23"), parseLocalDate("1946-03-31")),//[1][0]
asList(parseLocalDate("2014-01-28")),//[1][1]
asList(parseLocalDate("1938-09-20"), parseLocalDate("1920-07-09"), parseLocalDate("1990-12-31")),//[1][2]
asList(parseLocalDate("1984-07-20"), parseLocalDate("1988-11-25")),//[1][3]
asList(parseLocalDate("1941-12-21"), parseLocalDate("1939-01-16"), parseLocalDate("2012-09-19"))//[1][4]
),
asList( // [2]
asList(parseLocalDate("2020-12-28")),//[2][0]
asList(parseLocalDate("1930-11-13")),//[2][1]
asList(parseLocalDate("2014-05-02"), parseLocalDate("1935-02-16"), parseLocalDate("1919-01-17")),//[2][2]
asList(parseLocalDate("1972-04-20"), parseLocalDate("1951-05-30"), parseLocalDate("1963-01-11"))//[2][3]
),
asList( // [3]
asList(parseLocalDate("1993-03-20"), parseLocalDate("1978-12-31")),//[3][0]
asList(parseLocalDate("1965-12-15"), parseLocalDate("1970-09-02"), parseLocalDate("2010-05-25"))//[3][1]
)
))
.go();
}
@Test
public void timestampArray() throws Exception {
checkTimestampArrayInTable("timestamp_array");
}
@Test
public void timestampArrayParquet() throws Exception {
assertNativeScanUsed(queryBuilder(), "timestamp_array_p");
checkTimestampArrayInTable("timestamp_array_p");
}
private void checkTimestampArrayInTable(String table) throws Exception {
// Nesting 0: reading ARRAY<TIMESTAMP>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`%s`", table)
.optionSettingQueriesForTestQuery("alter session set `" + ExecConstants.PARQUET_READER_INT96_AS_TIMESTAMP + "` = true")
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(
parseBest("2018-10-21 04:51:36"),
parseBest("2017-07-11 09:26:48"),
parseBest("2018-09-23 03:02:33")))
.baselineValues(emptyList())
.baselineValues(asList(parseBest("2018-07-14 05:20:34")))
.go();
// Nesting 1: reading ARRAY<ARRAY<TIMESTAMP>>
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.`%s`", table)
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(
asList(parseBest("2017-03-21 12:52:33"), parseBest("2017-09-10 01:29:24"), parseBest("2018-01-17 04:45:23")),
asList(parseBest("2017-03-24 01:03:23"), parseBest("2018-09-22 05:00:26"))))
.baselineValues(asList(emptyList(), emptyList()))
.baselineValues(asList(asList(parseBest("2017-08-09 08:26:08"), parseBest("2017-08-28 09:47:23"))))
.go();
// Nesting 2: reading ARRAY<ARRAY<ARRAY<TIMESTAMP>>>
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.`%s` order by rid", table)
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(
asList( // row
asList( // [0]
asList(parseBest("1929-01-08 19:31:47")),//[0][0]
asList(parseBest("1968-07-02 15:13:55"), parseBest("1990-01-25 21:05:51"), parseBest("1950-10-26 19:16:10")),//[0][1]
asList(parseBest("1946-09-03 03:03:50"), parseBest("1987-03-29 11:27:05")),//[0][2]
asList(parseBest("1979-11-29 09:01:14"))//[0][3]
),
asList( // [1]
asList(parseBest("2010-08-26 12:08:51"), parseBest("2012-02-05 02:34:22")),//[1][0]
asList(parseBest("1955-02-24 19:45:33")),//[1][1]
asList(parseBest("1994-06-19 09:33:56"), parseBest("1971-11-05 06:27:55"), parseBest("1925-04-11 13:55:48")),//[1][2]
asList(parseBest("1916-10-02 05:09:18"), parseBest("1995-04-11 18:05:51"), parseBest("1973-11-17 06:06:53"))//[1][3]
),
asList( // [2]
asList(parseBest("1929-12-19 16:49:08"), parseBest("1942-10-28 04:55:13"), parseBest("1936-12-01 13:01:37")),//[2][0]
asList(parseBest("1926-12-09 07:34:14"), parseBest("1971-07-23 15:01:00"), parseBest("2014-01-07 06:29:03")),//[2][1]
asList(parseBest("2012-08-25 23:26:10")),//[2][2]
asList(parseBest("2010-03-04 08:31:54"), parseBest("1950-07-20 19:26:08"), parseBest("1953-03-16 16:13:24"))//[2][3]
)
)
)
.baselineValues(
asList( // row
asList( // [0]
asList(parseBest("1904-12-10 00:39:14")),//[0][0]
asList(parseBest("1994-04-12 23:06:07")),//[0][1]
asList(parseBest("1954-07-05 23:48:09"), parseBest("1913-03-03 18:47:14"), parseBest("1960-04-30 22:35:28")),//[0][2]
asList(parseBest("1962-09-26 17:11:12"), parseBest("1906-06-18 04:05:21"), parseBest("2003-06-19 05:15:24"))//[0][3]
),
asList( // [1]
asList(parseBest("1929-03-20 06:33:40"), parseBest("1939-02-12 07:03:07"), parseBest("1945-02-16 21:18:16"))//[1][0]
),
asList( // [2]
asList(parseBest("1969-08-11 22:25:31"), parseBest("1944-08-11 02:57:58")),//[2][0]
asList(parseBest("1989-03-18 13:33:56"), parseBest("1961-06-06 04:44:50"))//[2][1]
)
)
)
.baselineValues(
asList( // row
asList( // [0]
asList(parseBest("1999-12-07 01:16:45")),//[0][0]
asList(parseBest("1903-12-11 04:28:20"), parseBest("2007-01-03 19:27:28")),//[0][1]
asList(parseBest("2018-03-16 15:43:19"), parseBest("2002-09-16 08:58:40"), parseBest("1956-05-16 17:47:44")),//[0][2]
asList(parseBest("2006-09-19 18:38:19"), parseBest("2016-01-21 12:39:30"))//[0][3]
)
)
)
.go();
}
@Test
public void binaryArray() throws Exception {
// Nesting 0: reading ARRAY<BINARY>
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.`binary_array`")
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(new StringBytes("First"), new StringBytes("Second"), new StringBytes("Third")))
.baselineValues(asList(new StringBytes("First")))
.go();
}
@Test
public void arrayViewDefinedInHive() throws Exception {
testBuilder()
.sqlQuery("SELECT * FROM hive.`arr_view` WHERE vwrid=1")
.unOrdered()
.baselineColumns("vwrid", "int_n0", "int_n1", "string_n0", "string_n1",
"varchar_n0", "varchar_n1", "char_n0", "char_n1", "tinyint_n0",
"tinyint_n1", "smallint_n0", "smallint_n1", "decimal_n0", "decimal_n1",
"boolean_n0", "boolean_n1", "bigint_n0", "bigint_n1", "float_n0", "float_n1",
"double_n0", "double_n1", "date_n0", "date_n1", "timestamp_n0", "timestamp_n1")
.baselineValues(
1,
asList(-1, 0, 1),
asList(asList(-1, 0, 1), asList(-2, 1)),
asTextList("First Value Of Array", "komlnp", "The Last Value"),
asList(asTextList("Array 0, Value 0", "Array 0, Value 1"), asTextList("Array 1")),
asTextList("Five", "One", "T"),
asList(asTextList("Five", "One", "$42"), asTextList("T", "K", "O")),
asTextList("aa", "cc", "ot"),
asList(asTextList("aa"), asTextList("cc", "ot")),
asList(-128, 0, 127),
asList(asList(-128, -127), asList(0, 1), asList(127, 126)),
asList(-32768, 0, 32767),
asList(asList(-32768, -32768), asList(0, 0), asList(32767, 32767)),
asList(new BigDecimal("-100000.000"), new BigDecimal("102030.001"), new BigDecimal("0.001")),
asList(asList(new BigDecimal("-100000.000"), new BigDecimal("102030.001")), asList(new BigDecimal("0.101"), new BigDecimal("0.102")),
asList(new BigDecimal("0.001"), new BigDecimal("327670.001"))),
asList(false, true, false, true, false),
asList(asList(true, false, true), asList(false, false)),
asList(-9223372036854775808L, 0L, 10000000010L, 9223372036854775807L),
asList(asList(-9223372036854775808L, 0L, 10000000010L), asList(9223372036854775807L, 9223372036854775807L)),
asList(-32.058f, 94.47389f, 16.107912f),
asList(asList(-82.399826f, 12.633938f, 86.19402f), asList(-13.03544f, 64.65487f)),
asList(-13.241563769628, 0.3436367772981237, 9.73366),
asList(asList(-24.049666910012498, 14.975034200, 1.19975056092457), asList(-2.293376758961259, 80.783)),
asList(parseLocalDate("2018-10-21"), parseLocalDate("2017-07-11"), parseLocalDate("2018-09-23")),
asList(asList(parseLocalDate("2017-03-21"), parseLocalDate("2017-09-10"), parseLocalDate("2018-01-17")),
asList(parseLocalDate("2017-03-24"), parseLocalDate("2018-09-22"))),
asList(parseBest("2018-10-21 04:51:36"), parseBest("2017-07-11 09:26:48"), parseBest("2018-09-23 03:02:33")),
asList(asList(parseBest("2017-03-21 12:52:33"), parseBest("2017-09-10 01:29:24"), parseBest("2018-01-17 04:45:23")),
asList(parseBest("2017-03-24 01:03:23"), parseBest("2018-09-22 05:00:26")))
)
.go();
}
@Test
public void arrayViewDefinedInDrill() throws Exception {
queryBuilder().sql(
"CREATE VIEW " + StoragePluginTestUtils.DFS_TMP_SCHEMA + ".`dfs_arr_vw` AS " +
"SELECT " +
" t1.rid as vwrid," +
" t1.arr_n_0 as int_n0," +
" t1.arr_n_1 as int_n1," +
" t2.arr_n_0 as string_n0," +
" t2.arr_n_1 as string_n1," +
" t3.arr_n_0 as varchar_n0," +
" t3.arr_n_1 as varchar_n1," +
" t4.arr_n_0 as char_n0," +
" t4.arr_n_1 as char_n1," +
" t5.arr_n_0 as tinyint_n0," +
" t5.arr_n_1 as tinyint_n1," +
" t6.arr_n_0 as smallint_n0," +
" t6.arr_n_1 as smallint_n1," +
" t7.arr_n_0 as decimal_n0," +
" t7.arr_n_1 as decimal_n1," +
" t8.arr_n_0 as boolean_n0," +
" t8.arr_n_1 as boolean_n1," +
" t9.arr_n_0 as bigint_n0," +
" t9.arr_n_1 as bigint_n1," +
" t10.arr_n_0 as float_n0," +
" t10.arr_n_1 as float_n1," +
" t11.arr_n_0 as double_n0," +
" t11.arr_n_1 as double_n1," +
" t12.arr_n_0 as date_n0," +
" t12.arr_n_1 as date_n1," +
" t13.arr_n_0 as timestamp_n0," +
" t13.arr_n_1 as timestamp_n1 " +
"FROM " +
" hive.int_array t1," +
" hive.string_array t2," +
" hive.varchar_array t3," +
" hive.char_array t4," +
" hive.tinyint_array t5," +
" hive.smallint_array t6," +
" hive.decimal_array t7," +
" hive.boolean_array t8," +
" hive.bigint_array t9," +
" hive.float_array t10," +
" hive.double_array t11," +
" hive.date_array t12," +
" hive.timestamp_array t13 " +
"WHERE " +
" t1.rid=t2.rid AND" +
" t1.rid=t3.rid AND" +
" t1.rid=t4.rid AND" +
" t1.rid=t5.rid AND" +
" t1.rid=t6.rid AND" +
" t1.rid=t7.rid AND" +
" t1.rid=t8.rid AND" +
" t1.rid=t9.rid AND" +
" t1.rid=t10.rid AND" +
" t1.rid=t11.rid AND" +
" t1.rid=t12.rid AND" +
" t1.rid=t13.rid "
).run();
testBuilder()
.sqlQuery("SELECT * FROM " + StoragePluginTestUtils.DFS_TMP_SCHEMA + ".`dfs_arr_vw` WHERE vwrid=1")
.unOrdered()
.baselineColumns("vwrid", "int_n0", "int_n1", "string_n0", "string_n1",
"varchar_n0", "varchar_n1", "char_n0", "char_n1", "tinyint_n0",
"tinyint_n1", "smallint_n0", "smallint_n1", "decimal_n0", "decimal_n1",
"boolean_n0", "boolean_n1", "bigint_n0", "bigint_n1", "float_n0", "float_n1",
"double_n0", "double_n1", "date_n0", "date_n1", "timestamp_n0", "timestamp_n1")
.baselineValues(
1,
asList(-1, 0, 1),
asList(asList(-1, 0, 1), asList(-2, 1)),
asTextList("First Value Of Array", "komlnp", "The Last Value"),
asList(asTextList("Array 0, Value 0", "Array 0, Value 1"), asTextList("Array 1")),
asTextList("Five", "One", "T"),
asList(asTextList("Five", "One", "$42"), asTextList("T", "K", "O")),
asTextList("aa", "cc", "ot"),
asList(asTextList("aa"), asTextList("cc", "ot")),
asList(-128, 0, 127),
asList(asList(-128, -127), asList(0, 1), asList(127, 126)),
asList(-32768, 0, 32767),
asList(asList(-32768, -32768), asList(0, 0), asList(32767, 32767)),
asList(new BigDecimal("-100000.000"), new BigDecimal("102030.001"), new BigDecimal("0.001")),
asList(asList(new BigDecimal("-100000.000"), new BigDecimal("102030.001")), asList(new BigDecimal("0.101"), new BigDecimal("0.102")),
asList(new BigDecimal("0.001"), new BigDecimal("327670.001"))),
asList(false, true, false, true, false),
asList(asList(true, false, true), asList(false, false)),
asList(-9223372036854775808L, 0L, 10000000010L, 9223372036854775807L),
asList(asList(-9223372036854775808L, 0L, 10000000010L), asList(9223372036854775807L, 9223372036854775807L)),
asList(-32.058f, 94.47389f, 16.107912f),
asList(asList(-82.399826f, 12.633938f, 86.19402f), asList(-13.03544f, 64.65487f)),
asList(-13.241563769628, 0.3436367772981237, 9.73366),
asList(asList(-24.049666910012498, 14.975034200, 1.19975056092457), asList(-2.293376758961259, 80.783)),
asList(parseLocalDate("2018-10-21"), parseLocalDate("2017-07-11"), parseLocalDate("2018-09-23")),
asList(asList(parseLocalDate("2017-03-21"), parseLocalDate("2017-09-10"), parseLocalDate("2018-01-17")),
asList(parseLocalDate("2017-03-24"), parseLocalDate("2018-09-22"))),
asList(parseBest("2018-10-21 04:51:36"), parseBest("2017-07-11 09:26:48"), parseBest("2018-09-23 03:02:33")),
asList(asList(parseBest("2017-03-21 12:52:33"), parseBest("2017-09-10 01:29:24"), parseBest("2018-01-17 04:45:23")),
asList(parseBest("2017-03-24 01:03:23"), parseBest("2018-09-22 05:00:26")))
)
.go();
}
@Test
public void structArrayN0() throws Exception {
testBuilder()
.sqlQuery("SELECT arr_n_0 FROM hive.struct_array")
.unOrdered()
.baselineColumns("arr_n_0")
.baselineValues(asList(
TestBuilder.mapOf("a", -1, "b", true, "c", "asdpo daasree"),
TestBuilder.mapOf("a", 0, "b", false, "c", "xP>vcx _2p3 >.mm,//"),
TestBuilder.mapOf("a", 902, "b", false, "c", "*-//------*")
))
.baselineValues(asList())
.go();
}
@Test
public void structArrayN0ByIdxP1() throws Exception {
HiveTestUtilities.assertNativeScanUsed(queryBuilder(), "struct_array_p");
testBuilder()
.sqlQuery("SELECT rid, arr_n_0[1].c p1 FROM hive.struct_array_p")
.unOrdered()
.baselineColumns("rid", "p1")
.baselineValues(1, "xP>vcx _2p3 >.mm,//")
.baselineValues(2, null)
.go();
}
@Test
public void structArrayN0ByIdxP2() throws Exception {
HiveTestUtilities.assertNativeScanUsed(queryBuilder(), "struct_array_p");
testBuilder()
.sqlQuery("SELECT rid, arr_n_0[2] p2 FROM hive.struct_array_p")
.unOrdered()
.baselineColumns("rid", "p2")
.baselineValues(1, TestBuilder.mapOf("a", 902, "b", false, "c", "*-//------*"))
.baselineValues(2, TestBuilder.mapOf())
.go();
}
@Test
public void structArrayN0ByIdxP3() throws Exception {
testBuilder()
.sqlQuery("SELECT rid,arr_n_0[2] p3 FROM hive.struct_array")
.unOrdered()
.baselineColumns("rid", "p3")
.baselineValues(1, TestBuilder.mapOf("a", 902, "b", false, "c", "*-//------*"))
.baselineValues(2, TestBuilder.mapOf())
.go();
}
@Test
public void structArrayN1() throws Exception {
testBuilder()
.sqlQuery("SELECT arr_n_1 FROM hive.struct_array")
.unOrdered()
.baselineColumns("arr_n_1")
.baselineValues(asList(
asList(
TestBuilder.mapOf("x", 17.9231, "y", -12.12),
TestBuilder.mapOf("x", 0.0001, "y", -1.1),
TestBuilder.mapOf("x", 101.1, "y", -989.11)
),
asList(
TestBuilder.mapOf("x", 77.32, "y", -11.11),
TestBuilder.mapOf("x", 13.1, "y", -1.1)
)
))
.baselineValues(asList(
asList(),
asList(TestBuilder.mapOf("x", 21.221, "y", -21.221))
))
.go();
}
@Test
public void structArrayN2() throws Exception {
testBuilder()
.sqlQuery("SELECT arr_n_2 FROM hive.struct_array ORDER BY rid")
.ordered()
.baselineColumns("arr_n_2")
.baselineValues(asList(
asList(
asList(
TestBuilder.mapOf("t", 1, "d", parseLocalDate("2018-10-21")),
TestBuilder.mapOf("t", 2, "d", parseLocalDate("2017-07-11"))
),
asList(
TestBuilder.mapOf("t", 3, "d", parseLocalDate("2018-09-23")),
TestBuilder.mapOf("t", 4, "d", parseLocalDate("1965-04-18")),
TestBuilder.mapOf("t", 5, "d", parseLocalDate("1922-05-22"))
),
asList(
TestBuilder.mapOf("t", 6, "d", parseLocalDate("1921-05-22")),
TestBuilder.mapOf("t", 7, "d", parseLocalDate("1923-05-22"))
)
),
asList(
asList(
TestBuilder.mapOf("t", 8, "d", parseLocalDate("2002-02-11")),
TestBuilder.mapOf("t", 9, "d", parseLocalDate("2017-03-24"))
)
),
asList(
asList(
TestBuilder.mapOf("t", 10, "d", parseLocalDate("1919-01-17")),
TestBuilder.mapOf("t", 11, "d", parseLocalDate("1965-12-15"))
)
)
))
.baselineValues(asList(
asList(
asList(
TestBuilder.mapOf("t", 12, "d", parseLocalDate("2018-09-23")),
TestBuilder.mapOf("t", 13, "d", parseLocalDate("1939-10-23")),
TestBuilder.mapOf("t", 14, "d", parseLocalDate("1922-05-22"))
)
),
asList(
asList(
TestBuilder.mapOf("t", 15, "d", parseLocalDate("2018-09-23")),
TestBuilder.mapOf("t", 16, "d", parseLocalDate("1965-04-18"))
)
)
))
.go();
}
@Test
public void structArrayN2PrimitiveFieldAccess() throws Exception {
testBuilder()
.sqlQuery("SELECT sa.arr_n_2[0][0][1].d FROM hive.struct_array sa ORDER BY rid")
.ordered()
.baselineColumns("EXPR$0")
.baselineValues(parseLocalDate("2017-07-11"))
.baselineValues(parseLocalDate("1939-10-23"))
.go();
}
@Test
public void mapArrayN0() throws Exception {
testBuilder()
.sqlQuery("SELECT rid, arr_n_0 FROM hive.map_array")
.unOrdered()
.baselineColumns("rid", "arr_n_0")
.baselineValues(1, asList(mapOfObject(0, true, 1, false), mapOfObject(0, false), mapOfObject(1, true)))
.baselineValues(2, asList(mapOfObject(0, false, 1, true), mapOfObject(0, true)))
.baselineValues(3, asList(mapOfObject(0, true, 1, false)))
.go();
}
@Test
public void mapArrayN1() throws Exception {
testBuilder()
.sqlQuery("SELECT rid, arr_n_1 FROM hive.map_array")
.unOrdered()
.baselineColumns("rid", "arr_n_1")
.baselineValues(1, asList(
asList(mapOfObject(true, "zz", 1, "cx", 2), mapOfObject(true, "oo", 7, "nn", 9), mapOfObject(true, "nb", 3)),
asList(mapOfObject(true, "is", 12, "ie", 7, "po", 2), mapOfObject(true, "ka", 11)),
asList(mapOfObject(true, "tr", 3), mapOfObject(true, "xz", 4))
))
.baselineValues(2, asList(
asList(mapOfObject(true, "vv", 0, "zz", 2), mapOfObject(true, "ui", 8)),
asList(mapOfObject(true, "iy", 7, "yi", 5), mapOfObject(true, "nb", 4, "nr", 2, "nm", 2), mapOfObject(true, "qw", 12, "qq", 17)),
asList(mapOfObject(true, "aa", 0, "az", 0), mapOfObject(true, "tt", 25))
))
.baselineValues(3, asList(
asList(mapOfObject(true, "ix", 40)),
asList(mapOfObject(true, "cx", 30)),
asList(mapOfObject(true, "we", 20), mapOfObject(true, "ex", 70))
))
.go();
}
@Test
public void mapArrayN2() throws Exception {
testBuilder()
.sqlQuery("SELECT rid, arr_n_2 FROM hive.map_array")
.unOrdered()
.baselineColumns("rid", "arr_n_2")
.baselineValues(1, asList(
asList(
asList(mapOfObject(1, parseLocalDate("2019-09-12"), 2, parseLocalDate("2019-09-13")), mapOfObject(1, parseLocalDate("2019-09-13"))),
asList(mapOfObject(3, parseLocalDate("2019-09-27")), mapOfObject(5, parseLocalDate("2019-09-17")))
),
asList(
asList(mapOfObject(7, parseLocalDate("2019-07-07"))),
asList(mapOfObject(12, parseLocalDate("2019-09-15"))),
asList(mapOfObject(9, parseLocalDate("2019-09-15")))
)
))
.baselineValues(2, asList(
asList(
asList(mapOfObject(1, parseLocalDate("2020-01-01"), 3, parseLocalDate("2017-03-15"))),
asList(mapOfObject(5, parseLocalDate("2020-01-05"), 7, parseLocalDate("2017-03-17")), mapOfObject(0, parseLocalDate("2000-12-01")))
),
asList(
asList(mapOfObject(9, parseLocalDate("2019-05-09")), mapOfObject(0, parseLocalDate("2019-09-01"))),
asList(mapOfObject(3, parseLocalDate("2019-09-03")), mapOfObject(7, parseLocalDate("2007-08-07")), mapOfObject(4, parseLocalDate("2004-04-04"))),
asList(mapOfObject(3, parseLocalDate("2003-03-03")), mapOfObject(1, parseLocalDate("2001-01-11")))
)
))
.baselineValues(3, asList(
asList(
asList(mapOfObject(8, parseLocalDate("2019-10-19"))),
asList(mapOfObject(6, parseLocalDate("2019-11-06")))
),
asList(
asList(mapOfObject(9, parseLocalDate("2019-11-09"))),
asList(mapOfObject(6, parseLocalDate("2019-11-06"))),
asList(mapOfObject(6, parseLocalDate("2019-11-06")))
)
))
.go();
}
@Test
public void mapArrayRepeatedCount() throws Exception {
testBuilder()
.sqlQuery("SELECT rid, REPEATED_COUNT(arr_n_0) rc FROM hive.map_array")
.unOrdered()
.baselineColumns("rid", "rc")
.baselineValues(1, 3)
.baselineValues(2, 2)
.baselineValues(3, 1)
.go();
}
@Test
public void mapArrayCount() throws Exception {
testBuilder()
.sqlQuery("SELECT COUNT(arr_n_0) cnt FROM hive.map_array")
.unOrdered()
.baselineColumns("cnt")
.baselineValues(3L)
.go();
}
@Test
public void unionArray() throws Exception {
testBuilder()
.sqlQuery("SELECT rid, un_arr FROM hive.union_array")
.unOrdered()
.baselineColumns("rid", "un_arr")
.baselineValues(1, listOf(new Text("S0m3 tExTy 4arZ"), 128, true, 7.7775f))
.baselineValues(2, listOf(true, 7.7775f))
.baselineValues(3, listOf(new Text("S0m3 tExTy 4arZ"), 128, 7.7775f))
.go();
}
/**
* Workaround {@link StringBytes#equals(Object)} implementation
* used to compare binary array elements.
* See {@link TestHiveArrays#binaryArray()} for sample usage.
*/
private static final class StringBytes {
private final byte[] bytes;
private StringBytes(String s) {
bytes = s.getBytes();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof byte[]) {
return Arrays.equals(bytes, (byte[]) obj);
}
return (obj == this) || (obj instanceof StringBytes
&& Arrays.equals(bytes, ((StringBytes) obj).bytes));
}
@Override
public String toString() {
return new String(bytes);
}
}
private static List<Text> asTextList(String... strings) {
return Stream.of(strings)
.map(Text::new)
.collect(Collectors.toList());
}
}