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();