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