未验证 提交 07c68eaf 编写于 作者: L Liang Zhang 提交者: GitHub

Refactor DatabaseMetaDataDialectHandlerFactory (#7794)

上级 4d9bbfcf
......@@ -19,7 +19,7 @@ package org.apache.shardingsphere.infra.metadata.model.physical.jdbc;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl.DatabaseMetaDataDialectHandlerFacade;
import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandlerFactory;
import java.sql.Array;
import java.sql.Blob;
......@@ -67,7 +67,15 @@ public final class MetaDataConnectionAdapter implements Connection {
@Override
public String getSchema() {
return DatabaseMetaDataDialectHandlerFacade.getSchema(connection, databaseType);
return DatabaseMetaDataDialectHandlerFactory.findHandler(databaseType).map(handler -> handler.getSchema(connection)).orElse(getSchema(connection));
}
private String getSchema(final Connection connection) {
try {
return connection.getSchema();
} catch (final SQLException ex) {
return null;
}
}
@Override
......
......@@ -15,58 +15,35 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl;
package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Optional;
import java.util.Properties;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.infra.spi.exception.ServiceProviderNotFoundException;
import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
import java.util.Optional;
import java.util.Properties;
/**
* Database meta data dialect handler facade.
* Database meta data dialect handler factory.
*/
public final class DatabaseMetaDataDialectHandlerFacade {
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class DatabaseMetaDataDialectHandlerFactory {
static {
ShardingSphereServiceLoader.register(DatabaseMetaDataDialectHandler.class);
}
/**
* Get schema.
*
* @param connection connection
* @param databaseType database type
* @return schema
*/
public static String getSchema(final Connection connection, final DatabaseType databaseType) {
return findDatabaseSpecialHandler(databaseType).map(handler -> handler.getSchema(connection)).orElse(getSchema(connection));
}
private static String getSchema(final Connection connection) {
try {
return connection.getSchema();
} catch (final SQLException ex) {
return null;
}
}
/**
* Get table name pattern.
*
* @param tableNamePattern table name pattern
* Find database meta data dialect handler.
*
* @param databaseType database type
* @return table name pattern
* @return database meta data dialect handler
*/
public static String getTableNamePattern(final String tableNamePattern, final DatabaseType databaseType) {
return findDatabaseSpecialHandler(databaseType).map(handler -> handler.decorate(tableNamePattern)).orElse(tableNamePattern);
}
private static Optional<DatabaseMetaDataDialectHandler> findDatabaseSpecialHandler(final DatabaseType databaseType) {
public static Optional<DatabaseMetaDataDialectHandler> findHandler(final DatabaseType databaseType) {
try {
return Optional.of(TypedSPIRegistry.getRegisteredService(DatabaseMetaDataDialectHandler.class, databaseType.getName(), new Properties()));
} catch (final ServiceProviderNotFoundException ignored) {
......
......@@ -21,7 +21,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.MetaDataConnectionAdapter;
import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl.DatabaseMetaDataDialectHandlerFacade;
import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandlerFactory;
import org.apache.shardingsphere.infra.metadata.model.physical.model.column.PhysicalColumnMetaDataLoader;
import org.apache.shardingsphere.infra.metadata.model.physical.model.index.PhysicalIndexMetaDataLoader;
......@@ -48,7 +48,7 @@ public final class PhysicalTableMetaDataLoader {
*/
public static Optional<PhysicalTableMetaData> load(final DataSource dataSource, final String tableNamePattern, final DatabaseType databaseType) throws SQLException {
try (MetaDataConnectionAdapter connectionAdapter = new MetaDataConnectionAdapter(databaseType, dataSource.getConnection())) {
String tableName = DatabaseMetaDataDialectHandlerFacade.getTableNamePattern(tableNamePattern, databaseType);
String tableName = DatabaseMetaDataDialectHandlerFactory.findHandler(databaseType).map(handler -> handler.decorate(tableNamePattern)).orElse(tableNamePattern);
return isTableExist(connectionAdapter, tableName)
? Optional.of(new PhysicalTableMetaData(
PhysicalColumnMetaDataLoader.load(connectionAdapter, tableName, databaseType), PhysicalIndexMetaDataLoader.load(connectionAdapter, tableName)))
......
......@@ -15,51 +15,26 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl;
package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.DatabaseTypes;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@RunWith(MockitoJUnitRunner.class)
public final class OracleDatabaseMetaDataDialectFacadeTest {
private static final String USER_NAME = "root";
private static final String TABLE_NAME_PATTERN = "t_order_0";
private final DatabaseType oracleDatabaseType = DatabaseTypes.getTrunkDatabaseType("Oracle");
private final DatabaseType mysqlDatabaseType = DatabaseTypes.getTrunkDatabaseType("MySQL");
@Mock
private Connection connection;
@Mock
private DatabaseMetaData databaseMetaData;
public final class DatabaseMetaDataDialectHandlerFactoryTest {
@Test
public void assertGetSchema() throws SQLException {
when(connection.getMetaData()).thenReturn(databaseMetaData);
when(databaseMetaData.getUserName()).thenReturn(USER_NAME);
assertThat(DatabaseMetaDataDialectHandlerFacade.getSchema(connection, oracleDatabaseType), is(USER_NAME.toUpperCase()));
public void assertFindHandlerForOracle() {
assertTrue(DatabaseMetaDataDialectHandlerFactory.findHandler(DatabaseTypes.getTrunkDatabaseType("Oracle")).isPresent());
}
@Test
public void assertGetTableNamePattern() {
assertThat(DatabaseMetaDataDialectHandlerFacade.getTableNamePattern(TABLE_NAME_PATTERN, oracleDatabaseType), is(TABLE_NAME_PATTERN.toUpperCase()));
assertThat(DatabaseMetaDataDialectHandlerFacade.getTableNamePattern(TABLE_NAME_PATTERN, mysqlDatabaseType), is(TABLE_NAME_PATTERN));
public void assertFindHandlerMySQL() {
assertFalse(DatabaseMetaDataDialectHandlerFactory.findHandler(DatabaseTypes.getTrunkDatabaseType("MySQL")).isPresent());
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册