This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 5601835 Revise #8576 (#8583)
5601835 is described below
commit 56018359e672ed3e45f07c09c41b4b1bcd6568ec
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Dec 11 22:24:28 2020 +0800
Revise #8576 (#8583)
* Refactor ComplexInlineShardingAlgorithm
* Refactor HintInlineShardingAlgorithm
* Refactor ComplexInlineShardingAlgorithmTest
* Refactor HintInlineShardingAlgorithmTest
* Fix test case
---
.../complex/ComplexInlineShardingAlgorithm.java | 120 +++++++++------------
.../sharding/hint/HintInlineShardingAlgorithm.java | 64 +++++------
.../ComplexInlineShardingAlgorithmTest.java | 24 ++---
.../hint/HintInlineShardingAlgorithmTest.java | 25 +++--
4 files changed, 94 insertions(+), 139 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/complex/ComplexInlineShardingAlgorithm.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/complex/ComplexInlineShardingAlgorithm.java
index 04b5a2a..d67915c 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/complex/ComplexInlineShardingAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/complex/ComplexInlineShardingAlgorithm.java
@@ -20,61 +20,70 @@ package
org.apache.shardingsphere.sharding.algorithm.sharding.complex;
import com.google.common.base.Preconditions;
import groovy.lang.Closure;
import groovy.util.Expando;
+import lombok.Getter;
+import lombok.Setter;
import
org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineExpressionParser;
import
org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingAlgorithm;
import
org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingValue;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Properties;
import java.util.stream.Collectors;
/**
- * Complex Inline sharding algorithm.
+ * Complex inline sharding algorithm.
*/
-public class ComplexInlineShardingAlgorithm implements
ComplexKeysShardingAlgorithm<Comparable<?>> {
-
+public final class ComplexInlineShardingAlgorithm implements
ComplexKeysShardingAlgorithm<Comparable<?>> {
+
private static final String ALGORITHM_EXPRESSION_KEY =
"algorithm-expression";
-
+
private static final String SHARING_COLUMNS_KEY = "sharding-columns";
-
+
private static final String ALLOW_RANGE_QUERY_KEY =
"allow-range-query-with-inline-sharding";
-
+
private boolean allowRangeQuery;
-
+
private String[] shardingColumns;
-
+
private String algorithmExpression;
-
- private final Properties props = new Properties();
-
+
+ @Getter
+ @Setter
+ private Properties props = new Properties();
+
+ @Override
+ public void init() {
+ String expression = props.getProperty(ALGORITHM_EXPRESSION_KEY);
+ Preconditions.checkNotNull(expression, "Inline sharding algorithm
expression cannot be null.");
+ algorithmExpression =
InlineExpressionParser.handlePlaceHolder(expression.trim());
+ initShardingColumns(props.getProperty(SHARING_COLUMNS_KEY, ""));
+ allowRangeQuery =
Boolean.parseBoolean(props.getOrDefault(ALLOW_RANGE_QUERY_KEY,
Boolean.FALSE.toString()).toString());
+ }
+
+ private void initShardingColumns(final String shardingColumns) {
+ this.shardingColumns = shardingColumns.isEmpty() ? new String[0] :
shardingColumns.split(",");
+ }
+
@Override
public Collection<String> doSharding(final Collection<String>
availableTargetNames, final ComplexKeysShardingValue<Comparable<?>>
shardingValue) {
-
if (!shardingValue.getColumnNameAndRangeValuesMap().isEmpty()) {
- if (isAllowRangeQuery()) {
+ if (allowRangeQuery) {
return availableTargetNames;
}
-
throw new UnsupportedOperationException("Since the property of `"
+ ALLOW_RANGE_QUERY_KEY + "` is false, inline sharding algorithm can not tackle
with range query.");
}
-
Map<String, Collection<Comparable<?>>> columnNameAndShardingValuesMap
= shardingValue.getColumnNameAndShardingValuesMap();
-
if (shardingColumns.length > 0 && shardingColumns.length !=
columnNameAndShardingValuesMap.size()) {
throw new IllegalArgumentException("complex inline need " +
shardingColumns.length + " sharing columns, but only found " +
columnNameAndShardingValuesMap.size());
}
-
Collection<Map<String, Comparable<?>>> combine =
combine(columnNameAndShardingValuesMap);
-
- return combine.stream()
- .map(this::doSharding)
- .collect(Collectors.toList());
-
+ return
combine.stream().map(this::doSharding).collect(Collectors.toList());
}
-
+
private String doSharding(final Map<String, Comparable<?>> shardingValues)
{
Closure<?> closure = createClosure();
for (Map.Entry<String, Comparable<?>> entry :
shardingValues.entrySet()) {
@@ -82,53 +91,10 @@ public class ComplexInlineShardingAlgorithm implements
ComplexKeysShardingAlgori
}
return closure.call().toString();
}
-
- @Override
- public void init() {
- String expression = props.getProperty(ALGORITHM_EXPRESSION_KEY);
- Preconditions.checkNotNull(expression, "Inline sharding algorithm
expression cannot be null.");
- algorithmExpression =
InlineExpressionParser.handlePlaceHolder(expression.trim());
- initShardingColumns(props.getProperty(SHARING_COLUMNS_KEY, ""));
- allowRangeQuery =
Boolean.parseBoolean(props.getOrDefault(ALLOW_RANGE_QUERY_KEY,
Boolean.FALSE.toString()).toString());
- }
-
- private void initShardingColumns(final String shardingColumns) {
- if (shardingColumns.length() == 0) {
- this.shardingColumns = new String[0];
- return;
- }
- this.shardingColumns = shardingColumns.split(",");
- }
-
- private boolean isAllowRangeQuery() {
- return allowRangeQuery;
- }
-
- private Closure<?> createClosure() {
- Closure<?> result = new
InlineExpressionParser(algorithmExpression).evaluateClosure().rehydrate(new
Expando(), null, null);
- result.setResolveStrategy(Closure.DELEGATE_ONLY);
- return result;
- }
-
- @Override
- public String getType() {
- return "COMPLEX_INLINE";
- }
-
- @Override
- public Properties getProps() {
- return props;
- }
-
- @Override
- public void setProps(final Properties props) {
- this.props.clear();
- this.props.putAll(props);
- }
-
+
private static <K, V> Collection<Map<K, V>> combine(final Map<K,
Collection<V>> map) {
- Collection<Map<K, V>> result = new ArrayList<>();
- for (Map.Entry<K, Collection<V>> entry : map.entrySet()) {
+ Collection<Map<K, V>> result = new LinkedList<>();
+ for (Entry<K, Collection<V>> entry : map.entrySet()) {
if (result.isEmpty()) {
for (V value : entry.getValue()) {
Map<K, V> item = new HashMap<>();
@@ -136,7 +102,7 @@ public class ComplexInlineShardingAlgorithm implements
ComplexKeysShardingAlgori
result.add(item);
}
} else {
- Collection<Map<K, V>> list = new ArrayList<>();
+ Collection<Map<K, V>> list = new LinkedList<>();
for (Map<K, V> loop : result) {
for (V value : entry.getValue()) {
Map<K, V> item = new HashMap<>();
@@ -150,5 +116,15 @@ public class ComplexInlineShardingAlgorithm implements
ComplexKeysShardingAlgori
}
return result;
}
-
+
+ private Closure<?> createClosure() {
+ Closure<?> result = new
InlineExpressionParser(algorithmExpression).evaluateClosure().rehydrate(new
Expando(), null, null);
+ result.setResolveStrategy(Closure.DELEGATE_ONLY);
+ return result;
+ }
+
+ @Override
+ public String getType() {
+ return "COMPLEX_INLINE";
+ }
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/hint/HintInlineShardingAlgorithm.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/hint/HintInlineShardingAlgorithm.java
index e28c81b..cf9508f 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/hint/HintInlineShardingAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/hint/HintInlineShardingAlgorithm.java
@@ -20,6 +20,8 @@ package
org.apache.shardingsphere.sharding.algorithm.sharding.hint;
import com.google.common.base.Preconditions;
import groovy.lang.Closure;
import groovy.util.Expando;
+import lombok.Getter;
+import lombok.Setter;
import
org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineExpressionParser;
import
org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingAlgorithm;
import org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingValue;
@@ -29,66 +31,48 @@ import java.util.Properties;
import java.util.stream.Collectors;
/**
- * Hint Inline sharding algorithm.
+ * Hint inline sharding algorithm.
*/
-public class HintInlineShardingAlgorithm implements
HintShardingAlgorithm<Comparable<?>> {
-
+public final class HintInlineShardingAlgorithm implements
HintShardingAlgorithm<Comparable<?>> {
+
private static final String ALGORITHM_EXPRESSION_KEY =
"algorithm-expression";
-
+
private static final String DEFAULT_ALGORITHM_EXPRESSION = "${value}";
-
+
private static final String HINT_INLINE_VALUE_PROPERTY_NAME = "value";
-
+
private String algorithmExpression;
-
- private final Properties properties = new Properties();
-
+
+ @Getter
+ @Setter
+ private Properties properties = new Properties();
+
+ @Override
+ public void init() {
+ String expression = properties.getProperty(ALGORITHM_EXPRESSION_KEY,
DEFAULT_ALGORITHM_EXPRESSION);
+ Preconditions.checkNotNull(expression, "Inline sharding algorithm
expression cannot be null.");
+ algorithmExpression =
InlineExpressionParser.handlePlaceHolder(expression.trim());
+ }
+
@Override
public Collection<String> doSharding(final Collection<String>
availableTargetNames, final HintShardingValue<Comparable<?>> shardingValue) {
-
- if (shardingValue.getValues().isEmpty()) {
- return availableTargetNames;
- }
-
- return shardingValue.getValues().stream()
- .map(this::doSharding)
- .collect(Collectors.toList());
-
+ return shardingValue.getValues().isEmpty() ? availableTargetNames :
shardingValue.getValues().stream().map(this::doSharding).collect(Collectors.toList());
}
-
+
private String doSharding(final Comparable<?> shardingValue) {
Closure<?> closure = createClosure();
closure.setProperty(HINT_INLINE_VALUE_PROPERTY_NAME, shardingValue);
return closure.call().toString();
}
-
- @Override
- public void init() {
- String expression = properties.getProperty(ALGORITHM_EXPRESSION_KEY,
DEFAULT_ALGORITHM_EXPRESSION);
- Preconditions.checkNotNull(expression, "Inline sharding algorithm
expression cannot be null.");
- algorithmExpression =
InlineExpressionParser.handlePlaceHolder(expression.trim());
- }
-
+
private Closure<?> createClosure() {
Closure<?> result = new
InlineExpressionParser(algorithmExpression).evaluateClosure().rehydrate(new
Expando(), null, null);
result.setResolveStrategy(Closure.DELEGATE_ONLY);
return result;
}
-
+
@Override
public String getType() {
return "HINT_INLINE";
}
-
- @Override
- public Properties getProps() {
- return properties;
- }
-
- @Override
- public void setProps(final Properties props) {
- properties.clear();
- properties.putAll(props);
- }
-
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/complex/ComplexInlineShardingAlgorithmTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/complex/ComplexInlineShardingAlgorithmTest.java
index bbff5f3..863aa3c 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/complex/ComplexInlineShardingAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/complex/ComplexInlineShardingAlgorithmTest.java
@@ -32,28 +32,25 @@ import java.util.Map;
import static org.junit.Assert.assertTrue;
-/**
- * Complex Inline sharding algorithm test.
- */
-public class ComplexInlineShardingAlgorithmTest {
-
+public final class ComplexInlineShardingAlgorithmTest {
+
private ComplexInlineShardingAlgorithm complexInlineShardingAlgorithm;
-
+
private ComplexInlineShardingAlgorithm
complexInlineShardingAlgorithmAllowRangeQuery;
-
+
@Before
- public void setUp() throws Exception {
+ public void setUp() {
initComplexInlineShardingAlgorithm();
initComplexInlineShardingAlgorithmAllowRangeQuery();
}
-
+
private void initComplexInlineShardingAlgorithm() {
complexInlineShardingAlgorithm = new ComplexInlineShardingAlgorithm();
complexInlineShardingAlgorithm.getProps().setProperty("algorithm-expression",
"t_order_${type % 2}_${order_id % 2}");
complexInlineShardingAlgorithm.getProps().setProperty("sharding-columns",
"type,order_id");
complexInlineShardingAlgorithm.init();
}
-
+
private void initComplexInlineShardingAlgorithmAllowRangeQuery() {
complexInlineShardingAlgorithmAllowRangeQuery = new
ComplexInlineShardingAlgorithm();
complexInlineShardingAlgorithmAllowRangeQuery.getProps().setProperty("algorithm-expression",
"t_order_${type % 2}_${order_id % 2}");
@@ -61,7 +58,7 @@ public class ComplexInlineShardingAlgorithmTest {
complexInlineShardingAlgorithmAllowRangeQuery.getProps().setProperty("allow-range-query-with-inline-sharding",
"true");
complexInlineShardingAlgorithmAllowRangeQuery.init();
}
-
+
@Test
public void assertDoSharding() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0_0",
"t_order_0_1", "t_order_1_0", "t_order_1_1");
@@ -73,7 +70,7 @@ public class ComplexInlineShardingAlgorithmTest {
Collection<String> actual =
complexInlineShardingAlgorithm.doSharding(availableTargetNames, shardingValue);
assertTrue(actual.size() == 1 && actual.contains("t_order_0_0"));
}
-
+
@Test
public void assertDoShardingWithMultiValue() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0_0",
"t_order_0_1", "t_order_1_0", "t_order_1_1");
@@ -85,7 +82,7 @@ public class ComplexInlineShardingAlgorithmTest {
Collection<String> actual =
complexInlineShardingAlgorithm.doSharding(availableTargetNames, shardingValue);
assertTrue(actual.containsAll(availableTargetNames));
}
-
+
@Test
public void assertDoShardingWithRangeValue() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0_0",
"t_order_0_1", "t_order_1_0", "t_order_1_1");
@@ -96,5 +93,4 @@ public class ComplexInlineShardingAlgorithmTest {
Collection<String> actual =
complexInlineShardingAlgorithmAllowRangeQuery.doSharding(availableTargetNames,
shardingValue);
assertTrue(actual.containsAll(availableTargetNames));
}
-
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/hint/HintInlineShardingAlgorithmTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/hint/HintInlineShardingAlgorithmTest.java
index 341649f..a59e6a9 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/hint/HintInlineShardingAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/hint/HintInlineShardingAlgorithmTest.java
@@ -26,35 +26,35 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Properties;
import static org.junit.Assert.assertTrue;
-/**
- * Hint Inline sharding algorithm test.
- */
public final class HintInlineShardingAlgorithmTest {
-
+
private HintInlineShardingAlgorithm hintInlineShardingAlgorithm;
-
+
private HintInlineShardingAlgorithm hintInlineShardingAlgorithmDefault;
-
+
@Before
public void setUp() {
initHintInlineShardingAlgorithm();
initHintInlineShardingAlgorithmDefault();
}
-
+
private void initHintInlineShardingAlgorithm() {
hintInlineShardingAlgorithm = new HintInlineShardingAlgorithm();
-
hintInlineShardingAlgorithm.getProps().setProperty("algorithm-expression",
"t_order_$->{value % 4}");
+ Properties props = new Properties();
+ props.setProperty("algorithm-expression", "t_order_$->{value % 4}");
+ hintInlineShardingAlgorithm.setProperties(props);
hintInlineShardingAlgorithm.init();
}
-
+
private void initHintInlineShardingAlgorithmDefault() {
hintInlineShardingAlgorithmDefault = new HintInlineShardingAlgorithm();
hintInlineShardingAlgorithmDefault.init();
}
-
+
@Test
public void assertDoShardingWithSingleValueOfDefault() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0",
"t_order_1", "t_order_2", "t_order_3");
@@ -62,7 +62,7 @@ public final class HintInlineShardingAlgorithmTest {
Collection<String> actual =
hintInlineShardingAlgorithmDefault.doSharding(availableTargetNames,
shardingValue);
assertTrue(actual.contains("t_order_0"));
}
-
+
@Test
public void assertDoShardingWithSingleValue() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0",
"t_order_1", "t_order_2", "t_order_3");
@@ -70,7 +70,7 @@ public final class HintInlineShardingAlgorithmTest {
Collection<String> actual =
hintInlineShardingAlgorithm.doSharding(availableTargetNames, shardingValue);
assertTrue(actual.contains("t_order_0"));
}
-
+
@Test
public void assertDoShardingWithMultiValues() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0",
"t_order_1", "t_order_2", "t_order_3");
@@ -78,5 +78,4 @@ public final class HintInlineShardingAlgorithmTest {
Collection<String> actual =
hintInlineShardingAlgorithm.doSharding(availableTargetNames, shardingValue);
assertTrue(actual.containsAll(availableTargetNames));
}
-
}