/*
* Licensed 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 com.facebook.presto.tests.hive;
import com.teradata.tempto.ProductTest;
import com.teradata.tempto.Requirement;
import com.teradata.tempto.Requirements;
import com.teradata.tempto.RequirementsProvider;
import com.teradata.tempto.Requires;
import com.teradata.tempto.configuration.Configuration;
import com.teradata.tempto.fulfillment.table.MutableTableRequirement;
import com.teradata.tempto.fulfillment.table.MutableTablesState;
import com.teradata.tempto.fulfillment.table.TableDefinition;
import com.teradata.tempto.fulfillment.table.TableHandle;
import com.teradata.tempto.fulfillment.table.TableInstance;
import com.teradata.tempto.query.QueryResult;
import com.teradata.tempto.query.QueryType;
import org.testng.annotations.Test;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.SQLException;
import static com.facebook.presto.tests.TestGroups.HIVE_CONNECTOR;
import static com.facebook.presto.tests.TestGroups.POST_HIVE_1_0_1;
import static com.facebook.presto.tests.TestGroups.SMOKE;
import static com.facebook.presto.tests.hive.AllSimpleTypesTableDefinitions.ALL_HIVE_SIMPLE_TYPES_ORC;
import static com.facebook.presto.tests.hive.AllSimpleTypesTableDefinitions.ALL_HIVE_SIMPLE_TYPES_PARQUET;
import static com.facebook.presto.tests.hive.AllSimpleTypesTableDefinitions.ALL_HIVE_SIMPLE_TYPES_RCFILE;
import static com.facebook.presto.tests.hive.AllSimpleTypesTableDefinitions.ALL_HIVE_SIMPLE_TYPES_TEXTFILE;
import static com.facebook.presto.tests.hive.AllSimpleTypesTableDefinitions.onHive;
import static com.facebook.presto.tests.hive.AllSimpleTypesTableDefinitions.populateDataToHiveTable;
import static com.facebook.presto.tests.utils.JdbcDriverUtils.usingPrestoJdbcDriver;
import static com.facebook.presto.tests.utils.JdbcDriverUtils.usingTeradataJdbcDriver;
import static com.teradata.tempto.assertions.QueryAssert.Row.row;
import static com.teradata.tempto.assertions.QueryAssert.assertThat;
import static com.teradata.tempto.context.ThreadLocalTestContextHolder.testContext;
import static com.teradata.tempto.fulfillment.table.MutableTableRequirement.State.CREATED;
import static com.teradata.tempto.fulfillment.table.TableHandle.tableHandle;
import static com.teradata.tempto.fulfillment.table.TableRequirements.immutableTable;
import static com.teradata.tempto.query.QueryExecutor.defaultQueryExecutor;
import static com.teradata.tempto.query.QueryExecutor.query;
import static com.teradata.tempto.util.DateTimeUtils.parseTimestampInUTC;
import static java.lang.String.format;
import static java.sql.JDBCType.BIGINT;
import static java.sql.JDBCType.BOOLEAN;
import static java.sql.JDBCType.CHAR;
import static java.sql.JDBCType.DATE;
import static java.sql.JDBCType.DECIMAL;
import static java.sql.JDBCType.DOUBLE;
import static java.sql.JDBCType.INTEGER;
import static java.sql.JDBCType.LONGNVARCHAR;
import static java.sql.JDBCType.LONGVARBINARY;
import static java.sql.JDBCType.REAL;
import static java.sql.JDBCType.SMALLINT;
import static java.sql.JDBCType.TIMESTAMP;
import static java.sql.JDBCType.TINYINT;
import static java.sql.JDBCType.VARBINARY;
import static java.sql.JDBCType.VARCHAR;
public class TestAllDatatypesFromHiveConnector
extends ProductTest
{
public static final class TextRequirements
implements RequirementsProvider
{
@Override
public Requirement getRequirements(Configuration configuration)
{
return immutableTable(ALL_HIVE_SIMPLE_TYPES_TEXTFILE);
}
}
public static final class OrcRequirements
implements RequirementsProvider
{
@Override
public Requirement getRequirements(Configuration configuration)
{
return Requirements.compose(
MutableTableRequirement.builder(ALL_HIVE_SIMPLE_TYPES_ORC).withState(CREATED).build(),
immutableTable(ALL_HIVE_SIMPLE_TYPES_TEXTFILE));
}
}
public static final class RcfileRequirements
implements RequirementsProvider
{
@Override
public Requirement getRequirements(Configuration configuration)
{
return Requirements.compose(
MutableTableRequirement.builder(ALL_HIVE_SIMPLE_TYPES_RCFILE).withState(CREATED).build(),
immutableTable(ALL_HIVE_SIMPLE_TYPES_TEXTFILE));
}
}
public static final class ParquetRequirements
implements RequirementsProvider
{
@Override
public Requirement getRequirements(Configuration configuration)
{
return MutableTableRequirement.builder(ALL_HIVE_SIMPLE_TYPES_PARQUET).withState(CREATED).build();
}
}
@Requires(TextRequirements.class)
@Test(groups = {HIVE_CONNECTOR, SMOKE})
public void testSelectAllDatatypesTextFile()
throws SQLException
{
String tableName = ALL_HIVE_SIMPLE_TYPES_TEXTFILE.getName();
assertProperAllDatatypesSchema(tableName);
QueryResult queryResult = query(format("SELECT * FROM %s", tableName));
assertColumnTypes(queryResult);
assertThat(queryResult).containsOnly(
row(
127,
32767,
2147483647,
9223372036854775807L,
123.345f,
234.567,
new BigDecimal("346"),
new BigDecimal("345.67800"),
parseTimestampInUTC("2015-05-10 12:15:35.123"),
Date.valueOf("2015-05-10"),
"ala ma kota",
"ala ma kot",
"ala ma ",
true,
"kot binarny".getBytes()
)
);
}
@Requires(OrcRequirements.class)
@Test(groups = {HIVE_CONNECTOR})
public void testSelectAllDatatypesOrc()
throws SQLException
{
String tableName = mutableTableInstanceOf(ALL_HIVE_SIMPLE_TYPES_ORC).getNameInDatabase();
populateDataToHiveTable(tableName);
assertProperAllDatatypesSchema(tableName);
QueryResult queryResult = query(format("SELECT * FROM %s", tableName));
assertColumnTypes(queryResult);
assertThat(queryResult).containsOnly(
row(
127,
32767,
2147483647,
9223372036854775807L,
123.345f,
234.567,
new BigDecimal("346"),
new BigDecimal("345.67800"),
parseTimestampInUTC("2015-05-10 12:15:35.123"),
Date.valueOf("2015-05-10"),
"ala ma kota",
"ala ma kot",
"ala ma ",
true,
"kot binarny".getBytes()));
}
@Requires(RcfileRequirements.class)
@Test(groups = {HIVE_CONNECTOR})
public void testSelectAllDatatypesRcfile()
throws SQLException
{
String tableName = mutableTableInstanceOf(ALL_HIVE_SIMPLE_TYPES_RCFILE).getNameInDatabase();
populateDataToHiveTable(tableName);
assertProperAllDatatypesSchema(tableName);
QueryResult queryResult = query(format("SELECT * FROM %s", tableName));
assertColumnTypes(queryResult);
assertThat(queryResult).containsOnly(
row(
127,
32767,
2147483647,
9223372036854775807L,
123.345f,
234.567,
new BigDecimal("346"),
new BigDecimal("345.67800"),
parseTimestampInUTC("2015-05-10 12:15:35.123"),
Date.valueOf("2015-05-10"),
"ala ma kota",
"ala ma kot",
"ala ma ",
true,
"kot binarny".getBytes()));
}
private void assertProperAllDatatypesSchema(String tableName)
{
assertThat(query("SHOW COLUMNS FROM " + tableName, QueryType.SELECT).project(1, 2)).containsExactly(
row("c_tinyint", "tinyint"),
row("c_smallint", "smallint"),
row("c_int", "integer"),
row("c_bigint", "bigint"),
row("c_float", "real"),
row("c_double", "double"),
row("c_decimal", "decimal(10,0)"),
row("c_decimal_w_params", "decimal(10,5)"),
row("c_timestamp", "timestamp"),
row("c_date", "date"),
row("c_string", "varchar"),
row("c_varchar", "varchar(10)"),
row("c_char", "char(10)"),
row("c_boolean", "boolean"),
row("c_binary", "varbinary")
);
}
private void assertColumnTypes(QueryResult queryResult)
{
Connection connection = defaultQueryExecutor().getConnection();
if (usingPrestoJdbcDriver(connection)) {
assertThat(queryResult).hasColumns(
TINYINT,
SMALLINT,
INTEGER,
BIGINT,
REAL,
DOUBLE,
DECIMAL,
DECIMAL,
TIMESTAMP,
DATE,
LONGNVARCHAR,
LONGNVARCHAR,
CHAR,
BOOLEAN,
LONGVARBINARY
);
}
else if (usingTeradataJdbcDriver(connection)) {
assertThat(queryResult).hasColumns(
TINYINT,
SMALLINT,
INTEGER,
BIGINT,
REAL,
DOUBLE,
DECIMAL,
DECIMAL,
TIMESTAMP,
DATE,
VARCHAR,
VARCHAR,
CHAR,
BOOLEAN,
VARBINARY
);
}
else {
throw new IllegalStateException();
}
}
@Requires(ParquetRequirements.class)
@Test(groups = {HIVE_CONNECTOR, POST_HIVE_1_0_1})
public void testSelectAllDatatypesParquetFile()
throws SQLException
{
String tableName = mutableTableInstanceOf(ALL_HIVE_SIMPLE_TYPES_PARQUET).getNameInDatabase();
onHive().executeQuery(format("INSERT INTO %s VALUES(" +
"127," +
"32767," +
"2147483647," +
"9223372036854775807," +
"123.345," +
"234.567," +
"346," +
"345.67800," +
"'" + parseTimestampInUTC("2015-05-10 12:15:35.123").toString() + "'," +
"'ala ma kota'," +
"'ala ma kot'," +
"'ala ma '," +
"true," +
"'kot binarny'" +
")", tableName));
assertThat(query(format("SHOW COLUMNS FROM %s", tableName), QueryType.SELECT).project(1, 2)).containsExactly(
row("c_tinyint", "tinyint"),
row("c_smallint", "smallint"),
row("c_int", "integer"),
row("c_bigint", "bigint"),
row("c_float", "real"),
row("c_double", "double"),
row("c_decimal", "decimal(10,0)"),
row("c_decimal_w_params", "decimal(10,5)"),
row("c_timestamp", "timestamp"),
row("c_string", "varchar"),
row("c_varchar", "varchar(10)"),
row("c_char", "char(10)"),
row("c_boolean", "boolean"),
row("c_binary", "varbinary")
);
QueryResult queryResult = query(format("SELECT * FROM %s", tableName));
assertThat(queryResult).hasColumns(
TINYINT,
SMALLINT,
INTEGER,
BIGINT,
REAL,
DOUBLE,
DECIMAL,
DECIMAL,
TIMESTAMP,
LONGNVARCHAR,
LONGNVARCHAR,
CHAR,
BOOLEAN,
LONGVARBINARY
);
assertThat(queryResult).containsOnly(
row(
127,
32767,
2147483647,
9223372036854775807L,
123.345f,
234.567,
new BigDecimal("346"),
new BigDecimal("345.67800"),
parseTimestampInUTC("2015-05-10 12:15:35.123"),
"ala ma kota",
"ala ma kot",
"ala ma ",
true,
"kot binarny".getBytes()));
}
private static TableInstance mutableTableInstanceOf(TableDefinition tableDefinition)
{
if (tableDefinition.getDatabase().isPresent()) {
return mutableTableInstanceOf(tableDefinition, tableDefinition.getDatabase().get());
}
else {
return mutableTableInstanceOf(tableHandleInSchema(tableDefinition));
}
}
private static TableInstance mutableTableInstanceOf(TableDefinition tableDefinition, String database)
{
return mutableTableInstanceOf(tableHandleInSchema(tableDefinition).inDatabase(database));
}
private static TableInstance mutableTableInstanceOf(TableHandle tableHandle)
{
return testContext().getDependency(MutableTablesState.class).get(tableHandle);
}
private static TableHandle tableHandleInSchema(TableDefinition tableDefinition)
{
TableHandle tableHandle = tableHandle(tableDefinition.getName());
if (tableDefinition.getSchema().isPresent()) {
tableHandle = tableHandle.inSchema(tableDefinition.getSchema().get());
}
return tableHandle;
}
}