You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/05/29 04:29:22 UTC
[shardingsphere] branch master updated: Refactor ComplexInlineShardingAlgorithm (#25924)
This is an automated email from the ASF dual-hosted git repository.
jianglongtao 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 c675cb3d54e Refactor ComplexInlineShardingAlgorithm (#25924)
c675cb3d54e is described below
commit c675cb3d54e089a813f3ab65d3d0bccb1ca0c16d
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Mon May 29 12:29:12 2023 +0800
Refactor ComplexInlineShardingAlgorithm (#25924)
---
.../inline/ComplexInlineShardingAlgorithm.java | 43 ++++++++++++----------
.../exception/data/NullShardingValueException.java | 2 +-
.../inline/ComplexInlineShardingAlgorithmTest.java | 8 ++--
3 files changed, 29 insertions(+), 24 deletions(-)
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/ComplexInlineShardingAlgorithm.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/ComplexInlineShardingAlgorithm.java
index 3158b8d2567..3b1f2c5ca9e 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/ComplexInlineShardingAlgorithm.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/ComplexInlineShardingAlgorithm.java
@@ -19,9 +19,9 @@ package org.apache.shardingsphere.sharding.algorithm.sharding.inline;
import groovy.lang.Closure;
import groovy.util.Expando;
+import org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory;
import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.util.exception.external.sql.type.generic.UnsupportedSQLOperationException;
-import org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory;
import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingAlgorithm;
import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingValue;
import org.apache.shardingsphere.sharding.exception.algorithm.sharding.MismatchedComplexInlineShardingAlgorithmColumnAndValueSizeException;
@@ -87,38 +87,43 @@ public final class ComplexInlineShardingAlgorithm implements ComplexKeysSharding
Map<String, Collection<Comparable<?>>> columnNameAndShardingValuesMap = shardingValue.getColumnNameAndShardingValuesMap();
ShardingSpherePreconditions.checkState(shardingColumns.isEmpty() || shardingColumns.size() == columnNameAndShardingValuesMap.size(),
() -> new MismatchedComplexInlineShardingAlgorithmColumnAndValueSizeException(shardingColumns.size(), columnNameAndShardingValuesMap.size()));
- return combine(columnNameAndShardingValuesMap).stream().map(this::doSharding).collect(Collectors.toList());
+ return flatten(columnNameAndShardingValuesMap).stream().map(this::doSharding).collect(Collectors.toList());
}
- private String doSharding(final Map<String, Comparable<?>> shardingValues) {
+ private String doSharding(final Map<String, Comparable<?>> columnNameAndShardingValueMap) {
Closure<?> closure = createClosure();
- for (Entry<String, Comparable<?>> entry : shardingValues.entrySet()) {
+ for (Entry<String, Comparable<?>> entry : columnNameAndShardingValueMap.entrySet()) {
ShardingSpherePreconditions.checkNotNull(entry.getValue(), NullShardingValueException::new);
closure.setProperty(entry.getKey(), entry.getValue());
}
return closure.call().toString();
}
- private <K, V> Collection<Map<K, V>> combine(final Map<K, Collection<V>> columnNameAndShardingValuesMap) {
- Collection<Map<K, V>> result = new LinkedList<>();
- for (Entry<K, Collection<V>> entry : columnNameAndShardingValuesMap.entrySet()) {
+ private Collection<Map<String, Comparable<?>>> flatten(final Map<String, Collection<Comparable<?>>> columnNameAndShardingValuesMap) {
+ Collection<Map<String, Comparable<?>>> result = new LinkedList<>();
+ for (Entry<String, Collection<Comparable<?>>> entry : columnNameAndShardingValuesMap.entrySet()) {
if (result.isEmpty()) {
- for (V value : entry.getValue()) {
- Map<K, V> item = new HashMap<>();
+ for (Comparable<?> value : entry.getValue()) {
+ Map<String, Comparable<?>> item = new HashMap<>();
item.put(entry.getKey(), value);
result.add(item);
}
} else {
- Collection<Map<K, V>> list = new LinkedList<>();
- for (Map<K, V> loop : result) {
- for (V value : entry.getValue()) {
- Map<K, V> item = new HashMap<>();
- item.put(entry.getKey(), value);
- item.putAll(loop);
- list.add(item);
- }
- }
- result = list;
+ result = flatten(result, entry.getKey(), entry.getValue());
+ }
+ }
+ return result;
+ }
+
+ private Collection<Map<String, Comparable<?>>> flatten(final Collection<Map<String, Comparable<?>>> columnNameAndShardingValueMaps,
+ final String columnName, final Collection<Comparable<?>> shardingValues) {
+ Collection<Map<String, Comparable<?>>> result = new LinkedList<>();
+ for (Map<String, Comparable<?>> each : columnNameAndShardingValueMaps) {
+ for (Comparable<?> value : shardingValues) {
+ Map<String, Comparable<?>> item = new HashMap<>();
+ item.put(columnName, value);
+ item.putAll(each);
+ result.add(item);
}
}
return result;
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/data/NullShardingValueException.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/data/NullShardingValueException.java
index cdc83c2cfed..1b89c907e26 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/data/NullShardingValueException.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/data/NullShardingValueException.java
@@ -28,6 +28,6 @@ public final class NullShardingValueException extends ShardingSQLException {
private static final long serialVersionUID = -6223086772479822057L;
public NullShardingValueException() {
- super(XOpenSQLState.CHECK_OPTION_VIOLATION, 20, "Sharding value can't be null in sql statement.");
+ super(XOpenSQLState.CHECK_OPTION_VIOLATION, 20, "Sharding value can't be null in SQL statement.");
}
}
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/ComplexInlineShardingAlgorithmTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/ComplexInlineShardingAlgorithmTest.java
index 33da9f628e5..508a37c5ee0 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/ComplexInlineShardingAlgorithmTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/ComplexInlineShardingAlgorithmTest.java
@@ -56,10 +56,10 @@ class ComplexInlineShardingAlgorithmTest {
}
private ComplexKeysShardingValue<Comparable<?>> createComplexKeysShardingValue(final List<Comparable<?>> values) {
- Map<String, Collection<Comparable<?>>> sharingValues = new HashMap<>(2, 1F);
- sharingValues.put("type", values);
- sharingValues.put("order_id", values);
- return new ComplexKeysShardingValue<>("t_order", sharingValues, Collections.emptyMap());
+ Map<String, Collection<Comparable<?>>> columnNameAndShardingValuesMap = new HashMap<>(2, 1F);
+ columnNameAndShardingValuesMap.put("type", values);
+ columnNameAndShardingValuesMap.put("order_id", values);
+ return new ComplexKeysShardingValue<>("t_order", columnNameAndShardingValuesMap, Collections.emptyMap());
}
@Test