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.view;
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.model.ShardingSphereView;
32 import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
33 import org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
34 import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateViewStatement;
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 CreateViewStatementSchemaRefresher implements MetaDataRefresher<CreateViewStatement> {
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 CreateViewStatement sqlStatement, final ConfigurationProperties props) throws SQLException {
51 String viewName = TableRefreshUtils.getTableName(databaseType, sqlStatement.getView().getTableName().getIdentifier());
52 RuleMetaData ruleMetaData = new RuleMetaData(new LinkedList<>(database.getRuleMetaData().getRules()));
53 if (TableRefreshUtils.isSingleTable(viewName, database)) {
54 ruleMetaData.getAttributes(MutableDataNodeRuleAttribute.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, viewName));
55 }
56 GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(
57 database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName);
58 Map<String, ShardingSphereSchema> schemaMap = GenericSchemaBuilder.build(Collections.singletonList(viewName), material);
59 Optional<ShardingSphereTable> actualTableMetaData = Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> optional.getTable(viewName));
60 if (actualTableMetaData.isPresent()) {
61 AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), schemaName, logicDataSourceNames);
62 alterSchemaMetaDataPOJO.getAlteredTables().add(actualTableMetaData.get());
63 alterSchemaMetaDataPOJO.getAlteredViews().add(new ShardingSphereView(viewName, sqlStatement.getViewDefinition()));
64 modeContextManager.alterSchemaMetaData(alterSchemaMetaDataPOJO);
65 }
66 }
67
68 @Override
69 public Class<CreateViewStatement> getType() {
70 return CreateViewStatement.class;
71 }
72 }