This is an automated email from the ASF dual-hosted git repository.
panjuan 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 98f04e6 Revise pr 12295 (#12507)
98f04e6 is described below
commit 98f04e683e0e3d435b66ef1dce746f7da363e366
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Sep 17 11:06:50 2021 +0800
Revise pr 12295 (#12507)
---
.../segment/insert/values/InsertValueContext.java | 26 +++++----
.../insert/values/OnDuplicateUpdateContext.java | 22 ++++----
.../insert/values/InsertValueContextTest.java | 4 +-
.../values/OnDuplicateUpdateContextTest.java | 61 ++++++++--------------
.../statement/InsertContextExpressSegmentUtil.java | 54 -------------------
.../simple/ParameterMarkerExpressionSegment.java | 2 +
.../sql/common/util/ExpressionExtractUtil.java | 26 ++++++++-
7 files changed, 79 insertions(+), 116 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
index c4a2be7..1a9b83e 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
@@ -17,12 +17,13 @@
package org.apache.shardingsphere.infra.binder.segment.insert.values;
+import com.google.common.base.Preconditions;
import lombok.Getter;
import lombok.ToString;
-import
org.apache.shardingsphere.infra.statement.InsertContextExpressSegmentUtil;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
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.util.ExpressionExtractUtil;
import java.util.ArrayList;
import java.util.Collection;
@@ -40,14 +41,14 @@ public final class InsertValueContext {
private final List<ExpressionSegment> valueExpressions;
- private final List<ParameterMarkerExpressionSegment>
parametersValueExpressions;
+ private final List<ParameterMarkerExpressionSegment>
parameterMarkerExpressions;
private final List<Object> parameters;
public InsertValueContext(final Collection<ExpressionSegment> assignments,
final List<Object> parameters, final int parametersOffset) {
valueExpressions = getValueExpressions(assignments);
- parametersValueExpressions =
InsertContextExpressSegmentUtil.extractParameterMarkerExpressionSegment(assignments);
- parameterCount = parametersValueExpressions.size();
+ parameterMarkerExpressions =
ExpressionExtractUtil.getParameterMarkerExpressions(assignments);
+ parameterCount = parameterMarkerExpressions.size();
this.parameters = getParameters(parameters, parametersOffset);
}
@@ -74,13 +75,16 @@ public final class InsertValueContext {
*/
public Object getValue(final int index) {
ExpressionSegment valueExpression = valueExpressions.get(index);
- if (parametersValueExpressions.contains(valueExpression)) {
- return
parameters.get(parametersValueExpressions.indexOf(valueExpression));
- } else {
- return ((LiteralExpressionSegment) valueExpression).getLiterals();
- }
+ return valueExpression instanceof ParameterMarkerExpressionSegment
+ ?
parameters.get(getParameterIndex((ParameterMarkerExpressionSegment)
valueExpression)) : ((LiteralExpressionSegment) valueExpression).getLiterals();
}
-
+
+ private int getParameterIndex(final ParameterMarkerExpressionSegment
parameterMarkerExpression) {
+ int parameterIndex =
parameterMarkerExpressions.indexOf(parameterMarkerExpression);
+ Preconditions.checkArgument(parameterIndex >= 0, "Can not get
parameter index.");
+ return parameterIndex;
+ }
+
/**
* Get parameter index via column index.
*
@@ -89,6 +93,6 @@ public final class InsertValueContext {
*/
public int getParameterIndex(final int index) {
ExpressionSegment valueExpression = valueExpressions.get(index);
- return parametersValueExpressions.indexOf(valueExpression);
+ return valueExpression instanceof ParameterMarkerExpressionSegment ?
getParameterIndex((ParameterMarkerExpressionSegment) valueExpression) : -1;
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContext.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContext.java
index e382586..c0e50ec 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContext.java
@@ -17,14 +17,15 @@
package org.apache.shardingsphere.infra.binder.segment.insert.values;
+import com.google.common.base.Preconditions;
import lombok.Getter;
import lombok.ToString;
-import
org.apache.shardingsphere.infra.statement.InsertContextExpressSegmentUtil;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.AssignmentSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
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.util.ExpressionExtractUtil;
import java.util.ArrayList;
import java.util.Collection;
@@ -40,7 +41,7 @@ public final class OnDuplicateUpdateContext {
private final List<ExpressionSegment> valueExpressions;
- private final List<ParameterMarkerExpressionSegment>
parametersValueExpressions;
+ private final List<ParameterMarkerExpressionSegment>
parameterMarkerExpressions;
private final List<Object> parameters;
@@ -49,8 +50,8 @@ public final class OnDuplicateUpdateContext {
public OnDuplicateUpdateContext(final Collection<AssignmentSegment>
assignments, final List<Object> parameters, final int parametersOffset) {
List<ExpressionSegment> expressionSegments =
assignments.stream().map(AssignmentSegment::getValue).collect(Collectors.toList());
valueExpressions = getValueExpressions(expressionSegments);
- parametersValueExpressions =
InsertContextExpressSegmentUtil.extractParameterMarkerExpressionSegment(expressionSegments);
- parameterCount = parametersValueExpressions.size();
+ parameterMarkerExpressions =
ExpressionExtractUtil.getParameterMarkerExpressions(expressionSegments);
+ parameterCount = parameterMarkerExpressions.size();
this.parameters = getParameters(parameters, parametersOffset);
columns = assignments.stream().map(assignment ->
assignment.getColumns().get(0)).collect(Collectors.toList());
}
@@ -78,11 +79,14 @@ public final class OnDuplicateUpdateContext {
*/
public Object getValue(final int index) {
ExpressionSegment valueExpression = valueExpressions.get(index);
- if (parametersValueExpressions.contains(valueExpression)) {
- return
parameters.get(parametersValueExpressions.indexOf(valueExpression));
- } else {
- return ((LiteralExpressionSegment) valueExpression).getLiterals();
- }
+ return valueExpression instanceof ParameterMarkerExpressionSegment
+ ?
parameters.get(getParameterIndex((ParameterMarkerExpressionSegment)
valueExpression)) : ((LiteralExpressionSegment) valueExpression).getLiterals();
+ }
+
+ private int getParameterIndex(final ParameterMarkerExpressionSegment
parameterMarkerExpression) {
+ int parameterIndex =
parameterMarkerExpressions.indexOf(parameterMarkerExpression);
+ Preconditions.checkArgument(parameterIndex >= 0, "Can not get
parameter index.");
+ return parameterIndex;
}
/**
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
index cc824c8..3e19daa 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
@@ -86,14 +86,14 @@ public final class InsertValueContextTest {
@Test
public void assertGetParameterCount() {
- Collection<ExpressionSegment> assignments = Arrays.asList(
+ Collection<ExpressionSegment> expressions = Arrays.asList(
new LiteralExpressionSegment(0, 10, null),
new ExpressionProjectionSegment(0, 10, ""),
new ParameterMarkerExpressionSegment(0, 10, 5),
new BinaryOperationExpression(0, 0, new ColumnSegment(0, 0,
new IdentifierValue("")), new ParameterMarkerExpressionSegment(0, 10, 5), "=",
"")
);
List<Object> parameters = Arrays.asList("", "");
- InsertValueContext insertValueContext = new
InsertValueContext(assignments, parameters, 0);
+ InsertValueContext insertValueContext = new
InsertValueContext(expressions, parameters, 0);
assertThat(insertValueContext.getParameterCount(), is(2));
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContextTest.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContextTest.java
index 8bc72dc..160069b 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContextTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContextTest.java
@@ -33,7 +33,6 @@ import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.LinkedList;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
@@ -60,7 +59,7 @@ public final class OnDuplicateUpdateContextTest {
@Test
public void assertGetValueWhenParameterMarker() {
- Collection<AssignmentSegment> assignments =
makeParameterMarkerExpressionAssignmentSegment();
+ Collection<AssignmentSegment> assignments =
createParameterMarkerExpressionAssignmentSegment();
String parameterValue1 = "test1";
String parameterValue2 = "test2";
List<Object> parameters = Arrays.asList(parameterValue1,
parameterValue2);
@@ -72,63 +71,50 @@ public final class OnDuplicateUpdateContextTest {
assertThat(valueFromInsertValueContext2, is(parameterValue2));
}
- private Collection<AssignmentSegment>
makeParameterMarkerExpressionAssignmentSegment() {
+ private Collection<AssignmentSegment>
createParameterMarkerExpressionAssignmentSegment() {
ParameterMarkerExpressionSegment parameterMarkerExpressionSegment0 =
new ParameterMarkerExpressionSegment(0, 10, 5);
- AssignmentSegment assignmentSegment1 =
makeAssignmentSegment(parameterMarkerExpressionSegment0);
+ AssignmentSegment assignmentSegment1 =
createAssignmentSegment(parameterMarkerExpressionSegment0);
ParameterMarkerExpressionSegment parameterMarkerExpressionSegment1 =
new ParameterMarkerExpressionSegment(0, 10, 6);
- AssignmentSegment assignmentSegment2 =
makeAssignmentSegment(parameterMarkerExpressionSegment1);
+ AssignmentSegment assignmentSegment2 =
createAssignmentSegment(parameterMarkerExpressionSegment1);
return Arrays.asList(assignmentSegment1, assignmentSegment2);
}
@Test
public void assertGetValueWhenLiteralExpressionSegment() {
Object literalObject = new Object();
- Collection<AssignmentSegment> assignments =
makeLiteralExpressionSegment(literalObject);
+ Collection<AssignmentSegment> assignments =
createLiteralExpressionSegment(literalObject);
List<Object> parameters = Collections.emptyList();
OnDuplicateUpdateContext onDuplicateUpdateContext = new
OnDuplicateUpdateContext(assignments, parameters, 0);
Object valueFromInsertValueContext =
onDuplicateUpdateContext.getValue(0);
assertThat(valueFromInsertValueContext, is(literalObject));
}
- private Collection<AssignmentSegment> makeLiteralExpressionSegment(final
Object literalObject) {
+ private Collection<AssignmentSegment> createLiteralExpressionSegment(final
Object literalObject) {
LiteralExpressionSegment parameterLiteralExpression = new
LiteralExpressionSegment(0, 10, literalObject);
- AssignmentSegment assignmentSegment =
makeAssignmentSegment(parameterLiteralExpression);
+ AssignmentSegment assignmentSegment =
createAssignmentSegment(parameterLiteralExpression);
return Collections.singleton(assignmentSegment);
}
- private BinaryOperationExpression makeBinaryOperationExpression() {
- int doesNotMatterIndex = 0;
- String doesNotMatterColumnName = "columnNameStr";
- String doesNotMatterColumnText = "columnNameStr=?";
- ExpressionSegment left = new ColumnSegment(doesNotMatterIndex,
doesNotMatterIndex, new IdentifierValue(doesNotMatterColumnName));
- ExpressionSegment right = new
ParameterMarkerExpressionSegment(doesNotMatterIndex, doesNotMatterIndex,
doesNotMatterIndex);
- return new BinaryOperationExpression(doesNotMatterIndex,
doesNotMatterIndex, left, right, "=", doesNotMatterColumnText);
+ private BinaryOperationExpression createBinaryOperationExpression() {
+ ExpressionSegment left = new ColumnSegment(0, 0, new
IdentifierValue("columnNameStr"));
+ ExpressionSegment right = new ParameterMarkerExpressionSegment(0, 0,
0);
+ return new BinaryOperationExpression(0, 0, left, right, "=",
"columnNameStr=?");
}
- private AssignmentSegment makeAssignmentSegment(final
SimpleExpressionSegment expressionSegment) {
- int doesNotMatterLexicalIndex = 0;
- String doesNotMatterColumnName = "columnNameStr";
- ColumnSegment column = new ColumnSegment(doesNotMatterLexicalIndex,
doesNotMatterLexicalIndex, new IdentifierValue(doesNotMatterColumnName));
- List<ColumnSegment> columnSegments = new LinkedList<>();
- columnSegments.add(column);
- AssignmentSegment result = new
ColumnAssignmentSegment(doesNotMatterLexicalIndex, doesNotMatterLexicalIndex,
columnSegments, expressionSegment);
- return result;
+ private AssignmentSegment createAssignmentSegment(final
SimpleExpressionSegment expressionSegment) {
+ List<ColumnSegment> columnSegments = Collections.singletonList(new
ColumnSegment(0, 0, new IdentifierValue("columnNameStr")));
+ return new ColumnAssignmentSegment(0, 0, columnSegments,
expressionSegment);
}
- private AssignmentSegment makeAssignmentSegment(final
BinaryOperationExpression binaryOperationExpression) {
- int doesNotMatterLexicalIndex = 0;
- String doesNotMatterColumnName = "columnNameStr";
- ColumnSegment column = new ColumnSegment(doesNotMatterLexicalIndex,
doesNotMatterLexicalIndex, new IdentifierValue(doesNotMatterColumnName));
- List<ColumnSegment> columnSegments = new LinkedList<>();
- columnSegments.add(column);
- AssignmentSegment result = new
ColumnAssignmentSegment(doesNotMatterLexicalIndex, doesNotMatterLexicalIndex,
columnSegments, binaryOperationExpression);
- return result;
+ private AssignmentSegment createAssignmentSegment(final
BinaryOperationExpression binaryOperationExpression) {
+ List<ColumnSegment> columnSegments = Collections.singletonList(new
ColumnSegment(0, 0, new IdentifierValue("columnNameStr")));
+ return new ColumnAssignmentSegment(0, 0, columnSegments,
binaryOperationExpression);
}
@Test
public void assertGetColumn() {
Object literalObject = new Object();
- Collection<AssignmentSegment> assignments =
makeLiteralExpressionSegment(literalObject);
+ Collection<AssignmentSegment> assignments =
createLiteralExpressionSegment(literalObject);
List<Object> parameters = Collections.emptyList();
OnDuplicateUpdateContext onDuplicateUpdateContext = new
OnDuplicateUpdateContext(assignments, parameters, 0);
ColumnSegment column = onDuplicateUpdateContext.getColumn(0);
@@ -138,14 +124,11 @@ public final class OnDuplicateUpdateContextTest {
@Test
public void assertParameterCount() {
List<AssignmentSegment> assignments = Arrays.asList(
- makeAssignmentSegment(makeBinaryOperationExpression()),
- makeAssignmentSegment(new ParameterMarkerExpressionSegment(0,
10, 5)),
- makeAssignmentSegment(new LiteralExpressionSegment(0, 10, new
Object()))
+ createAssignmentSegment(createBinaryOperationExpression()),
+ createAssignmentSegment(new
ParameterMarkerExpressionSegment(0, 10, 5)),
+ createAssignmentSegment(new LiteralExpressionSegment(0, 10,
new Object()))
);
- int doestNotMatterParametersOffset = 0;
- String doesNotMatterParameterValue = "";
- List<Object> parameters = Arrays.asList(doesNotMatterParameterValue,
doesNotMatterParameterValue);
- OnDuplicateUpdateContext onDuplicateUpdateContext = new
OnDuplicateUpdateContext(assignments, parameters,
doestNotMatterParametersOffset);
+ OnDuplicateUpdateContext onDuplicateUpdateContext = new
OnDuplicateUpdateContext(assignments, Arrays.asList("1", "2"), 0);
assertThat(onDuplicateUpdateContext.getParameterCount(), is(2));
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/statement/InsertContextExpressSegmentUtil.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/statement/InsertContextExpressSegmentUtil.java
deleted file mode 100644
index ce65d1a..0000000
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/statement/InsertContextExpressSegmentUtil.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.infra.statement;
-
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Insert context expression segment util.
- */
-public final class InsertContextExpressSegmentUtil {
- /**
- * Extract all ParameterMarkerExpressionSegment from ExpressionSegment
list.
- *
- * @param expressions ExpressionSegment list
- * @return ParameterMarkerExpressionSegment list
- */
- public static List<ParameterMarkerExpressionSegment>
extractParameterMarkerExpressionSegment(final Collection<ExpressionSegment>
expressions) {
- List<ParameterMarkerExpressionSegment> result = new ArrayList<>();
- for (ExpressionSegment each : expressions) {
- if (each instanceof ParameterMarkerExpressionSegment) {
- result.add((ParameterMarkerExpressionSegment) each);
- } else if (each instanceof BinaryOperationExpression) {
- if (((BinaryOperationExpression) each).getLeft() instanceof
ParameterMarkerExpressionSegment) {
- result.add((ParameterMarkerExpressionSegment)
((BinaryOperationExpression) each).getLeft());
- }
- if (((BinaryOperationExpression) each).getRight() instanceof
ParameterMarkerExpressionSegment) {
- result.add((ParameterMarkerExpressionSegment)
((BinaryOperationExpression) each).getRight());
- }
- }
- }
- return result;
- }
-}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
index 4ae2bba..2cd3fbd 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
@@ -17,6 +17,7 @@
package
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple;
+import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
@@ -28,6 +29,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Projecti
@RequiredArgsConstructor
@Getter
@ToString
+@EqualsAndHashCode
public class ParameterMarkerExpressionSegment implements
SimpleExpressionSegment, ProjectionSegment {
private final int startIndex;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtil.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtil.java
index e082a4c..f019473 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtil.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtil.java
@@ -22,11 +22,14 @@ import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.sql.parser.sql.common.constant.LogicalOperator;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
+import java.util.ArrayList;
import java.util.Collection;
-import java.util.LinkedList;
import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Optional;
/**
@@ -78,4 +81,25 @@ public final class ExpressionExtractUtil {
result.getPredicates().add(expression);
return result;
}
+
+ /**
+ * Get parameter marker expression collection.
+ *
+ * @param expressions expression collection
+ * @return parameter marker expression collection
+ */
+ public static List<ParameterMarkerExpressionSegment>
getParameterMarkerExpressions(final Collection<ExpressionSegment> expressions) {
+ List<ParameterMarkerExpressionSegment> result = new ArrayList<>();
+ for (ExpressionSegment each : expressions) {
+ if (each instanceof ParameterMarkerExpressionSegment) {
+ result.add((ParameterMarkerExpressionSegment) each);
+ }
+ // TODO support more expression type if necessary
+ if (each instanceof BinaryOperationExpression) {
+
result.addAll(getParameterMarkerExpressions(Collections.singletonList(((BinaryOperationExpression)
each).getLeft())));
+
result.addAll(getParameterMarkerExpressions(Collections.singletonList(((BinaryOperationExpression)
each).getRight())));
+ }
+ }
+ return result;
+ }
}