1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.sharding.rule;
19
20 import com.cedarsoftware.util.CaseInsensitiveMap;
21 import lombok.Getter;
22 import lombok.RequiredArgsConstructor;
23 import org.apache.shardingsphere.sharding.exception.metadata.ActualTableNotFoundException;
24 import org.apache.shardingsphere.sharding.exception.metadata.BindingTableNotFoundException;
25
26 import java.util.Collection;
27 import java.util.LinkedHashMap;
28 import java.util.Map;
29 import java.util.Optional;
30
31
32
33
34
35
36 @RequiredArgsConstructor
37 @Getter
38 public final class BindingTableRule {
39
40 private final Map<String, ShardingTable> shardingTables = new CaseInsensitiveMap<>();
41
42
43
44
45
46
47
48 public boolean hasLogicTable(final String logicTable) {
49 return shardingTables.containsKey(logicTable);
50 }
51
52
53
54
55
56
57
58
59
60
61
62
63 public String getBindingActualTable(final String dataSource, final String logicTable, final String otherLogicTable, final String otherActualTable) {
64 Optional<ShardingTable> otherShardingTable = Optional.ofNullable(shardingTables.get(otherLogicTable));
65 int index = otherShardingTable.map(optional -> optional.findActualTableIndex(dataSource, otherActualTable)).orElse(-1);
66 if (-1 == index) {
67 throw new ActualTableNotFoundException(dataSource, otherActualTable);
68 }
69 Optional<ShardingTable> shardingTable = Optional.ofNullable(shardingTables.get(logicTable));
70 if (shardingTable.isPresent()) {
71 return shardingTable.get().getActualDataNodes().get(index).getTableName();
72 }
73 throw new BindingTableNotFoundException(dataSource, logicTable, otherActualTable);
74 }
75
76
77
78
79
80
81 public Collection<String> getAllLogicTables() {
82 return shardingTables.keySet();
83 }
84
85
86
87
88
89
90
91
92
93
94 public Map<String, String> getLogicAndActualTables(final String dataSource, final String logicTable, final String actualTable, final Collection<String> availableLogicBindingTables) {
95 Map<String, String> result = new LinkedHashMap<>(availableLogicBindingTables.size(), 1F);
96 for (String each : availableLogicBindingTables) {
97 if (!each.equalsIgnoreCase(logicTable) && hasLogicTable(each)) {
98 result.put(each, getBindingActualTable(dataSource, each, logicTable, actualTable));
99 }
100 }
101 return result;
102 }
103 }