tristaZero commented on a change in pull request #7353:
URL: https://github.com/apache/shardingsphere/pull/7353#discussion_r486801178



##########
File path: 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
##########
@@ -55,37 +60,51 @@ protected boolean isGenerateSQLTokenForEncrypt(final 
SQLStatementContext sqlStat
     public Collection<SubstitutableColumnNameToken> generateSQLTokens(final 
SQLStatementContext sqlStatementContext) {
         Preconditions.checkState(((WhereAvailable) 
sqlStatementContext).getWhere().isPresent());
         Collection<SubstitutableColumnNameToken> result = new 
LinkedHashSet<>();
-        for (AndPredicate each : ((WhereAvailable) 
sqlStatementContext).getWhere().get().getAndPredicates()) {
+        Collection<AndPredicate> andPredicates = new LinkedList<>();
+        ExpressionSegment expression = ((WhereAvailable) 
sqlStatementContext).getWhere().get().getExpr();
+        ExpressionBuildUtil util = new ExpressionBuildUtil(expression);
+        andPredicates.addAll(util.extractAndPredicates().getAndPredicates());
+        for (AndPredicate each : andPredicates) {
             result.addAll(generateSQLTokens(sqlStatementContext, each));
         }
         return result;
     }
     
     private Collection<SubstitutableColumnNameToken> generateSQLTokens(final 
SQLStatementContext sqlStatementContext, final AndPredicate andPredicate) {
         Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
-        for (PredicateSegment each : andPredicate.getPredicates()) {
-            Optional<EncryptTable> encryptTable = 
findEncryptTable(sqlStatementContext, each);
-            if (!encryptTable.isPresent() || 
!encryptTable.get().findEncryptorName(each.getColumn().getIdentifier().getValue()).isPresent())
 {
+        for (ExpressionSegment each : andPredicate.getPredicates()) {
+            ColumnSegment column;
+            if (each instanceof BinaryOperationExpression && 
((BinaryOperationExpression) each).getLeft() instanceof ColumnSegment) {
+                column = (ColumnSegment) ((BinaryOperationExpression) 
each).getLeft();
+            } else if (each instanceof InExpression && ((InExpression) 
each).getLeft() instanceof ColumnSegment) {
+                column = (ColumnSegment) ((InExpression) each).getLeft();
+            } else if (each instanceof BetweenExpression && 
((BetweenExpression) each).getLeft() instanceof ColumnSegment) {
+                column = (ColumnSegment) ((BetweenExpression) each).getLeft();
+            } else {
+                continue;
+            }
+            Optional<EncryptTable> encryptTable = 
findEncryptTable(sqlStatementContext, column);

Review comment:
       Please extract a function for this one.

##########
File path: 
shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/main/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/PreparedShadowDataSourceJudgeEngine.java
##########
@@ -61,27 +63,47 @@ public boolean isShadow() {
             }
             return false;
         }
-        if (sqlStatementContext instanceof WhereAvailable) {
-            Optional<WhereSegment> whereSegment = ((WhereAvailable) 
sqlStatementContext).getWhere();
-            if (!whereSegment.isPresent()) {
-                return false;
-            }
-            Collection<AndPredicate> andPredicates = 
whereSegment.get().getAndPredicates();
-            for (AndPredicate andPredicate : andPredicates) {
-                if (judgePredicateSegments(andPredicate.getPredicates())) {
-                    return true;
-                }
+        if (!(sqlStatementContext instanceof WhereAvailable)) {
+            return false;
+        }
+        Optional<WhereSegment> whereSegment = ((WhereAvailable) 
sqlStatementContext).getWhere();
+        if (!whereSegment.isPresent()) {
+            return false;
+        }
+        Collection<AndPredicate> andPredicates = new LinkedList<>();
+        ExpressionSegment expression = whereSegment.get().getExpr();
+        ExpressionBuildUtil util = new ExpressionBuildUtil(expression);
+        andPredicates.addAll(util.extractAndPredicates().getAndPredicates());
+        for (AndPredicate andPredicate : andPredicates) {
+            if (judgePredicateSegments(andPredicate.getPredicates())) {

Review comment:
       An expressive name is needed.

##########
File path: 
shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/RowNumberPaginationContextEngineTest.java
##########
@@ -133,14 +134,16 @@ private void 
assertCreatePaginationContextWhenRowNumberAliasPresentAndRowNumberP
     }
     
     private void 
assertCreatePaginationContextWhenOffsetSegmentInstanceOfNumberLiteralRowNumberValueSegmentWithGivenOperator(final
 String operator) {
-        PredicateCompareRightValue predicateCompareRightValue = new 
PredicateCompareRightValue(0, 10, operator, new LiteralExpressionSegment(0, 10, 
100));
-        AndPredicate andPredicate = new AndPredicate();
-        andPredicate.getPredicates().add(new PredicateSegment(0, 10, new 
ColumnSegment(0, 10, new IdentifierValue(ROW_NUMBER_COLUMN_NAME)), 
predicateCompareRightValue));
         Projection projectionWithRowNumberAlias = new ColumnProjection(null, 
ROW_NUMBER_COLUMN_NAME, ROW_NUMBER_COLUMN_ALIAS);
         ProjectionsContext projectionsContext = new ProjectionsContext(0, 0, 
false, Collections.singleton(projectionWithRowNumberAlias));
+    
+        BinaryOperationExpression expression = new BinaryOperationExpression();
+        expression.setOperator(operator);
+        expression.setRight(new LiteralExpressionSegment(0, 10, 100));
+        expression.setLeft(new ColumnSegment(0, 10, new 
IdentifierValue(ROW_NUMBER_COLUMN_NAME)));
         

Review comment:
       Please remove it.

##########
File path: 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionBuildUtil.java
##########
@@ -0,0 +1,76 @@
+/*
+ * 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.common.util;
+
+import lombok.RequiredArgsConstructor;
+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.predicate.AndPredicate;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.OrPredicateSegment;
+
+import java.util.Optional;
+
+@RequiredArgsConstructor
+public class ExpressionBuildUtil {

Review comment:
       Final?

##########
File path: 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/JoinTableSegment.java
##########
@@ -15,26 +15,39 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate;
+package org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table;
 
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.value.PredicateRightValue;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+
+import java.util.List;
+import java.util.Optional;
 
-/**
- * Predicate segment.
- */
-@RequiredArgsConstructor
 @Getter
-public final class PredicateSegment implements SQLSegment {
+@Setter
+public class JoinTableSegment implements TableSegment {

Review comment:
       Final?

##########
File path: 
shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/UpdateStatementContextTest.java
##########
@@ -47,29 +47,31 @@
     @Mock
     private WhereSegment whereSegment;
     
-    @Mock
-    private AndPredicate andPredicate;
-    
-    @Mock
-    private PredicateSegment predicateSegment;
-    
     @Mock
     private ColumnSegment columnSegment;
     
     @Test
     public void assertNewInstance() {
         when(columnSegment.getOwner()).thenReturn(Optional.of(new 
OwnerSegment(0, 0, new IdentifierValue("tbl_2"))));
-        when(predicateSegment.getColumn()).thenReturn(columnSegment);
-        
when(andPredicate.getPredicates()).thenReturn(Collections.singletonList(predicateSegment));
-        
when(whereSegment.getAndPredicates()).thenReturn(Lists.newLinkedList(Arrays.asList(andPredicate)));
-        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(0, 0, 
new IdentifierValue("tbl_1"));
+        BinaryOperationExpression expression = new BinaryOperationExpression();
+        expression.setLeft(columnSegment);
+        

Review comment:
       A redundant line is needed to remove.

##########
File path: 
shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-common/src/main/java/org/apache/shardingsphere/shadow/condition/ShadowConditionEngine.java
##########
@@ -56,7 +59,12 @@
         if (!whereSegment.isPresent()) {
             return Optional.empty();
         }
-        for (AndPredicate each : whereSegment.get().getAndPredicates()) {
+    

Review comment:
       Please remove it.

##########
File path: 
shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/RowNumberPaginationContextEngineTest.java
##########
@@ -133,14 +134,16 @@ private void 
assertCreatePaginationContextWhenRowNumberAliasPresentAndRowNumberP
     }
     
     private void 
assertCreatePaginationContextWhenOffsetSegmentInstanceOfNumberLiteralRowNumberValueSegmentWithGivenOperator(final
 String operator) {
-        PredicateCompareRightValue predicateCompareRightValue = new 
PredicateCompareRightValue(0, 10, operator, new LiteralExpressionSegment(0, 10, 
100));
-        AndPredicate andPredicate = new AndPredicate();
-        andPredicate.getPredicates().add(new PredicateSegment(0, 10, new 
ColumnSegment(0, 10, new IdentifierValue(ROW_NUMBER_COLUMN_NAME)), 
predicateCompareRightValue));
         Projection projectionWithRowNumberAlias = new ColumnProjection(null, 
ROW_NUMBER_COLUMN_NAME, ROW_NUMBER_COLUMN_ALIAS);
         ProjectionsContext projectionsContext = new ProjectionsContext(0, 0, 
false, Collections.singleton(projectionWithRowNumberAlias));
+    

Review comment:
       Please remove

##########
File path: 
shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/impl/PostgreSQLDMLVisitor.java
##########
@@ -459,101 +451,88 @@ public ASTNode visitTargetEl(final TargetElContext ctx) {
         return result;
     }
     
-    private ColumnProjectionSegment generateColumnProjection(final 
ColumnrefContext ctx) {
-        if (null != ctx.indirection()) {
-            PostgreSQLStatementParser.AttrNameContext attrName = 
ctx.indirection().indirectionEl().attrName();
-            ColumnSegment columnSegment = new 
ColumnSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), new 
IdentifierValue(attrName.getText()));
-            OwnerSegment owner = new 
OwnerSegment(ctx.colId().start.getStartIndex(), 
ctx.colId().stop.getStopIndex(), new IdentifierValue(ctx.colId().getText()));
-            columnSegment.setOwner(owner);
-            return new ColumnProjectionSegment(columnSegment);
-        }
-        ColumnSegment columnSegment = new 
ColumnSegment(ctx.colId().start.getStartIndex(), 
ctx.colId().stop.getStopIndex(), new IdentifierValue(ctx.colId().getText()));
-        return new ColumnProjectionSegment(columnSegment);
-    }
-    
     @Override
     public ASTNode visitFromClause(final FromClauseContext ctx) {
         return visit(ctx.fromList());
     }
     
     @Override
-    public ASTNode visitFromList(final 
PostgreSQLStatementParser.FromListContext ctx) {
-        CollectionValue<TableReferenceSegment> result = new 
CollectionValue<>();
+    public ASTNode visitFromList(final FromListContext ctx) {
         if (null != ctx.fromList()) {
-            result.getValue().addAll(((CollectionValue<TableReferenceSegment>) 
visit(ctx.fromList())).getValue());
+            JoinTableSegment result = new JoinTableSegment();
+            result.setStartIndex(ctx.start.getStartIndex());
+            result.setStopIndex(ctx.stop.getStopIndex());
+            result.setLeft((TableSegment) visit(ctx.fromList()));
+            result.setRight((TableSegment) visit(ctx.tableReference()));
+            return result;
         }
-        result.getValue().add((TableReferenceSegment) 
visit(ctx.tableReference()));
+        TableSegment result = (TableSegment) visit(ctx.tableReference());
         return result;
     }
     
     @Override
     public ASTNode visitTableReference(final TableReferenceContext ctx) {
-        if (null != ctx.tableReference()) {
-            TableReferenceSegment result = (TableReferenceSegment) 
visit(ctx.tableReference());
-            if (null != ctx.joinedTable()) {
-                result.getJoinedTables().add((JoinedTableSegment) 
visit(ctx.joinedTable()));
-            }
-            return result;
-        }
         if (null != ctx.relationExpr()) {
-            TableReferenceSegment result = new TableReferenceSegment();
-            SimpleTableSegment table = 
generateTableFromRelationExpr(ctx.relationExpr());
+            SimpleTableSegment result = 
generateTableFromRelationExpr(ctx.relationExpr());
             if (null != ctx.aliasClause()) {
-                table.setAlias((AliasSegment) visit(ctx.aliasClause()));
+                result.setAlias((AliasSegment) visit(ctx.aliasClause()));
             }
-            TableFactorSegment tableFactorSegment = new TableFactorSegment();
-            tableFactorSegment.setTable(table);
-            result.setTableFactor(tableFactorSegment);
             return result;
         }
         if (null != ctx.selectWithParens()) {
-            TableReferenceSegment result = new TableReferenceSegment();
             SelectStatement select = (SelectStatement) 
visit(ctx.selectWithParens());
             SubquerySegment subquery = new 
SubquerySegment(ctx.selectWithParens().start.getStartIndex(), 
ctx.selectWithParens().stop.getStopIndex(), select);
             AliasSegment alias = null != ctx.aliasClause() ? (AliasSegment) 
visit(ctx.aliasClause()) : null;
-            SubqueryTableSegment subqueryTable = new 
SubqueryTableSegment(subquery);
-            subqueryTable.setAlias(alias);
-            TableFactorSegment tableFactor = new TableFactorSegment();
-            tableFactor.setTable(subqueryTable);
-            result.setTableFactor(tableFactor);
+            SubqueryTableSegment result = new SubqueryTableSegment(subquery);
+            result.setAlias(alias);
+            return result;
+        }
+        if (null != ctx.tableReference()) {
+            JoinTableSegment result = new JoinTableSegment();
+            int startIndex = null != ctx.LP_() ? 
ctx.LP_().getSymbol().getStartIndex() : 
ctx.tableReference().start.getStartIndex();
+            int stopIndex = 0;
+            AliasSegment alias = null;
+            if (null != ctx.aliasClause()) {
+                alias = (AliasSegment) visit(ctx.aliasClause());
+                startIndex = null != ctx.RP_() ? 
ctx.RP_().getSymbol().getStopIndex() : ctx.joinedTable().stop.getStopIndex();
+            } else {
+                stopIndex = null != ctx.RP_() ? 
ctx.RP_().getSymbol().getStopIndex() : 
ctx.tableReference().start.getStopIndex();
+            }
+    

Review comment:
       Please remove it.

##########
File path: 
shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/MySQLVisitor.java
##########
@@ -255,123 +254,173 @@ public final ASTNode visitExpr(final ExprContext ctx) {
         if (null != ctx.booleanPrimary()) {
             return visit(ctx.booleanPrimary());
         }
+        if (null != ctx.LP_()) {
+            return visit(ctx.expr(0));
+        }
+        if (null != ctx.XOR()) {
+            BinaryOperationExpression result = new BinaryOperationExpression();
+            result.setStartIndex(ctx.start.getStartIndex());
+            result.setStopIndex(ctx.stop.getStopIndex());
+            result.setLeft((ExpressionSegment) visit(ctx.expr(0)));
+            result.setRight((ExpressionSegment) visit(ctx.expr(1)));
+            result.setOperator("XOR");
+            String text = ctx.start.getInputStream().getText(new 
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
+            result.setText(text);
+            return result;
+        }
         if (null != ctx.logicalOperator()) {
-            return new PredicateBuildUtils(visit(ctx.expr(0)), 
visit(ctx.expr(1)), ctx.logicalOperator().getText()).mergePredicate();
+            BinaryOperationExpression result = new BinaryOperationExpression();
+            result.setStartIndex(ctx.start.getStartIndex());
+            result.setStopIndex(ctx.stop.getStopIndex());
+            result.setLeft((ExpressionSegment) visit(ctx.expr(0)));
+            result.setRight((ExpressionSegment) visit(ctx.expr(1)));

Review comment:
       Please extract a function 

##########
File path: 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/BinaryOperationProjection.java
##########
@@ -0,0 +1,44 @@
+/*
+ * 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.common.segment.dml.item;
+
+import lombok.Getter;
+import lombok.Setter;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+
+import java.util.Optional;
+
+@Setter
+@Getter
+public class BinaryOperationProjection implements ProjectionSegment, 
AliasAvailable {

Review comment:
       Final ?

##########
File path: 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/DeleteMultiTableSegment.java
##########
@@ -15,40 +15,35 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.common.segment.dml;
+package org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table;
 
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 
-import java.util.Collection;
 import java.util.LinkedList;
+import java.util.List;
+import java.util.Optional;
 
-@Getter
 @Setter
-public final class JoinedTableSegment implements SQLSegment {
+@Getter
+public class DeleteMultiTableSegment implements TableSegment {

Review comment:
       Fianl?

##########
File path: 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/TableExtractUtils.java
##########
@@ -17,293 +17,191 @@
 
 package org.apache.shardingsphere.sql.parser.sql.common.util;
 
-import com.google.common.base.Preconditions;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.JoinSpecificationSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.JoinedTableSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.TableReferenceSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerAvailable;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.TableFactorSegment;
+import lombok.Getter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BetweenExpression;
+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.InExpression;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.SubqueryProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ColumnOrderByItemSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.OrderByItemSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.PredicateSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.value.PredicateBetweenRightValue;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.value.PredicateCompareRightValue;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.value.PredicateInRightValue;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerAvailable;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
 
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.Optional;
 
 public final class TableExtractUtils {
+    
+    @Getter
+    private Collection<SimpleTableSegment> rewriteTables = new LinkedList<>();
+    
+    @Getter
+    private Collection<TableSegment> tableContext = new LinkedList<>();
+    
     /**
-     * Get table that should be rewrited from SelectStatement.
+     * Extract table that should be rewrited from SelectStatement.
      *
      * @param selectStatement SelectStatement.
-     * @return SimpleTableSegment collection
      */
-    public static Collection<SimpleTableSegment> getTablesFromSelect(final 
SelectStatement selectStatement) {
-        Collection<SimpleTableSegment> result = new LinkedList<>();
-        Collection<TableSegment> realTables = new LinkedList<>();
-        Collection<TableSegment> allTables = new LinkedList<>();
-        for (TableReferenceSegment each : 
selectStatement.getTableReferences()) {
-            allTables.addAll(getTablesFromTableReference(each));
-            realTables.addAll(getRealTablesFromTableReference(each));
+    public void extractTablesFromSelect(final SelectStatement selectStatement) 
{
+        if (null != selectStatement.getFrom()) {
+            extractTablesFromTableSegment(selectStatement.getFrom());
         }
         if (selectStatement.getWhere().isPresent()) {
-            
allTables.addAll(getAllTablesFromWhere(selectStatement.getWhere().get(), 
realTables));
+            
extractTablesFromExpression(selectStatement.getWhere().get().getExpr());
+        }
+        if (null != selectStatement.getProjections()) {
+            extractTablesFromProjections(selectStatement.getProjections());
         }
-        
result.addAll(getAllTablesFromProjections(selectStatement.getProjections(), 
realTables));
         if (selectStatement.getGroupBy().isPresent()) {
-            
result.addAll(getAllTablesFromOrderByItems(selectStatement.getGroupBy().get().getGroupByItems(),
 realTables));
+            
extractTablesFromOrderByItems(selectStatement.getGroupBy().get().getGroupByItems());
         }
         if (selectStatement.getOrderBy().isPresent()) {
-            
result.addAll(getAllTablesFromOrderByItems(selectStatement.getOrderBy().get().getOrderByItems(),
 realTables));
-        }
-        for (TableSegment each : allTables) {
-            if (each instanceof SubqueryTableSegment) {
-                result.addAll(getTablesFromSelect(((SubqueryTableSegment) 
each).getSubquery().getSelect()));
-            } else {
-                result.add((SimpleTableSegment) each);
-            }
+            
extractTablesFromOrderByItems(selectStatement.getOrderBy().get().getOrderByItems());
         }
-        return result;
     }
     
-    /**
-     * Get real table that should be rewrited from SelectStatement.
-     *
-     * @param selectStatement SelectStatement.
-     * @return SimpleTableSegment collection
-     */
-    public static Collection<SimpleTableSegment> 
getSimpleTableFromSelect(final SelectStatement selectStatement) {
-        Collection<SimpleTableSegment> result = new LinkedList<>();
-        Collection<TableSegment> realTables = new LinkedList<>();
-        for (TableReferenceSegment each : 
selectStatement.getTableReferences()) {
-            realTables.addAll(getRealTablesFromTableReference(each));
+    private void extractTablesFromTableSegment(final TableSegment 
tableSegment) {
+        if (tableSegment instanceof SimpleTableSegment) {
+            tableContext.add(tableSegment);
+            rewriteTables.add((SimpleTableSegment) tableSegment);
         }
-        for (TableSegment each : realTables) {
-            if (each instanceof SubqueryTableSegment) {
-                result.addAll(getSimpleTableFromSelect(((SubqueryTableSegment) 
each).getSubquery().getSelect()));
-            } else {
-                result.add((SimpleTableSegment) each);
-            }
+        if (tableSegment instanceof SubqueryTableSegment) {
+            tableContext.add(tableSegment);
+            TableExtractUtils utils = new TableExtractUtils();
+            utils.extractTablesFromSelect(((SubqueryTableSegment) 
tableSegment).getSubquery().getSelect());
+            rewriteTables.addAll(utils.getRewriteTables());
         }
-        return result;
-    }
-    
-    private static Collection<TableSegment> getTablesFromTableReference(final 
TableReferenceSegment tableReferenceSegment) {
-        Collection<TableSegment> result = new LinkedList<>();
-        if (null != tableReferenceSegment.getTableFactor()) {
-            
result.addAll(getTablesFromTableFactor(tableReferenceSegment.getTableFactor()));
+        if (tableSegment instanceof JoinTableSegment) {
+            extractTablesFromTableSegment(((JoinTableSegment) 
tableSegment).getLeft());
+            extractTablesFromTableSegment(((JoinTableSegment) 
tableSegment).getRight());
+            extractTablesFromExpression(((JoinTableSegment) 
tableSegment).getCondition());
         }
-        if (null != tableReferenceSegment.getJoinedTables()) {
-            for (JoinedTableSegment each : 
tableReferenceSegment.getJoinedTables()) {
-                result.addAll(getTablesFromJoinTable(each, result));
-            }
-        }
-        return result;
     }
     
-    private static Collection<TableSegment> 
getRealTablesFromTableReference(final TableReferenceSegment 
tableReferenceSegment) {
-        Collection<TableSegment> result = new LinkedList<>();
-        if (null != tableReferenceSegment.getTableFactor()) {
-            
result.addAll(getRealTablesFromTableFactor(tableReferenceSegment.getTableFactor()));
-        }
-        if (null != tableReferenceSegment.getJoinedTables()) {
-            for (JoinedTableSegment each : 
tableReferenceSegment.getJoinedTables()) {
-                result.addAll(getRealTablesFromJoinTable(each));
+    private void extractTablesFromExpression(final ExpressionSegment 
expressionSegment) {
+        if (expressionSegment instanceof ColumnSegment) {
+            if (((ColumnSegment) expressionSegment).getOwner().isPresent() && 
needRewrite(((ColumnSegment) expressionSegment).getOwner().get())) {
+                OwnerSegment ownerSegment = ((ColumnSegment) 
expressionSegment).getOwner().get();
+                rewriteTables.add(new 
SimpleTableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), 
ownerSegment.getIdentifier()));
             }
         }
-        return result;
-    }
-    
-    private static Collection<TableSegment> getTablesFromTableFactor(final 
TableFactorSegment tableFactorSegment) {
-        Collection<TableSegment> result = new LinkedList<>();
-        if (null != tableFactorSegment.getTable() && 
tableFactorSegment.getTable() instanceof SimpleTableSegment) {
-            result.add(tableFactorSegment.getTable());
-        }
-        if (null != tableFactorSegment.getTable() && 
tableFactorSegment.getTable() instanceof SubqueryTableSegment) {
-            result.add(tableFactorSegment.getTable());
-        }
-        if (null != tableFactorSegment.getTableReferences() && 
!tableFactorSegment.getTableReferences().isEmpty()) {
-            for (TableReferenceSegment each: 
tableFactorSegment.getTableReferences()) {
-                result.addAll(getTablesFromTableReference(each));
+        if (expressionSegment instanceof ListExpression) {
+            for (ExpressionSegment each : ((ListExpression) 
expressionSegment).getItems()) {
+                extractTablesFromExpression(each);
             }
         }
-        return result;
-    }
-    
-    private static Collection<TableSegment> getRealTablesFromTableFactor(final 
TableFactorSegment tableFactorSegment) {
-        Collection<TableSegment> result = new LinkedList<>();
-        if (null != tableFactorSegment.getTable() && 
tableFactorSegment.getTable() instanceof SimpleTableSegment) {
-            result.add(tableFactorSegment.getTable());
+        if (expressionSegment instanceof BetweenExpression) {
+            extractTablesFromExpression(((BetweenExpression) 
expressionSegment).getLeft());
+            extractTablesFromExpression(((BetweenExpression) 
expressionSegment).getBetweenExpr());
+            extractTablesFromExpression(((BetweenExpression) 
expressionSegment).getAndExpr());
         }
-        if (null != tableFactorSegment.getTable() && 
tableFactorSegment.getTable() instanceof SubqueryTableSegment) {
-            result.add(tableFactorSegment.getTable());
+        if (expressionSegment instanceof InExpression) {
+            extractTablesFromExpression(((InExpression) 
expressionSegment).getLeft());
+            extractTablesFromExpression(((InExpression) 
expressionSegment).getRight());
         }
-        if (null != tableFactorSegment.getTableReferences() && 
!tableFactorSegment.getTableReferences().isEmpty()) {
-            for (TableReferenceSegment each: 
tableFactorSegment.getTableReferences()) {
-                result.addAll(getRealTablesFromTableReference(each));
-            }
+        if (expressionSegment instanceof SubqueryExpressionSegment) {
+            extractTablesFromSelect(((SubqueryExpressionSegment) 
expressionSegment).getSubquery().getSelect());
         }
-        return result;
-    }
-    
-    private static Collection<TableSegment> getTablesFromJoinTable(final 
JoinedTableSegment joinedTableSegment, final Collection<TableSegment> 
tableSegments) {
-        Collection<TableSegment> result = new LinkedList<>();
-        Collection<TableSegment> realTables = new LinkedList<>();
-        realTables.addAll(tableSegments);
-        if (null != joinedTableSegment.getTableFactor()) {
-            
result.addAll(getTablesFromTableFactor(joinedTableSegment.getTableFactor()));
-            
realTables.addAll(getTablesFromTableFactor(joinedTableSegment.getTableFactor()));
-        }
-        if (null != joinedTableSegment.getJoinSpecification()) {
-            
result.addAll(getTablesFromJoinSpecification(joinedTableSegment.getJoinSpecification(),
 realTables));
-        }
-        return result;
-    }
-    
-    private static Collection<TableSegment> getRealTablesFromJoinTable(final 
JoinedTableSegment joinedTableSegment) {
-        Collection<TableSegment> result = new LinkedList<>();
-        if (null != joinedTableSegment.getTableFactor()) {
-            
result.addAll(getTablesFromTableFactor(joinedTableSegment.getTableFactor()));
+        if (expressionSegment instanceof BinaryOperationExpression) {
+            extractTablesFromExpression(((BinaryOperationExpression) 
expressionSegment).getLeft());
+            extractTablesFromExpression(((BinaryOperationExpression) 
expressionSegment).getRight());
         }
-        return result;
     }
     
-    private static Collection<SimpleTableSegment> 
getTablesFromJoinSpecification(final JoinSpecificationSegment 
joinSpecificationSegment, final Collection<TableSegment> tableSegments) {
-        Collection<SimpleTableSegment> result = new LinkedList<>();
-        Collection<AndPredicate> andPredicates = 
joinSpecificationSegment.getAndPredicates();
-        for (AndPredicate each : andPredicates) {
-            for (PredicateSegment e : each.getPredicates()) {
-                if (null != e.getColumn() && 
(e.getColumn().getOwner().isPresent())) {
-                    OwnerSegment ownerSegment = e.getColumn().getOwner().get();
-                    if (isTable(ownerSegment, tableSegments)) {
-                        result.add(new 
SimpleTableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), 
ownerSegment.getIdentifier()));
-                    }
+    private void extractTablesFromProjections(final ProjectionsSegment 
projections) {
+        for (ProjectionSegment each : projections.getProjections()) {
+            if (each instanceof SubqueryProjectionSegment) {
+                extractTablesFromSelect(((SubqueryProjectionSegment) 
each).getSubquery().getSelect());
+            } else if (each instanceof OwnerAvailable) {
+                if (((OwnerAvailable) each).getOwner().isPresent() && 
needRewrite(((OwnerAvailable) each).getOwner().get())) {
+                    OwnerSegment ownerSegment = ((OwnerAvailable) 
each).getOwner().get();
+                    rewriteTables.add(new 
SimpleTableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), 
ownerSegment.getIdentifier()));
                 }
-                if (null != e.getRightValue() && (e.getRightValue() instanceof 
ColumnSegment) && ((ColumnSegment) e.getRightValue()).getOwner().isPresent()) {
-                    OwnerSegment ownerSegment = ((ColumnSegment) 
e.getRightValue()).getOwner().get();
-                    if (isTable(ownerSegment, tableSegments)) {
-                        result.add(new 
SimpleTableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), 
ownerSegment.getIdentifier()));
-                    }
+            } else if (each instanceof ColumnProjectionSegment) {
+                if (((ColumnProjectionSegment) 
each).getColumn().getOwner().isPresent() && 
needRewrite(((ColumnProjectionSegment) each).getColumn().getOwner().get())) {
+                    OwnerSegment ownerSegment = ((ColumnProjectionSegment) 
each).getColumn().getOwner().get();
+                    rewriteTables.add(new 
SimpleTableSegment(ownerSegment.getStartIndex(), ownerSegment.getStopIndex(), 
ownerSegment.getIdentifier()));
                 }
             }
         }
-        return result;
     }
     
-    private static Collection<SimpleTableSegment> getAllTablesFromWhere(final 
WhereSegment where, final Collection<TableSegment> tableSegments) {
-        Collection<SimpleTableSegment> result = new LinkedList<>();
-        for (AndPredicate each : where.getAndPredicates()) {
-            for (PredicateSegment predicate : each.getPredicates()) {
-                result.addAll(getAllTablesFromPredicate(predicate, 
tableSegments));
-            }
-        }
-        return result;
-    }
-    
-    private static Collection<SimpleTableSegment> 
getAllTablesFromPredicate(final PredicateSegment predicate, final 
Collection<TableSegment> tableSegments) {
-        Collection<SimpleTableSegment> result = new LinkedList<>();
-        if (predicate.getColumn().getOwner().isPresent() && 
isTable(predicate.getColumn().getOwner().get(), tableSegments)) {
-            OwnerSegment segment = predicate.getColumn().getOwner().get();
-            result.add(new SimpleTableSegment(segment.getStartIndex(), 
segment.getStopIndex(), segment.getIdentifier()));
-        }
-        if (predicate.getRightValue() instanceof PredicateCompareRightValue) {
-            if (((PredicateCompareRightValue) 
predicate.getRightValue()).getExpression() instanceof 
SubqueryExpressionSegment) {
-                
result.addAll(TableExtractUtils.getTablesFromSelect(((SubqueryExpressionSegment)
 ((PredicateCompareRightValue) 
predicate.getRightValue()).getExpression()).getSubquery().getSelect()));
-            }
-        }
-        if (predicate.getRightValue() instanceof PredicateInRightValue) {
-            for (ExpressionSegment expressionSegment : 
((PredicateInRightValue) predicate.getRightValue()).getSqlExpressions()) {
-                if (expressionSegment instanceof SubqueryExpressionSegment) {
-                    
result.addAll(TableExtractUtils.getTablesFromSelect(((SubqueryExpressionSegment)
 expressionSegment).getSubquery().getSelect()));
+    private void extractTablesFromOrderByItems(final 
Collection<OrderByItemSegment> orderByItems) {
+        for (OrderByItemSegment each : orderByItems) {
+            if (each instanceof ColumnOrderByItemSegment) {
+                Optional<OwnerSegment> owner = ((ColumnOrderByItemSegment) 
each).getColumn().getOwner();
+                if (owner.isPresent() && needRewrite(owner.get())) {
+                    OwnerSegment segment = ((ColumnOrderByItemSegment) 
each).getColumn().getOwner().get();
+                    rewriteTables.add(new 
SimpleTableSegment(segment.getStartIndex(), segment.getStopIndex(), 
segment.getIdentifier()));
                 }
             }
-        } 
-        if (predicate.getRightValue() instanceof PredicateBetweenRightValue) {
-            if (((PredicateBetweenRightValue) 
predicate.getRightValue()).getBetweenExpression() instanceof 
SubqueryExpressionSegment) {
-                SelectStatement subquerySelect = ((SubqueryExpressionSegment) 
(((PredicateBetweenRightValue) 
predicate.getRightValue()).getBetweenExpression())).getSubquery().getSelect();
-                
result.addAll(TableExtractUtils.getTablesFromSelect(subquerySelect));    
-            }
-            if (((PredicateBetweenRightValue) 
predicate.getRightValue()).getAndExpression() instanceof 
SubqueryExpressionSegment) {
-                SelectStatement subquerySelect = ((SubqueryExpressionSegment) 
(((PredicateBetweenRightValue) 
predicate.getRightValue()).getAndExpression())).getSubquery().getSelect();
-                
result.addAll(TableExtractUtils.getTablesFromSelect(subquerySelect));
-            }
-        } 
-        if (predicate.getRightValue() instanceof ColumnSegment) {
-            Preconditions.checkState(((ColumnSegment) 
predicate.getRightValue()).getOwner().isPresent());
-            OwnerSegment segment = ((ColumnSegment) 
predicate.getRightValue()).getOwner().get();
-            result.add(new SimpleTableSegment(segment.getStartIndex(), 
segment.getStopIndex(), segment.getIdentifier()));
         }
-        return result;
     }
     
-    private static Collection<SimpleTableSegment> 
getAllTablesFromProjections(final ProjectionsSegment projections, final 
Collection<TableSegment> tableSegments) {
-        Collection<SimpleTableSegment> result = new LinkedList<>();
-        if (null == projections || projections.getProjections().isEmpty()) {
-            return result;
-        }
-        for (ProjectionSegment each : projections.getProjections()) {
-            if (each instanceof SubqueryProjectionSegment) {
-                result.addAll(getTablesFromSelect(((SubqueryProjectionSegment) 
each).getSubquery().getSelect()));
-            } else {
-                Optional<SimpleTableSegment> table = getTableSegment(each, 
tableSegments);
-                table.ifPresent(result::add);
-            }
+    /**
+     * Extract table that should be rewrited from DeleteStatement.
+     *
+     * @param deleteStatement DeleteStatement.
+     */
+    public void extractTablesFromDelete(final DeleteStatement deleteStatement) 
{
+        

Review comment:
       Remove




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to