1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.infra.metadata.database.schema.reviser.schema;
19
20 import lombok.RequiredArgsConstructor;
21 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
22 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
23 import org.apache.shardingsphere.infra.metadata.database.schema.reviser.table.TableMetaDataReviseEngine;
24 import org.apache.shardingsphere.infra.metadata.database.schema.reviser.MetaDataReviseEntry;
25 import org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
26 import org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
27 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
28 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
29
30 import javax.sql.DataSource;
31 import java.util.Collection;
32 import java.util.Map.Entry;
33 import java.util.Optional;
34 import java.util.stream.Collectors;
35
36
37
38
39 @RequiredArgsConstructor
40 public final class SchemaMetaDataReviseEngine {
41
42 private final Collection<ShardingSphereRule> rules;
43
44 private final ConfigurationProperties props;
45
46 private final DatabaseType databaseType;
47
48 private final DataSource dataSource;
49
50
51
52
53
54
55
56 @SuppressWarnings({"rawtypes", "unchecked"})
57 public SchemaMetaData revise(final SchemaMetaData originalMetaData) {
58 SchemaMetaData result = originalMetaData;
59 for (Entry<ShardingSphereRule, MetaDataReviseEntry> entry : OrderedSPILoader.getServices(MetaDataReviseEntry.class, rules).entrySet()) {
60 result = revise(result, entry.getKey(), entry.getValue());
61 }
62 return result;
63 }
64
65 private <T extends ShardingSphereRule> SchemaMetaData revise(final SchemaMetaData originalMetaData, final T rule, final MetaDataReviseEntry<T> reviseEntry) {
66 TableMetaDataReviseEngine<T> tableMetaDataReviseEngine = new TableMetaDataReviseEngine<>(rule, databaseType, dataSource, reviseEntry);
67 Optional<? extends SchemaTableAggregationReviser<T>> aggregationReviser = reviseEntry.getSchemaTableAggregationReviser(props);
68 if (!aggregationReviser.isPresent()) {
69 return new SchemaMetaData(originalMetaData.getName(), originalMetaData.getTables().stream().map(tableMetaDataReviseEngine::revise).collect(Collectors.toList()));
70 }
71 for (TableMetaData each : originalMetaData.getTables()) {
72 aggregationReviser.get().add(tableMetaDataReviseEngine.revise(each));
73 }
74 return new SchemaMetaData(originalMetaData.getName(), aggregationReviser.get().aggregate(rule));
75 }
76 }