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