This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang 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 d29e64f018e Fix inline sharding algorithm with big values (#21564)
d29e64f018e is described below

commit d29e64f018e9510d5e8f9aaae7f68fd72718ea02
Author: ZhangCheng <[email protected]>
AuthorDate: Fri Oct 14 18:14:59 2022 +0800

    Fix inline sharding algorithm with big values (#21564)
    
    * Fix inline sharding algorithm with big values
    
    * Fix
    
    * Fix
---
 .../sharding/inline/InlineShardingAlgorithm.java   |  3 ---
 .../inline/InlineShardingAlgorithmTest.java        | 30 +++++++++++++++++++---
 2 files changed, 26 insertions(+), 7 deletions(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithm.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithm.java
index e02e47e0bc5..ab543c9e188 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithm.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithm.java
@@ -70,9 +70,6 @@ public final class InlineShardingAlgorithm implements 
StandardShardingAlgorithm<
     public String doSharding(final Collection<String> availableTargetNames, 
final PreciseShardingValue<Comparable<?>> shardingValue) {
         Closure<?> closure = createClosure();
         Comparable<?> value = shardingValue.getValue();
-        if (value instanceof Number) {
-            value = Math.abs(((Number) value).intValue());
-        }
         closure.setProperty(shardingValue.getColumnName(), value);
         return getTargetShardingNode(closure, shardingValue.getColumnName());
     }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithmTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithmTest.java
index 81b26c40849..e1e950abf18 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithmTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithmTest.java
@@ -28,6 +28,7 @@ import 
org.apache.shardingsphere.sharding.factory.ShardingAlgorithmFactory;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
@@ -46,11 +47,14 @@ public final class InlineShardingAlgorithmTest {
     
     private InlineShardingAlgorithm inlineShardingAlgorithmWithSimplified;
     
+    private InlineShardingAlgorithm negativeNumberInlineShardingAlgorithm;
+    
     @Before
     public void setUp() {
         inlineShardingAlgorithm = (InlineShardingAlgorithm) 
ShardingAlgorithmFactory.newInstance(new AlgorithmConfiguration("INLINE", 
createAllowRangeQueryProperties()));
         inlineShardingAlgorithmWithSimplified = (InlineShardingAlgorithm) 
ShardingAlgorithmFactory.newInstance(
                 new AlgorithmConfiguration("INLINE", 
createDisallowRangeQueryProperties()));
+        negativeNumberInlineShardingAlgorithm = (InlineShardingAlgorithm) 
ShardingAlgorithmFactory.newInstance(new AlgorithmConfiguration("INLINE", 
createNegativeAllowRangeQueryProperties()));
     }
     
     private Properties createAllowRangeQueryProperties() {
@@ -60,6 +64,13 @@ public final class InlineShardingAlgorithmTest {
         return result;
     }
     
+    private Properties createNegativeAllowRangeQueryProperties() {
+        Properties result = new Properties();
+        result.setProperty("algorithm-expression", "t_order_$->{(order_id % 
4).abs()}");
+        result.setProperty("allow-range-query-with-inline-sharding", 
Boolean.TRUE.toString());
+        return result;
+    }
+    
     private Properties createDisallowRangeQueryProperties() {
         Properties result = new Properties();
         result.setProperty("algorithm-expression", "t_order_${order_id % 4}");
@@ -91,9 +102,20 @@ public final class InlineShardingAlgorithmTest {
     @Test
     public void assertDoShardingWithNegative() {
         List<String> availableTargetNames = Lists.newArrayList("t_order_0", 
"t_order_1", "t_order_2", "t_order_3");
-        assertThat(inlineShardingAlgorithm.doSharding(availableTargetNames, 
new PreciseShardingValue<>("t_order", "order_id", DATA_NODE_INFO, -1)), 
is("t_order_1"));
-        assertThat(inlineShardingAlgorithm.doSharding(availableTargetNames, 
new PreciseShardingValue<>("t_order", "order_id", DATA_NODE_INFO, -4)), 
is("t_order_0"));
-        
assertThat(inlineShardingAlgorithmWithSimplified.doSharding(availableTargetNames,
 new PreciseShardingValue<>("t_order", "order_id", DATA_NODE_INFO, -1)), 
is("t_order_1"));
-        
assertThat(inlineShardingAlgorithmWithSimplified.doSharding(availableTargetNames,
 new PreciseShardingValue<>("t_order", "order_id", DATA_NODE_INFO, -4)), 
is("t_order_0"));
+        
assertThat(negativeNumberInlineShardingAlgorithm.doSharding(availableTargetNames,
 new PreciseShardingValue<>("t_order", "order_id", DATA_NODE_INFO, -1)), 
is("t_order_1"));
+        
assertThat(negativeNumberInlineShardingAlgorithm.doSharding(availableTargetNames,
 new PreciseShardingValue<>("t_order", "order_id", DATA_NODE_INFO, -4)), 
is("t_order_0"));
+    }
+    
+    @Test
+    public void assertDoShardingWithLargeValues() {
+        List<String> availableTargetNames = Lists.newArrayList("t_order_0", 
"t_order_1", "t_order_2", "t_order_3");
+        assertThat(inlineShardingAlgorithm.doSharding(availableTargetNames, 
+                new PreciseShardingValue<>("t_order", "order_id", 
DATA_NODE_INFO, 787694822390497280L)), is("t_order_0"));
+        assertThat(inlineShardingAlgorithm.doSharding(availableTargetNames, 
+                new PreciseShardingValue<>("t_order", "order_id", 
DATA_NODE_INFO, new BigInteger("787694822390497280787694822390497280"))), 
is("t_order_0"));
+        
assertThat(inlineShardingAlgorithmWithSimplified.doSharding(availableTargetNames,
 
+                new PreciseShardingValue<>("t_order", "order_id", 
DATA_NODE_INFO, 787694822390497280L)), is("t_order_0"));
+        
assertThat(inlineShardingAlgorithmWithSimplified.doSharding(availableTargetNames,
 
+                new PreciseShardingValue<>("t_order", "order_id", 
DATA_NODE_INFO, new BigInteger("787694822390497280787694822390497280"))), 
is("t_order_0"));
     }
 }

Reply via email to