RaigorJiang commented on a change in pull request #16172:
URL: https://github.com/apache/shardingsphere/pull/16172#discussion_r829718509
##########
File path:
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingBindingTableRulesStatementUpdater.java
##########
@@ -77,6 +88,73 @@ private void checkToBeAlteredDuplicateBindingTables(final
String schemaName, fin
}
}
+ private void checkToBeAlteredCanBindBindingTables(final
AlterShardingBindingTableRulesStatement sqlStatement, final
ShardingRuleConfiguration currentRuleConfig) throws DistSQLException {
+ Collection<String> cannotBindRules =
sqlStatement.getRules().stream().map(BindingTableRuleSegment::getTableGroups)
+ .filter(each -> !canBind(currentRuleConfig,
each)).collect(Collectors.toCollection(LinkedList::new));
+ DistSQLException.predictionThrow(cannotBindRules.isEmpty(),
+ () -> new InvalidRuleConfigurationException("binding",
cannotBindRules, Collections.singleton("Unable to bind with different sharding
strategies")));
+ }
+
+ private boolean canBind(final ShardingRuleConfiguration currentRuleConfig,
final String bindingRule) {
+ LinkedList<String> shardingTables = new
LinkedList<>(Splitter.on(",").trimResults().splitToList(bindingRule));
+ Collection<String> bindableShardingTables =
getBindableShardingTable(currentRuleConfig, shardingTables.getFirst());
+ return bindableShardingTables.containsAll(shardingTables);
+ }
+
+ private Collection<String> getBindableShardingTable(final
ShardingRuleConfiguration currentRuleConfig, final String shardingTable) {
Review comment:
`getBindableShardingTables` is better, because the result is a
collection.
##########
File path:
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingBindingTableRulesStatementUpdater.java
##########
@@ -77,6 +88,73 @@ private void checkToBeAlteredDuplicateBindingTables(final
String schemaName, fin
}
}
+ private void checkToBeAlteredCanBindBindingTables(final
AlterShardingBindingTableRulesStatement sqlStatement, final
ShardingRuleConfiguration currentRuleConfig) throws DistSQLException {
+ Collection<String> cannotBindRules =
sqlStatement.getRules().stream().map(BindingTableRuleSegment::getTableGroups)
+ .filter(each -> !canBind(currentRuleConfig,
each)).collect(Collectors.toCollection(LinkedList::new));
+ DistSQLException.predictionThrow(cannotBindRules.isEmpty(),
+ () -> new InvalidRuleConfigurationException("binding",
cannotBindRules, Collections.singleton("Unable to bind with different sharding
strategies")));
+ }
+
+ private boolean canBind(final ShardingRuleConfiguration currentRuleConfig,
final String bindingRule) {
Review comment:
`canBind ` is not a good name for method, can `isValid` be better? or
some else
##########
File path:
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingBindingTableRulesStatementUpdater.java
##########
@@ -77,6 +88,73 @@ private void checkToBeAlteredDuplicateBindingTables(final
String schemaName, fin
}
}
+ private void checkToBeAlteredCanBindBindingTables(final
AlterShardingBindingTableRulesStatement sqlStatement, final
ShardingRuleConfiguration currentRuleConfig) throws DistSQLException {
+ Collection<String> cannotBindRules =
sqlStatement.getRules().stream().map(BindingTableRuleSegment::getTableGroups)
+ .filter(each -> !canBind(currentRuleConfig,
each)).collect(Collectors.toCollection(LinkedList::new));
+ DistSQLException.predictionThrow(cannotBindRules.isEmpty(),
+ () -> new InvalidRuleConfigurationException("binding",
cannotBindRules, Collections.singleton("Unable to bind with different sharding
strategies")));
+ }
+
+ private boolean canBind(final ShardingRuleConfiguration currentRuleConfig,
final String bindingRule) {
+ LinkedList<String> shardingTables = new
LinkedList<>(Splitter.on(",").trimResults().splitToList(bindingRule));
+ Collection<String> bindableShardingTables =
getBindableShardingTable(currentRuleConfig, shardingTables.getFirst());
+ return bindableShardingTables.containsAll(shardingTables);
+ }
+
+ private Collection<String> getBindableShardingTable(final
ShardingRuleConfiguration currentRuleConfig, final String shardingTable) {
+ Collection<String> result = new ArrayList<>();
+ Optional<ShardingTableRuleConfiguration> tableRule =
getFromTable(currentRuleConfig.getTables(), shardingTable);
+ tableRule.ifPresent(op ->
result.addAll(getBindableShardingTable(currentRuleConfig, op)));
+ Optional<ShardingAutoTableRuleConfiguration> autoTableRule =
getFromAutoTable(currentRuleConfig.getAutoTables(), shardingTable);
+ autoTableRule.ifPresent(op ->
result.addAll(getBindableShardingAutoTable(currentRuleConfig, op)));
+ return result;
+ }
+
+ private Collection<String> getBindableShardingTable(final
ShardingRuleConfiguration currentRuleConfig, final
ShardingTableRuleConfiguration tableRule) {
+ return currentRuleConfig.getTables().stream()
+ .filter(each ->
hasSameShardingStrategy(each.getTableShardingStrategy(),
tableRule.getTableShardingStrategy()))
+ .filter(each ->
hasSameShardingStrategy(each.getDatabaseShardingStrategy(),
tableRule.getDatabaseShardingStrategy()))
+
.map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toSet());
+ }
+
+ private Collection<String> getBindableShardingAutoTable(final
ShardingRuleConfiguration currentRuleConfig, final
ShardingAutoTableRuleConfiguration autoTableRule) {
+ return currentRuleConfig.getAutoTables().stream()
+ .filter(each ->
hasSameShardingStrategy(each.getShardingStrategy(),
autoTableRule.getShardingStrategy()))
+
.map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toSet());
+ }
+
+ private Optional<ShardingAutoTableRuleConfiguration>
getFromAutoTable(final Collection<ShardingAutoTableRuleConfiguration>
autoTableConfigurations, final String tableName) {
+ return autoTableConfigurations.stream().filter(each ->
each.getLogicTable().equals(tableName)).findAny();
+ }
+
+ private Optional<ShardingTableRuleConfiguration> getFromTable(final
Collection<ShardingTableRuleConfiguration> tableConfigurations, final String
tableName) {
Review comment:
Sorry, we don't get the ShardingTableRuleConfiguration `from` table,
maybe `getConfigurationForTable` or `getConfigurationByTableName`
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]