You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2025/05/20 07:40:19 UTC

(shardingsphere) branch master updated: Optimize column segment extraction in SQL parsing (#35474)

This is an automated email from the ASF dual-hosted git repository.

zhangliang 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 4b17fa8aced Optimize column segment extraction in SQL parsing (#35474)
4b17fa8aced is described below

commit 4b17fa8aced539c59454a4a2c37dbc7931ca33bf
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Tue May 20 15:40:14 2025 +0800

    Optimize column segment extraction in SQL parsing (#35474)
    
    * Optimize column segment extraction in SQL parsing
    
    - Modify ColumnExtractor to return a new Collection instead of updating an existing one
    - Update related test cases to use the new method signature
    - Refactor DeleteStatementContext, SelectStatementContext, and UpdateStatementContext to use the new column extraction approach
    - Extract common logic for creating where segments into separate methods
    
    * Optimize column segment extraction in SQL parsing
    
    - Modify ColumnExtractor to return a new Collection instead of updating an existing one
    - Update related test cases to use the new method signature
    - Refactor DeleteStatementContext, SelectStatementContext, and UpdateStatementContext to use the new column extraction approach
    - Extract common logic for creating where segments into separate methods
---
 .../context/statement/dml/DeleteStatementContext.java  | 14 ++++++++------
 .../context/statement/dml/SelectStatementContext.java  | 18 ++++++++++--------
 .../context/statement/dml/UpdateStatementContext.java  | 14 ++++++++------
 .../statement/core/extractor/ColumnExtractor.java      |  8 +++++---
 .../statement/core/extractor/ColumnExtractorTest.java  |  4 +---
 5 files changed, 32 insertions(+), 26 deletions(-)

diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/DeleteStatementContext.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/DeleteStatementContext.java
index 067ff411425..5c022bb7286 100644
--- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/DeleteStatementContext.java
+++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/DeleteStatementContext.java
@@ -47,22 +47,24 @@ public final class DeleteStatementContext extends CommonSQLStatementContext impl
     
     private final TablesContext tablesContext;
     
-    private final Collection<WhereSegment> whereSegments = new LinkedList<>();
+    private final Collection<WhereSegment> whereSegments;
     
-    private final Collection<ColumnSegment> columnSegments = new LinkedList<>();
+    private final Collection<ColumnSegment> columnSegments;
     
     private final Collection<BinaryOperationExpression> joinConditions = new LinkedList<>();
     
     public DeleteStatementContext(final DeleteStatement sqlStatement) {
         super(sqlStatement);
         tablesContext = new TablesContext(getAllSimpleTableSegments());
-        extractWhereSegments(whereSegments, sqlStatement);
-        ColumnExtractor.extractColumnSegments(columnSegments, whereSegments);
+        whereSegments = createWhereSegments(sqlStatement);
+        columnSegments = ColumnExtractor.extractColumnSegments(whereSegments);
         ExpressionExtractor.extractJoinConditions(joinConditions, whereSegments);
     }
     
-    private void extractWhereSegments(final Collection<WhereSegment> whereSegments, final DeleteStatement deleteStatement) {
-        deleteStatement.getWhere().ifPresent(whereSegments::add);
+    private Collection<WhereSegment> createWhereSegments(final DeleteStatement deleteStatement) {
+        Collection<WhereSegment> result = new LinkedList<>();
+        deleteStatement.getWhere().ifPresent(result::add);
+        return result;
     }
     
     private Collection<SimpleTableSegment> getAllSimpleTableSegments() {
diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java
index e64d6dbc6ac..d347cf75fe7 100644
--- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java
+++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java
@@ -101,9 +101,9 @@ public final class SelectStatementContext extends CommonSQLStatementContext impl
     
     private final Map<Integer, SelectStatementContext> subqueryContexts;
     
-    private final Collection<WhereSegment> whereSegments = new LinkedList<>();
+    private final Collection<WhereSegment> whereSegments;
     
-    private final Collection<ColumnSegment> columnSegments = new LinkedList<>();
+    private final Collection<ColumnSegment> columnSegments;
     
     private final Collection<BinaryOperationExpression> joinConditions = new LinkedList<>();
     
@@ -118,8 +118,8 @@ public final class SelectStatementContext extends CommonSQLStatementContext impl
     public SelectStatementContext(final ShardingSphereMetaData metaData, final List<Object> params, final SelectStatement sqlStatement,
                                   final String currentDatabaseName, final Collection<TableSegment> inheritedTables) {
         super(sqlStatement);
-        extractWhereSegments(whereSegments, sqlStatement);
-        ColumnExtractor.extractColumnSegments(columnSegments, whereSegments);
+        whereSegments = createWhereSegments(sqlStatement);
+        columnSegments = ColumnExtractor.extractColumnSegments(whereSegments);
         Collection<TableSegment> tableSegments = getAllTableSegments(inheritedTables);
         ExpressionExtractor.extractJoinConditions(joinConditions, whereSegments);
         subqueryContexts = createSubqueryContexts(metaData, params, currentDatabaseName, tableSegments);
@@ -131,10 +131,12 @@ public final class SelectStatementContext extends CommonSQLStatementContext impl
         containsEnhancedTable = isContainsEnhancedTable(metaData, tablesContext.getDatabaseNames(), currentDatabaseName);
     }
     
-    private void extractWhereSegments(final Collection<WhereSegment> whereSegments, final SelectStatement selectStatement) {
-        selectStatement.getWhere().ifPresent(whereSegments::add);
-        whereSegments.addAll(WhereExtractor.extractSubqueryWhereSegments(selectStatement));
-        whereSegments.addAll(WhereExtractor.extractJoinWhereSegments(selectStatement));
+    private Collection<WhereSegment> createWhereSegments(final SelectStatement selectStatement) {
+        Collection<WhereSegment> result = new LinkedList<>();
+        selectStatement.getWhere().ifPresent(result::add);
+        result.addAll(WhereExtractor.extractSubqueryWhereSegments(selectStatement));
+        result.addAll(WhereExtractor.extractJoinWhereSegments(selectStatement));
+        return result;
     }
     
     private Collection<TableSegment> getAllTableSegments(final Collection<TableSegment> inheritedTables) {
diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java
index 915053e23c0..b80faf53a62 100644
--- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java
+++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java
@@ -45,22 +45,24 @@ public final class UpdateStatementContext extends CommonSQLStatementContext impl
     
     private final TablesContext tablesContext;
     
-    private final Collection<WhereSegment> whereSegments = new LinkedList<>();
+    private final Collection<WhereSegment> whereSegments;
     
-    private final Collection<ColumnSegment> columnSegments = new LinkedList<>();
+    private final Collection<ColumnSegment> columnSegments;
     
     private final Collection<BinaryOperationExpression> joinConditions = new LinkedList<>();
     
     public UpdateStatementContext(final UpdateStatement sqlStatement) {
         super(sqlStatement);
         tablesContext = new TablesContext(getAllSimpleTableSegments());
-        extractWhereSegments(whereSegments, sqlStatement);
-        ColumnExtractor.extractColumnSegments(columnSegments, whereSegments);
+        whereSegments = createWhereSegments(sqlStatement);
+        columnSegments = ColumnExtractor.extractColumnSegments(whereSegments);
         ExpressionExtractor.extractJoinConditions(joinConditions, whereSegments);
     }
     
-    private void extractWhereSegments(final Collection<WhereSegment> whereSegments, final UpdateStatement updateStatement) {
-        updateStatement.getWhere().ifPresent(whereSegments::add);
+    private Collection<WhereSegment> createWhereSegments(final UpdateStatement updateStatement) {
+        Collection<WhereSegment> result = new LinkedList<>();
+        updateStatement.getWhere().ifPresent(result::add);
+        return result;
     }
     
     private Collection<SimpleTableSegment> getAllSimpleTableSegments() {
diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractor.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractor.java
index d0ba99974ff..16594e58bba 100644
--- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractor.java
+++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractor.java
@@ -159,15 +159,17 @@ public final class ColumnExtractor {
     /**
      * Extract column segments.
      *
-     * @param columnSegments column segments
      * @param whereSegments where segments
+     * @return column segments
      */
-    public static void extractColumnSegments(final Collection<ColumnSegment> columnSegments, final Collection<WhereSegment> whereSegments) {
+    public static Collection<ColumnSegment> extractColumnSegments(final Collection<WhereSegment> whereSegments) {
+        Collection<ColumnSegment> result = new LinkedList<>();
         for (WhereSegment each : whereSegments) {
             for (ExpressionSegment expression : ExpressionExtractor.extractAllExpressions(each.getExpr())) {
-                columnSegments.addAll(extract(expression));
+                result.addAll(extract(expression));
             }
         }
+        return result;
     }
     
     /**
diff --git a/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractorTest.java b/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractorTest.java
index 7250a089963..186ed519f11 100644
--- a/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractorTest.java
+++ b/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractorTest.java
@@ -27,7 +27,6 @@ import org.junit.jupiter.api.Test;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.LinkedList;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -36,8 +35,7 @@ class ColumnExtractorTest {
     
     @Test
     void assertExtractColumnSegments() {
-        Collection<ColumnSegment> columnSegments = new LinkedList<>();
-        ColumnExtractor.extractColumnSegments(columnSegments, createWhereSegments());
+        Collection<ColumnSegment> columnSegments = ColumnExtractor.extractColumnSegments(createWhereSegments());
         assertThat(columnSegments.size(), is(2));
         Iterator<ColumnSegment> iterator = columnSegments.iterator();
         ColumnSegment firstColumn = iterator.next();