You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2020/07/16 08:21:32 UTC
[shardingsphere] branch master updated: extract
getSubqueryWhereSegments function to WhereSegmentExtractUtils (#6360)
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 <st...@gmail.com>
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;
+ }
+}