Skip to content

Commit

Permalink
Minor refactor ProjectionsSegmentBinder (#33897)
Browse files Browse the repository at this point in the history
  • Loading branch information
strongduanmu authored Dec 3, 2024
1 parent 2747d9b commit 8195c64
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ private static ShardingSphereMetaData createShardingSphereMetaData(final Shardin
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()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
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;
Expand Down Expand Up @@ -89,7 +91,36 @@ private static ProjectionSegment bind(final ProjectionSegment projectionSegment,
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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
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;
Expand Down Expand Up @@ -81,12 +82,23 @@ public static Collection<ColumnSegment> extract(final ExpressionSegment expressi
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.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,15 @@ public final Optional<IdentifierValue> getAlias() {
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;
Expand Down

0 comments on commit 8195c64

Please sign in to comment.