This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 55a2123ed5f Refactor data type load (#19642)
55a2123ed5f is described below
commit 55a2123ed5ff9516ea29b204514e675a170ecc9c
Author: Chuxin Chen <[email protected]>
AuthorDate: Thu Jul 28 16:50:31 2022 +0800
Refactor data type load (#19642)
* refactor data type load
* Update DataTypeLoaderFixture.java
---
...TypeLoader.java => AbstractDataTypeLoader.java} | 12 +++----
...aTypeLoader.java => DefaultDataTypeLoader.java} | 32 +++++++++----------
.../loader/dialect/H2SchemaMetaDataLoader.java | 5 +--
.../loader/dialect/MySQLSchemaMetaDataLoader.java | 18 ++---------
.../dialect/OpenGaussSchemaMetaDataLoader.java | 4 +--
.../loader/dialect/OracleSchemaMetaDataLoader.java | 11 ++-----
.../dialect/PostgreSQLSchemaMetaDataLoader.java | 4 +--
.../dialect/SQLServerSchemaMetaDataLoader.java | 5 +--
.../datatypeloader/MySQLDataTypeLoader.java} | 37 ++++++++++++----------
.../datatypeloader/OracleDataTypeLoader.java} | 30 ++++++++----------
.../loader/{common => spi}/DataTypeLoader.java | 25 +++++----------
.../DataTypeLoaderFactory.java} | 37 ++++++++++------------
...adata.database.schema.loader.spi.DataTypeLoader | 20 ++++++++++++
.../schema/loader/common/DataTypeLoaderTest.java | 4 ++-
.../loader/dialect/DataTypeLoaderFixture.java} | 29 +++++++----------
...adata.database.schema.loader.spi.DataTypeLoader | 18 +++++++++++
16 files changed, 148 insertions(+), 143 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/AbstractDataTypeLoader.java
similarity index 83%
copy from
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/AbstractDataTypeLoader.java
index 323996c8825..cc70ac04ff5 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/AbstractDataTypeLoader.java
@@ -17,8 +17,7 @@
package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
@@ -27,19 +26,18 @@ import java.util.Map;
import java.util.TreeMap;
/**
- * Data type loader.
+ * Abstract data type loader.
*/
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public abstract class AbstractDataTypeLoader implements DataTypeLoader {
/**
* Load data type.
- *
+ *
* @param database database
* @return data type map
* @throws SQLException SQL exception
*/
- public static Map<String, Integer> load(final DatabaseMetaData database)
throws SQLException {
+ public Map<String, Integer> load(final DatabaseMetaData database) throws
SQLException {
Map<String, Integer> result = new
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
try (ResultSet resultSet = database.getTypeInfo()) {
while (resultSet.next()) {
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DefaultDataTypeLoader.java
similarity index 63%
copy from
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DefaultDataTypeLoader.java
index 323996c8825..cb19ea2027f 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DefaultDataTypeLoader.java
@@ -17,35 +17,33 @@
package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-
import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
-import java.util.TreeMap;
/**
- * Data type loader.
+ * Default data type loader.
*/
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public final class DefaultDataTypeLoader extends AbstractDataTypeLoader {
/**
* Load data type.
- *
+ *
* @param database database
* @return data type map
* @throws SQLException SQL exception
*/
- public static Map<String, Integer> load(final DatabaseMetaData database)
throws SQLException {
- Map<String, Integer> result = new
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
- try (ResultSet resultSet = database.getTypeInfo()) {
- while (resultSet.next()) {
- result.put(resultSet.getString("TYPE_NAME"),
resultSet.getInt("DATA_TYPE"));
- }
- }
- return result;
+ public Map<String, Integer> load(final DatabaseMetaData database) throws
SQLException {
+ return super.load(database);
+ }
+
+ @Override
+ public String getType() {
+ return "Default";
+ }
+
+ @Override
+ public boolean isDefault() {
+ return true;
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/H2SchemaMetaDataLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/H2SchemaMetaDataLoader.java
index 60eb35221ce..205806fa5db 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/H2SchemaMetaDataLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/H2SchemaMetaDataLoader.java
@@ -17,11 +17,12 @@
package
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
-import
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
import javax.sql.DataSource;
@@ -80,7 +81,7 @@ public final class H2SchemaMetaDataLoader implements
DialectSchemaMetaDataLoader
private Map<String, Collection<ColumnMetaData>>
loadColumnMetaDataMap(final Connection connection, final Collection<String>
tables) throws SQLException {
Map<String, Collection<ColumnMetaData>> result = new HashMap<>();
try (PreparedStatement preparedStatement =
connection.prepareStatement(getTableMetaDataSQL(tables))) {
- Map<String, Integer> dataTypes =
DataTypeLoader.load(connection.getMetaData());
+ Map<String, Integer> dataTypes =
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("H2")).load(connection.getMetaData());
Map<String, Collection<String>> tablePrimaryKeys =
loadTablePrimaryKeys(connection, tables);
Map<String, Map<String, Boolean>> tableGenerated =
loadTableGenerated(connection, tables);
preparedStatement.setString(1, connection.getCatalog());
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/MySQLSchemaMetaDataLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/MySQLSchemaMetaDataLoader.java
index fda6f27e3d2..6a65a2a2a02 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/MySQLSchemaMetaDataLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/MySQLSchemaMetaDataLoader.java
@@ -17,13 +17,14 @@
package
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
import
org.apache.shardingsphere.infra.datasource.registry.GlobalDataSourceRegistry;
-import
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ConstraintMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
import javax.sql.DataSource;
@@ -31,7 +32,6 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.sql.Types;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -103,8 +103,7 @@ public final class MySQLSchemaMetaDataLoader implements
DialectSchemaMetaDataLoa
try (
Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement =
connection.prepareStatement(getTableMetaDataSQL(tables))) {
- Map<String, Integer> dataTypes =
DataTypeLoader.load(connection.getMetaData());
- appendDataTypes(dataTypes);
+ Map<String, Integer> dataTypes =
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("MySQL")).load(connection.getMetaData());
String databaseName = "".equals(connection.getCatalog()) ?
GlobalDataSourceRegistry.getInstance().getCachedDatabaseTables().get(tables.iterator().next())
: connection.getCatalog();
preparedStatement.setString(1, databaseName);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
@@ -121,17 +120,6 @@ public final class MySQLSchemaMetaDataLoader implements
DialectSchemaMetaDataLoa
return result;
}
- private void appendDataTypes(final Map<String, Integer> dataTypes) {
- dataTypes.putIfAbsent("JSON", Types.LONGVARCHAR);
- dataTypes.putIfAbsent("GEOMETRY", Types.BINARY);
- dataTypes.putIfAbsent("YEAR", Types.DATE);
- dataTypes.putIfAbsent("POINT", Types.BINARY);
- dataTypes.putIfAbsent("MULTIPOINT", Types.BINARY);
- dataTypes.putIfAbsent("POLYGON", Types.BINARY);
- dataTypes.putIfAbsent("MULTIPOLYGON", Types.BINARY);
- dataTypes.putIfAbsent("MULTILINESTRING", Types.BINARY);
- }
-
private ColumnMetaData loadColumnMetaData(final Map<String, Integer>
dataTypeMap, final ResultSet resultSet) throws SQLException {
String columnName = resultSet.getString("COLUMN_NAME");
String dataType = resultSet.getString("DATA_TYPE");
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OpenGaussSchemaMetaDataLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OpenGaussSchemaMetaDataLoader.java
index cfaa119f74a..fb00aabb9cc 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OpenGaussSchemaMetaDataLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OpenGaussSchemaMetaDataLoader.java
@@ -20,11 +20,11 @@ package
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
-import
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
import javax.sql.DataSource;
@@ -87,7 +87,7 @@ public final class OpenGaussSchemaMetaDataLoader implements
DialectSchemaMetaDat
final Collection<String> schemaNames) throws SQLException {
Map<String, Multimap<String, ColumnMetaData>> result = new
LinkedHashMap<>();
try (Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement =
connection.prepareStatement(getColumnMetaDataSQL(schemaNames, tables))) {
- Map<String, Integer> dataTypes =
DataTypeLoader.load(connection.getMetaData());
+ Map<String, Integer> dataTypes =
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("openGauss")).load(connection.getMetaData());
Set<String> primaryKeys = loadPrimaryKeys(connection, schemaNames);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
index 920825bfe80..17a6bc399f1 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
@@ -18,11 +18,12 @@
package
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
import com.google.common.collect.Lists;
-import
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
import javax.sql.DataSource;
@@ -31,7 +32,6 @@ import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -90,8 +90,7 @@ public final class OracleSchemaMetaDataLoader implements
DialectSchemaMetaDataLo
private Map<String, Collection<ColumnMetaData>>
loadColumnMetaDataMap(final Connection connection, final Collection<String>
tables) throws SQLException {
Map<String, Collection<ColumnMetaData>> result = new
HashMap<>(tables.size(), 1);
try (PreparedStatement preparedStatement =
connection.prepareStatement(getTableMetaDataSQL(tables,
connection.getMetaData()))) {
- Map<String, Integer> dataTypes =
DataTypeLoader.load(connection.getMetaData());
- appendNumberDataType(dataTypes);
+ Map<String, Integer> dataTypes =
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("Oracle")).load(connection.getMetaData());
Map<String, Collection<String>> tablePrimaryKeys =
loadTablePrimaryKeys(connection, tables);
preparedStatement.setString(1, connection.getSchema());
try (ResultSet resultSet = preparedStatement.executeQuery()) {
@@ -108,10 +107,6 @@ public final class OracleSchemaMetaDataLoader implements
DialectSchemaMetaDataLo
return result;
}
- private void appendNumberDataType(final Map<String, Integer> dataTypes) {
- dataTypes.put("NUMBER", Types.NUMERIC);
- }
-
private ColumnMetaData loadColumnMetaData(final Map<String, Integer>
dataTypeMap, final ResultSet resultSet, final Collection<String> primaryKeys,
final DatabaseMetaData
databaseMetaData) throws SQLException {
String columnName = resultSet.getString("COLUMN_NAME");
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java
index 210b753c01d..1b9150deb81 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java
@@ -20,11 +20,11 @@ package
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
-import
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
import javax.sql.DataSource;
@@ -92,7 +92,7 @@ public final class PostgreSQLSchemaMetaDataLoader implements
DialectSchemaMetaDa
Map<String, Multimap<String, ColumnMetaData>> result = new
LinkedHashMap<>();
Collection<String> roleTableGrants = loadRoleTableGrants(dataSource,
tables);
try (Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement =
connection.prepareStatement(getColumnMetaDataSQL(schemaNames, tables))) {
- Map<String, Integer> dataTypes =
DataTypeLoader.load(connection.getMetaData());
+ Map<String, Integer> dataTypes =
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("PostgreSQL")).load(connection.getMetaData());
Set<String> primaryKeys = loadPrimaryKeys(connection, schemaNames);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
index 8203c9dccdc..e6d1e86a342 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
@@ -17,11 +17,12 @@
package
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
-import
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
import javax.sql.DataSource;
@@ -76,7 +77,7 @@ public final class SQLServerSchemaMetaDataLoader implements
DialectSchemaMetaDat
try (
Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement =
connection.prepareStatement(getTableMetaDataSQL(tables))) {
- Map<String, Integer> dataTypes =
DataTypeLoader.load(connection.getMetaData());
+ Map<String, Integer> dataTypes =
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("SQLServer")).load(connection.getMetaData());
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
String tableName = resultSet.getString("TABLE_NAME");
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/MySQLDataTypeLoader.java
similarity index 55%
copy from
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/MySQLDataTypeLoader.java
index 323996c8825..43cfc9562de 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/MySQLDataTypeLoader.java
@@ -15,37 +15,42 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+package
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect.datatypeloader;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.AbstractDataTypeLoader;
import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Types;
import java.util.Map;
-import java.util.TreeMap;
/**
- * Data type loader.
+ * MySQL data type loader.
*/
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public final class MySQLDataTypeLoader extends AbstractDataTypeLoader {
/**
* Load data type.
- *
+ *
* @param database database
* @return data type map
* @throws SQLException SQL exception
*/
- public static Map<String, Integer> load(final DatabaseMetaData database)
throws SQLException {
- Map<String, Integer> result = new
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
- try (ResultSet resultSet = database.getTypeInfo()) {
- while (resultSet.next()) {
- result.put(resultSet.getString("TYPE_NAME"),
resultSet.getInt("DATA_TYPE"));
- }
- }
+ public Map<String, Integer> load(final DatabaseMetaData database) throws
SQLException {
+ Map<String, Integer> result = super.load(database);
+ result.putIfAbsent("JSON", Types.LONGVARCHAR);
+ result.putIfAbsent("GEOMETRY", Types.BINARY);
+ result.putIfAbsent("YEAR", Types.DATE);
+ result.putIfAbsent("POINT", Types.BINARY);
+ result.putIfAbsent("MULTIPOINT", Types.BINARY);
+ result.putIfAbsent("POLYGON", Types.BINARY);
+ result.putIfAbsent("MULTIPOLYGON", Types.BINARY);
+ result.putIfAbsent("MULTILINESTRING", Types.BINARY);
return result;
}
+
+ @Override
+ public String getType() {
+ return "MySQL";
+ }
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/OracleDataTypeLoader.java
similarity index 63%
copy from
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/OracleDataTypeLoader.java
index 323996c8825..0c071ad6919 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/OracleDataTypeLoader.java
@@ -15,37 +15,35 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+package
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect.datatypeloader;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.AbstractDataTypeLoader;
import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Types;
import java.util.Map;
-import java.util.TreeMap;
/**
- * Data type loader.
+ * Oracle data type loader.
*/
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public final class OracleDataTypeLoader extends AbstractDataTypeLoader {
/**
* Load data type.
- *
+ *
* @param database database
* @return data type map
* @throws SQLException SQL exception
*/
- public static Map<String, Integer> load(final DatabaseMetaData database)
throws SQLException {
- Map<String, Integer> result = new
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
- try (ResultSet resultSet = database.getTypeInfo()) {
- while (resultSet.next()) {
- result.put(resultSet.getString("TYPE_NAME"),
resultSet.getInt("DATA_TYPE"));
- }
- }
+ public Map<String, Integer> load(final DatabaseMetaData database) throws
SQLException {
+ Map<String, Integer> result = super.load(database);
+ result.putIfAbsent("NUMBER", Types.NUMERIC);
return result;
}
+
+ @Override
+ public String getType() {
+ return "Oracle";
+ }
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoader.java
similarity index 63%
copy from
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoader.java
index 323996c8825..b562f261e91 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoader.java
@@ -15,37 +15,28 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+package org.apache.shardingsphere.infra.metadata.database.schema.loader.spi;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.spi.annotation.SingletonSPI;
+import org.apache.shardingsphere.spi.type.required.RequiredSPI;
+import org.apache.shardingsphere.spi.type.typed.TypedSPI;
import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
-import java.util.TreeMap;
/**
* Data type loader.
*/
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+@SingletonSPI
+public interface DataTypeLoader extends TypedSPI, RequiredSPI {
/**
* Load data type.
- *
+ *
* @param database database
* @return data type map
* @throws SQLException SQL exception
*/
- public static Map<String, Integer> load(final DatabaseMetaData database)
throws SQLException {
- Map<String, Integer> result = new
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
- try (ResultSet resultSet = database.getTypeInfo()) {
- while (resultSet.next()) {
- result.put(resultSet.getString("TYPE_NAME"),
resultSet.getInt("DATA_TYPE"));
- }
- }
- return result;
- }
+ Map<String, Integer> load(DatabaseMetaData database) throws SQLException;
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoaderFactory.java
similarity index 56%
copy from
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoaderFactory.java
index 323996c8825..3e9597e82b8 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoaderFactory.java
@@ -15,37 +15,32 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+package org.apache.shardingsphere.infra.metadata.database.schema.loader.spi;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Map;
-import java.util.TreeMap;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.spi.type.required.RequiredSPIRegistry;
+import org.apache.shardingsphere.spi.type.typed.TypedSPIRegistry;
/**
* Data type loader.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public final class DataTypeLoaderFactory {
+
+ static {
+ ShardingSphereServiceLoader.register(DataTypeLoader.class);
+ }
/**
- * Load data type.
- *
- * @param database database
- * @return data type map
- * @throws SQLException SQL exception
+ * Get instance of dialect data type loader.
+ *
+ * @param databaseType database type
+ * @return found instance
*/
- public static Map<String, Integer> load(final DatabaseMetaData database)
throws SQLException {
- Map<String, Integer> result = new
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
- try (ResultSet resultSet = database.getTypeInfo()) {
- while (resultSet.next()) {
- result.put(resultSet.getString("TYPE_NAME"),
resultSet.getInt("DATA_TYPE"));
- }
- }
- return result;
+ public static DataTypeLoader getInstance(final DatabaseType databaseType) {
+ return TypedSPIRegistry.findRegisteredService(DataTypeLoader.class,
databaseType.getType()).orElseGet(() ->
RequiredSPIRegistry.getRegisteredService(DataTypeLoader.class));
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
b/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
new file mode 100644
index 00000000000..7ef2b905ebd
--- /dev/null
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect.datatypeloader.MySQLDataTypeLoader
+org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect.datatypeloader.OracleDataTypeLoader
+org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DefaultDataTypeLoader
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoaderTest.java
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoaderTest.java
index fa559540d6d..2658f46180f 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoaderTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoaderTest.java
@@ -17,6 +17,8 @@
package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+import org.apache.shardingsphere.infra.fixture.InfraDatabaseTypeFixture;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
import org.junit.Test;
import java.sql.DatabaseMetaData;
@@ -39,7 +41,7 @@ public final class DataTypeLoaderTest {
when(resultSet.getInt("DATA_TYPE")).thenReturn(4, 12);
DatabaseMetaData databaseMetaData = mock(DatabaseMetaData.class);
when(databaseMetaData.getTypeInfo()).thenReturn(resultSet);
- Map<String, Integer> actual = DataTypeLoader.load(databaseMetaData);
+ Map<String, Integer> actual = DataTypeLoaderFactory.getInstance(new
InfraDatabaseTypeFixture()).load(databaseMetaData);
assertThat(actual.size(), is(2));
assertThat(actual.get("INT"), is(4));
assertThat(actual.get("VARCHAR"), is(12));
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/DataTypeLoaderFixture.java
similarity index 62%
rename from
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
rename to
shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/DataTypeLoaderFixture.java
index 323996c8825..797a5027190 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/DataTypeLoaderFixture.java
@@ -15,37 +15,32 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+package
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.AbstractDataTypeLoader;
import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
-import java.util.TreeMap;
/**
- * Data type loader.
+ * Data type loader fixture.
*/
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public final class DataTypeLoaderFixture extends AbstractDataTypeLoader {
/**
* Load data type.
- *
+ *
* @param database database
* @return data type map
* @throws SQLException SQL exception
*/
- public static Map<String, Integer> load(final DatabaseMetaData database)
throws SQLException {
- Map<String, Integer> result = new
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
- try (ResultSet resultSet = database.getTypeInfo()) {
- while (resultSet.next()) {
- result.put(resultSet.getString("TYPE_NAME"),
resultSet.getInt("DATA_TYPE"));
- }
- }
- return result;
+ public Map<String, Integer> load(final DatabaseMetaData database) throws
SQLException {
+ return super.load(database);
+ }
+
+ @Override
+ public String getType() {
+ return "INFRA.FIXTURE";
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
b/shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
new file mode 100644
index 00000000000..780f7a27979
--- /dev/null
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect.DataTypeLoaderFixture