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() {