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;