blob: caa4e737d79c6221d3bff242a4f546a541b6e3ba [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.store.parquet;
import org.apache.drill.test.BaseDirTestWatcher;
import org.apache.drill.test.TestBuilder;
import org.apache.drill.common.expression.SchemaPath;
import org.apache.drill.common.types.TypeProtos;
import org.apache.drill.common.types.Types;
import org.apache.drill.test.ClusterFixture;
import org.apache.drill.test.ClusterTest;
import org.apache.drill.test.ClusterFixtureBuilder;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
public class ParquetInternalsTest extends ClusterTest {
@ClassRule
public static BaseDirTestWatcher dirTestWatcher = new BaseDirTestWatcher();
@BeforeClass
public static void setup( ) throws Exception {
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher);
// Set options, etc.
startCluster(builder);
}
@Test
public void testFixedWidth() throws Exception {
String sql = "SELECT l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity\n" +
"FROM `cp`.`tpch/lineitem.parquet` LIMIT 20";
Map<SchemaPath, TypeProtos.MajorType> typeMap = new HashMap<>();
typeMap.put(TestBuilder.parsePath("l_orderkey"), Types.required(TypeProtos.MinorType.INT));
typeMap.put(TestBuilder.parsePath("l_partkey"), Types.required(TypeProtos.MinorType.INT));
typeMap.put(TestBuilder.parsePath("l_suppkey"), Types.required(TypeProtos.MinorType.INT));
typeMap.put(TestBuilder.parsePath("l_linenumber"), Types.required(TypeProtos.MinorType.INT));
typeMap.put(TestBuilder.parsePath("l_quantity"), Types.required(TypeProtos.MinorType.FLOAT8));
client.testBuilder()
.sqlQuery(sql)
.unOrdered()
.csvBaselineFile("parquet/expected/fixedWidth.csv")
.baselineColumns("l_orderkey", "l_partkey", "l_suppkey", "l_linenumber", "l_quantity")
.baselineTypes(typeMap)
.build()
.run();
}
@Test
public void testVariableWidth() throws Exception {
String sql = "SELECT s_name, s_address, s_phone, s_comment\n" +
"FROM `cp`.`tpch/supplier.parquet` LIMIT 20";
Map<SchemaPath, TypeProtos.MajorType> typeMap = new HashMap<>();
typeMap.put(TestBuilder.parsePath("s_name"), Types.required(TypeProtos.MinorType.VARCHAR));
typeMap.put(TestBuilder.parsePath("s_address"), Types.required(TypeProtos.MinorType.VARCHAR));
typeMap.put(TestBuilder.parsePath("s_phone"), Types.required(TypeProtos.MinorType.VARCHAR));
typeMap.put(TestBuilder.parsePath("s_comment"), Types.required(TypeProtos.MinorType.VARCHAR));
client.testBuilder()
.sqlQuery(sql)
.unOrdered()
.csvBaselineFile("parquet/expected/variableWidth.csv")
.baselineColumns("s_name", "s_address", "s_phone", "s_comment")
.baselineTypes(typeMap)
.build()
.run();
}
@Test
public void testMixedWidth() throws Exception {
String sql = "SELECT s_suppkey, s_name, s_address, s_phone, s_acctbal\n" +
"FROM `cp`.`tpch/supplier.parquet` LIMIT 20";
Map<SchemaPath, TypeProtos.MajorType> typeMap = new HashMap<>();
typeMap.put(TestBuilder.parsePath("s_suppkey"), Types.required(TypeProtos.MinorType.INT));
typeMap.put(TestBuilder.parsePath("s_name"), Types.required(TypeProtos.MinorType.VARCHAR));
typeMap.put(TestBuilder.parsePath("s_address"), Types.required(TypeProtos.MinorType.VARCHAR));
typeMap.put(TestBuilder.parsePath("s_phone"), Types.required(TypeProtos.MinorType.VARCHAR));
typeMap.put(TestBuilder.parsePath("s_acctbal"), Types.required(TypeProtos.MinorType.FLOAT8));
client.testBuilder()
.sqlQuery(sql)
.unOrdered()
.csvBaselineFile("parquet/expected/mixedWidth.csv")
.baselineColumns("s_suppkey", "s_name", "s_address", "s_phone", "s_acctbal")
.baselineTypes(typeMap)
.build()
.run();
}
@Test
public void testStar() throws Exception {
String sql = "SELECT *\n" +
"FROM `cp`.`tpch/supplier.parquet` LIMIT 20";
Map<SchemaPath, TypeProtos.MajorType> typeMap = new HashMap<>();
typeMap.put(TestBuilder.parsePath("s_suppkey"), Types.required(TypeProtos.MinorType.INT));
typeMap.put(TestBuilder.parsePath("s_name"), Types.required(TypeProtos.MinorType.VARCHAR));
typeMap.put(TestBuilder.parsePath("s_address"), Types.required(TypeProtos.MinorType.VARCHAR));
typeMap.put(TestBuilder.parsePath("s_nationkey"), Types.required(TypeProtos.MinorType.INT));
typeMap.put(TestBuilder.parsePath("s_phone"), Types.required(TypeProtos.MinorType.VARCHAR));
typeMap.put(TestBuilder.parsePath("s_acctbal"), Types.required(TypeProtos.MinorType.FLOAT8));
typeMap.put(TestBuilder.parsePath("s_comment"), Types.required(TypeProtos.MinorType.VARCHAR));
client.testBuilder()
.sqlQuery(sql)
.unOrdered()
.csvBaselineFile("parquet/expected/star.csv")
.baselineColumns("s_suppkey", "s_name", "s_address", "s_nationkey", "s_phone", "s_acctbal", "s_comment")
.baselineTypes(typeMap)
.build()
.run();
}
@Test
public void testMissing() throws Exception {
String sql = "SELECT s_suppkey, bogus\n" +
"FROM `cp`.`tpch/supplier.parquet` LIMIT 20";
// This test should return nothing but nulls. At present, the test
// framework can't check this case. Temporarily dumping the query
// to a CSV file to the console.
// TODO: Once the "row set" fixture is available, use that to verify
// that all rows are null.
// Can't handle nulls this way...
// Map<SchemaPath, TypeProtos.MajorType> typeMap = new HashMap<>();
// typeMap.put(TestBuilder.parsePath("s_suppkey"), Types.required(TypeProtos.MinorType.INT));
// typeMap.put(TestBuilder.parsePath("bogus"), Types.optional(TypeProtos.MinorType.INT));
// client.testBuilder()
// .sqlQuery(sql)
// .unOrdered()
// .csvBaselineFile("parquet/expected/bogus.csv")
// .baselineColumns("s_suppkey", "bogus")
// .baselineTypes(typeMap)
// .build()
// .run();
}
}