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.database.connector.core.metadata.data.model.SchemaMetaData;
22 import org.apache.shardingsphere.database.connector.core.metadata.data.model.TableMetaData;
23 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
24 import org.apache.shardingsphere.infra.metadata.database.schema.reviser.MetaDataReviseEntry;
25 import org.apache.shardingsphere.infra.metadata.database.schema.reviser.table.TableMetaDataReviseEngine;
26 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
27 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
28
29 import java.util.Collection;
30 import java.util.Map.Entry;
31 import java.util.Optional;
32 import java.util.stream.Collectors;
33
34
35
36
37 @RequiredArgsConstructor
38 public final class SchemaMetaDataReviseEngine {
39
40 private final Collection<ShardingSphereRule> rules;
41
42 private final ConfigurationProperties props;
43
44
45
46
47
48
49
50 @SuppressWarnings({"rawtypes", "unchecked"})
51 public SchemaMetaData revise(final SchemaMetaData originalMetaData) {
52 SchemaMetaData result = originalMetaData;
53 for (Entry<ShardingSphereRule, MetaDataReviseEntry> entry : OrderedSPILoader.getServices(MetaDataReviseEntry.class, rules).entrySet()) {
54 result = revise(result, entry.getKey(), entry.getValue());
55 }
56 return result;
57 }
58
59 private <T extends ShardingSphereRule> SchemaMetaData revise(final SchemaMetaData originalMetaData, final T rule, final MetaDataReviseEntry<T> reviseEntry) {
60 TableMetaDataReviseEngine<T> tableMetaDataReviseEngine = new TableMetaDataReviseEngine<>(rule, reviseEntry);
61 Optional<? extends SchemaTableAggregationReviser<T>> aggregationReviser = reviseEntry.getSchemaTableAggregationReviser(props);
62 if (!aggregationReviser.isPresent()) {
63 return new SchemaMetaData(originalMetaData.getName(), originalMetaData.getTables().stream().map(tableMetaDataReviseEngine::revise).collect(Collectors.toList()));
64 }
65 for (TableMetaData each : originalMetaData.getTables()) {
66 aggregationReviser.get().add(tableMetaDataReviseEngine.revise(each));
67 }
68 return new SchemaMetaData(originalMetaData.getName(), aggregationReviser.get().aggregate(rule));
69 }
70 }