You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by am...@apache.org on 2015/03/04 18:01:46 UTC
incubator-lens git commit: LENS-308 : Fixes serialization and
deserialization of JDBC resultset metadata (Jaideep Dhok via amareshwari)
Repository: incubator-lens
Updated Branches:
refs/heads/master f28b1e498 -> 1b0e5846b
LENS-308 : Fixes serialization and deserialization of JDBC resultset metadata (Jaideep Dhok via amareshwari)
Project: http://git-wip-us.apache.org/repos/asf/incubator-lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-lens/commit/1b0e5846
Tree: http://git-wip-us.apache.org/repos/asf/incubator-lens/tree/1b0e5846
Diff: http://git-wip-us.apache.org/repos/asf/incubator-lens/diff/1b0e5846
Branch: refs/heads/master
Commit: 1b0e5846b6227cf2dbeb46e4c8e09eae328fc4ff
Parents: f28b1e4
Author: Jaideep Dhok <jd...@apache.org>
Authored: Wed Mar 4 22:31:29 2015 +0530
Committer: Amareshwari Sriramadasu <am...@apache.org>
Committed: Wed Mar 4 22:31:29 2015 +0530
----------------------------------------------------------------------
.../apache/lens/driver/jdbc/JDBCResultSet.java | 80 +++++++++++++++-----
.../apache/lens/server/query/TestLensDAO.java | 52 +++++++++++++
2 files changed, 115 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/1b0e5846/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCResultSet.java
----------------------------------------------------------------------
diff --git a/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCResultSet.java b/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCResultSet.java
index 5cf282e..eefc4e1 100644
--- a/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCResultSet.java
+++ b/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCResultSet.java
@@ -40,6 +40,10 @@ import org.apache.hive.service.cli.TypeDescriptor;
import org.apache.hive.service.cli.TypeQualifiers;
import org.apache.log4j.Logger;
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+import lombok.*;
+
/**
* The Class JDBCResultSet.
*/
@@ -101,29 +105,71 @@ public class JDBCResultSet extends InMemoryResultSet {
@Override
public synchronized LensResultSetMetadata getMetadata() throws LensException {
if (lensResultMeta == null) {
- lensResultMeta = new LensResultSetMetadata() {
- @Override
- public List<ColumnDescriptor> getColumns() {
- try {
- ResultSetMetaData rsmeta = getRsMetadata();
- List<ColumnDescriptor> columns = new ArrayList<ColumnDescriptor>(rsmeta.getColumnCount());
- for (int i = 1; i <= rsmeta.getColumnCount(); i++) {
- FieldSchema col = new FieldSchema(rsmeta.getColumnName(i), TypeInfoUtils.getTypeInfoFromTypeString(
- getHiveTypeForSQLType(i, rsmeta)).getTypeName(), rsmeta.getColumnTypeName(i));
- columns.add(new ColumnDescriptor(col, i));
- }
- return columns;
- } catch (Exception e) {
- LOG.error("Error getting JDBC type information: " + e.getMessage(), e);
- return null;
- }
+ JDBCResultSetMetadata jdbcResultSetMetadata = new JDBCResultSetMetadata();
+ jdbcResultSetMetadata.setFieldSchemas(new ArrayList<FieldSchemaData>());
+ try {
+ ResultSetMetaData rsmeta = getRsMetadata();
+
+ for (int i = 1; i <= rsmeta.getColumnCount(); i++) {
+ FieldSchemaData col = new FieldSchemaData(rsmeta.getColumnName(i),
+ TypeInfoUtils.getTypeInfoFromTypeString(getHiveTypeForSQLType(i, rsmeta)).getTypeName(),
+ rsmeta.getColumnTypeName(i));
+ jdbcResultSetMetadata.getFieldSchemas().add(col);
}
- };
+ } catch (Exception e) {
+ LOG.error("Error getting JDBC type information: " + e.getMessage(), e);
+ jdbcResultSetMetadata.setFieldSchemas(null);
+ }
+ lensResultMeta = jdbcResultSetMetadata;
}
return lensResultMeta;
}
/**
+ * FieldSchemaData is created so that we don't save FieldSchema as some classes used by it don't have
+ * default constructors which are required by jackson
+ */
+ @Data
+ @NoArgsConstructor
+ public static class FieldSchemaData {
+ private String name;
+ private String type;
+ private String comment;
+
+ public FieldSchemaData(String name, String type, String comment) {
+ this.name = name;
+ this.type = type;
+ this.comment = comment;
+ }
+
+ public FieldSchema toFieldSchema() {
+ return new FieldSchema(name, type, comment);
+ }
+ }
+
+ /**
+ * Result set metadata of a JDBC query
+ */
+ public static class JDBCResultSetMetadata extends LensResultSetMetadata {
+ @Getter @Setter
+ private List<FieldSchemaData> fieldSchemas;
+
+ @JsonIgnore
+ @Override
+ public List<ColumnDescriptor> getColumns() {
+ if (fieldSchemas == null) {
+ return null;
+ }
+ List<ColumnDescriptor> columns = new ArrayList<ColumnDescriptor>(fieldSchemas.size());
+
+ for (int i = 0; i < fieldSchemas.size(); i++) {
+ columns.add(new ColumnDescriptor(fieldSchemas.get(i).toFieldSchema(), i + 1));
+ }
+ return columns;
+ }
+ }
+
+ /**
* Gets the hive type for sql type.
*
* @param index the index
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/1b0e5846/lens-server/src/test/java/org/apache/lens/server/query/TestLensDAO.java
----------------------------------------------------------------------
diff --git a/lens-server/src/test/java/org/apache/lens/server/query/TestLensDAO.java b/lens-server/src/test/java/org/apache/lens/server/query/TestLensDAO.java
index 89c4084..f0358cb 100644
--- a/lens-server/src/test/java/org/apache/lens/server/query/TestLensDAO.java
+++ b/lens-server/src/test/java/org/apache/lens/server/query/TestLensDAO.java
@@ -18,6 +18,10 @@
*/
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.HashMap;
import java.util.List;
@@ -28,6 +32,7 @@ import org.apache.lens.api.LensSessionHandle;
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.jdbc.JDBCResultSet;
import org.apache.lens.server.LensJerseyTest;
import org.apache.lens.server.LensServices;
import org.apache.lens.server.api.query.FinishedLensQuery;
@@ -35,6 +40,7 @@ import org.apache.lens.server.api.query.QueryContext;
import org.apache.hadoop.conf.Configuration;
+import org.codehaus.jackson.map.ObjectMapper;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -60,11 +66,57 @@ public class TestLensDAO extends LensJerseyTest {
queryContext.setQueryName("daoTestQuery1");
FinishedLensQuery finishedLensQuery = new FinishedLensQuery(queryContext);
finishedLensQuery.setStatus(QueryStatus.Status.SUCCESSFUL.name());
+
+ // 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 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));
+ finishedLensQuery.setMetadataClass(JDBCResultSet.JDBCResultSetMetadata.class.getName());
+ } 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);
+
+ // 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 metadat
+ Assert.assertEquals(actualRsMeta.getColumns().size(), 1);
+ Assert.assertEquals(actualRsMeta.getColumns().get(0).getName().toLowerCase(), "handle");
+
Assert.assertEquals(actual.getHandle(), finishedHandle);
// Test find finished queries