You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ng...@apache.org on 2021/04/06 15:40:01 UTC

[hive] 17/38: HIVE-24396: refactored code to Abstract class and providers share common code

This is an automated email from the ASF dual-hosted git repository.

ngangam pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git

commit 3de6032b45890d46269d935f1e02d7bdab3f4cd1
Author: Naveen Gangam <ng...@cloudera.com>
AuthorDate: Mon Nov 23 17:59:30 2020 -0500

    HIVE-24396: refactored code to Abstract class and providers share common code
---
 .../JDBCConnectorProviderFactory.java              |  9 ++-
 .../jdbc/AbstractJDBCConnectorProvider.java        | 13 ++--
 .../jdbc/DerbySQLConnectorProvider.java            | 69 ++++++++++++++++++++
 .../dataconnector/jdbc/MySQLConnectorProvider.java | 74 ++++------------------
 .../jdbc/PostgreSQLConnectorProvider.java          | 71 ++++-----------------
 5 files changed, 102 insertions(+), 134 deletions(-)

diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/JDBCConnectorProviderFactory.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/JDBCConnectorProviderFactory.java
index 537fd2c..b1ebfe0 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/JDBCConnectorProviderFactory.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/JDBCConnectorProviderFactory.java
@@ -1,12 +1,11 @@
 package org.apache.hadoop.hive.metastore.dataconnector;
 
 import org.apache.hadoop.hive.metastore.api.DataConnector;
+import org.apache.hadoop.hive.metastore.dataconnector.jdbc.DerbySQLConnectorProvider;
 import org.apache.hadoop.hive.metastore.dataconnector.jdbc.MySQLConnectorProvider;
 import org.apache.hadoop.hive.metastore.dataconnector.jdbc.PostgreSQLConnectorProvider;
 
-import static org.apache.hadoop.hive.metastore.dataconnector.IDataConnectorProvider.MYSQL_TYPE;
-import static org.apache.hadoop.hive.metastore.dataconnector.IDataConnectorProvider.POSTGRES_TYPE;
-
+import static org.apache.hadoop.hive.metastore.dataconnector.IDataConnectorProvider.*;
 
 public class JDBCConnectorProviderFactory {
 
@@ -33,6 +32,10 @@ public class JDBCConnectorProviderFactory {
       provider = new PostgreSQLConnectorProvider(dbName, connector);
       break;
 
+    case DERBY_TYPE:
+      provider = new DerbySQLConnectorProvider(dbName, connector);
+      break;
+
     default:
       throw new RuntimeException("Unsupported JDBC type");
     }
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/AbstractJDBCConnectorProvider.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/AbstractJDBCConnectorProvider.java
index 62a7786..12ce799 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/AbstractJDBCConnectorProvider.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/AbstractJDBCConnectorProvider.java
@@ -1,5 +1,6 @@
 package org.apache.hadoop.hive.metastore.dataconnector.jdbc;
 
+import org.apache.hadoop.hive.metastore.ColumnType;
 import org.apache.hadoop.hive.metastore.Warehouse;
 import org.apache.hadoop.hive.metastore.api.DataConnector;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
@@ -219,16 +220,13 @@ public abstract class AbstractJDBCConnectorProvider extends AbstractDataConnecto
     return rs;
   }
 
-  private String wrapSize(int size) {
+  protected String wrapSize(int size) {
     return "(" + size + ")";
   }
 
-  protected abstract String getDataType(String dbType, int size);
-
-  /*
-  private String getDataType(String mySqlType, int size) {
-    //TODO: Geomentric, network, bit, array data types of postgresql needs to be supported.
-    switch(mySqlType)
+  // subclasses call this first, anything that is not mappable by this code is mapped in the subclass
+  protected String getDataType(String mySqlType, int size) {
+    switch(mySqlType.toLowerCase())
     {
     case "char":
       return ColumnType.CHAR_TYPE_NAME + wrapSize(size);
@@ -288,7 +286,6 @@ public abstract class AbstractJDBCConnectorProvider extends AbstractDataConnecto
       return ColumnType.VOID_TYPE_NAME;
     }
   }
- */
 
   @Override protected String getInputClass() {
     return JDBC_INPUTFORMAT_CLASS;
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/DerbySQLConnectorProvider.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/DerbySQLConnectorProvider.java
new file mode 100644
index 0000000..1cf90bc
--- /dev/null
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/DerbySQLConnectorProvider.java
@@ -0,0 +1,69 @@
+package org.apache.hadoop.hive.metastore.dataconnector.jdbc;
+
+import org.apache.hadoop.hive.metastore.api.DataConnector;
+import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.Table;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+
+public class DerbySQLConnectorProvider extends AbstractJDBCConnectorProvider {
+  private static Logger LOG = LoggerFactory.getLogger(DerbySQLConnectorProvider.class);
+
+  // private static final String DRIVER_CLASS = "org.apache.derby.jdbc.EmbeddedDriver".intern();
+  private static final String DRIVER_CLASS = "org.apache.derby.jdbc.AutoloadedDriver".intern();
+
+  public DerbySQLConnectorProvider(String dbName, DataConnector connector) {
+    super(dbName, connector);
+    driverClassName = DRIVER_CLASS;
+  }
+
+  /**
+   * Returns a list of all table names from the remote database.
+   * @return List A collection of all the table names, null if there are no tables.
+   * @throws IOException To indicate any failures with executing this API
+   */
+  @Override
+  protected ResultSet fetchTableNames() throws MetaException {
+    ResultSet rs = null;
+    try {
+      rs = getConnection().getMetaData().getTables(scoped_db, null, null, new String[] { "TABLE" });
+    } catch (SQLException sqle) {
+      LOG.warn("Could not retrieve table names from remote datasource, cause:" + sqle.getMessage());
+      throw new MetaException("Could not retrieve table names from remote datasource, cause:" + sqle.getMessage());
+    }
+    return rs;
+  }
+
+  /**
+   * Fetch a single table with the given name, returns a Hive Table object from the remote database
+   * @return Table A Table object for the matching table, null otherwise.
+   * @throws MetaException To indicate any failures with executing this API
+   * @param tableName
+   */
+  @Override
+  public ResultSet fetchTableMetadata(String tableName) throws MetaException {
+     return null;
+  }
+
+  /**
+   * Returns Hive Table objects from the remote database for tables that match a name pattern.
+   * @return List A collection of objects that match the name pattern, null otherwise.
+   * @throws MetaException To indicate any failures with executing this API
+   * @param regex
+   */
+  @Override
+  public List<Table> getTables(String regex) throws MetaException {
+    return null;
+  }
+
+  protected String getDataType(String dbDataType, int size) {
+    String mappedType = super.getDataType(dbDataType, size);
+    // map any db specific types here. or return
+    return mappedType;
+  }
+}
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/MySQLConnectorProvider.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/MySQLConnectorProvider.java
index f4f9b62..cb80c4f 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/MySQLConnectorProvider.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/MySQLConnectorProvider.java
@@ -7,7 +7,6 @@ import org.apache.hadoop.hive.metastore.api.Table;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
@@ -26,7 +25,7 @@ public class MySQLConnectorProvider extends AbstractJDBCConnectorProvider {
   /**
    * Returns a list of all table names from the remote database.
    * @return List A collection of all the table names, null if there are no tables.
-   * @throws IOException To indicate any failures with executing this API
+   * @throws MetaException To indicate any failures with executing this API
    */
   @Override protected ResultSet fetchTableNames() throws MetaException {
     ResultSet rs = null;
@@ -46,6 +45,7 @@ public class MySQLConnectorProvider extends AbstractJDBCConnectorProvider {
    * @param regex
    */
   @Override public  List<Table> getTables(String regex) throws MetaException {
+    LOG.info("getTables() not implemented yet");
     return null;
   }
 
@@ -69,70 +69,18 @@ public class MySQLConnectorProvider extends AbstractJDBCConnectorProvider {
     }
   }
 
-  private String wrapSize(int size) {
-    return "(" + size + ")";
-  }
-
   protected String getDataType(String dbDataType, int size) {
-    //TODO: Geomentric, network, bit, array data types of postgresql needs to be supported.
-    switch(dbDataType.toLowerCase())
+    String mappedType = super.getDataType(dbDataType, size);
+    if (!mappedType.equalsIgnoreCase(ColumnType.VOID_TYPE_NAME)) {
+      return mappedType;
+    }
+
+    // map any db specific types here.
+    switch (dbDataType.toLowerCase())
     {
-    case "char":
-      return ColumnType.CHAR_TYPE_NAME + wrapSize(size);
-    case "varchar":
-    case "tinytext":
-      return ColumnType.VARCHAR_TYPE_NAME + wrapSize(size);
-    case "text":
-    case "mediumtext":
-    case "enum":
-    case "set":
-    case "tsvector":
-    case "tsquery":
-    case "uuid":
-    case "json":
-      return ColumnType.STRING_TYPE_NAME;
-    case "blob":
-    case "mediumblob":
-    case "longblob":
-    case "bytea":
-      return ColumnType.BINARY_TYPE_NAME;
-    case "tinyint":
-      return ColumnType.TINYINT_TYPE_NAME;
-    case "smallint":
-    case "smallserial":
-      return ColumnType.SMALLINT_TYPE_NAME;
-    case "mediumint":
-    case "int":
-    case "serial":
-      return ColumnType.INT_TYPE_NAME;
-    case "bigint":
-    case "bigserial":
-    case "money":
-      return ColumnType.BIGINT_TYPE_NAME;
-    case "float":
-    case "real":
-      return ColumnType.FLOAT_TYPE_NAME;
-    case "double":
-    case "double precision":
-      return ColumnType.DOUBLE_TYPE_NAME;
-    case "decimal":
-    case "numeric":
-      return ColumnType.DECIMAL_TYPE_NAME;
-    case "date":
-      return ColumnType.DATE_TYPE_NAME;
-    case "datetime":
-      return ColumnType.DATETIME_TYPE_NAME;
-    case "timestamp":
-    case "time":
-    case "interval":
-      return ColumnType.TIMESTAMP_TYPE_NAME;
-    case "timestampz":
-    case "timez":
-      return ColumnType.TIMESTAMPTZ_TYPE_NAME;
-    case "boolean":
-      return ColumnType.BOOLEAN_TYPE_NAME;
     default:
-      return ColumnType.VOID_TYPE_NAME;
+      mappedType = ColumnType.VOID_TYPE_NAME;
     }
+    return mappedType;
   }
 }
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/PostgreSQLConnectorProvider.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/PostgreSQLConnectorProvider.java
index 41e08e9..1e7c65a 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/PostgreSQLConnectorProvider.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/dataconnector/jdbc/PostgreSQLConnectorProvider.java
@@ -45,72 +45,23 @@ public class PostgreSQLConnectorProvider extends AbstractJDBCConnectorProvider {
     return null;
   }
 
-  private String wrapSize(int size) {
-    return "(" + size + ")";
-  }
-
   protected String getDataType(String dbDataType, int size) {
+    String mappedType = super.getDataType(dbDataType, size);
+    if (!mappedType.equalsIgnoreCase(ColumnType.VOID_TYPE_NAME)) {
+      return mappedType;
+    }
+
+    // map any db specific types here.
     //TODO: Geomentric, network, bit, array data types of postgresql needs to be supported.
-    switch(dbDataType.toLowerCase())
+    switch (dbDataType.toLowerCase())
     {
-    case "char":
     case "bpchar":
-      return ColumnType.CHAR_TYPE_NAME + wrapSize(size);
-    case "varchar":
-    case "tinytext":
-      return ColumnType.VARCHAR_TYPE_NAME + wrapSize(size);
-    case "text":
-    case "mediumtext":
-    case "enum":
-    case "set":
-    case "tsvector":
-    case "tsquery":
-    case "uuid":
-    case "json":
-      return ColumnType.STRING_TYPE_NAME;
-    case "blob":
-    case "mediumblob":
-    case "longblob":
-    case "bytea":
-      return ColumnType.BINARY_TYPE_NAME;
-    case "tinyint":
-      return ColumnType.TINYINT_TYPE_NAME;
-    case "smallint":
-    case "smallserial":
-      return ColumnType.SMALLINT_TYPE_NAME;
-    case "mediumint":
-    case "int":
-    case "serial":
-      return ColumnType.INT_TYPE_NAME;
-    case "bigint":
-    case "bigserial":
+      mappedType = ColumnType.CHAR_TYPE_NAME + wrapSize(size);
     case "int8":
-    case "money":
-      return ColumnType.BIGINT_TYPE_NAME;
-    case "float":
-    case "real":
-      return ColumnType.FLOAT_TYPE_NAME;
-    case "double":
-    case "double precision":
-      return ColumnType.DOUBLE_TYPE_NAME;
-    case "decimal":
-    case "numeric":
-      return ColumnType.DECIMAL_TYPE_NAME;
-    case "date":
-      return ColumnType.DATE_TYPE_NAME;
-    case "datetime":
-      return ColumnType.DATETIME_TYPE_NAME;
-    case "timestamp":
-    case "time":
-    case "interval":
-      return ColumnType.TIMESTAMP_TYPE_NAME;
-    case "timestampz":
-    case "timez":
-      return ColumnType.TIMESTAMPTZ_TYPE_NAME;
-    case "boolean":
-      return ColumnType.BOOLEAN_TYPE_NAME;
+      mappedType = ColumnType.BIGINT_TYPE_NAME;
     default:
-      return ColumnType.VOID_TYPE_NAME;
+      mappedType = ColumnType.VOID_TYPE_NAME;
     }
+    return mappedType;
   }
 }