| /** |
| * 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.sqoop; |
| |
| import java.io.BufferedReader; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.sql.SQLException; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.fs.FSDataInputStream; |
| import org.apache.hadoop.fs.FileSystem; |
| import org.apache.hadoop.fs.Path; |
| import org.apache.hadoop.io.IOUtils; |
| |
| import org.apache.sqoop.testutil.CommonArgs; |
| import org.apache.sqoop.testutil.ImportJobTestCase; |
| import org.junit.After; |
| import org.junit.Test; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| /** |
| * Test free form query import. |
| */ |
| public class TestFreeFormQueryImport extends ImportJobTestCase { |
| |
| private Log log; |
| |
| public TestFreeFormQueryImport() { |
| this.log = LogFactory.getLog(TestFreeFormQueryImport.class.getName()); |
| } |
| |
| /** |
| * @return the Log object to use for reporting during this test |
| */ |
| protected Log getLogger() { |
| return log; |
| } |
| |
| /** the names of the tables we're creating. */ |
| private List<String> tableNames; |
| |
| @After |
| public void tearDown() { |
| // Clean up the database on our way out. |
| for (String tableName : tableNames) { |
| try { |
| dropTableIfExists(tableName); |
| } catch (SQLException e) { |
| log.warn("Error trying to drop table '" + tableName |
| + "' on tearDown: " + e); |
| } |
| } |
| super.tearDown(); |
| } |
| |
| /** |
| * Create the argv to pass to Sqoop. |
| * @param splitByCol column of the table used to split work. |
| * @param query free form query to be used. |
| * @return the argv as an array of strings. |
| */ |
| protected String [] getArgv(String splitByCol, String query) { |
| ArrayList<String> args = new ArrayList<String>(); |
| |
| CommonArgs.addHadoopFlags(args); |
| |
| args.add("--connect"); |
| args.add(getConnectString()); |
| args.add("--target-dir"); |
| args.add(getTablePath().toString()); |
| args.add("--split-by"); |
| args.add(splitByCol); |
| args.add("--num-mappers"); |
| args.add("2"); |
| args.add("--query"); |
| args.add(query); |
| |
| return args.toArray(new String[0]); |
| } |
| |
| /** |
| * Create two tables that share the common id column. Run free-form query |
| * import on the result table that is created by joining the two tables on |
| * the id column. |
| */ |
| @Test |
| public void testSimpleJoin() throws IOException { |
| tableNames = new ArrayList<String>(); |
| |
| String [] types1 = { "SMALLINT", }; |
| String [] vals1 = { "1", }; |
| String tableName1 = getTableName(); |
| createTableWithColTypes(types1, vals1); |
| tableNames.add(tableName1); |
| |
| incrementTableNum(); |
| |
| String [] types2 = { "SMALLINT", "VARCHAR(32)", }; |
| String [] vals2 = { "1", "'foo'", }; |
| String tableName2 = getTableName(); |
| createTableWithColTypes(types2, vals2); |
| tableNames.add(tableName2); |
| |
| String query = "SELECT " |
| + tableName1 + "." + getColName(0) + ", " |
| + tableName2 + "." + getColName(1) + " " |
| + "FROM " + tableName1 + " JOIN " + tableName2 + " ON (" |
| + tableName1 + "." + getColName(0) + " = " |
| + tableName2 + "." + getColName(0) + ") WHERE " |
| + tableName1 + "." + getColName(0) + " < 3 AND $CONDITIONS"; |
| |
| runImport(getArgv(tableName1 + "." + getColName(0), query)); |
| |
| Path filePath = new Path(getTablePath(), "part-m-00000"); |
| String expectedVal = "1,foo"; |
| |
| BufferedReader reader = null; |
| if (!isOnPhysicalCluster()) { |
| reader = new BufferedReader( |
| new InputStreamReader(new FileInputStream( |
| new File(filePath.toString())))); |
| } else { |
| FileSystem dfs = FileSystem.get(getConf()); |
| FSDataInputStream dis = dfs.open(filePath); |
| reader = new BufferedReader(new InputStreamReader(dis)); |
| } |
| try { |
| String line = reader.readLine(); |
| assertEquals("QueryResult expected a different string", |
| expectedVal, line); |
| } finally { |
| IOUtils.closeStream(reader); |
| } |
| } |
| } |