blob: 23b9813a551acc24b9fc32991b29b0a13ff0b94c [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.lens.server.query;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.ws.rs.core.Application;
import org.apache.lens.api.LensConf;
import org.apache.lens.api.LensSessionHandle;
import org.apache.lens.api.Priority;
import org.apache.lens.api.query.FailedAttempt;
import org.apache.lens.api.query.LensQuery;
import org.apache.lens.api.query.QueryHandle;
import org.apache.lens.api.query.QueryStatus;
import org.apache.lens.driver.hive.EmbeddedThriftConnection;
import org.apache.lens.driver.hive.HiveDriver;
import org.apache.lens.driver.hive.ThriftConnection;
import org.apache.lens.driver.jdbc.JDBCDriver;
import org.apache.lens.driver.jdbc.JDBCResultSet;
import org.apache.lens.server.LensJerseyTest;
import org.apache.lens.server.LensServices;
import org.apache.lens.server.api.LensConfConstants;
import org.apache.lens.server.api.driver.LensDriver;
import org.apache.lens.server.api.driver.MockDriver;
import org.apache.lens.server.api.driver.hooks.DriverQueryHook;
import org.apache.lens.server.api.error.LensException;
import org.apache.lens.server.api.query.*;
import org.apache.lens.server.api.user.MockDriverQueryHook;
import org.apache.hadoop.conf.Configuration;
import org.codehaus.jackson.map.ObjectMapper;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
/**
* The Class TestLensDAO.
*/
@Test(groups = "unit-test")
@Slf4j
public class TestLensDAO extends LensJerseyTest {
@Override
protected Application configure() {
return new TestQueryService.QueryServiceTestApp();
}
/**
* Test lens server dao.
*
* @throws Exception the exception
*/
@Test
public void testLensServerDAO() throws Exception {
QueryExecutionServiceImpl service = LensServices.get().getService(QueryExecutionService.NAME);
String driverQuery = "SELECT aliasName1.Id FROM driverTable1 aliasName1";
String userQuery = "SELECT ID FROM testTable";
// Test insert query
QueryContext queryContext = service.createContext(userQuery, "foo@localhost", new LensConf(),
new Configuration(), 0);
long submissionTime = queryContext.getSubmissionTime();
queryContext.setQueryName("daoTestQuery1");
queryContext.getDriverContext().setSelectedDriver(new MockDriver());
queryContext.getLensConf().addProperty("prop", "value");
LensDriver mockDriver = new MockDriver();
DriverSelectorQueryContext mockDriverContext = new DriverSelectorQueryContext(userQuery,
new Configuration(), Lists.newArrayList(mockDriver), false);
queryContext.setDriverContext(mockDriverContext);
queryContext.getDriverContext().setSelectedDriver(mockDriver);
// Add a query for the selected driver
queryContext.getDriverContext().setDriverQuery(mockDriver, driverQuery);
Assert.assertEquals(queryContext.getDriverContext().getSelectedDriverQuery(), driverQuery);
FinishedLensQuery finishedLensQuery = new FinishedLensQuery(queryContext);
finishedLensQuery.setStatus(QueryStatus.Status.SUCCESSFUL.name());
finishedLensQuery.setPriority(Priority.NORMAL.toString());
finishedLensQuery.setFailedAttempts(Lists.newArrayList(
new FailedAttempt("driver1", 1.0, "progress full", "no error", 0L, 1L),
new FailedAttempt("driver2", 1.0, "progress also full", "no error at all", 2L, 3L)
));
// Validate JDBC driver RS Meta can be deserialized
// Create a valid JDBCResultSet
Connection conn = null;
Statement stmt = null;
final ObjectMapper MAPPER = new ObjectMapper();
try {
conn = service.lensServerDao.getConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT handle FROM finished_queries");
JDBCResultSet jdbcResultSet = new JDBCResultSet(null, rs, false);
JDBCResultSet.JDBCResultSetMetadata jdbcRsMeta =
(JDBCResultSet.JDBCResultSetMetadata) jdbcResultSet.getMetadata();
String jsonMetadata = MAPPER.writeValueAsString(jdbcRsMeta);
log.info("@@@JSON {}" + jsonMetadata);
finishedLensQuery.setMetadata(MAPPER.writeValueAsString(jdbcRsMeta));
} catch (SQLException ex) {
log.error("Error creating result set ", ex);
} finally {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
String finishedHandle = finishedLensQuery.getHandle();
service.lensServerDao.insertFinishedQuery(finishedLensQuery);
// Re-insert should be a no-op on the db.
service.lensServerDao.insertFinishedQuery(finishedLensQuery);
FinishedLensQuery actual = service.lensServerDao.getQuery(finishedHandle);
Assert.assertEquals(finishedLensQuery, actual);
Assert.assertEquals(actual.getConf().getProperty("prop"), "value");
// Try to read back result set metadata class, should not throw deserialize exception
JDBCResultSet.JDBCResultSetMetadata actualRsMeta = MAPPER.readValue(actual.getMetadata(),
JDBCResultSet.JDBCResultSetMetadata.class);
// Assert
Assert.assertNotNull(actualRsMeta, "Should be able to read back metadata for jdbc queries");
// Validate metadata
Assert.assertEquals(actualRsMeta.getColumns().size(), 1);
Assert.assertEquals(actualRsMeta.getColumns().get(0).getName().toLowerCase(), "handle");
Assert.assertEquals(actual.getHandle(), finishedHandle);
Assert.assertEquals(Priority.valueOf(actual.getPriority()), Priority.NORMAL);
Assert.assertEquals(actual.getDriverQuery(), driverQuery);
// when driver list contains the selected driver, selected driver should get set correctly in context
QueryContext retrievedQueryContext = actual.toQueryContext(new Configuration(),
Lists.newArrayList(mockDriver));
Assert.assertEquals(retrievedQueryContext.getSelectedDriverQuery(), driverQuery);
// Test find finished queries
LensSessionHandle session = service.openSession("foo@localhost", "bar", new HashMap<String, String>());
List<QueryHandle> persistedHandles = service.lensServerDao.findFinishedQueries(null, null, null, null,
submissionTime, System.currentTimeMillis());
if (persistedHandles != null) {
for (QueryHandle handle : persistedHandles) {
LensQuery query = service.getQuery(session, handle);
if (!handle.getHandleId().toString().equals(finishedHandle)) {
Assert.assertTrue(query.getStatus().finished(), query.getQueryHandle() + " STATUS="
+ query.getStatus().getStatus());
}
}
}
System.out.println("@@ State = " + queryContext.getStatus().getStatus().name());
List<QueryHandle> daoTestQueryHandles = service.lensServerDao.findFinishedQueries(
Lists.newArrayList(QueryStatus.Status.valueOf(finishedLensQuery.getStatus())), queryContext.getSubmittedUser(),
queryContext.getSelectedDriver().getFullyQualifiedName(), "daotestquery1", -1L, Long.MAX_VALUE);
Assert.assertEquals(daoTestQueryHandles.size(), 1);
Assert.assertEquals(daoTestQueryHandles.get(0).getHandleId().toString(), finishedHandle);
service.lensServerDao.insertActiveQuery(queryContext);
QueryContext actualQueryContext = service.lensServerDao.findActiveQueryDetails(queryContext.getQueryHandle());
Assert.assertEquals(actualQueryContext.getQueryHandle().toString(), queryContext.getQueryHandle().toString());
QueryContext invalidQueryContext = service.createContext("SELECT ID FROM testTable1",
"foo@localhost", new LensConf(),
new Configuration(), 0);
try {
QueryContext actualInvalidQueryContext =
service.lensServerDao.findActiveQueryDetails(invalidQueryContext.getQueryHandle());
} catch (LensException le) {
// expected to throw LensException
}
boolean actualInvalidDeleteQuery = service.lensServerDao.deleteActiveQuery(invalidQueryContext);
Assert.assertNotEquals(actualInvalidDeleteQuery, true);
service.lensServerDao.insertActiveSession(service.getSession(session).getLensSessionPersistInfo());
LensSessionHandle invalidSession = service.openSession("foo@localhost", "bar",
new HashMap<String, String>());
boolean actualActiveSessionDeleted = service.lensServerDao.deleteActiveSession(session);
Assert.assertEquals(actualActiveSessionDeleted, false);
boolean invalidActualActiveSessionDeleted = service.lensServerDao.deleteActiveSession(invalidSession);
Assert.assertEquals(invalidActualActiveSessionDeleted, false);
service.closeSession(session);
}
public void testPreparedQueryDAO() throws Exception {
QueryExecutionServiceImpl service = LensServices.get().getService(QueryExecutionService.NAME);
Connection conn = null;
Statement stmt = null;
final ObjectMapper MAPPER = new ObjectMapper();
try {
conn = service.lensServerDao.getConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT handle FROM finished_queries");
JDBCResultSet jdbcResultSet = new JDBCResultSet(null, rs, false);
JDBCResultSet.JDBCResultSetMetadata jdbcRsMeta =
(JDBCResultSet.JDBCResultSetMetadata) jdbcResultSet.getMetadata();
String jsonMetadata = MAPPER.writeValueAsString(jdbcRsMeta);
log.info("@@@JSON {}" + jsonMetadata);
} catch (SQLException ex) {
log.error("Error creating result set ", ex);
} finally {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
service.lensServerDao.createPreparedQueriesTable();
Configuration driverConf = new Configuration();
try {
PreparedQueryContext preparedQueryContext = new PreparedQueryContext("query", "user1", driverConf,
createDriver(driverConf));
preparedQueryContext.setPrepareEndTime(new Date());
service.lensServerDao.insertPreparedQuery(preparedQueryContext);
} catch (Exception e) {
Assert.fail("it shouldn't be coming in this catch block");
}
}
protected Collection<LensDriver> createDriver(Configuration driverConf) throws LensException {
driverConf.addResource("drivers/jdbc/jdbc1/jdbcdriver-site.xml");
driverConf.setClass(HiveDriver.HIVE_CONNECTION_CLASS, EmbeddedThriftConnection.class, ThriftConnection.class);
driverConf.setClass(LensConfConstants.DRIVER_HOOK_CLASSES_SFX, MockDriverQueryHook.class, DriverQueryHook.class);
driverConf.set("hive.lock.manager", "org.apache.hadoop.hive.ql.lockmgr.EmbeddedLockManager");
driverConf.setBoolean(HiveDriver.HS2_CALCULATE_PRIORITY, true);
JDBCDriver driver = new JDBCDriver();
driver.configure(driverConf, "jdbc", "jdbc1");
Collection<LensDriver> drivers = Lists.<LensDriver>newArrayList(driver);
System.out.println("TestJDBCDriver created");
return drivers;
}
}