/**
* 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.tajo.engine.query;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionCodecFactory;
import org.apache.hadoop.io.compress.DeflateCodec;
import org.apache.tajo.IntegrationTest;
import org.apache.tajo.TajoTestingCluster;
import org.apache.tajo.TpchTestBase;
import org.apache.tajo.catalog.CatalogService;
import org.apache.tajo.catalog.TableDesc;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import java.io.IOException;
import java.sql.ResultSet;
import static org.junit.Assert.*;
@Category(IntegrationTest.class)
public class TestInsertQuery {
private static TpchTestBase tpch;
public TestInsertQuery() throws IOException {
super();
}
@BeforeClass
public static void setUp() throws Exception {
tpch = TpchTestBase.getInstance();
}
@Test
public final void testInsertOverwrite() throws Exception {
String tableName ="InsertOverwrite";
ResultSet res = tpch.execute("create table " + tableName +" (col1 int4, col2 int4, col3 float8)");
res.close();
TajoTestingCluster cluster = tpch.getTestingCluster();
CatalogService catalog = cluster.getMaster().getCatalog();
assertTrue(catalog.existsTable(tableName));
res = tpch.execute("insert overwrite into " + tableName
+ " select l_orderkey, l_partkey, l_quantity from lineitem");
res.close();
TableDesc desc = catalog.getTableDesc(tableName);
assertEquals(5, desc.getStats().getNumRows().intValue());
}
@Test
public final void testInsertOverwriteSmallerColumns() throws Exception {
String tableName = "insertoverwritesmallercolumns";
ResultSet res = tpch.execute("create table " + tableName + " (col1 int4, col2 int4, col3 float8)");
res.close();
TajoTestingCluster cluster = tpch.getTestingCluster();
CatalogService catalog = cluster.getMaster().getCatalog();
assertTrue(catalog.existsTable(tableName));
TableDesc originalDesc = catalog.getTableDesc(tableName);
res = tpch.execute("insert overwrite into " + tableName + " select l_orderkey from lineitem");
res.close();
TableDesc desc = catalog.getTableDesc(tableName);
assertEquals(5, desc.getStats().getNumRows().intValue());
assertEquals(originalDesc.getSchema(), desc.getSchema());
}
@Test
public final void testInsertOverwriteWithTargetColumns() throws Exception {
String tableName = "InsertOverwriteWithTargetColumns";
ResultSet res = tpch.execute("create table " + tableName + " (col1 int4, col2 int4, col3 float8)");
res.close();
TajoTestingCluster cluster = tpch.getTestingCluster();
CatalogService catalog = cluster.getMaster().getCatalog();
assertTrue(catalog.existsTable(tableName));
TableDesc originalDesc = catalog.getTableDesc(tableName);
res = tpch.execute("insert overwrite into " + tableName + " (col1, col3) select l_orderkey, l_quantity from lineitem");
res.close();
TableDesc desc = catalog.getTableDesc(tableName);
assertEquals(5, desc.getStats().getNumRows().intValue());
res = tpch.execute("select * from " + tableName);
assertTrue(res.next());
assertEquals(1, res.getLong(1));
assertTrue(0f == res.getFloat(2));
assertTrue(res.wasNull());
assertTrue(17.0 == res.getFloat(3));
assertTrue(res.next());
assertEquals(1, res.getLong(1));
assertTrue(0f == res.getFloat(2));
assertTrue(res.wasNull());
assertTrue(36.0 == res.getFloat(3));
assertTrue(res.next());
assertEquals(2, res.getLong(1));
assertTrue(0f == res.getFloat(2));
assertTrue(res.wasNull());
assertTrue(38.0 == res.getFloat(3));
assertTrue(res.next());
assertTrue(0f == res.getFloat(2));
assertTrue(res.wasNull());
assertTrue(45.0 == res.getFloat(3));
assertTrue(res.next());
assertEquals(3, res.getLong(1));
assertTrue(0f == res.getFloat(2));
assertTrue(res.wasNull());
assertTrue(49.0 == res.getFloat(3));
assertFalse(res.next());
res.close();
assertEquals(originalDesc.getSchema(), desc.getSchema());
}
@Test
public final void testInsertOverwriteWithAsterisk() throws Exception {
String tableName = "testinsertoverwritewithasterisk";
ResultSet res = tpch.execute("create table " + tableName + " as select * from lineitem");
res.close();
TajoTestingCluster cluster = tpch.getTestingCluster();
CatalogService catalog = cluster.getMaster().getCatalog();
assertTrue(catalog.existsTable(tableName));
res = tpch.execute("insert overwrite into " + tableName + " select * from lineitem where l_orderkey = 3");
res.close();
TableDesc desc = catalog.getTableDesc(tableName);
assertEquals(2, desc.getStats().getNumRows().intValue());
}
@Test
public final void testInsertOverwriteIntoSelect() throws Exception {
String tableName = "insertoverwriteintoselect";
ResultSet res = tpch.execute(
"create table " + tableName + " as select l_orderkey from lineitem");
assertFalse(res.next());
res.close();
TajoTestingCluster cluster = tpch.getTestingCluster();
CatalogService catalog = cluster.getMaster().getCatalog();
assertTrue(catalog.existsTable(tableName));
TableDesc orderKeys = catalog.getTableDesc(tableName);
assertEquals(5, orderKeys.getStats().getNumRows().intValue());
// this query will result in the two rows.
res = tpch.execute(
"insert overwrite into " + tableName + " select l_orderkey from lineitem where l_orderkey = 3");
assertFalse(res.next());
res.close();
assertTrue(catalog.existsTable(tableName));
orderKeys = catalog.getTableDesc(tableName);
assertEquals(2, orderKeys.getStats().getNumRows().intValue());
}
@Test
public final void testInsertOverwriteCapitalTableName() throws Exception {
String tableName = "testInsertOverwriteCapitalTableName";
ResultSet res = tpch.execute("create table " + tableName + " as select * from lineitem");
res.close();
TajoTestingCluster cluster = tpch.getTestingCluster();
CatalogService catalog = cluster.getMaster().getCatalog();
assertTrue(catalog.existsTable(tableName));
res = tpch.execute("insert overwrite into " + tableName + " select * from lineitem where l_orderkey = 3");
res.close();
TableDesc desc = catalog.getTableDesc(tableName);
assertEquals(2, desc.getStats().getNumRows().intValue());
}
@Test
public final void testInsertOverwriteLocation() throws Exception {
ResultSet res =
tpch.execute("insert overwrite into location '/tajo-data/testInsertOverwriteCapitalTableName' select * from lineitem where l_orderkey = 3");
res.close();
FileSystem fs = FileSystem.get(tpch.getTestingCluster().getConfiguration());
assertTrue(fs.exists(new Path("/tajo-data/testInsertOverwriteCapitalTableName")));
assertEquals(1, fs.listStatus(new Path("/tajo-data/testInsertOverwriteCapitalTableName")).length);
}
@Test
public final void testInsertOverwriteWithCompression() throws Exception {
String tableName = "testInsertOverwriteWithCompression";
ResultSet res = tpch.execute("create table " + tableName + " (col1 int4, col2 int4, col3 float8) USING csv WITH ('csvfile.delimiter'='|','compression.codec'='org.apache.hadoop.io.compress.DeflateCodec')");
res.close();
TajoTestingCluster cluster = tpch.getTestingCluster();
CatalogService catalog = cluster.getMaster().getCatalog();
assertTrue(catalog.existsTable(tableName));
res = tpch.execute("insert overwrite into " + tableName + " select l_orderkey, l_partkey, l_quantity from lineitem where l_orderkey = 3");
res.close();
TableDesc desc = catalog.getTableDesc(tableName);
assertEquals(2, desc.getStats().getNumRows().intValue());
FileSystem fs = FileSystem.get(tpch.getTestingCluster().getConfiguration());
assertTrue(fs.exists(desc.getPath()));
CompressionCodecFactory factory = new CompressionCodecFactory(tpch.getTestingCluster().getConfiguration());
for (FileStatus file : fs.listStatus(desc.getPath())){
CompressionCodec codec = factory.getCodec(file.getPath());
assertTrue(codec instanceof DeflateCodec);
}
}
@Test
public final void testInsertOverwriteLocationWithCompression() throws Exception {
ResultSet res = tpch.execute("insert overwrite into location '/tajo-data/testInsertOverwriteLocationWithCompression' USING csv WITH ('csvfile.delimiter'='|','compression.codec'='org.apache.hadoop.io.compress.DeflateCodec') select * from lineitem where l_orderkey = 3");
res.close();
FileSystem fs = FileSystem.get(tpch.getTestingCluster().getConfiguration());
Path path = new Path("/tajo-data/testInsertOverwriteLocationWithCompression");
assertTrue(fs.exists(path));
assertEquals(1, fs.listStatus(path).length);
CompressionCodecFactory factory = new CompressionCodecFactory(tpch.getTestingCluster().getConfiguration());
for (FileStatus file : fs.listStatus(path)){
CompressionCodec codec = factory.getCodec(file.getPath());
assertTrue(codec instanceof DeflateCodec);
}
}
}