/* * 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 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 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 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 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 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(); } }