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 <ngan...@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; } }