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.statement.ddl.AlterTableStatement;
34
35 import java.sql.SQLException;
36 import java.util.Collection;
37 import java.util.Collections;
38 import java.util.LinkedList;
39 import java.util.Map;
40 import java.util.Optional;
41
42
43
44
45 public final class AlterTableStatementSchemaRefresher implements MetaDataRefresher<AlterTableStatement> {
46
47 @Override
48 public void refresh(final ModeContextManager modeContextManager, final ShardingSphereDatabase database, final Collection<String> logicDataSourceNames,
49 final String schemaName, final DatabaseType databaseType, final AlterTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException {
50 String tableName = TableRefreshUtils.getTableName(databaseType, sqlStatement.getTable().getTableName().getIdentifier());
51 AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), schemaName, logicDataSourceNames);
52 if (sqlStatement.getRenameTable().isPresent()) {
53 String renameTable = sqlStatement.getRenameTable().get().getTableName().getIdentifier().getValue();
54 alterSchemaMetaDataPOJO.getAlteredTables().add(getTable(database, logicDataSourceNames, schemaName, renameTable, props));
55 alterSchemaMetaDataPOJO.getDroppedTables().add(tableName);
56 } else {
57 alterSchemaMetaDataPOJO.getAlteredTables().add(getTable(database, logicDataSourceNames, schemaName, tableName, props));
58 }
59 modeContextManager.alterSchemaMetaData(alterSchemaMetaDataPOJO);
60 }
61
62 private ShardingSphereTable getTable(final ShardingSphereDatabase database, final Collection<String> logicDataSourceNames, final String schemaName,
63 final String tableName, final ConfigurationProperties props) throws SQLException {
64 RuleMetaData ruleMetaData = new RuleMetaData(new LinkedList<>(database.getRuleMetaData().getRules()));
65 if (TableRefreshUtils.isSingleTable(tableName, database)) {
66 ruleMetaData.getAttributes(MutableDataNodeRuleAttribute.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, tableName));
67 }
68 GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(
69 database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName);
70 Map<String, ShardingSphereSchema> schemaMap = GenericSchemaBuilder.build(Collections.singletonList(tableName), material);
71 return Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> optional.getTable(tableName))
72 .orElseGet(() -> new ShardingSphereTable(tableName, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
73 }
74
75 @Override
76 public Class<AlterTableStatement> getType() {
77 return AlterTableStatement.class;
78 }
79 }