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

Refactor schema loader (#8104)

* Rename SchemaLoader

* Rename SchemaLoader

* Refactor ShardingSphereMetaDataLoader

* Refactor TableAddressingMapperDataLoader

* Refactor PhysicalSchemaMetaDataLoader

* Refactor test cases

* Refactor PhysicalTableMetaDataLoaderTest

* Refactor PhysicalIndexMetaDataLoaderTest

* Refactor PhysicalColumnMetaDataLoaderTest

* Rename MetaDataLoaderConnectionAdapter

* Rename MetaDataLoaderConnectionAdapter's package

* Rename packages of adapter and dialect
上级 555155ef
......@@ -34,19 +34,19 @@ import java.util.Map;
import java.util.Map.Entry;
/**
* Schema meta data loader.
* Schema loader.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class SchemaMetaDataLoader {
public final class SchemaLoader {
/**
* Load schema meta data.
* Load schema.
*
* @param databaseType database type
* @param dataSourceMap data source map
* @param rules ShardingSphere rules
* @param props configuration properties
* @return schema meta data
* @return ShardingSphere schema
* @throws SQLException SQL exception
*/
public static ShardingSphereSchema load(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap,
......
......@@ -29,7 +29,6 @@ import org.apache.shardingsphere.infra.spi.ordered.OrderedSPIRegistry;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
......@@ -56,24 +55,24 @@ public final class TableAddressingMapperDataLoader {
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public static Map<String, Collection<String>> load(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap, final Collection<ShardingSphereRule> rules) throws SQLException {
Map<String, Collection<String>> result = initializeTableAddressingMapper(databaseType, dataSourceMap);
Map<String, Collection<String>> result = initialize(databaseType, dataSourceMap);
for (Entry<ShardingSphereRule, TableAddressingMapperDecorator> entry : OrderedSPIRegistry.getRegisteredServices(rules, TableAddressingMapperDecorator.class).entrySet()) {
entry.getValue().decorate(entry.getKey(), result);
}
return result;
}
private static Map<String, Collection<String>> initializeTableAddressingMapper(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap) throws SQLException {
private static Map<String, Collection<String>> initialize(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap) throws SQLException {
Map<String, Collection<String>> result = new HashMap<>();
for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
appendMetaData(result, databaseType, entry.getKey(), entry.getValue());
append(result, databaseType, entry.getKey(), entry.getValue());
}
return result;
}
private static void appendMetaData(final Map<String, Collection<String>> tableAddressingMapper,
final DatabaseType databaseType, final String dataSourceName, final DataSource dataSource) throws SQLException {
for (String each : PhysicalSchemaMetaDataLoader.loadTableNames(dataSource, databaseType, Collections.emptyList())) {
private static void append(final Map<String, Collection<String>> tableAddressingMapper,
final DatabaseType databaseType, final String dataSourceName, final DataSource dataSource) throws SQLException {
for (String each : PhysicalSchemaMetaDataLoader.loadAllTableNames(dataSource, databaseType)) {
if (!tableAddressingMapper.containsKey(each)) {
tableAddressingMapper.put(each, new LinkedHashSet<>());
}
......
......@@ -20,8 +20,8 @@ package org.apache.shardingsphere.infra.metadata.schema.loader.physical;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandlerFactory;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandlerFactory;
import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
......
......@@ -21,7 +21,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.MetaDataConnectionAdapter;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.adapter.MetaDataLoaderConnectionAdapter;
import javax.sql.DataSource;
import java.sql.Connection;
......@@ -34,7 +34,6 @@ import java.util.List;
/**
* Physical schema meta data loader.
* Note: this is only load table name, skip index and column info
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Slf4j(topic = "ShardingSphere-metadata")
......@@ -51,15 +50,13 @@ public final class PhysicalSchemaMetaDataLoader {
*
* @param dataSource data source
* @param databaseType database type
* @param excludedTableNames excluded table names
* @return all table names
* @return loaded all table names
* @throws SQLException SQL exception
*/
public static Collection<String> loadTableNames(final DataSource dataSource, final DatabaseType databaseType, final Collection<String> excludedTableNames) throws SQLException {
List<String> result;
try (MetaDataConnectionAdapter connectionAdapter = new MetaDataConnectionAdapter(databaseType, dataSource.getConnection())) {
public static Collection<String> loadAllTableNames(final DataSource dataSource, final DatabaseType databaseType) throws SQLException {
Collection<String> result;
try (MetaDataLoaderConnectionAdapter connectionAdapter = new MetaDataLoaderConnectionAdapter(databaseType, dataSource.getConnection())) {
result = loadAllTableNames(connectionAdapter);
result.removeAll(excludedTableNames);
}
log.info("Loading {} tables' meta data for unconfigured tables.", result.size());
if (result.isEmpty()) {
......@@ -68,7 +65,7 @@ public final class PhysicalSchemaMetaDataLoader {
return result;
}
private static List<String> loadAllTableNames(final Connection connection) throws SQLException {
private static Collection<String> loadAllTableNames(final Connection connection) throws SQLException {
List<String> result = new LinkedList<>();
try (ResultSet resultSet = connection.getMetaData().getTables(connection.getCatalog(), connection.getSchema(), null, new String[]{TABLE_TYPE, VIEW_TYPE})) {
while (resultSet.next()) {
......
......@@ -20,8 +20,8 @@ package org.apache.shardingsphere.infra.metadata.schema.loader.physical;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.MetaDataConnectionAdapter;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandlerFactory;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.adapter.MetaDataLoaderConnectionAdapter;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandlerFactory;
import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
import javax.sql.DataSource;
......@@ -46,7 +46,7 @@ public final class PhysicalTableMetaDataLoader {
* @throws SQLException SQL exception
*/
public static Optional<TableMetaData> load(final DataSource dataSource, final String tableNamePattern, final DatabaseType databaseType) throws SQLException {
try (MetaDataConnectionAdapter connectionAdapter = new MetaDataConnectionAdapter(databaseType, dataSource.getConnection())) {
try (MetaDataLoaderConnectionAdapter connectionAdapter = new MetaDataLoaderConnectionAdapter(databaseType, dataSource.getConnection())) {
String formattedTableNamePattern = formatTableNamePattern(tableNamePattern, databaseType);
return isTableExist(connectionAdapter, formattedTableNamePattern)
? Optional.of(new TableMetaData(PhysicalColumnMetaDataLoader.load(
......
......@@ -15,11 +15,11 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.adapter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandlerFactory;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandlerFactory;
import java.sql.Array;
import java.sql.Blob;
......@@ -42,15 +42,16 @@ import java.util.Properties;
import java.util.concurrent.Executor;
/**
* Meta data connection adapter.
* Meta data loader connection adapter.
*/
@RequiredArgsConstructor
public final class MetaDataConnectionAdapter implements Connection {
public final class MetaDataLoaderConnectionAdapter implements Connection {
private final DatabaseType databaseType;
private final Connection connection;
@SuppressWarnings("ReturnOfNull")
@Override
public String getCatalog() {
try {
......@@ -70,6 +71,7 @@ public final class MetaDataConnectionAdapter implements Connection {
return DatabaseMetaDataDialectHandlerFactory.findHandler(databaseType).map(handler -> handler.getSchema(connection)).orElse(getSchema(connection));
}
@SuppressWarnings("ReturnOfNull")
private String getSchema(final Connection connection) {
try {
return connection.getSchema();
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect;
import org.apache.shardingsphere.infra.spi.typed.TypedSPI;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
......@@ -34,6 +34,7 @@ public interface DatabaseMetaDataDialectHandler extends TypedSPI {
* @param connection connection
* @return schema
*/
@SuppressWarnings("ReturnOfNull")
default String getSchema(final Connection connection) {
try {
return connection.getSchema();
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
......
......@@ -15,11 +15,11 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import java.util.Properties;
......
......@@ -15,11 +15,11 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import java.util.Properties;
......
......@@ -15,11 +15,11 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import java.util.Properties;
......
......@@ -15,11 +15,11 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import java.sql.Connection;
......@@ -35,7 +35,8 @@ import java.util.Properties;
public final class OracleDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler {
private Properties props;
@SuppressWarnings("ReturnOfNull")
@Override
public String getSchema(final Connection connection) {
try {
......
......@@ -15,11 +15,11 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import java.util.Properties;
......
......@@ -15,11 +15,11 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import java.util.Properties;
......
......@@ -15,11 +15,11 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.DatabaseMetaDataDialectHandler;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import java.util.Properties;
......
......@@ -48,8 +48,7 @@ public interface ShardingSphereMetaDataLoader<T extends TableContainedRule> exte
* @return meta data
* @throws SQLException SQL exception
*/
Optional<TableMetaData> load(String tableName,
DatabaseType databaseType, Map<String, DataSource> dataSourceMap, DataNodes dataNodes, T rule, ConfigurationProperties props) throws SQLException;
Optional<TableMetaData> load(String tableName, DatabaseType databaseType, Map<String, DataSource> dataSourceMap, DataNodes dataNodes, T rule, ConfigurationProperties props) throws SQLException;
/**
* Decorate table meta data.
......
......@@ -15,10 +15,10 @@
# limitations under the License.
#
org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect.H2DatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect.MariaDBDatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect.MySQLDatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect.OracleDatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect.PostgreSQLDatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect.SQL92DatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect.SQLServerDatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl.H2DatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl.MariaDBDatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl.MySQLDatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl.OracleDatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl.PostgreSQLDatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl.SQL92DatabaseMetaDataDialectHandler
org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl.SQLServerDatabaseMetaDataDialectHandler
......@@ -38,7 +38,7 @@ import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@RunWith(MockitoJUnitRunner.class)
public final class SchemaMetaDataLoaderTest {
public final class SchemaLoaderTest {
@Mock
private DatabaseType databaseType;
......@@ -51,7 +51,7 @@ public final class SchemaMetaDataLoaderTest {
@Test
public void assertLoadFullDatabases() throws SQLException {
ShardingSphereSchema actual = SchemaMetaDataLoader.load(
ShardingSphereSchema actual = SchemaLoader.load(
databaseType, Collections.singletonMap("logic_db", dataSource), Arrays.asList(new CommonFixtureRule(), new DataNodeContainedFixtureRule()), props);
assertSchema(actual);
}
......
......@@ -18,20 +18,18 @@
package org.apache.shardingsphere.infra.metadata.schema.loader.physical;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Collection;
import java.util.Iterator;
......@@ -39,32 +37,21 @@ import java.util.Iterator;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public final class ColumnMetaDataLoaderTest {
public final class PhysicalColumnMetaDataLoaderTest {
private static final String TEST_CATALOG = "catalog";
private static final String TEST_TABLE = "table";
private final DatabaseType databaseType = DatabaseTypeRegistry.getActualDatabaseType("MySQL");
@Mock
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Connection connection;
@Mock
private DatabaseMetaData databaseMetaData;
@Mock
private ResultSet primaryResultSet;
@Mock
private ResultSet columnResultSet;
@Mock
private Statement statement;
@Mock
private ResultSet caseSensitivesResultSet;
......@@ -73,19 +60,17 @@ public final class ColumnMetaDataLoaderTest {
@Before
public void setUp() throws SQLException {
when(connection.getCatalog()).thenReturn(TEST_CATALOG);
when(connection.getMetaData()).thenReturn(databaseMetaData);
when(databaseMetaData.getPrimaryKeys(TEST_CATALOG, null, TEST_TABLE)).thenReturn(primaryResultSet);
when(connection.getCatalog()).thenReturn("catalog");
when(connection.getMetaData().getPrimaryKeys("catalog", null, "tbl")).thenReturn(primaryResultSet);
when(primaryResultSet.next()).thenReturn(true, false);
when(primaryResultSet.getString("COLUMN_NAME")).thenReturn("pk_col");
when(databaseMetaData.getColumns(TEST_CATALOG, null, TEST_TABLE, "%")).thenReturn(columnResultSet);
when(connection.getMetaData().getColumns("catalog", null, "tbl", "%")).thenReturn(columnResultSet);
when(columnResultSet.next()).thenReturn(true, true, false);
when(columnResultSet.getString("TABLE_NAME")).thenReturn(TEST_TABLE);
when(columnResultSet.getString("TABLE_NAME")).thenReturn("tbl");
when(columnResultSet.getString("COLUMN_NAME")).thenReturn("pk_col", "col");
when(columnResultSet.getInt("DATA_TYPE")).thenReturn(Types.INTEGER, Types.VARCHAR);
when(columnResultSet.getString("TYPE_NAME")).thenReturn("INT", "VARCHAR");
when(connection.createStatement()).thenReturn(statement);
when(statement.executeQuery(anyString())).thenReturn(caseSensitivesResultSet);
when(connection.createStatement().executeQuery(anyString())).thenReturn(caseSensitivesResultSet);
when(caseSensitivesResultSet.findColumn("pk_col")).thenReturn(1);
when(caseSensitivesResultSet.findColumn("col")).thenReturn(2);
when(caseSensitivesResultSet.getMetaData()).thenReturn(resultSetMetaData);
......@@ -94,7 +79,7 @@ public final class ColumnMetaDataLoaderTest {
@Test
public void assertLoad() throws SQLException {
Collection<ColumnMetaData> actual = PhysicalColumnMetaDataLoader.load(connection, TEST_TABLE, databaseType);
Collection<ColumnMetaData> actual = PhysicalColumnMetaDataLoader.load(connection, "tbl", mock(DatabaseType.class));
assertThat(actual.size(), is(2));
Iterator<ColumnMetaData> columnMetaDataIterator = actual.iterator();
assertColumnMetaData(columnMetaDataIterator.next(), "pk_col", Types.INTEGER, "INT", true, true);
......
......@@ -18,52 +18,44 @@
package org.apache.shardingsphere.infra.metadata.schema.loader.physical;
import org.apache.shardingsphere.infra.metadata.schema.model.IndexMetaData;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public final class IndexMetaDataLoaderTest {
private static final String TEST_CATALOG = "catalog";
private static final String TEST_TABLE = "table";
@Mock
private Connection connection;
@Mock
private DatabaseMetaData databaseMetaData;
@Mock
private ResultSet indexResultSet;
@Before
public void setUp() throws SQLException {
when(connection.getCatalog()).thenReturn(TEST_CATALOG);
when(connection.getMetaData()).thenReturn(databaseMetaData);
}
public final class PhysicalIndexMetaDataLoaderTest {
@Test
public void assertLoad() throws SQLException {
when(databaseMetaData.getIndexInfo(TEST_CATALOG, null, TEST_TABLE, false, false)).thenReturn(indexResultSet);
when(indexResultSet.next()).thenReturn(true, true, false);
when(indexResultSet.getString("INDEX_NAME")).thenReturn("my_index");
Collection<IndexMetaData> actual = PhysicalIndexMetaDataLoader.load(connection, TEST_TABLE);
Collection<IndexMetaData> actual = PhysicalIndexMetaDataLoader.load(mockConnection(), "tbl");
assertThat(actual.size(), is(1));
IndexMetaData indexMetaData = actual.iterator().next();
assertThat(indexMetaData.getName(), is("my_index"));
}
private Connection mockConnection() throws SQLException {
Connection result = mock(Connection.class, RETURNS_DEEP_STUBS);
ResultSet resultSet = mockResultSet();
when(result.getMetaData().getIndexInfo("catalog", null, "tbl", false, false)).thenReturn(resultSet);
when(result.getCatalog()).thenReturn("catalog");
return result;
}
private ResultSet mockResultSet() throws SQLException {
ResultSet result = mock(ResultSet.class);
when(result.next()).thenReturn(true, true, false);
when(result.getString("INDEX_NAME")).thenReturn("my_index");
return result;
}
}
......@@ -18,59 +18,45 @@
package org.apache.shardingsphere.infra.metadata.schema.loader.physical;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public final class SchemaMetaDataLoaderTest {
public final class PhysicalSchemaMetaDataLoaderTest {
private static final String TEST_CATALOG = "catalog";
private static final String TABLE_TYPE = "TABLE";
private static final String VIEW_TYPE = "VIEW";
private final DatabaseType databaseType = DatabaseTypeRegistry.getTrunkDatabaseType("Oracle");
@Mock
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private DataSource dataSource;
@Mock
private Connection connection;
@Mock
private DatabaseMetaData databaseMetaData;
@Mock
private ResultSet tableExistResultSet;
@Before
public void setUp() throws SQLException {
when(dataSource.getConnection()).thenReturn(connection);
when(connection.getCatalog()).thenReturn(TEST_CATALOG);
when(connection.getMetaData()).thenReturn(databaseMetaData);
when(databaseMetaData.getTables(TEST_CATALOG, null, null, new String[]{TABLE_TYPE, VIEW_TYPE})).thenReturn(tableExistResultSet);
ResultSet resultSet = mockResultSet();
when(dataSource.getConnection().getMetaData().getTables("catalog", null, null, new String[]{"TABLE", "VIEW"})).thenReturn(resultSet);
when(dataSource.getConnection().getCatalog()).thenReturn("catalog");
}
private ResultSet mockResultSet() throws SQLException {
ResultSet result = mock(ResultSet.class);
when(result.next()).thenReturn(true, true, true, false);
when(result.getString("TABLE_NAME")).thenReturn("tbl", "$tbl", "/tbl");
return result;
}
@Test
public void assertLoadUnconfiguredTableNamesForOracle() throws SQLException {
Collection<String> tableNames = PhysicalSchemaMetaDataLoader.loadTableNames(dataSource, databaseType, Collections.emptyList());
assertThat(tableNames.size(), is(0));
public void assertLoadAllTableNames() throws SQLException {
assertThat(PhysicalSchemaMetaDataLoader.loadAllTableNames(dataSource, mock(DatabaseType.class)), is(Collections.singletonList("tbl")));
}
}
......@@ -18,23 +18,20 @@
package org.apache.shardingsphere.infra.metadata.schema.loader.physical;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
import org.apache.shardingsphere.infra.metadata.schema.model.IndexMetaData;
import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Map;
import java.util.Optional;
......@@ -44,26 +41,19 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public final class TableMetaDataLoaderTest {
public final class PhysicalTableMetaDataLoaderTest {
private static final String TEST_CATALOG = "catalog";
private static final String TEST_TABLE = "table";
private final DatabaseType databaseType = DatabaseTypeRegistry.getActualDatabaseType("MySQL");
@Mock
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private DataSource dataSource;
@Mock
private Connection connection;
@Mock
private DatabaseMetaData databaseMetaData;
@Mock
private ResultSet primaryResultSet;
......@@ -76,9 +66,6 @@ public final class TableMetaDataLoaderTest {
@Mock
private ResultSet columnResultSet;
@Mock
private Statement statement;
@Mock
private ResultSet caseSensitivesResultSet;
......@@ -90,34 +77,31 @@ public final class TableMetaDataLoaderTest {
@Before
public void setUp() throws SQLException {
when(dataSource.getConnection()).thenReturn(connection);
when(connection.getCatalog()).thenReturn(TEST_CATALOG);
when(connection.getMetaData()).thenReturn(databaseMetaData);
when(databaseMetaData.getTables(TEST_CATALOG, null, TEST_TABLE, null)).thenReturn(tableExistResultSet);
when(dataSource.getConnection().getCatalog()).thenReturn(TEST_CATALOG);
when(dataSource.getConnection().getMetaData().getTables(TEST_CATALOG, null, TEST_TABLE, null)).thenReturn(tableExistResultSet);
when(tableExistResultSet.next()).thenReturn(true);
when(databaseMetaData.getColumns(TEST_CATALOG, null, TEST_TABLE, "%")).thenReturn(columnResultSet);
when(dataSource.getConnection().getMetaData().getColumns(TEST_CATALOG, null, TEST_TABLE, "%")).thenReturn(columnResultSet);
when(columnResultSet.next()).thenReturn(true, true, false);
when(columnResultSet.getString("TABLE_NAME")).thenReturn(TEST_TABLE);
when(columnResultSet.getString("COLUMN_NAME")).thenReturn("pk_col", "col");
when(columnResultSet.getInt("DATA_TYPE")).thenReturn(Types.INTEGER, Types.VARCHAR);
when(columnResultSet.getString("TYPE_NAME")).thenReturn("INT", "VARCHAR");
when(databaseMetaData.getPrimaryKeys(TEST_CATALOG, null, TEST_TABLE)).thenReturn(primaryResultSet);
when(dataSource.getConnection().getMetaData().getPrimaryKeys(TEST_CATALOG, null, TEST_TABLE)).thenReturn(primaryResultSet);
when(primaryResultSet.next()).thenReturn(true, false);
when(primaryResultSet.getString("COLUMN_NAME")).thenReturn("pk_col");
when(connection.createStatement()).thenReturn(statement);
when(statement.executeQuery(anyString())).thenReturn(caseSensitivesResultSet);
when(dataSource.getConnection().createStatement().executeQuery(anyString())).thenReturn(caseSensitivesResultSet);
when(caseSensitivesResultSet.findColumn("pk_col")).thenReturn(1);
when(caseSensitivesResultSet.findColumn("col")).thenReturn(2);
when(caseSensitivesResultSet.getMetaData()).thenReturn(resultSetMetaData);
when(resultSetMetaData.isCaseSensitive(1)).thenReturn(true);
when(databaseMetaData.getIndexInfo(TEST_CATALOG, null, TEST_TABLE, false, false)).thenReturn(indexResultSet);
when(dataSource.getConnection().getMetaData().getIndexInfo(TEST_CATALOG, null, TEST_TABLE, false, false)).thenReturn(indexResultSet);
when(indexResultSet.next()).thenReturn(true, false);
when(indexResultSet.getString("INDEX_NAME")).thenReturn("my_index");
}
@Test
public void assertLoad() throws SQLException {
Optional<TableMetaData> actual = PhysicalTableMetaDataLoader.load(dataSource, TEST_TABLE, databaseType);
public void assertLoadWithExistedTable() throws SQLException {
Optional<TableMetaData> actual = PhysicalTableMetaDataLoader.load(dataSource, TEST_TABLE, mock(DatabaseType.class));
assertTrue(actual.isPresent());
Map<String, ColumnMetaData> columnMetaDataMap = actual.get().getColumns();
assertThat(columnMetaDataMap.size(), is(2));
......@@ -128,14 +112,6 @@ public final class TableMetaDataLoaderTest {
assertTrue(indexMetaDataMap.containsKey("my_index"));
}
@Test
public void assertTableNotExist() throws SQLException {
when(databaseMetaData.getTables(TEST_CATALOG, null, TEST_TABLE, null)).thenReturn(tableNotExistResultSet);
when(tableNotExistResultSet.next()).thenReturn(false);
Optional<TableMetaData> actual = PhysicalTableMetaDataLoader.load(dataSource, TEST_TABLE, databaseType);
assertFalse(actual.isPresent());
}
private void assertColumnMetaData(final ColumnMetaData actual, final String name, final int dataType, final String typeName, final boolean primaryKey, final boolean caseSensitive) {
assertThat(actual.getName(), is(name));
assertThat(actual.getDataType(), is(dataType));
......@@ -143,4 +119,11 @@ public final class TableMetaDataLoaderTest {
assertThat(actual.isPrimaryKey(), is(primaryKey));
assertThat(actual.isCaseSensitive(), is(caseSensitive));
}
@Test
public void assertLoadWithNotExistedTable() throws SQLException {
when(dataSource.getConnection().getMetaData().getTables(TEST_CATALOG, null, TEST_TABLE, null)).thenReturn(tableNotExistResultSet);
when(tableNotExistResultSet.next()).thenReturn(false);
assertFalse(PhysicalTableMetaDataLoader.load(dataSource, TEST_TABLE, mock(DatabaseType.class)).isPresent());
}
}
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.adapter;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
......@@ -35,7 +35,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public final class MetaDataConnectionAdapterTest {
public final class MetaDataLoaderConnectionAdapterTest {
private static final String TEST_CATALOG = "catalog";
......@@ -51,21 +51,21 @@ public final class MetaDataConnectionAdapterTest {
@Test
public void assertGetCatalog() throws SQLException {
when(connection.getCatalog()).thenReturn(TEST_CATALOG);
MetaDataConnectionAdapter connectionAdapter = new MetaDataConnectionAdapter(databaseType, connection);
MetaDataLoaderConnectionAdapter connectionAdapter = new MetaDataLoaderConnectionAdapter(databaseType, connection);
assertThat(connectionAdapter.getCatalog(), is(TEST_CATALOG));
}
@Test
public void assertGetCatalogReturnNullWhenThrowsSQLException() throws SQLException {
when(connection.getCatalog()).thenThrow(SQLException.class);
MetaDataConnectionAdapter connectionAdapter = new MetaDataConnectionAdapter(databaseType, connection);
MetaDataLoaderConnectionAdapter connectionAdapter = new MetaDataLoaderConnectionAdapter(databaseType, connection);
assertNull(connectionAdapter.getCatalog());
}
@Test
public void assertGetSchema() throws SQLException {
when(connection.getSchema()).thenReturn(TEST_SCHEMA);
MetaDataConnectionAdapter connectionAdapter = new MetaDataConnectionAdapter(databaseType, connection);
MetaDataLoaderConnectionAdapter connectionAdapter = new MetaDataLoaderConnectionAdapter(databaseType, connection);
assertThat(connectionAdapter.getSchema(), is(TEST_SCHEMA));
}
......@@ -74,21 +74,21 @@ public final class MetaDataConnectionAdapterTest {
DatabaseMetaData databaseMetaData = mock(DatabaseMetaData.class);
when(connection.getMetaData()).thenReturn(databaseMetaData);
when(databaseMetaData.getUserName()).thenReturn(TEST_SCHEMA);
MetaDataConnectionAdapter connectionAdapter = new MetaDataConnectionAdapter(oracleDatabaseType, connection);
MetaDataLoaderConnectionAdapter connectionAdapter = new MetaDataLoaderConnectionAdapter(oracleDatabaseType, connection);
assertThat(connectionAdapter.getSchema(), is(TEST_SCHEMA.toUpperCase()));
}
@Test
public void assertGetSchemaByMySQLSPI() throws SQLException {
when(connection.getSchema()).thenReturn(TEST_SCHEMA);
MetaDataConnectionAdapter connectionAdapter = new MetaDataConnectionAdapter(databaseType, connection);
MetaDataLoaderConnectionAdapter connectionAdapter = new MetaDataLoaderConnectionAdapter(databaseType, connection);
assertThat(connectionAdapter.getSchema(), is(TEST_SCHEMA));
}
@Test
public void assertGetSchemaReturnNullWhenThrowsSQLException() throws SQLException {
when(connection.getSchema()).thenThrow(SQLException.class);
MetaDataConnectionAdapter connectionAdapter = new MetaDataConnectionAdapter(databaseType, connection);
MetaDataLoaderConnectionAdapter connectionAdapter = new MetaDataLoaderConnectionAdapter(databaseType, connection);
assertNull(connectionAdapter.getSchema());
}
}
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect;
import lombok.Getter;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
import org.junit.Test;
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
......
......@@ -15,10 +15,10 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import org.junit.Test;
......
......@@ -15,10 +15,10 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import org.apache.shardingsphere.infra.database.type.dialect.MariaDBDatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import org.junit.Test;
......
......@@ -15,10 +15,10 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import org.junit.Test;
......
......@@ -15,10 +15,10 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import org.apache.shardingsphere.infra.database.type.dialect.OracleDatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import org.junit.Test;
......
......@@ -15,10 +15,10 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import org.junit.Test;
......
......@@ -15,10 +15,10 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import org.apache.shardingsphere.infra.database.type.dialect.SQL92DatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import org.junit.Test;
......
......@@ -15,11 +15,11 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.dialect;
package org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.impl;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.dialect.SQLServerDatabaseType;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.jdbc.handler.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.infra.metadata.schema.loader.physical.dialect.AbstractDatabaseMetaDataDialectHandlerTest;
import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
import org.junit.Before;
import org.junit.Test;
......
......@@ -15,10 +15,8 @@
* limitations under the License.
*/
package org.apache.shardingsphere.infra.metadata.schema.model.physical;
package org.apache.shardingsphere.infra.metadata.schema.model;
import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
import org.junit.Before;
import org.junit.Test;
......
......@@ -31,7 +31,7 @@ import org.apache.shardingsphere.infra.metadata.resource.CachedDatabaseMetaData;
import org.apache.shardingsphere.infra.metadata.resource.DataSourcesMetaData;
import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
import org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
import org.apache.shardingsphere.infra.metadata.schema.loader.SchemaMetaDataLoader;
import org.apache.shardingsphere.infra.metadata.schema.loader.SchemaLoader;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.builder.ShardingSphereRulesBuilder;
......@@ -131,7 +131,7 @@ public final class MetaDataContextsBuilder {
private ShardingSphereSchema buildSchema(final String schemaName, final Map<String, DataSource> dataSourceMap, final Collection<ShardingSphereRule> rules) throws SQLException {
long start = System.currentTimeMillis();
ShardingSphereSchema result = SchemaMetaDataLoader.load(databaseType, dataSourceMap, rules, props);
ShardingSphereSchema result = SchemaLoader.load(databaseType, dataSourceMap, rules, props);
log.info("Load meta data for schema {} finished, cost {} milliseconds.", schemaName, System.currentTimeMillis() - start);
return result;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册