1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.infra.connection.refresher.type.table;
19
20 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
21 import org.apache.shardingsphere.infra.connection.refresher.MetaDataRefresher;
22 import org.apache.shardingsphere.infra.connection.refresher.util.TableRefreshUtils;
23 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
24 import org.apache.shardingsphere.infra.instance.mode.ModeContextManager;
25 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
26 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
27 import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
28 import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
29 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
30 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
31 import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
32 import org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
33 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.RenameTableDefinitionSegment;
34 import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.RenameTableStatement;
35
36 import java.sql.SQLException;
37 import java.util.Collection;
38 import java.util.Collections;
39 import java.util.LinkedList;
40 import java.util.Map;
41 import java.util.Optional;
42
43
44
45
46 public final class RenameTableStatementSchemaRefresher implements MetaDataRefresher<RenameTableStatement> {
47
48 @Override
49 public void refresh(final ModeContextManager modeContextManager, final ShardingSphereDatabase database, final Collection<String> logicDataSourceNames,
50 final String schemaName, final DatabaseType databaseType, final RenameTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException {
51 for (RenameTableDefinitionSegment each : sqlStatement.getRenameTables()) {
52 AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), schemaName, logicDataSourceNames);
53 alterSchemaMetaDataPOJO.getAlteredTables().add(getTable(database, logicDataSourceNames, schemaName,
54 TableRefreshUtils.getTableName(databaseType, each.getRenameTable().getTableName().getIdentifier()), props));
55 alterSchemaMetaDataPOJO.getDroppedTables().add(each.getTable().getTableName().getIdentifier().getValue());
56 modeContextManager.alterSchemaMetaData(alterSchemaMetaDataPOJO);
57 }
58 }
59
60 private ShardingSphereTable getTable(final ShardingSphereDatabase database, final Collection<String> logicDataSourceNames, final String schemaName, final String tableName,
61 final ConfigurationProperties props) throws SQLException {
62 RuleMetaData ruleMetaData = new RuleMetaData(new LinkedList<>(database.getRuleMetaData().getRules()));
63 if (TableRefreshUtils.isSingleTable(tableName, database) && !logicDataSourceNames.isEmpty()) {
64 ruleMetaData.getAttributes(MutableDataNodeRuleAttribute.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, tableName));
65 }
66 GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(
67 database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName);
68 Map<String, ShardingSphereSchema> schemaMap = GenericSchemaBuilder.build(Collections.singletonList(tableName), material);
69 return Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> optional.getTable(tableName))
70 .orElseGet(() -> new ShardingSphereTable(tableName, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
71 }
72
73 @Override
74 public Class<RenameTableStatement> getType() {
75 return RenameTableStatement.class;
76 }
77 }