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

Add TableContainedRule check for table refresh (#8118)

* Add TableContainedRule check for table refresh

* Add TableContainedRule check for table refresh
上级 8c151b27
...@@ -21,6 +21,8 @@ import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; ...@@ -21,6 +21,8 @@ import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials; import org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
import org.apache.shardingsphere.infra.metadata.schema.builder.TableMetaDataBuilder; import org.apache.shardingsphere.infra.metadata.schema.builder.TableMetaDataBuilder;
import org.apache.shardingsphere.infra.metadata.schema.refresher.SchemaRefresher; import org.apache.shardingsphere.infra.metadata.schema.refresher.SchemaRefresher;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.type.TableContainedRule;
import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterTableStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterTableStatement;
import java.sql.SQLException; import java.sql.SQLException;
...@@ -35,8 +37,20 @@ public final class AlterTableStatementSchemaRefresher implements SchemaRefresher ...@@ -35,8 +37,20 @@ public final class AlterTableStatementSchemaRefresher implements SchemaRefresher
public void refresh(final ShardingSphereSchema schema, public void refresh(final ShardingSphereSchema schema,
final Collection<String> routeDataSourceNames, final AlterTableStatement sqlStatement, final SchemaBuilderMaterials materials) throws SQLException { final Collection<String> routeDataSourceNames, final AlterTableStatement sqlStatement, final SchemaBuilderMaterials materials) throws SQLException {
String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue(); String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue();
if (!containsInTableContainedRule(tableName, materials)) {
return;
}
if (null != schema && schema.containsTable(tableName)) { if (null != schema && schema.containsTable(tableName)) {
TableMetaDataBuilder.build(tableName, materials).ifPresent(tableMetaData -> schema.put(tableName, tableMetaData)); TableMetaDataBuilder.build(tableName, materials).ifPresent(tableMetaData -> schema.put(tableName, tableMetaData));
} }
} }
private boolean containsInTableContainedRule(final String tableName, final SchemaBuilderMaterials materials) {
for (ShardingSphereRule each : materials.getRules()) {
if (each instanceof TableContainedRule && ((TableContainedRule) each).getTables().contains(tableName)) {
return true;
}
}
return false;
}
} }
...@@ -36,8 +36,8 @@ public final class CreateIndexStatementSchemaRefresher implements SchemaRefreshe ...@@ -36,8 +36,8 @@ public final class CreateIndexStatementSchemaRefresher implements SchemaRefreshe
if (null == sqlStatement.getIndex()) { if (null == sqlStatement.getIndex()) {
return; return;
} }
String indexName = sqlStatement.getIndex().getIdentifier().getValue();
String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue(); String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue();
String indexName = sqlStatement.getIndex().getIdentifier().getValue();
schema.get(tableName).getIndexes().put(indexName, new IndexMetaData(indexName)); schema.get(tableName).getIndexes().put(indexName, new IndexMetaData(indexName));
} }
} }
...@@ -22,6 +22,8 @@ import org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMate ...@@ -22,6 +22,8 @@ import org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMate
import org.apache.shardingsphere.infra.metadata.schema.builder.TableMetaDataBuilder; import org.apache.shardingsphere.infra.metadata.schema.builder.TableMetaDataBuilder;
import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData; import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
import org.apache.shardingsphere.infra.metadata.schema.refresher.SchemaRefresher; import org.apache.shardingsphere.infra.metadata.schema.refresher.SchemaRefresher;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.type.TableContainedRule;
import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
import java.sql.SQLException; import java.sql.SQLException;
...@@ -36,8 +38,22 @@ public final class CreateTableStatementSchemaRefresher implements SchemaRefreshe ...@@ -36,8 +38,22 @@ public final class CreateTableStatementSchemaRefresher implements SchemaRefreshe
public void refresh(final ShardingSphereSchema schema, public void refresh(final ShardingSphereSchema schema,
final Collection<String> routeDataSourceNames, final CreateTableStatement sqlStatement, final SchemaBuilderMaterials materials) throws SQLException { final Collection<String> routeDataSourceNames, final CreateTableStatement sqlStatement, final SchemaBuilderMaterials materials) throws SQLException {
String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue(); String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue();
TableMetaData tableMetaData = TableMetaDataBuilder.build(tableName, materials).orElse(new TableMetaData()); TableMetaData tableMetaData;
if (containsInTableContainedRule(tableName, materials)) {
tableMetaData = TableMetaDataBuilder.build(tableName, materials).orElse(new TableMetaData());
} else {
tableMetaData = new TableMetaData();
}
schema.put(tableName, tableMetaData); schema.put(tableName, tableMetaData);
schema.get(tableName).getAddressingDataSources().addAll(routeDataSourceNames); schema.get(tableName).getAddressingDataSources().addAll(routeDataSourceNames);
} }
private boolean containsInTableContainedRule(final String tableName, final SchemaBuilderMaterials materials) {
for (ShardingSphereRule each : materials.getRules()) {
if (each instanceof TableContainedRule && ((TableContainedRule) each).getTables().contains(tableName)) {
return true;
}
}
return false;
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册