/** * 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.lens.driver.jdbc; import static org.testng.Assert.*; import java.sql.Connection; import java.sql.Statement; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.lens.api.LensConf; import org.apache.lens.api.query.ResultRow; import org.apache.lens.server.api.driver.InMemoryResultSet; import org.apache.lens.server.api.driver.LensDriver; import org.apache.lens.server.api.driver.LensResultSet; import org.apache.lens.server.api.driver.LensResultSetMetadata; import org.apache.lens.server.api.query.QueryContext; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.ql.session.SessionState; import org.apache.hive.service.cli.ColumnDescriptor; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; /** * The Class TestJDBCFinal. */ public class TestJDBCFinal { /** The base conf. */ Configuration baseConf; /** The driver. */ JDBCDriver driver; /** * Collection of drivers */ Collection<LensDriver> drivers; /** * Test create jdbc driver. * * @throws Exception the exception */ @BeforeTest public void testCreateJdbcDriver() throws Exception { baseConf = new Configuration(); baseConf.set(JDBCDriverConfConstants.JDBC_DRIVER_CLASS, "org.hsqldb.jdbc.JDBCDriver"); baseConf.set(JDBCDriverConfConstants.JDBC_DB_URI, "jdbc:hsqldb:mem:jdbcTestDB;MODE=MYSQL"); baseConf.set(JDBCDriverConfConstants.JDBC_USER, "sa"); baseConf.set(JDBCDriverConfConstants.JDBC_PASSWORD, ""); baseConf.set(JDBCDriverConfConstants.JDBC_QUERY_REWRITER_CLASS, ColumnarSQLRewriter.class.getName()); baseConf.set(JDBCDriverConfConstants.JDBC_EXPLAIN_KEYWORD_PARAM, "explain plan for "); driver = new JDBCDriver(); driver.configure(baseConf, "jdbc", "jdbc1"); assertNotNull(driver); assertTrue(driver.configured); System.out.println("Driver configured!"); SessionState.start(new HiveConf(ColumnarSQLRewriter.class)); drivers = new ArrayList<LensDriver>() { { add(driver); } }; } /** * Close. * * @throws Exception the exception */ @AfterTest public void close() throws Exception { driver.close(); System.out.println("Driver closed!"); } // create table and insert data /** * Creates the tables. * * @throws Exception the exception */ synchronized void createTables() throws Exception { Connection conn = null; Statement stmt = null; String createFact = "create table sales_fact (time_key integer, item_key integer, branch_key integer, " + "location_key integer, dollars_sold double, units_sold integer)"; String createDim1 = "create table time_dim ( time_key integer, day date, day_of_week integer, " + "month integer, quarter integer, year integer )"; String createDim2 = "create table item_dim ( item_key integer, item_name varchar(500))"; String createDim3 = "create table branch_dim ( branch_key integer, branch_name varchar(100))"; String createDim4 = "create table location_dim (location_key integer,location_name varchar(100))"; String insertFact = "insert into sales_fact values " + "(1001,234,119,223,3000.58,56), (1002,235,120,224,3456.26,62), (1003,236,121,225,6745.23,97)," + "(1004,237,122,226,8753.49,106)"; String insertDim1 = "insert into time_dim values " + "(1001,'1900-01-01',1,1,1,1900),(1002,'1900-01-02',2,1,1,1900),(1003,'1900-01-03',3,1,1,1900)," + "(1004,'1900-01-04',4,1,1,1900)"; String insertDim2 = "insert into item_dim values " + "(234,'item1'),(235,'item2'),(236,'item3'),(237,'item4')"; String insertDim3 = "insert into branch_dim values " + "(119,'branch1'),(120,'branch2'),(121,'branch3'),(122,'branch4') "; String insertDim4 = "insert into location_dim values " + "(223,'loc1'),(224,'loc2'),(225,'loc4'),(226,'loc4')"; try { conn = driver.getConnection(); stmt = conn.createStatement(); // stmt.execute(dropTables); stmt.execute(createFact); stmt.execute(createDim1); stmt.execute(createDim2); stmt.execute(createDim3); stmt.execute(createDim4); stmt.execute(insertFact); stmt.execute(insertDim1); stmt.execute(insertDim2); stmt.execute(insertDim3); stmt.execute(insertDim4); } finally { if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } } /** * Creates the schema. * * @throws Exception the exception */ @Test public void createSchema() throws Exception { createTables(); } /** * Test execute1. * * @throws Exception the exception */ @Test public void testExecute1() throws Exception { testCreateJdbcDriver(); final String query = "select fact.time_key,time_dim.day_of_week,time_dim.day," + "sum(fact.dollars_sold) " + "from sales_fact fact " + "inner join time_dim time_dim on fact.time_key = time_dim.time_key " + "where time_dim.day between '1900-01-01' and '1900-01-03' " + "group by fact.time_key,time_dim.day_of_week,time_dim.day " + "order by fact.time_key desc"; QueryContext context = new QueryContext(query, "SA", new LensConf(), baseConf, drivers); LensResultSet resultSet = driver.execute(context); assertNotNull(resultSet); if (resultSet instanceof InMemoryResultSet) { InMemoryResultSet rs = (InMemoryResultSet) resultSet; LensResultSetMetadata rsMeta = rs.getMetadata(); assertEquals(rsMeta.getColumns().size(), 4); ColumnDescriptor col1 = rsMeta.getColumns().get(0); assertEquals(col1.getTypeName().toLowerCase(), "int"); assertEquals(col1.getName(), "time_key".toUpperCase()); ColumnDescriptor col2 = rsMeta.getColumns().get(1); assertEquals(col2.getTypeName().toLowerCase(), "int"); assertEquals(col2.getName(), "day_of_week".toUpperCase()); ColumnDescriptor col3 = rsMeta.getColumns().get(2); assertEquals(col3.getTypeName().toLowerCase(), "date"); assertEquals(col3.getName(), "day".toUpperCase()); ColumnDescriptor col4 = rsMeta.getColumns().get(3); assertEquals(col4.getTypeName().toLowerCase(), "double"); assertEquals(col4.getName(), "c4".toUpperCase()); while (rs.hasNext()) { ResultRow row = rs.next(); List<Object> rowObjects = row.getValues(); System.out.println(rowObjects); } if (rs instanceof JDBCResultSet) { ((JDBCResultSet) rs).close(); } } } /** * Test execute2. * * @throws Exception the exception */ @Test public void testExecute2() throws Exception { testCreateJdbcDriver(); final String query = "select fact.time_key,time_dim.day_of_week,time_dim.day, " + "sum(fact.dollars_sold) " + "from sales_fact fact " + "inner join time_dim time_dim on fact.time_key = time_dim.time_key " + "inner join item_dim item_dim on fact.item_key = item_dim.item_key and item_dim.item_name = 'item2' " + "inner join branch_dim branch_dim on fact.branch_key = branch_dim.branch_key " + "and branch_dim.branch_name = 'branch2' " + "inner join location_dim location_dim on fact.location_key = location_dim.location_key " + "where time_dim.day between '1900-01-01' and '1900-01-04' " + "and location_dim.location_name = 'loc2' " + "group by fact.time_key,time_dim.day_of_week,time_dim.day " + "order by fact.time_key desc "; QueryContext context = new QueryContext(query, "SA", new LensConf(), baseConf, drivers); LensResultSet resultSet = driver.execute(context); assertNotNull(resultSet); if (resultSet instanceof InMemoryResultSet) { InMemoryResultSet rs = (InMemoryResultSet) resultSet; LensResultSetMetadata rsMeta = rs.getMetadata(); assertEquals(rsMeta.getColumns().size(), 4); ColumnDescriptor col1 = rsMeta.getColumns().get(0); assertEquals(col1.getTypeName().toLowerCase(), "int"); assertEquals(col1.getName(), "time_key".toUpperCase()); ColumnDescriptor col2 = rsMeta.getColumns().get(1); assertEquals(col2.getTypeName().toLowerCase(), "int"); assertEquals(col2.getName(), "day_of_week".toUpperCase()); ColumnDescriptor col3 = rsMeta.getColumns().get(2); assertEquals(col3.getTypeName().toLowerCase(), "date"); assertEquals(col3.getName(), "day".toUpperCase()); ColumnDescriptor col4 = rsMeta.getColumns().get(3); assertEquals(col4.getTypeName().toLowerCase(), "double"); assertEquals(col4.getName(), "c4".toUpperCase()); while (rs.hasNext()) { ResultRow row = rs.next(); List<Object> rowObjects = row.getValues(); System.out.println(rowObjects); } if (rs instanceof JDBCResultSet) { ((JDBCResultSet) rs).close(); } } } }