Skip to content

Commit

Permalink
Simplify Create/Alter DatabaseRuleRDLExecuteEngine (#29844)
Browse files Browse the repository at this point in the history
* Simplify CreateDatabaseRuleRDLExecuteEngine and AlterDatabaseRuleRDLExecuteEngine

* Fix LoadSingleTableStatementUpdaterTest
  • Loading branch information
RaigorJiang committed Jan 25, 2024
1 parent 9b210f8 commit dc08f57
Show file tree
Hide file tree
Showing 19 changed files with 38 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ private void checkToBeAlteredEncryptors(final AlterEncryptRuleStatement sqlState
}

@Override
public EncryptRuleConfiguration buildToBeAlteredRuleConfiguration(final AlterEncryptRuleStatement sqlStatement) {
public EncryptRuleConfiguration buildToBeAlteredRuleConfiguration(final EncryptRuleConfiguration currentRuleConfig, final AlterEncryptRuleStatement sqlStatement) {
return EncryptRuleStatementConverter.convert(sqlStatement.getRules());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ private Collection<String> getToBeAlteredMaskTableNames(final AlterMaskRuleState
}

@Override
public MaskRuleConfiguration buildToBeAlteredRuleConfiguration(final AlterMaskRuleStatement sqlStatement) {
public MaskRuleConfiguration buildToBeAlteredRuleConfiguration(final MaskRuleConfiguration currentRuleConfig, final AlterMaskRuleStatement sqlStatement) {
return MaskRuleStatementConverter.convert(sqlStatement.getRules());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ void assertUpdate() {
new AlgorithmSegment("MD5", new Properties()));
MaskRuleSegment ruleSegment = new MaskRuleSegment("t_order", Collections.singleton(columnSegment));
AlterMaskRuleStatement sqlStatement = new AlterMaskRuleStatement(Collections.singleton(ruleSegment));
MaskRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(sqlStatement);
MaskRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(currentRuleConfig, sqlStatement);
executor.updateCurrentRuleConfiguration(currentRuleConfig, toBeAlteredRuleConfig);
assertThat(currentRuleConfig.getMaskAlgorithms().size(), is(1));
assertTrue(currentRuleConfig.getMaskAlgorithms().containsKey("t_order_order_id_md5"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public void checkSQLStatement(final ShardingSphereDatabase database, final Alter
}

@Override
public ReadwriteSplittingRuleConfiguration buildToBeAlteredRuleConfiguration(final AlterReadwriteSplittingRuleStatement sqlStatement) {
public ReadwriteSplittingRuleConfiguration buildToBeAlteredRuleConfiguration(final ReadwriteSplittingRuleConfiguration currentRuleConfig, final AlterReadwriteSplittingRuleStatement sqlStatement) {
return ReadwriteSplittingRuleStatementConverter.convert(sqlStatement.getRules());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public final class AlterDefaultShadowAlgorithmExecutor implements DatabaseRuleAl
private static final String DEFAULT_ALGORITHM_NAME = "default_shadow_algorithm";

@Override
public ShadowRuleConfiguration buildToBeAlteredRuleConfiguration(final AlterDefaultShadowAlgorithmStatement sqlStatement) {
public ShadowRuleConfiguration buildToBeAlteredRuleConfiguration(final ShadowRuleConfiguration currentRuleConfig, final AlterDefaultShadowAlgorithmStatement sqlStatement) {
ShadowRuleConfiguration result = new ShadowRuleConfiguration();
result.setShadowAlgorithms(buildAlgorithmMap(sqlStatement));
result.setDefaultShadowAlgorithmName(DEFAULT_ALGORITHM_NAME);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
public final class AlterShadowRuleExecutor implements DatabaseRuleAlterExecutor<AlterShadowRuleStatement, ShadowRuleConfiguration> {

@Override
public ShadowRuleConfiguration buildToBeAlteredRuleConfiguration(final AlterShadowRuleStatement sqlStatement) {
public ShadowRuleConfiguration buildToBeAlteredRuleConfiguration(final ShadowRuleConfiguration currentRuleConfig, final AlterShadowRuleStatement sqlStatement) {
return ShadowRuleStatementConverter.convert(sqlStatement.getRules());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ private Optional<ShardingStrategyConfiguration> getStrategyConfiguration(final S
}

@Override
public ShardingRuleConfiguration buildToBeAlteredRuleConfiguration(final AlterDefaultShardingStrategyStatement sqlStatement) {
public ShardingRuleConfiguration buildToBeAlteredRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final AlterDefaultShardingStrategyStatement sqlStatement) {
ShardingRuleConfiguration result = new ShardingRuleConfiguration();
if ("none".equalsIgnoreCase(sqlStatement.getStrategyType())) {
setStrategyConfiguration(result, sqlStatement.getDefaultType(), new NoneShardingStrategyConfiguration());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ private void checkToBeReferencedShardingTablesExisted(final String databaseName,
}

private void checkShardingTableReferenceRulesValid(final AlterShardingTableReferenceRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
Collection<ShardingTableReferenceRuleConfiguration> toBeAlteredShardingTableReferenceRules = buildToBeAlteredRuleConfiguration(sqlStatement).getBindingTableGroups();
Collection<ShardingTableReferenceRuleConfiguration> toBeAlteredShardingTableReferenceRules = buildToBeAlteredRuleConfiguration(currentRuleConfig, sqlStatement).getBindingTableGroups();
Collection<String> ruleNames = toBeAlteredShardingTableReferenceRules.stream().map(ShardingTableReferenceRuleConfiguration::getName).collect(Collectors.toList());
ShardingSpherePreconditions.checkState(ShardingTableRuleStatementChecker.isValidBindingTableGroups(toBeAlteredShardingTableReferenceRules, currentRuleConfig),
() -> new InvalidRuleConfigurationException("sharding table", ruleNames, Collections.singleton("invalid sharding table reference.")));
Expand Down Expand Up @@ -112,7 +112,7 @@ private boolean containsIgnoreCase(final Collection<String> currentRules, final
}

@Override
public ShardingRuleConfiguration buildToBeAlteredRuleConfiguration(final AlterShardingTableReferenceRuleStatement sqlStatement) {
public ShardingRuleConfiguration buildToBeAlteredRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final AlterShardingTableReferenceRuleStatement sqlStatement) {
ShardingRuleConfiguration result = new ShardingRuleConfiguration();
sqlStatement.getRules().forEach(each -> result.getBindingTableGroups().add(new ShardingTableReferenceRuleConfiguration(each.getName(), each.getReference())));
return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public void checkSQLStatement(final ShardingSphereDatabase database, final Alter
}

@Override
public ShardingRuleConfiguration buildToBeAlteredRuleConfiguration(final AlterShardingTableRuleStatement sqlStatement) {
public ShardingRuleConfiguration buildToBeAlteredRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final AlterShardingTableRuleStatement sqlStatement) {
return ShardingTableRuleStatementConverter.convert(sqlStatement.getRules());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ void assertAlterDefaultTableShardingStrategy() {
currentRuleConfig.setDefaultTableShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "orderAlgorithm"));
currentRuleConfig.getShardingAlgorithms().put("order_id_algorithm", null);
executor.checkSQLStatement(database, statement, currentRuleConfig);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(statement);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(currentRuleConfig, statement);
executor.updateCurrentRuleConfiguration(currentRuleConfig, toBeAlteredRuleConfig);
StandardShardingStrategyConfiguration defaultTableShardingStrategy = (StandardShardingStrategyConfiguration) currentRuleConfig.getDefaultTableShardingStrategy();
assertThat(defaultTableShardingStrategy.getShardingAlgorithmName(), is("default_table_order_id_algorithm"));
Expand All @@ -108,7 +108,7 @@ void assertAlterDefaultDatabaseShardingStrategy() {
ShardingRuleConfiguration currentRuleConfig = new ShardingRuleConfiguration();
currentRuleConfig.setDefaultDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "orderAlgorithm"));
executor.checkSQLStatement(database, statement, currentRuleConfig);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(statement);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(currentRuleConfig, statement);
executor.updateCurrentRuleConfiguration(currentRuleConfig, toBeAlteredRuleConfig);
StandardShardingStrategyConfiguration defaultDatabaseShardingStrategy = (StandardShardingStrategyConfiguration) currentRuleConfig.getDefaultDatabaseShardingStrategy();
assertThat(defaultDatabaseShardingStrategy.getShardingAlgorithmName(), is("default_database_inline"));
Expand All @@ -122,7 +122,7 @@ void assertAlterDefaultTableShardingStrategyWithNoneShardingStrategyType() {
currentRuleConfig.setDefaultTableShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "orderAlgorithm"));
currentRuleConfig.getShardingAlgorithms().put("order_id_algorithm", null);
executor.checkSQLStatement(database, statement, currentRuleConfig);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(statement);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(currentRuleConfig, statement);
executor.updateCurrentRuleConfiguration(currentRuleConfig, toBeAlteredRuleConfig);
NoneShardingStrategyConfiguration defaultTableShardingStrategy = (NoneShardingStrategyConfiguration) currentRuleConfig.getDefaultTableShardingStrategy();
assertThat(defaultTableShardingStrategy.getType(), is(""));
Expand All @@ -135,7 +135,7 @@ void assertAlterDefaultDatabaseShardingStrategyWithNoneShardingStrategyType() {
ShardingRuleConfiguration currentRuleConfig = new ShardingRuleConfiguration();
currentRuleConfig.setDefaultDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "orderAlgorithm"));
executor.checkSQLStatement(database, statement, currentRuleConfig);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(statement);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(currentRuleConfig, statement);
executor.updateCurrentRuleConfiguration(currentRuleConfig, toBeAlteredRuleConfig);
NoneShardingStrategyConfiguration defaultDatabaseShardingStrategy = (NoneShardingStrategyConfiguration) currentRuleConfig.getDefaultDatabaseShardingStrategy();
assertThat(defaultDatabaseShardingStrategy.getType(), is(""));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void before() {
void assertUpdate() {
AlterShardingTableRuleStatement statement = new AlterShardingTableRuleStatement(Arrays.asList(createCompleteAutoTableRule("t_order_item"), createCompleteTableRule("t_order")));
executor.checkSQLStatement(database, statement, currentRuleConfig);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(statement);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(currentRuleConfig, statement);
executor.updateCurrentRuleConfiguration(currentRuleConfig, toBeAlteredRuleConfig);
assertThat(currentRuleConfig.getTables().size(), is(1));
ShardingTableRuleConfiguration tableRule = currentRuleConfig.getTables().iterator().next();
Expand All @@ -103,7 +103,7 @@ void assertUpdate() {
void assertUpdateWithDifferentCase() {
AlterShardingTableRuleStatement statement = new AlterShardingTableRuleStatement(Arrays.asList(createCompleteAutoTableRule("T_ORDER_ITEM"), createCompleteTableRule("T_ORDER")));
executor.checkSQLStatement(database, statement, currentRuleConfig);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(statement);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(currentRuleConfig, statement);
executor.updateCurrentRuleConfiguration(currentRuleConfig, toBeAlteredRuleConfig);
assertThat(currentRuleConfig.getTables().size(), is(1));
ShardingTableRuleConfiguration tableRule = currentRuleConfig.getTables().iterator().next();
Expand All @@ -128,7 +128,7 @@ void assertUpdateWithDifferentCase() {
void assertUpdateTableType() {
AlterShardingTableRuleStatement statement = new AlterShardingTableRuleStatement(Arrays.asList(createCompleteAutoTableRule("t_order"), createCompleteTableRule("t_order_item")));
executor.checkSQLStatement(database, statement, currentRuleConfig);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(statement);
ShardingRuleConfiguration toBeAlteredRuleConfig = executor.buildToBeAlteredRuleConfiguration(currentRuleConfig, statement);
executor.updateCurrentRuleConfiguration(currentRuleConfig, toBeAlteredRuleConfig);
assertThat(currentRuleConfig.getTables().size(), is(1));
ShardingTableRuleConfiguration tableRule = currentRuleConfig.getTables().iterator().next();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@ public interface DatabaseRuleAlterExecutor<T extends SQLStatement, R extends Rul
/**
* Build to be altered rule configuration.
*
* @param currentRuleConfig current rule configuration
* @param sqlStatement SQL statement
* @return to be altered rule configuration
*/
R buildToBeAlteredRuleConfiguration(T sqlStatement);
R buildToBeAlteredRuleConfiguration(R currentRuleConfig, T sqlStatement);

/**
* TODO Remove temporary default implementation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,12 +146,14 @@ private Collection<String> getLogicDataSources(final ShardingSphereDatabase data
@Override
public SingleRuleConfiguration buildToBeCreatedRuleConfiguration(final SingleRuleConfiguration currentRuleConfig, final LoadSingleTableStatement sqlStatement) {
SingleRuleConfiguration result = new SingleRuleConfiguration();
result.getTables().addAll(currentRuleConfig.getTables());
result.getTables().addAll(getRequiredTables(currentRuleConfig, sqlStatement));
return result;
}

@Override
public void updateCurrentRuleConfiguration(final SingleRuleConfiguration currentRuleConfig, final SingleRuleConfiguration toBeCreatedRuleConfig) {
currentRuleConfig.getTables().clear();
currentRuleConfig.getTables().addAll(toBeCreatedRuleConfig.getTables());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ private void checkStorageUnitExist(final ShardingSphereDatabase database, final
public SingleRuleConfiguration buildToBeCreatedRuleConfiguration(final SingleRuleConfiguration currentRuleConfig, final SetDefaultSingleTableStorageUnitStatement sqlStatement) {
SingleRuleConfiguration result = new SingleRuleConfiguration();
result.setDefaultDataSource(sqlStatement.getDefaultStorageUnit());
result.getTables().addAll(currentRuleConfig.getTables());
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,21 @@
package org.apache.shardingsphere.single.distsql.handler.update;

import com.google.common.base.Splitter;
import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.NoSuchTableException;
import org.apache.shardingsphere.distsql.handler.exception.rule.MissingRequiredRuleException;
import org.apache.shardingsphere.distsql.handler.type.rdl.rule.database.DatabaseRuleAlterExecutor;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.datanode.DataNode;
import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.NoSuchTableException;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
import org.apache.shardingsphere.single.api.constant.SingleTableConstants;
import org.apache.shardingsphere.single.distsql.statement.rdl.UnloadSingleTableStatement;
import org.apache.shardingsphere.single.exception.SingleTableNotFoundException;
import org.apache.shardingsphere.single.rule.SingleRule;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -88,19 +86,20 @@ private void checkTableRuleExist(final String databaseName, final DatabaseType d
}

@Override
public SingleRuleConfiguration buildToBeAlteredRuleConfiguration(final UnloadSingleTableStatement sqlStatement) {
public SingleRuleConfiguration buildToBeAlteredRuleConfiguration(final SingleRuleConfiguration currentRuleConfig, final UnloadSingleTableStatement sqlStatement) {
SingleRuleConfiguration result = new SingleRuleConfiguration();
result.getTables().addAll(sqlStatement.isUnloadAllTables() ? Collections.singletonList(SingleTableConstants.ASTERISK) : sqlStatement.getTables());
currentRuleConfig.getDefaultDataSource().ifPresent(result::setDefaultDataSource);
if (!sqlStatement.isUnloadAllTables()) {
result.getTables().addAll(currentRuleConfig.getTables());
result.getTables().removeIf(each -> sqlStatement.getTables().contains(extractTableName(each)));
}
return result;
}

@Override
public void updateCurrentRuleConfiguration(final SingleRuleConfiguration currentRuleConfig, final SingleRuleConfiguration toBeAlteredRuleConfig) {
if (toBeAlteredRuleConfig.getTables().contains(SingleTableConstants.ASTERISK)) {
currentRuleConfig.getTables().clear();
} else {
currentRuleConfig.getTables().removeIf(each -> toBeAlteredRuleConfig.getTables().contains(extractTableName(each)));
}
currentRuleConfig.getTables().clear();
currentRuleConfig.getTables().addAll(toBeAlteredRuleConfig.getTables());
}

private String extractTableName(final String tableNode) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ void assertBuild() {
void assertUpdate() {
Collection<String> currentTables = new LinkedList<>(Collections.singletonList("ds_0.foo"));
SingleRuleConfiguration currentConfig = new SingleRuleConfiguration(currentTables, null);
SingleRuleConfiguration toBeCreatedRuleConfig = new SingleRuleConfiguration(Collections.singletonList("ds_0.bar"), null);
LoadSingleTableStatement sqlStatement = new LoadSingleTableStatement(Collections.singletonList(new SingleTableSegment("ds_0", null, "bar")));
SingleRuleConfiguration toBeCreatedRuleConfig = executor.buildToBeCreatedRuleConfiguration(currentConfig, sqlStatement);
executor.updateCurrentRuleConfiguration(currentConfig, toBeCreatedRuleConfig);
Iterator<String> iterator = currentConfig.getTables().iterator();
assertThat(iterator.next(), is("ds_0.foo"));
Expand Down
Loading

0 comments on commit dc08f57

Please sign in to comment.