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 34cd6ce528f Support extracting columns from oracle case when 
expressions (#28306)
34cd6ce528f is described below

commit 34cd6ce528f6254fe7d270853b903f2862faaae8
Author: ZhangCheng <[email protected]>
AuthorDate: Tue Aug 29 17:54:02 2023 +0800

    Support extracting columns from oracle case when expressions (#28306)
---
 .../engine/condition/generator/ConditionValue.java |  7 ++++-
 .../impl/ConditionValueInOperatorGenerator.java    |  5 ++++
 .../value/ListShardingConditionValue.java          |  4 +--
 .../ConditionValueInOperatorGeneratorTest.java     | 30 ++++++++++++++++++++++
 4 files changed, 43 insertions(+), 3 deletions(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/ConditionValue.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/ConditionValue.java
index bcea24aba22..439c9caccd3 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/ConditionValue.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/ConditionValue.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.Expressi
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 
+import lombok.Getter;
 import java.util.List;
 import java.util.Optional;
 
@@ -35,6 +36,9 @@ public final class ConditionValue {
     
     private final int parameterMarkerIndex;
     
+    @Getter
+    private boolean isNull;
+    
     public ConditionValue(final ExpressionSegment expressionSegment, final 
List<Object> params) {
         value = getValue(expressionSegment, params);
         parameterMarkerIndex = expressionSegment instanceof 
ParameterMarkerExpressionSegment ? ((ParameterMarkerExpressionSegment) 
expressionSegment).getParameterMarkerIndex() : -1;
@@ -62,7 +66,8 @@ public final class ConditionValue {
     
     private Comparable<?> getValue(final LiteralExpressionSegment 
expressionSegment) {
         Object result = expressionSegment.getLiterals();
-        ShardingSpherePreconditions.checkState(result instanceof Comparable, 
() -> new NotImplementComparableValueException("Sharding", result));
+        isNull = null == result;
+        ShardingSpherePreconditions.checkState(null == result || result 
instanceof Comparable, () -> new 
NotImplementComparableValueException("Sharding", result));
         return (Comparable<?>) result;
     }
     
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGenerator.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGenerator.java
index da95610608a..62dbc165aad 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGenerator.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGenerator.java
@@ -44,6 +44,11 @@ public final class ConditionValueInOperatorGenerator 
implements ConditionValueGe
         for (ExpressionSegment each : predicate.getExpressionList()) {
             ConditionValue conditionValue = new ConditionValue(each, params);
             Optional<Comparable<?>> value = conditionValue.getValue();
+            if (conditionValue.isNull()) {
+                shardingConditionValues.add(null);
+                
conditionValue.getParameterMarkerIndex().ifPresent(parameterMarkerIndexes::add);
+                continue;
+            }
             if (value.isPresent()) {
                 shardingConditionValues.add(value.get());
                 
conditionValue.getParameterMarkerIndex().ifPresent(parameterMarkerIndexes::add);
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/value/ListShardingConditionValue.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/value/ListShardingConditionValue.java
index 76bcbcc2942..a0cef659f1a 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/value/ListShardingConditionValue.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/value/ListShardingConditionValue.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.sharding.route.engine.condition.value;
 
+import com.google.common.base.Joiner;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 
@@ -24,7 +25,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Sharding condition value for list values.
@@ -49,7 +49,7 @@ public final class ListShardingConditionValue<T> implements 
ShardingConditionVal
     
     @Override
     public String toString() {
-        String condition = 1 == values.size() ? " = " + new 
ArrayList<>(values).get(0) : " in (" + 
values.stream().map(Object::toString).collect(Collectors.joining(",")) + ")";
+        String condition = 1 == values.size() ? " = " + new 
ArrayList<>(values).get(0) : " in (" + 
Joiner.on(",").useForNull("").join(values) + ")";
         return tableName + "." + columnName + condition;
     }
 }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
index 737a4596266..75d2e65ed4c 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
@@ -24,12 +24,14 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.Column
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import 
org.apache.shardingsphere.timeservice.api.config.TimestampServiceRuleConfiguration;
 import org.apache.shardingsphere.timeservice.core.rule.TimestampServiceRule;
 import org.junit.jupiter.api.Test;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
 import java.util.LinkedList;
@@ -61,6 +63,34 @@ class ConditionValueInOperatorGeneratorTest {
         
assertTrue(shardingConditionValue.get().getParameterMarkerIndexes().isEmpty());
     }
     
+    @Test
+    void assertNullExpression() {
+        ListExpression listExpression = new ListExpression(0, 0);
+        listExpression.getItems().add(new LiteralExpressionSegment(0, 0, 
null));
+        listExpression.getItems().add(new LiteralExpressionSegment(0, 0, 
null));
+        InExpression inExpression = new InExpression(0, 0, null, 
listExpression, false);
+        Optional<ShardingConditionValue> shardingConditionValue = 
generator.generate(inExpression, column, new LinkedList<>(), 
timestampServiceRule);
+        assertTrue(shardingConditionValue.isPresent());
+        assertThat(((ListShardingConditionValue) 
shardingConditionValue.get()).getValues(), is(Arrays.asList(null, null)));
+        
assertTrue(shardingConditionValue.get().getParameterMarkerIndexes().isEmpty());
+        assertThat(shardingConditionValue.get().toString(), is("tbl.id in 
(,)"));
+    }
+    
+    @Test
+    void assertNullAndCommonExpression() {
+        ListExpression listExpression = new ListExpression(0, 0);
+        listExpression.getItems().add(new LiteralExpressionSegment(0, 0, 
"test1"));
+        listExpression.getItems().add(new LiteralExpressionSegment(0, 0, 
null));
+        listExpression.getItems().add(new LiteralExpressionSegment(0, 0, 
null));
+        listExpression.getItems().add(new LiteralExpressionSegment(0, 0, 
"test2"));
+        InExpression inExpression = new InExpression(0, 0, null, 
listExpression, false);
+        Optional<ShardingConditionValue> shardingConditionValue = 
generator.generate(inExpression, column, new LinkedList<>(), 
timestampServiceRule);
+        assertTrue(shardingConditionValue.isPresent());
+        assertThat(((ListShardingConditionValue) 
shardingConditionValue.get()).getValues(), is(Arrays.asList("test1", null, 
null, "test2")));
+        
assertTrue(shardingConditionValue.get().getParameterMarkerIndexes().isEmpty());
+        assertThat(shardingConditionValue.get().toString(), is("tbl.id in 
(test1,,,test2)"));
+    }
+    
     @SuppressWarnings("unchecked")
     @Test
     void assertGenerateConditionValueWithParameter() {

Reply via email to