ShardingRuleTest.java 17.6 KB
Newer Older
T
terrymanu 已提交
1
/*
2 3 4 5 6 7
 * 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
T
terrymanu 已提交
8
 *
T
terrymanu 已提交
9
 *     http://www.apache.org/licenses/LICENSE-2.0
T
terrymanu 已提交
10 11 12 13 14 15 16 17
 *
 * 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.
 */

18
package org.apache.shardingsphere.sharding.rule;
T
terrymanu 已提交
19

20
import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
L
Liang Zhang 已提交
21 22
import org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurationException;
import org.apache.shardingsphere.infra.datanode.DataNode;
23 24 25
import org.apache.shardingsphere.sharding.algorithm.keygen.SnowflakeKeyGenerateAlgorithm;
import org.apache.shardingsphere.sharding.algorithm.keygen.fixture.IncrementKeyGenerateAlgorithm;
import org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineShardingAlgorithm;
26
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
27
import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
L
Liang Zhang 已提交
28 29 30
import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
import org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
T
tianbin 已提交
31
import org.junit.Test;
32

L
Liang Zhang 已提交
33 34 35 36 37 38 39 40 41 42 43
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Properties;

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;

T
terrymanu 已提交
44 45
public final class ShardingRuleTest {
    
T
terrymanu 已提交
46 47
    @Test(expected = IllegalArgumentException.class)
    public void assertNewShardingRuleWithEmptyDataSourceNames() {
L
Liang Zhang 已提交
48
        new ShardingRule(new ShardingRuleConfiguration(), Collections.emptyList());
T
terrymanu 已提交
49 50
    }
    
51
    @Test
T
terrymanu 已提交
52 53 54 55 56
    public void assertNewShardingRuleWithMaximumConfiguration() {
        ShardingRule actual = createMaximumShardingRule();
        assertThat(actual.getTableRules().size(), is(2));
        assertThat(actual.getBindingTableRules().size(), is(1));
        assertThat(actual.getBindingTableRules().iterator().next().getTableRules().size(), is(2));
57
        assertThat(actual.getBroadcastTables(), is(Collections.singletonList("BROADCAST_TABLE")));
58
        assertThat(actual.getDefaultKeyGenerateAlgorithm(), instanceOf(IncrementKeyGenerateAlgorithm.class));
59 60
    }
    
T
terrymanu 已提交
61
    @Test
T
terrymanu 已提交
62 63 64 65 66
    public void assertNewShardingRuleWithMinimumConfiguration() {
        ShardingRule actual = createMinimumShardingRule();
        assertThat(actual.getTableRules().size(), is(1));
        assertTrue(actual.getBindingTableRules().isEmpty());
        assertTrue(actual.getBroadcastTables().isEmpty());
67
        assertThat(actual.getDefaultKeyGenerateAlgorithm(), instanceOf(SnowflakeKeyGenerateAlgorithm.class));
T
terrymanu 已提交
68 69 70
    }
    
    @Test
T
terrymanu 已提交
71 72
    public void assertFindTableRule() {
        assertTrue(createMaximumShardingRule().findTableRule("logic_Table").isPresent());
T
terrymanu 已提交
73 74 75
    }
    
    @Test
T
terrymanu 已提交
76 77
    public void assertNotFindTableRule() {
        assertFalse(createMaximumShardingRule().findTableRule("other_Table").isPresent());
T
terrymanu 已提交
78 79 80
    }
    
    @Test
T
terrymanu 已提交
81 82 83 84 85 86 87 88 89
    public void assertFindTableRuleByActualTable() {
        assertTrue(createMaximumShardingRule().findTableRuleByActualTable("table_0").isPresent());
    }
    
    @Test
    public void assertNotFindTableRuleByActualTable() {
        assertFalse(createMaximumShardingRule().findTableRuleByActualTable("table_3").isPresent());
    }
    
90 91 92 93 94 95 96 97 98 99
    @Test
    public void assertFindLogicTableByActualTable() {
        assertTrue(createMaximumShardingRule().findLogicTableByActualTable("table_0").isPresent());
    }
    
    @Test
    public void assertNotFindLogicTableByActualTable() {
        assertFalse(createMaximumShardingRule().findLogicTableByActualTable("table_3").isPresent());
    }
    
T
terrymanu 已提交
100 101 102 103 104 105 106 107 108 109 110 111
    @Test
    public void assertGetTableRuleWithShardingTable() {
        TableRule actual = createMaximumShardingRule().getTableRule("Logic_Table");
        assertThat(actual.getLogicTable(), is("logic_table"));
    }
    
    @Test
    public void assertGetTableRuleWithBroadcastTable() {
        TableRule actual = createMaximumShardingRule().getTableRule("Broadcast_Table");
        assertThat(actual.getLogicTable(), is("broadcast_table"));
    }
    
112
    @Test(expected = ShardingSphereConfigurationException.class)
T
terrymanu 已提交
113 114
    public void assertGetTableRuleFailure() {
        createMinimumShardingRule().getTableRule("New_Table");
T
terrymanu 已提交
115 116
    }
    
T
terrymanu 已提交
117 118
    @Test
    public void assertIsAllBindingTableWhenLogicTablesIsEmpty() {
L
Liang Zhang 已提交
119
        assertFalse(createMaximumShardingRule().isAllBindingTables(Collections.emptyList()));
T
terrymanu 已提交
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
    }
    
    @Test
    public void assertIsNotAllBindingTable() {
        assertFalse(createMaximumShardingRule().isAllBindingTables(Collections.singletonList("new_Table")));
        assertFalse(createMaximumShardingRule().isAllBindingTables(Arrays.asList("logic_Table", "new_Table")));
    }
    
    @Test
    public void assertIsAllBindingTable() {
        assertTrue(createMaximumShardingRule().isAllBindingTables(Collections.singletonList("logic_Table")));
        assertTrue(createMaximumShardingRule().isAllBindingTables(Collections.singletonList("logic_table")));
        assertTrue(createMaximumShardingRule().isAllBindingTables(Collections.singletonList("sub_Logic_Table")));
        assertTrue(createMaximumShardingRule().isAllBindingTables(Collections.singletonList("sub_logic_table")));
        assertTrue(createMaximumShardingRule().isAllBindingTables(Arrays.asList("logic_Table", "sub_Logic_Table")));
        assertTrue(createMaximumShardingRule().isAllBindingTables(Arrays.asList("logic_table", "sub_logic_Table")));
        assertFalse(createMaximumShardingRule().isAllBindingTables(Arrays.asList("logic_table", "sub_logic_Table", "new_table")));
L
Liang Zhang 已提交
137
        assertFalse(createMaximumShardingRule().isAllBindingTables(Collections.emptyList()));
T
terrymanu 已提交
138 139 140
        assertFalse(createMaximumShardingRule().isAllBindingTables(Collections.singletonList("new_Table")));
    }
    
T
terrymanu 已提交
141
    @Test
T
terrymanu 已提交
142
    public void assertGetBindingTableRuleForNotConfig() {
T
terrymanu 已提交
143
        assertFalse(createMinimumShardingRule().findBindingTableRule("logic_Table").isPresent());
T
terrymanu 已提交
144 145 146
    }
    
    @Test
T
terrymanu 已提交
147
    public void assertGetBindingTableRuleForNotFound() {
T
terrymanu 已提交
148
        assertFalse(createMaximumShardingRule().findBindingTableRule("new_Table").isPresent());
T
terrymanu 已提交
149 150 151
    }
    
    @Test
T
terrymanu 已提交
152
    public void assertGetBindingTableRuleForFound() {
T
terrymanu 已提交
153
        ShardingRule actual = createMaximumShardingRule();
T
tianbin 已提交
154
        assertTrue(actual.findBindingTableRule("logic_Table").isPresent());
T
terrymanu 已提交
155
        assertThat(actual.findBindingTableRule("logic_Table").get().getTableRules().size(), is(2));
T
terrymanu 已提交
156 157 158
    }
    
    @Test
T
terrymanu 已提交
159
    public void assertIsAllBroadcastTableWhenLogicTablesIsEmpty() {
L
Liang Zhang 已提交
160
        assertFalse(createMaximumShardingRule().isAllBroadcastTables(Collections.emptyList()));
T
terrymanu 已提交
161 162 163
    }
    
    @Test
T
terrymanu 已提交
164 165
    public void assertIsAllBroadcastTable() {
        assertTrue(createMaximumShardingRule().isAllBroadcastTables(Collections.singletonList("Broadcast_Table")));
T
terrymanu 已提交
166 167 168
    }
    
    @Test
T
terrymanu 已提交
169 170 171 172 173 174 175 176 177 178 179 180 181 182
    public void assertIsNotAllBroadcastTable() {
        assertFalse(createMaximumShardingRule().isAllBroadcastTables(Arrays.asList("broadcast_table", "other_table")));
    }
    
    @Test
    public void assertIsBroadcastTable() {
        assertTrue(createMaximumShardingRule().isBroadcastTable("Broadcast_Table"));
    }
    
    @Test
    public void assertIsNotBroadcastTable() {
        assertFalse(createMaximumShardingRule().isBroadcastTable("other_table"));
    }
    
183
    @Test
T
terrymanu 已提交
184
    public void assertIsShardingColumnForDefaultDatabaseShardingStrategy() {
T
terrymanu 已提交
185
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
L
Liang Zhang 已提交
186
        shardingRuleConfig.getTables().add(createTableRuleConfigWithAllStrategies());
187
        shardingRuleConfig.setDefaultDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("column", "STANDARD_TEST"));
188
        shardingRuleConfig.getShardingAlgorithms().put("standard", new ShardingSphereAlgorithmConfiguration("STANDARD_TEST", new Properties()));
189
        assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn("column", "LOGIC_TABLE"));
190 191 192
    }
    
    @Test
T
terrymanu 已提交
193
    public void assertIsShardingColumnForDefaultTableShardingStrategy() {
T
terrymanu 已提交
194
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
L
Liang Zhang 已提交
195
        shardingRuleConfig.getTables().add(createTableRuleConfigWithAllStrategies());
196
        shardingRuleConfig.setDefaultTableShardingStrategy(new StandardShardingStrategyConfiguration("column", "STANDARD_TEST"));
197
        shardingRuleConfig.getShardingAlgorithms().put("standard", new ShardingSphereAlgorithmConfiguration("STANDARD_TEST", new Properties()));
198
        assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn("column", "LOGIC_TABLE"));
199 200 201
    }
    
    @Test
T
terrymanu 已提交
202
    public void assertIsShardingColumnForDatabaseShardingStrategy() {
T
terrymanu 已提交
203
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
L
Liang Zhang 已提交
204
        shardingRuleConfig.getTables().add(createTableRuleConfigWithAllStrategies());
205
        shardingRuleConfig.getShardingAlgorithms().put("standard", new ShardingSphereAlgorithmConfiguration("STANDARD_TEST", new Properties()));
206
        assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn("column", "logic_Table"));
207 208 209
    }
    
    @Test
T
terrymanu 已提交
210
    public void assertIsShardingColumnForTableShardingStrategy() {
T
terrymanu 已提交
211
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
L
Liang Zhang 已提交
212
        shardingRuleConfig.getTables().add(createTableRuleConfigWithTableStrategies());
213
        shardingRuleConfig.getShardingAlgorithms().put("standard", new ShardingSphereAlgorithmConfiguration("STANDARD_TEST", new Properties()));
214
        assertTrue(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn("column", "logic_Table"));
215 216 217
    }
    
    @Test
T
terrymanu 已提交
218
    public void assertIsNotShardingColumn() {
T
terrymanu 已提交
219
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
L
Liang Zhang 已提交
220
        shardingRuleConfig.getTables().add(createTableRuleConfigWithAllStrategies());
221
        assertFalse(new ShardingRule(shardingRuleConfig, createDataSourceNames()).isShardingColumn("column", "other_Table"));
222
    }
T
terrymanu 已提交
223
    
T
tianbin 已提交
224
    @Test
T
terrymanu 已提交
225
    public void assertFindGenerateKeyColumn() {
226
        assertTrue(createMaximumShardingRule().findGenerateKeyColumnName("logic_table").isPresent());
T
tianbin 已提交
227 228
    }
    
马晓光 已提交
229
    @Test
T
terrymanu 已提交
230
    public void assertNotFindGenerateKeyColumn() {
231
        assertFalse(createMinimumShardingRule().findGenerateKeyColumnName("sub_logic_table").isPresent());
T
tianbin 已提交
232 233
    }
    
234
    @Test(expected = ShardingSphereConfigurationException.class)
T
tianbin 已提交
235
    public void assertGenerateKeyFailure() {
T
terrymanu 已提交
236
        createMaximumShardingRule().generateKey("table_0");
T
tianbin 已提交
237 238 239 240
    }
    
    @Test
    public void assertGenerateKeyWithDefaultKeyGenerator() {
T
terrymanu 已提交
241
        assertThat(createMinimumShardingRule().generateKey("logic_table"), instanceOf(Long.class));
T
tianbin 已提交
242
    }
T
terrymanu 已提交
243
    
T
tianbin 已提交
244 245
    @Test
    public void assertGenerateKeyWithKeyGenerator() {
T
terrymanu 已提交
246
        assertThat(createMaximumShardingRule().generateKey("logic_table"), instanceOf(Integer.class));
T
terrymanu 已提交
247 248
    }
    
T
tianbin 已提交
249
    @Test
T
terrymanu 已提交
250 251
    public void assertGetDataNodeByLogicTable() {
        assertThat(createMaximumShardingRule().getDataNode("logic_table"), is(new DataNode("ds_0.table_0")));
T
tianbin 已提交
252 253
    }
    
T
terrymanu 已提交
254 255 256
    @Test
    public void assertGetDataNodeByDataSourceAndLogicTable() {
        assertThat(createMaximumShardingRule().getDataNode("ds_1", "logic_table"), is(new DataNode("ds_1.table_0")));
T
tianbin 已提交
257 258
    }
    
259
    @Test(expected = ShardingSphereConfigurationException.class)
T
terrymanu 已提交
260 261
    public void assertGetDataNodeByLogicTableFailureWithDataSourceName() {
        createMaximumShardingRule().getDataNode("ds_3", "logic_table");
T
tianbin 已提交
262 263
    }
    
T
terrymanu 已提交
264 265
    @Test
    public void assertGetShardingLogicTableNames() {
T
terrymanu 已提交
266
        ShardingRule actual = createMaximumShardingRule();
267
        assertThat(actual.getShardingLogicTableNames(Arrays.asList("LOGIC_TABLE", "BROADCAST_TABLE")), is(Collections.singletonList("LOGIC_TABLE")));
T
terrymanu 已提交
268
    }
T
terrymanu 已提交
269
    
tank U  
孙不服 已提交
270
    @Test(expected = IllegalArgumentException.class)
S
sunbufu 已提交
271
    public void assertConstructShardingRuleWithNullShardingRuleConfiguration() {
L
Liang Zhang 已提交
272
        new ShardingRule((ShardingRuleConfiguration) null, createDataSourceNames());
273
    }
T
terrymanu 已提交
274
    
nice  
孙不服 已提交
275
    @Test(expected = IllegalArgumentException.class)
T
terrymanu 已提交
276
    public void assertConstructShardingRuleWithNullDataSourceNames() {
277 278 279 280
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
        ShardingTableRuleConfiguration shardingTableRuleConfig = createTableRuleConfiguration("LOGIC_TABLE", "pr_ds_${0..1}.table_${0..2}");
        shardingRuleConfig.getTables().add(shardingTableRuleConfig);
        new ShardingRule(shardingRuleConfig, null);
281
    }
T
terrymanu 已提交
282
    
R
Raigor 已提交
283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
    @Test
    public void assertTableRuleExists() {
        assertTrue(createMaximumShardingRule().tableRuleExists(Collections.singletonList("logic_table")));
    }
    
    @Test
    public void assertTableRuleExistsForMultipleTables() {
        assertTrue(createMaximumShardingRule().tableRuleExists(Arrays.asList("logic_table", "table_0")));
    }
    
    @Test
    public void assertTableRuleNotExists() {
        assertFalse(createMinimumShardingRule().tableRuleExists(Collections.singletonList("table_0")));
    }
    
298 299 300 301 302
    @Test
    public void assertGetTables() {
        assertThat(createMaximumShardingRule().getTables(), is(Arrays.asList("logic_table", "sub_logic_table")));
    }
    
T
terrymanu 已提交
303
    private ShardingRule createMaximumShardingRule() {
304 305 306 307 308 309 310 311
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
        ShardingTableRuleConfiguration shardingTableRuleConfig = createTableRuleConfiguration("LOGIC_TABLE", "ds_${0..1}.table_${0..2}");
        shardingTableRuleConfig.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "increment"));
        ShardingTableRuleConfiguration subTableRuleConfig = createTableRuleConfiguration("SUB_LOGIC_TABLE", "ds_${0..1}.sub_table_${0..2}");
        shardingRuleConfig.getTables().add(shardingTableRuleConfig);
        shardingRuleConfig.getTables().add(subTableRuleConfig);
        shardingRuleConfig.getBindingTableGroups().add(shardingTableRuleConfig.getLogicTable() + "," + subTableRuleConfig.getLogicTable());
        shardingRuleConfig.getBroadcastTables().add("BROADCAST_TABLE");
312
        InlineShardingAlgorithm shardingAlgorithmDB = new InlineShardingAlgorithm();
L
Liang Zhang 已提交
313
        Properties props = new Properties();
R
rick.huang 已提交
314
        props.setProperty("algorithm-expression", "ds_%{ds_id % 2}");
L
Liang Zhang 已提交
315
        shardingAlgorithmDB.setProps(props);
316
        shardingRuleConfig.setDefaultDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("ds_id", "standard"));
317
        InlineShardingAlgorithm shardingAlgorithmTBL = new InlineShardingAlgorithm();
L
Liang Zhang 已提交
318
        props = new Properties();
R
rick.huang 已提交
319
        props.setProperty("algorithm-expression", "table_%{table_id % 2}");
L
Liang Zhang 已提交
320
        shardingAlgorithmTBL.setProps(props);
321 322 323 324 325 326
        shardingRuleConfig.setDefaultTableShardingStrategy(new StandardShardingStrategyConfiguration("table_id", "standard"));
        shardingRuleConfig.setDefaultKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "default"));
        shardingRuleConfig.getShardingAlgorithms().put("standard", new ShardingSphereAlgorithmConfiguration("STANDARD_TEST", new Properties()));
        shardingRuleConfig.getKeyGenerators().put("increment", new ShardingSphereAlgorithmConfiguration("INCREMENT", new Properties()));
        shardingRuleConfig.getKeyGenerators().put("default", new ShardingSphereAlgorithmConfiguration("INCREMENT", new Properties()));
        return new ShardingRule(shardingRuleConfig, createDataSourceNames());
T
terrymanu 已提交
327 328
    }
    
T
terrymanu 已提交
329
    private ShardingRule createMinimumShardingRule() {
330 331 332 333
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
        ShardingTableRuleConfiguration shardingTableRuleConfig = createTableRuleConfiguration("LOGIC_TABLE", "ds_${0..1}.table_${0..2}");
        shardingRuleConfig.getTables().add(shardingTableRuleConfig);
        return new ShardingRule(shardingRuleConfig, createDataSourceNames());
T
terrymanu 已提交
334 335
    }
    
L
Liang Zhang 已提交
336 337
    private ShardingTableRuleConfiguration createTableRuleConfiguration(final String logicTableName, final String actualDataNodes) {
        return new ShardingTableRuleConfiguration(logicTableName, actualDataNodes);
338 339
    }
    
340
    private Collection<String> createDataSourceNames() {
T
terrymanu 已提交
341
        return Arrays.asList("ds_0", "ds_1");
342 343
    }
    
L
Liang Zhang 已提交
344 345
    private ShardingTableRuleConfiguration createTableRuleConfigWithAllStrategies() {
        ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("LOGIC_TABLE", "ds_${0..1}.table_${0..2}");
346
        result.setDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("column", "standard"));
L
Liang Zhang 已提交
347
        result.setTableShardingStrategy(new NoneShardingStrategyConfiguration());
348 349 350
        return result;
    }
    
L
Liang Zhang 已提交
351 352
    private ShardingTableRuleConfiguration createTableRuleConfigWithTableStrategies() {
        ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("LOGIC_TABLE", "ds_${0..1}.table_${0..2}");
353
        result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("column", "standard"));
354
        return result;
355
    }
T
terrymanu 已提交
356
}