Skip to content

Commit

Permalink
Use excluded table names to avoid duplicate load tables (#5062)
Browse files Browse the repository at this point in the history
* Use excluded table names to avoid duplicate load tables

* remove SchemaMetaData.getter

* rename RuleTableMetaDataLoader to RuleMetaDataLoader
  • Loading branch information
terrymanu committed Apr 3, 2020
1 parent e98ce80 commit d205c5d
Show file tree
Hide file tree
Showing 17 changed files with 105 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.underlying.common.metadata.schema.spi.RuleTableMetaDataDecorator;
import org.apache.shardingsphere.underlying.common.metadata.schema.spi.RuleMetaDataDecorator;

import java.util.Collection;
import java.util.LinkedList;

/**
* Table meta data decorator for encrypt.
*/
public final class EncryptTableMetaDataDecorator implements RuleTableMetaDataDecorator<EncryptRule> {
public final class EncryptMetaDataDecorator implements RuleMetaDataDecorator<EncryptRule> {

@Override
public TableMetaData decorate(final String tableName, final TableMetaData tableMetaData, final EncryptRule encryptRule) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@
package org.apache.shardingsphere.encrypt.metadata;

import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaDataLoader;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.underlying.common.database.type.DatabaseType;
import org.apache.shardingsphere.underlying.common.metadata.schema.spi.RuleTableMetaDataLoader;
import org.apache.shardingsphere.underlying.common.metadata.schema.spi.RuleMetaDataLoader;

import javax.sql.DataSource;
import java.sql.SQLException;
Expand All @@ -32,20 +33,22 @@
import java.util.Optional;

/**
* Table meta data loader for encrypt.
* Meta data loader for encrypt.
*/
public final class EncryptTableMetaDataLoader implements RuleTableMetaDataLoader<EncryptRule> {
public final class EncryptMetaDataLoader implements RuleMetaDataLoader<EncryptRule> {

@Override
public Map<String, TableMetaData> load(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap,
final EncryptRule encryptRule, final ConfigurationProperties properties) throws SQLException {
public SchemaMetaData load(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap,
final EncryptRule encryptRule, final ConfigurationProperties properties, final Collection<String> excludedTableNames) throws SQLException {
DataSource dataSource = dataSourceMap.values().iterator().next();
Collection<String> encryptTableNames = encryptRule.getEncryptTableNames();
Map<String, TableMetaData> result = new HashMap<>(encryptTableNames.size(), 1);
for (String each : encryptTableNames) {
result.put(each, TableMetaDataLoader.load(dataSource, each, databaseType.getName()));
if (!excludedTableNames.contains(each)) {
result.put(each, TableMetaDataLoader.load(dataSource, each, databaseType.getName()));
}
}
return result;
return new SchemaMetaData(result);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@
# limitations under the License.
#

org.apache.shardingsphere.core.metadata.ShardingTableMetaDataLoader
org.apache.shardingsphere.encrypt.metadata.EncryptMetaDataDecorator
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@
# limitations under the License.
#

org.apache.shardingsphere.encrypt.metadata.EncryptTableMetaDataLoader
org.apache.shardingsphere.encrypt.metadata.EncryptMetaDataLoader
Original file line number Diff line number Diff line change
Expand Up @@ -18,30 +18,32 @@
package org.apache.shardingsphere.masterslave.metadata;

import org.apache.shardingsphere.core.rule.MasterSlaveRule;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaDataLoader;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaDataLoader;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;
import org.apache.shardingsphere.underlying.common.database.type.DatabaseType;
import org.apache.shardingsphere.underlying.common.metadata.schema.spi.RuleTableMetaDataLoader;
import org.apache.shardingsphere.underlying.common.metadata.schema.spi.RuleMetaDataLoader;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;

/**
* Table meta data loader for master slave.
* Meta data loader for master slave.
*/
public final class MasterSlaveTableMetaDataLoader implements RuleTableMetaDataLoader<MasterSlaveRule> {
public final class MasterSlaveMetaDataLoader implements RuleMetaDataLoader<MasterSlaveRule> {

@Override
public Map<String, TableMetaData> load(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap,
final MasterSlaveRule masterSlaveRule, final ConfigurationProperties properties) throws SQLException {
public SchemaMetaData load(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap,
final MasterSlaveRule masterSlaveRule, final ConfigurationProperties properties, final Collection<String> excludedTableNames) throws SQLException {
DataSource dataSource = dataSourceMap.values().iterator().next();
int maxConnectionCount = properties.getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY);
return SchemaMetaDataLoader.load(dataSource, maxConnectionCount, databaseType.getName()).getTables();
return SchemaMetaDataLoader.load(dataSource, maxConnectionCount, databaseType.getName(), excludedTableNames);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@

#
# 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.masterslave.metadata.MasterSlaveMetaDataLoader

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.index.IndexMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.underlying.common.metadata.schema.spi.RuleTableMetaDataDecorator;
import org.apache.shardingsphere.underlying.common.metadata.schema.spi.RuleMetaDataDecorator;
import org.apache.shardingsphere.underlying.common.rule.DataNode;

import java.util.Collection;
Expand All @@ -34,7 +34,7 @@
/**
* Table meta data decorator for sharding.
*/
public final class ShardingTableMetaDataDecorator implements RuleTableMetaDataDecorator<ShardingRule> {
public final class ShardingMetaDataDecorator implements RuleMetaDataDecorator<ShardingRule> {

@Override
public TableMetaData decorate(final String tableName, final TableMetaData tableMetaData, final ShardingRule shardingRule) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;
import org.apache.shardingsphere.underlying.common.database.type.DatabaseType;
import org.apache.shardingsphere.underlying.common.exception.ShardingSphereException;
import org.apache.shardingsphere.underlying.common.metadata.schema.spi.RuleTableMetaDataLoader;
import org.apache.shardingsphere.underlying.common.metadata.schema.spi.RuleMetaDataLoader;
import org.apache.shardingsphere.underlying.common.rule.DataNode;

import javax.sql.DataSource;
Expand All @@ -50,9 +50,9 @@
import java.util.stream.Collectors;

/**
* Table meta data loader for sharding.
* Meta data loader for sharding.
*/
public final class ShardingTableMetaDataLoader implements RuleTableMetaDataLoader<ShardingRule> {
public final class ShardingMetaDataLoader implements RuleMetaDataLoader<ShardingRule> {

private static final String LINE_SEPARATOR = System.getProperty("line.separator");

Expand All @@ -61,13 +61,15 @@ public final class ShardingTableMetaDataLoader implements RuleTableMetaDataLoade
private static final int FUTURE_GET_TIME_OUT_SEC = 5;

@Override
public Map<String, TableMetaData> load(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap,
final ShardingRule shardingRule, final ConfigurationProperties properties) throws SQLException {
Map<String, TableMetaData> result = new HashMap<>(shardingRule.getTableRules().size(), 1);
public SchemaMetaData load(final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap,
final ShardingRule shardingRule, final ConfigurationProperties properties, final Collection<String> excludedTableNames) throws SQLException {
SchemaMetaData result = new SchemaMetaData(new HashMap<>(shardingRule.getTableRules().size(), 1));
for (TableRule each : shardingRule.getTableRules()) {
load(databaseType, dataSourceMap, each.getLogicTable(), shardingRule, properties).ifPresent(tableMetaData -> result.put(each.getLogicTable(), tableMetaData));
if (!excludedTableNames.contains(each.getLogicTable())) {
load(databaseType, dataSourceMap, each.getLogicTable(), shardingRule, properties).ifPresent(tableMetaData -> result.put(each.getLogicTable(), tableMetaData));
}
}
result.putAll(loadDefaultSchemaMetaData(databaseType, dataSourceMap, shardingRule, properties).getTables());
result.merge(loadDefaultSchemaMetaData(databaseType, dataSourceMap, shardingRule, properties));
return result;
}

Expand Down Expand Up @@ -132,7 +134,7 @@ private TableMetaData loadTableByDataNode(final DataNode dataNode, final Databas
}

private void checkUniformed(final String logicTableName, final Map<String, TableMetaData> actualTableMetaDataMap, final ShardingRule shardingRule) {
ShardingTableMetaDataDecorator decorator = new ShardingTableMetaDataDecorator();
ShardingMetaDataDecorator decorator = new ShardingMetaDataDecorator();
TableMetaData sample = decorator.decorate(logicTableName, actualTableMetaDataMap.values().iterator().next(), shardingRule);
Collection<TableMetaDataViolation> violations = actualTableMetaDataMap.entrySet().stream()
.filter(entry -> !sample.equals(decorator.decorate(logicTableName, entry.getValue(), shardingRule)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@
# limitations under the License.
#

org.apache.shardingsphere.core.metadata.ShardingTableMetaDataDecorator
org.apache.shardingsphere.core.metadata.ShardingMetaDataDecorator
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@
# limitations under the License.
#

org.apache.shardingsphere.encrypt.metadata.EncryptTableMetaDataDecorator
org.apache.shardingsphere.core.metadata.ShardingMetaDataLoader
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
import lombok.Getter;
import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
import org.apache.shardingsphere.core.log.ConfigurationLogger;
import org.apache.shardingsphere.core.metadata.ShardingTableMetaDataDecorator;
import org.apache.shardingsphere.core.metadata.ShardingMetaDataDecorator;
import org.apache.shardingsphere.core.rule.MasterSlaveRule;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.encrypt.metadata.EncryptTableMetaDataDecorator;
import org.apache.shardingsphere.encrypt.metadata.EncryptMetaDataDecorator;
import org.apache.shardingsphere.orchestration.core.common.event.ShardingRuleChangedEvent;
import org.apache.shardingsphere.orchestration.core.common.rule.OrchestrationMasterSlaveRule;
import org.apache.shardingsphere.orchestration.core.common.rule.OrchestrationShardingRule;
Expand Down Expand Up @@ -198,9 +198,9 @@ private Optional<TableMetaData> loadTableMeta(final String tableName) throws SQL
LogicSchemas.getInstance().getDatabaseType(), getBackendDataSource().getDataSources(), tableName, ShardingProxyContext.getInstance().getProperties());
if (tableMetaData.isPresent()) {
TableMetaData result = tableMetaData.get();
result = new ShardingTableMetaDataDecorator().decorate(tableName, result, shardingRule);
result = new ShardingMetaDataDecorator().decorate(tableName, result, shardingRule);
if (!shardingRule.getEncryptRule().getEncryptTableNames().isEmpty()) {
result = new EncryptTableMetaDataDecorator().decorate(tableName, result, shardingRule.getEncryptRule());
result = new EncryptMetaDataDecorator().decorate(tableName, result, shardingRule.getEncryptRule());
}
return Optional.of(result);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

package org.apache.shardingsphere.sql.parser.binder.metadata.schema;

import lombok.Getter;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;

import java.util.ArrayList;
Expand All @@ -31,7 +30,6 @@
/**
* Schema meta data.
*/
@Getter
public final class SchemaMetaData {

private final Map<String, TableMetaData> tables;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,24 @@ public final class SchemaMetaDataLoader {
* @throws SQLException SQL exception
*/
public static SchemaMetaData load(final DataSource dataSource, final int maxConnectionCount, final String databaseType) throws SQLException {
return load(dataSource, maxConnectionCount, databaseType, Collections.emptyList());
}

/**
* Load schema meta data.
*
* @param dataSource data source
* @param maxConnectionCount count of max connections permitted to use for this query
* @param databaseType database type
* @param excludedTableNames excluded table names
* @return schema meta data
* @throws SQLException SQL exception
*/
public static SchemaMetaData load(final DataSource dataSource, final int maxConnectionCount, final String databaseType, final Collection<String> excludedTableNames) throws SQLException {
List<String> tableNames;
try (Connection connection = dataSource.getConnection()) {
tableNames = loadAllTableNames(connection);
tableNames.removeAll(excludedTableNames);
}
log.info("Loading {} tables' meta data.", tableNames.size());
if (0 == tableNames.size()) {
Expand Down

0 comments on commit d205c5d

Please sign in to comment.