From 9df8a1dc613a59851d5478b207f8be0e8ea1005c Mon Sep 17 00:00:00 2001 From: "Juan Pan(Trista)" Date: Sun, 7 Jun 2020 21:56:26 +0800 Subject: [PATCH] Create ShardingAutoTableRuleConfiguration (#5939) * Create ShardingAutoTableRuleConfiguration * check style --- .../ShardingAutoTableRuleConfiguration.java | 51 ++++++++++ .../api/config/ShardingRuleConfiguration.java | 4 +- ...amlShardingAutoTableRuleConfiguration.java | 38 ++++++++ ...AutoTableRuleConfigurationYamlSwapper.java | 60 ++++++++++++ ...TableRuleConfigurationYamlSwapperTest.java | 94 +++++++++++++++++++ 5 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingAutoTableRuleConfiguration.java create mode 100644 shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/yaml/config/YamlShardingAutoTableRuleConfiguration.java create mode 100644 shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingAutoTableRuleConfigurationYamlSwapper.java create mode 100644 shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingAutoTableRuleConfigurationYamlSwapperTest.java diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingAutoTableRuleConfiguration.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingAutoTableRuleConfiguration.java new file mode 100644 index 0000000000..78ffddd739 --- /dev/null +++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingAutoTableRuleConfiguration.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.sharding.api.config; + +import com.google.common.base.Preconditions; +import com.google.common.base.Strings; +import lombok.Getter; +import lombok.Setter; +import org.apache.shardingsphere.sharding.api.config.strategy.ShardingStrategyConfiguration; + +/** + * Sharding auto table rule configuration. + * + */ +@Getter +@Setter +public class ShardingAutoTableRuleConfiguration { + + private final String logicTable; + + private final String actualDataSources; + + private ShardingStrategyConfiguration shardingStrategy; + + private KeyGeneratorConfiguration keyGenerator; + + public ShardingAutoTableRuleConfiguration(final String logicTable) { + this(logicTable, null); + } + + public ShardingAutoTableRuleConfiguration(final String logicTable, final String actualDataSources) { + Preconditions.checkArgument(!Strings.isNullOrEmpty(logicTable), "LogicTable is required."); + this.logicTable = logicTable; + this.actualDataSources = actualDataSources; + } +} diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingRuleConfiguration.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingRuleConfiguration.java index b9d3201e77..d227e699c1 100644 --- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingRuleConfiguration.java +++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingRuleConfiguration.java @@ -33,7 +33,9 @@ import java.util.LinkedList; public final class ShardingRuleConfiguration implements RuleConfiguration { private Collection tables = new LinkedList<>(); - + + private Collection autoTables = new LinkedList<>(); + private Collection bindingTableGroups = new LinkedList<>(); private Collection broadcastTables = new LinkedList<>(); diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/yaml/config/YamlShardingAutoTableRuleConfiguration.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/yaml/config/YamlShardingAutoTableRuleConfiguration.java new file mode 100644 index 0000000000..7c6d55bb94 --- /dev/null +++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/yaml/config/YamlShardingAutoTableRuleConfiguration.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.sharding.yaml.config; + +import lombok.Getter; +import lombok.Setter; +import org.apache.shardingsphere.infra.yaml.config.YamlConfiguration; + +/** + * Sharding auto table rule configuration for YAML. + */ +@Getter +@Setter +public final class YamlShardingAutoTableRuleConfiguration implements YamlConfiguration { + + private String logicTable; + + private String actualDataSources; + + private YamlShardingStrategyConfiguration shardingStrategy; + + private YamlKeyGeneratorConfiguration keyGenerator; +} diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingAutoTableRuleConfigurationYamlSwapper.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingAutoTableRuleConfigurationYamlSwapper.java new file mode 100644 index 0000000000..b6cc812297 --- /dev/null +++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingAutoTableRuleConfigurationYamlSwapper.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.sharding.yaml.swapper; + +import com.google.common.base.Preconditions; +import org.apache.shardingsphere.infra.yaml.swapper.YamlSwapper; +import org.apache.shardingsphere.sharding.api.config.ShardingAutoTableRuleConfiguration; +import org.apache.shardingsphere.sharding.yaml.config.YamlShardingAutoTableRuleConfiguration; + +/** + * Sharding auto table rule configuration YAML swapper. + */ +public final class ShardingAutoTableRuleConfigurationYamlSwapper implements YamlSwapper { + + private final ShardingStrategyConfigurationYamlSwapper shardingStrategyConfigurationYamlSwapper = new ShardingStrategyConfigurationYamlSwapper(); + + private final KeyGeneratorConfigurationYamlSwapper keyGeneratorConfigurationYamlSwapper = new KeyGeneratorConfigurationYamlSwapper(); + + @Override + public YamlShardingAutoTableRuleConfiguration swap(final ShardingAutoTableRuleConfiguration data) { + YamlShardingAutoTableRuleConfiguration result = new YamlShardingAutoTableRuleConfiguration(); + result.setLogicTable(data.getLogicTable()); + result.setActualDataSources(data.getActualDataSources()); + if (null != data.getShardingStrategy()) { + result.setShardingStrategy(shardingStrategyConfigurationYamlSwapper.swap(data.getShardingStrategy())); + } + if (null != data.getKeyGenerator()) { + result.setKeyGenerator(keyGeneratorConfigurationYamlSwapper.swap(data.getKeyGenerator())); + } + return result; + } + + @Override + public ShardingAutoTableRuleConfiguration swap(final YamlShardingAutoTableRuleConfiguration yamlConfiguration) { + Preconditions.checkNotNull(yamlConfiguration.getLogicTable(), "Logic table cannot be null."); + ShardingAutoTableRuleConfiguration result = new ShardingAutoTableRuleConfiguration(yamlConfiguration.getLogicTable(), yamlConfiguration.getActualDataSources()); + if (null != yamlConfiguration.getShardingStrategy()) { + result.setShardingStrategy(shardingStrategyConfigurationYamlSwapper.swap(yamlConfiguration.getShardingStrategy())); + } + if (null != yamlConfiguration.getKeyGenerator()) { + result.setKeyGenerator(keyGeneratorConfigurationYamlSwapper.swap(yamlConfiguration.getKeyGenerator())); + } + return result; + } +} diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingAutoTableRuleConfigurationYamlSwapperTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingAutoTableRuleConfigurationYamlSwapperTest.java new file mode 100644 index 0000000000..cb28f97bab --- /dev/null +++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingAutoTableRuleConfigurationYamlSwapperTest.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.sharding.yaml.swapper; + +import org.apache.shardingsphere.infra.yaml.swapper.YamlSwapper; +import org.apache.shardingsphere.sharding.api.config.KeyGeneratorConfiguration; +import org.apache.shardingsphere.sharding.api.config.ShardingAutoTableRuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.ShardingStrategyConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.StandardShardingStrategyConfiguration; +import org.apache.shardingsphere.sharding.yaml.config.YamlKeyGeneratorConfiguration; +import org.apache.shardingsphere.sharding.yaml.config.YamlShardingAutoTableRuleConfiguration; +import org.apache.shardingsphere.sharding.yaml.config.YamlShardingStrategyConfiguration; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.lang.reflect.Field; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public final class ShardingAutoTableRuleConfigurationYamlSwapperTest { + + @Mock + private ShardingStrategyConfigurationYamlSwapper shardingStrategyConfigurationYamlSwapper; + + @Mock + private KeyGeneratorConfigurationYamlSwapper keyGeneratorConfigurationYamlSwapper; + + private final ShardingAutoTableRuleConfigurationYamlSwapper tableRuleConfigurationYamlSwapper = new ShardingAutoTableRuleConfigurationYamlSwapper(); + + @Before + public void setUp() throws ReflectiveOperationException { + setSwapper("shardingStrategyConfigurationYamlSwapper", shardingStrategyConfigurationYamlSwapper); + when(shardingStrategyConfigurationYamlSwapper.swap(ArgumentMatchers.any())).thenReturn(mock(YamlShardingStrategyConfiguration.class)); + setSwapper("keyGeneratorConfigurationYamlSwapper", keyGeneratorConfigurationYamlSwapper); + when(keyGeneratorConfigurationYamlSwapper.swap(ArgumentMatchers.any())).thenReturn(mock(YamlKeyGeneratorConfiguration.class)); + } + + private void setSwapper(final String swapperFieldName, final YamlSwapper swapperFieldValue) throws ReflectiveOperationException { + Field field = ShardingAutoTableRuleConfigurationYamlSwapper.class.getDeclaredField(swapperFieldName); + field.setAccessible(true); + field.set(tableRuleConfigurationYamlSwapper, swapperFieldValue); + } + + @Test + public void assertSwapToYamlWithMinProperties() { + YamlShardingAutoTableRuleConfiguration actual = tableRuleConfigurationYamlSwapper.swap(new ShardingAutoTableRuleConfiguration("tbl", "ds0,ds1")); + assertThat(actual.getLogicTable(), is("tbl")); + assertThat(actual.getActualDataSources(), is("ds0,ds1")); + assertNull(actual.getShardingStrategy()); + assertNull(actual.getKeyGenerator()); + } + + @Test + public void assertSwapToYamlWithMaxProperties() { + ShardingAutoTableRuleConfiguration shardingTableRuleConfiguration = new ShardingAutoTableRuleConfiguration("tbl", "ds0,ds1"); + shardingTableRuleConfiguration.setShardingStrategy(mock(StandardShardingStrategyConfiguration.class)); + shardingTableRuleConfiguration.setKeyGenerator(mock(KeyGeneratorConfiguration.class)); + YamlShardingAutoTableRuleConfiguration actual = tableRuleConfigurationYamlSwapper.swap(shardingTableRuleConfiguration); + assertThat(actual.getLogicTable(), is("tbl")); + assertThat(actual.getActualDataSources(), is("ds0,ds1")); + assertNotNull(actual.getShardingStrategy()); + assertNotNull(actual.getKeyGenerator()); + } + + @Test(expected = NullPointerException.class) + public void assertSwapToObjectWithoutLogicTable() { + new ShardingAutoTableRuleConfigurationYamlSwapper().swap(new YamlShardingAutoTableRuleConfiguration()); + } +} -- GitLab