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;
+    }
+}