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 3da5ecf extract getSubqueryWhereSegments function to
WhereSegmentExtractUtils (#6360)
3da5ecf is described below
commit 3da5ecfd56ea2a6d6cce0cc410ef33424d9bdd61
Author: DuanZhengqiang <[email protected]>
AuthorDate: Thu Jul 16 03:21:02 2020 -0500
extract getSubqueryWhereSegments function to WhereSegmentExtractUtils
(#6360)
---
.../engine/WhereClauseShardingConditionEngine.java | 6 +-
.../statement/dml/SelectStatementContext.java | 120 +---------------
.../parser/sql/util/WhereSegmentExtractUtils.java | 159 +++++++++++++++++++++
3 files changed, 164 insertions(+), 121 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
index 7e311eb..623e533 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
@@ -31,13 +31,13 @@ import
org.apache.shardingsphere.sharding.strategy.value.RangeRouteValue;
import org.apache.shardingsphere.sharding.strategy.value.RouteValue;
import
org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import
org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
-import
org.apache.shardingsphere.sql.parser.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.sql.parser.binder.type.WhereAvailable;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.AndPredicate;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.sql.parser.sql.util.SafeRangeOperationUtils;
+import org.apache.shardingsphere.sql.parser.sql.util.WhereSegmentExtractUtils;
import java.util.ArrayList;
import java.util.Collection;
@@ -75,8 +75,8 @@ public final class WhereClauseShardingConditionEngine {
if (whereSegment.isPresent()) {
result.addAll(createShardingConditions(sqlStatementContext,
whereSegment.get().getAndPredicates(), parameters));
}
- Collection<WhereSegment> subqueryWhereSegments = sqlStatementContext
instanceof SelectStatementContext
- ? ((SelectStatementContext)
sqlStatementContext).getSubqueryWhereSegments((SelectStatement)
sqlStatementContext.getSqlStatement()) : Collections.emptyList();
+ Collection<WhereSegment> subqueryWhereSegments =
sqlStatementContext.getSqlStatement() instanceof SelectStatement
+ ?
WhereSegmentExtractUtils.getSubqueryWhereSegments((SelectStatement)
sqlStatementContext.getSqlStatement()) : Collections.emptyList();
for (WhereSegment each : subqueryWhereSegments) {
Collection<ShardingCondition> subqueryShardingConditions =
createShardingConditions(sqlStatementContext, each.getAndPredicates(),
parameters);
if (!result.containsAll(subqueryShardingConditions)) {
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/SelectStatementContext.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/SelectStatementContext.java
index 469f656..dfe5eaa 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/SelectStatementContext.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/SelectStatementContext.java
@@ -42,12 +42,9 @@ import
org.apache.shardingsphere.sql.parser.sql.segment.dml.JoinedTableSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.TableFactorSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.TableReferenceSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
-import
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.ExpressionSegment;
-import
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.subquery.SubqueryExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ColumnProjectionSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ProjectionSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ProjectionsSegment;
-import
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.SubqueryProjectionSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ColumnOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ExpressionOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.IndexOrderByItemSegment;
@@ -56,9 +53,6 @@ import
org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.TextOrder
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.AndPredicate;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
-import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateBetweenRightValue;
-import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateCompareRightValue;
-import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateInRightValue;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerAvailable;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
import
org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
@@ -66,14 +60,13 @@ import
org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SubqueryTa
import
org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.sql.parser.sql.util.SQLUtil;
+import org.apache.shardingsphere.sql.parser.sql.util.WhereSegmentExtractUtils;
import java.util.Collection;
-import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
-import java.util.stream.Collectors;
/**
* Select SQL statement context.
@@ -117,7 +110,7 @@ public final class SelectStatementContext extends
CommonSQLStatementContext<Sele
}
private boolean containsSubquery() {
- Collection<WhereSegment> subqueryPredicateSegments =
getSubqueryWhereSegments(getSqlStatement());
+ Collection<WhereSegment> subqueryPredicateSegments =
WhereSegmentExtractUtils.getSubqueryWhereSegments(getSqlStatement());
for (WhereSegment each : subqueryPredicateSegments) {
if (!each.getAndPredicates().isEmpty()) {
return true;
@@ -127,115 +120,6 @@ public final class SelectStatementContext extends
CommonSQLStatementContext<Sele
}
/**
- * Get subquery where segment from SelectStatement.
- *
- * @param selectStatement SelectStatement.
- * @return subquery where segment collection.
- */
- public Collection<WhereSegment> getSubqueryWhereSegments(final
SelectStatement selectStatement) {
- Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
-
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromProjections(selectStatement.getProjections()));
-
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromTableReferences(selectStatement.getTableReferences()));
-
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromWhere(selectStatement.getWhere().orElse(null)));
- return subqueryWhereSegments;
- }
-
- private Collection<WhereSegment>
getSubqueryWhereSegmentsFromProjections(final ProjectionsSegment projections) {
- if (null == projections || projections.getProjections().isEmpty()) {
- return Collections.emptyList();
- }
- Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
-
- for (ProjectionSegment each : projections.getProjections()) {
- if (!(each instanceof SubqueryProjectionSegment)) {
- continue;
- }
- SelectStatement subquerySelect = ((SubqueryProjectionSegment)
each).getSubquery().getSelect();
- subquerySelect.getWhere().ifPresent(subqueryWhereSegments::add);
-
subqueryWhereSegments.addAll(getSubqueryWhereSegments(subquerySelect));
- }
- return subqueryWhereSegments;
- }
-
- private Collection<WhereSegment>
getSubqueryWhereSegmentsFromTableReferences(final
Collection<TableReferenceSegment> tableReferences) {
- if (tableReferences.isEmpty()) {
- return Collections.emptyList();
- }
- Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
- for (TableReferenceSegment each : tableReferences) {
-
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromTableFactor(each.getTableFactor()));
-
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromJoinedTable(each.getJoinedTables()));
- }
- return subqueryWhereSegments;
- }
-
- private Collection<WhereSegment> getSubqueryWhereSegmentsFromWhere(final
WhereSegment where) {
- if (null == where || where.getAndPredicates().isEmpty()) {
- return Collections.emptyList();
- }
- Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
- List<PredicateSegment> predicateSegments =
where.getAndPredicates().stream().flatMap(andPredicate ->
andPredicate.getPredicates().stream()).collect(Collectors.toList());
- for (PredicateSegment each : predicateSegments) {
- if (each.getRightValue() instanceof PredicateBetweenRightValue) {
-
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(((PredicateBetweenRightValue)
each.getRightValue()).getBetweenExpression()));
-
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(((PredicateBetweenRightValue)
each.getRightValue()).getAndExpression()));
- }
- if (each.getRightValue() instanceof PredicateCompareRightValue) {
-
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(((PredicateCompareRightValue)
each.getRightValue()).getExpression()));
- }
- if (each.getRightValue() instanceof PredicateInRightValue) {
- for (ExpressionSegment sqlExpression :
((PredicateInRightValue) each.getRightValue()).getSqlExpressions()) {
-
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(sqlExpression));
- }
- }
- }
- return subqueryWhereSegments;
- }
-
- private Collection<WhereSegment>
getSubqueryWhereSegmentsFromTableFactor(final TableFactorSegment tableFactor) {
- if (null == tableFactor) {
- return Collections.emptyList();
- }
- return
getSubqueryWhereSegmentsFromTableSegment(tableFactor.getTable());
- }
-
- private Collection<WhereSegment>
getSubqueryWhereSegmentsFromJoinedTable(final Collection<JoinedTableSegment>
joinedTables) {
- if (joinedTables.isEmpty()) {
- return Collections.emptyList();
- }
- Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
- for (JoinedTableSegment joinedTable : joinedTables) {
- if (null == joinedTable.getTableFactor()) {
- continue;
- }
-
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromTableSegment(joinedTable.getTableFactor().getTable()));
- }
- return subqueryWhereSegments;
- }
-
- private Collection<WhereSegment>
getSubqueryWhereSegmentsFromTableSegment(final TableSegment tableSegment) {
- if (!(tableSegment instanceof SubqueryTableSegment)) {
- return Collections.emptyList();
- }
- Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
- SelectStatement subquerySelect = ((SubqueryTableSegment)
tableSegment).getSubquery().getSelect();
- subquerySelect.getWhere().ifPresent(subqueryWhereSegments::add);
- subqueryWhereSegments.addAll(getSubqueryWhereSegments(subquerySelect));
- return subqueryWhereSegments;
- }
-
- private Collection<WhereSegment>
getSubqueryWhereSegmentsFromExpression(final ExpressionSegment
expressionSegment) {
- if (!(expressionSegment instanceof SubqueryExpressionSegment)) {
- return Collections.emptyList();
- }
- Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
- SelectStatement subquerySelect = ((SubqueryExpressionSegment)
expressionSegment).getSubquery().getSelect();
- subquerySelect.getWhere().ifPresent(subqueryWhereSegments::add);
- subqueryWhereSegments.addAll(getSubqueryWhereSegments(subquerySelect));
- return subqueryWhereSegments;
- }
-
- /**
* Set indexes.
*
* @param columnLabelIndexMap map for column label and index
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/util/WhereSegmentExtractUtils.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/util/WhereSegmentExtractUtils.java
new file mode 100644
index 0000000..ebc6660
--- /dev/null
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/util/WhereSegmentExtractUtils.java
@@ -0,0 +1,159 @@
+/*
+ * 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.sql.parser.sql.util;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import org.apache.shardingsphere.sql.parser.sql.segment.dml.JoinedTableSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.dml.TableFactorSegment;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.TableReferenceSegment;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.subquery.SubqueryExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ProjectionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ProjectionsSegment;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.item.SubqueryProjectionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateBetweenRightValue;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateCompareRightValue;
+import
org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateInRightValue;
+import
org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SubqueryTableSegment;
+import
org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableSegment;
+import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Where segment extract utility class.
+ */
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public final class WhereSegmentExtractUtils {
+
+ /**
+ * Get subquery where segment from SelectStatement.
+ *
+ * @param selectStatement SelectStatement.
+ * @return subquery where segment collection.
+ */
+ public static Collection<WhereSegment> getSubqueryWhereSegments(final
SelectStatement selectStatement) {
+ Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromProjections(selectStatement.getProjections()));
+
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromTableReferences(selectStatement.getTableReferences()));
+
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromWhere(selectStatement.getWhere().orElse(null)));
+ return subqueryWhereSegments;
+ }
+
+ private static Collection<WhereSegment>
getSubqueryWhereSegmentsFromProjections(final ProjectionsSegment projections) {
+ if (null == projections || projections.getProjections().isEmpty()) {
+ return Collections.emptyList();
+ }
+ Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+
+ for (ProjectionSegment each : projections.getProjections()) {
+ if (!(each instanceof SubqueryProjectionSegment)) {
+ continue;
+ }
+ SelectStatement subquerySelect = ((SubqueryProjectionSegment)
each).getSubquery().getSelect();
+ subquerySelect.getWhere().ifPresent(subqueryWhereSegments::add);
+
subqueryWhereSegments.addAll(getSubqueryWhereSegments(subquerySelect));
+ }
+ return subqueryWhereSegments;
+ }
+
+ private static Collection<WhereSegment>
getSubqueryWhereSegmentsFromTableReferences(final
Collection<TableReferenceSegment> tableReferences) {
+ if (tableReferences.isEmpty()) {
+ return Collections.emptyList();
+ }
+ Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+ for (TableReferenceSegment each : tableReferences) {
+
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromTableFactor(each.getTableFactor()));
+
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromJoinedTable(each.getJoinedTables()));
+ }
+ return subqueryWhereSegments;
+ }
+
+ private static Collection<WhereSegment>
getSubqueryWhereSegmentsFromWhere(final WhereSegment where) {
+ if (null == where || where.getAndPredicates().isEmpty()) {
+ return Collections.emptyList();
+ }
+ Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+ List<PredicateSegment> predicateSegments =
where.getAndPredicates().stream().flatMap(andPredicate ->
andPredicate.getPredicates().stream()).collect(Collectors.toList());
+ for (PredicateSegment each : predicateSegments) {
+ if (each.getRightValue() instanceof PredicateBetweenRightValue) {
+
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(((PredicateBetweenRightValue)
each.getRightValue()).getBetweenExpression()));
+
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(((PredicateBetweenRightValue)
each.getRightValue()).getAndExpression()));
+ }
+ if (each.getRightValue() instanceof PredicateCompareRightValue) {
+
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(((PredicateCompareRightValue)
each.getRightValue()).getExpression()));
+ }
+ if (each.getRightValue() instanceof PredicateInRightValue) {
+ for (ExpressionSegment sqlExpression :
((PredicateInRightValue) each.getRightValue()).getSqlExpressions()) {
+
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(sqlExpression));
+ }
+ }
+ }
+ return subqueryWhereSegments;
+ }
+
+ private static Collection<WhereSegment>
getSubqueryWhereSegmentsFromTableFactor(final TableFactorSegment tableFactor) {
+ if (null == tableFactor) {
+ return Collections.emptyList();
+ }
+ return
getSubqueryWhereSegmentsFromTableSegment(tableFactor.getTable());
+ }
+
+ private static Collection<WhereSegment>
getSubqueryWhereSegmentsFromJoinedTable(final Collection<JoinedTableSegment>
joinedTables) {
+ if (joinedTables.isEmpty()) {
+ return Collections.emptyList();
+ }
+ Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+ for (JoinedTableSegment joinedTable : joinedTables) {
+ if (null == joinedTable.getTableFactor()) {
+ continue;
+ }
+
subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromTableSegment(joinedTable.getTableFactor().getTable()));
+ }
+ return subqueryWhereSegments;
+ }
+
+ private static Collection<WhereSegment>
getSubqueryWhereSegmentsFromTableSegment(final TableSegment tableSegment) {
+ if (!(tableSegment instanceof SubqueryTableSegment)) {
+ return Collections.emptyList();
+ }
+ Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+ SelectStatement subquerySelect = ((SubqueryTableSegment)
tableSegment).getSubquery().getSelect();
+ subquerySelect.getWhere().ifPresent(subqueryWhereSegments::add);
+ subqueryWhereSegments.addAll(getSubqueryWhereSegments(subquerySelect));
+ return subqueryWhereSegments;
+ }
+
+ private static Collection<WhereSegment>
getSubqueryWhereSegmentsFromExpression(final ExpressionSegment
expressionSegment) {
+ if (!(expressionSegment instanceof SubqueryExpressionSegment)) {
+ return Collections.emptyList();
+ }
+ Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+ SelectStatement subquerySelect = ((SubqueryExpressionSegment)
expressionSegment).getSubquery().getSelect();
+ subquerySelect.getWhere().ifPresent(subqueryWhereSegments::add);
+ subqueryWhereSegments.addAll(getSubqueryWhereSegments(subquerySelect));
+ return subqueryWhereSegments;
+ }
+}