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

chengzhang 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 8195c64351e Minor refactor ProjectionsSegmentBinder (#33897)
8195c64351e is described below

commit 8195c64351e6cf15055e4d98411639026a2f1448
Author: Zhengqiang Duan <duanzhengqi...@apache.org>
AuthorDate: Tue Dec 3 18:33:05 2024 +0800

    Minor refactor ProjectionsSegmentBinder (#33897)
---
 .../standard/assertion/ShardingRouteAssert.java    |  1 +
 .../projection/ProjectionsSegmentBinder.java       | 31 ++++++++++++++++++++++
 .../statement/core/extractor/ColumnExtractor.java  | 12 +++++++++
 .../dml/item/AggregationProjectionSegment.java     |  9 +++++++
 4 files changed, 53 insertions(+)

diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
index 47e9ebc15e4..db3c9f83ba6 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
@@ -102,6 +102,7 @@ public final class ShardingRouteAssert {
     private static Collection<ShardingSphereSchema> buildSchemas() {
         Collection<ShardingSphereTable> tables = new LinkedList<>();
         tables.add(new ShardingSphereTable("t_order", Arrays.asList(new 
ShardingSphereColumn("order_id", Types.INTEGER, true, false, false, true, 
false, false),
+                new ShardingSphereColumn("id", Types.INTEGER, false, false, 
false, true, false, false),
                 new ShardingSphereColumn("user_id", Types.INTEGER, false, 
false, false, true, false, false),
                 new ShardingSphereColumn("product_id", Types.INTEGER, false, 
false, false, true, false, false),
                 new ShardingSphereColumn("status", Types.INTEGER, false, 
false, false, true, false, false)), Collections.emptyList(), 
Collections.emptyList()));
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java
index 124fbbf15a6..a520cc4142f 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java
@@ -30,6 +30,8 @@ import 
org.apache.shardingsphere.infra.binder.engine.segment.projection.type.Sho
 import 
org.apache.shardingsphere.infra.binder.engine.segment.projection.type.SubqueryProjectionSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationDistinctProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
@@ -89,7 +91,36 @@ public final class ProjectionsSegmentBinder {
             result.setAlias(((ExpressionProjectionSegment) 
projectionSegment).getAliasSegment());
             return result;
         }
+        if (projectionSegment instanceof AggregationDistinctProjectionSegment) 
{
+            return 
bindAggregationDistinctProjection((AggregationDistinctProjectionSegment) 
projectionSegment, binderContext, tableBinderContexts, 
outerTableBinderContexts);
+        }
+        if (projectionSegment instanceof AggregationProjectionSegment) {
+            return bindAggregationProjection((AggregationProjectionSegment) 
projectionSegment, binderContext, tableBinderContexts, 
outerTableBinderContexts);
+        }
         // TODO support more ProjectionSegment bound
         return projectionSegment;
     }
+    
+    private static AggregationDistinctProjectionSegment 
bindAggregationDistinctProjection(final AggregationDistinctProjectionSegment 
aggregationDistinctSegment,
+                                                                               
           final SQLStatementBinderContext binderContext,
+                                                                               
           final Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts,
+                                                                               
           final Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
outerTableBinderContexts) {
+        AggregationDistinctProjectionSegment result = new 
AggregationDistinctProjectionSegment(aggregationDistinctSegment.getStartIndex(),
 aggregationDistinctSegment.getStopIndex(),
+                aggregationDistinctSegment.getType(), 
aggregationDistinctSegment.getExpression(), 
aggregationDistinctSegment.getDistinctInnerExpression());
+        aggregationDistinctSegment.getParameters()
+                .forEach(each -> 
result.getParameters().add(ExpressionSegmentBinder.bind(each, 
SegmentType.PROJECTION, binderContext, tableBinderContexts, 
outerTableBinderContexts)));
+        
aggregationDistinctSegment.getAliasSegment().ifPresent(result::setAlias);
+        return result;
+    }
+    
+    private static AggregationProjectionSegment 
bindAggregationProjection(final AggregationProjectionSegment 
aggregationSegment, final SQLStatementBinderContext binderContext,
+                                                                          
final Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts,
+                                                                          
final Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
outerTableBinderContexts) {
+        AggregationProjectionSegment result =
+                new 
AggregationProjectionSegment(aggregationSegment.getStartIndex(), 
aggregationSegment.getStopIndex(), aggregationSegment.getType(), 
aggregationSegment.getExpression());
+        aggregationSegment.getParameters()
+                .forEach(each -> 
result.getParameters().add(ExpressionSegmentBinder.bind(each, 
SegmentType.PROJECTION, binderContext, tableBinderContexts, 
outerTableBinderContexts)));
+        aggregationSegment.getAliasSegment().ifPresent(result::setAlias);
+        return result;
+    }
 }
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 ae141557845..7588c7db466 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
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.Betw
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.RowExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
@@ -81,12 +82,23 @@ public final class ColumnExtractor {
         if (expression instanceof InExpression && ((InExpression) 
expression).getLeft() instanceof ColumnSegment) {
             result.add((ColumnSegment) ((InExpression) expression).getLeft());
         }
+        if (expression instanceof InExpression && ((InExpression) 
expression).getLeft() instanceof RowExpression) {
+            extractColumnInRowExpression((InExpression) expression, result);
+        }
         if (expression instanceof BetweenExpression && ((BetweenExpression) 
expression).getLeft() instanceof ColumnSegment) {
             result.add((ColumnSegment) ((BetweenExpression) 
expression).getLeft());
         }
         return result;
     }
     
+    private static void extractColumnInRowExpression(final InExpression 
expression, final Collection<ColumnSegment> result) {
+        for (ExpressionSegment each : ((RowExpression) 
expression.getLeft()).getItems()) {
+            if (each instanceof ColumnSegment) {
+                result.add((ColumnSegment) each);
+            }
+        }
+    }
+    
     /**
      * Extract column segments.
      *
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/item/AggregationProjectionSegment.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/item/AggregationProjectionSegment.java
index 068f93b46c3..ab8eed3a2dc 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/item/AggregationProjectionSegment.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/item/AggregationProjectionSegment.java
@@ -70,6 +70,15 @@ public class AggregationProjectionSegment implements 
ProjectionSegment, AliasAva
         return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
     }
     
+    /**
+     * Get alias segment.
+     *
+     * @return alias segment
+     */
+    public Optional<AliasSegment> getAliasSegment() {
+        return Optional.ofNullable(alias);
+    }
+    
     @Override
     public String getText() {
         return expression;

Reply via email to