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 eb646dc9648 Refactor PivotSegment (#35690) eb646dc9648 is described below commit eb646dc9648da7d05823a37f6a7df87f7985029a Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Fri Jun 13 12:30:39 2025 +0800 Refactor PivotSegment (#35690) * Refactor ColumnSegmentBinder * Refactor ColumnSegmentBinder * Refactor PivotSegment --- .../segment/dml/expression/type/ColumnSegmentBinder.java | 10 ++-------- .../engine/segment/dml/from/type/SimpleTableSegmentBinder.java | 7 ++----- .../segment/dml/from/type/SubqueryTableSegmentBinder.java | 8 +++----- .../parser/statement/core/segment/generic/PivotSegment.java | 9 +++++---- 4 files changed, 12 insertions(+), 22 deletions(-) diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java index 97d3bb8b518..163325b59a5 100644 --- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java +++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java @@ -200,13 +200,7 @@ public final class ColumnSegmentBinder { } private static Optional<ColumnSegment> findInputColumnSegmentByPivotColumns(final ColumnSegment segment, final Collection<String> pivotColumnNames) { - if (pivotColumnNames.isEmpty()) { - return Optional.empty(); - } - if (pivotColumnNames.contains(segment.getIdentifier().getValue())) { - return Optional.of(new ColumnSegment(0, 0, segment.getIdentifier())); - } - return Optional.empty(); + return pivotColumnNames.isEmpty() || !pivotColumnNames.contains(segment.getIdentifier().getValue()) ? Optional.empty() : Optional.of(new ColumnSegment(0, 0, segment.getIdentifier())); } private static Optional<ColumnSegment> findInputColumnSegmentFromOuterTable(final ColumnSegment segment, @@ -298,7 +292,7 @@ public final class ColumnSegmentBinder { } private static List<ColumnSegmentInputInfo> findUsingColumnSegmentInputInfos(final Collection<TableSegmentBinderContext> tableBinderContexts, final String columnName) { - List<ColumnSegmentInputInfo> result = new ArrayList<>(); + List<ColumnSegmentInputInfo> result = new ArrayList<>(tableBinderContexts.size()); for (TableSegmentBinderContext each : tableBinderContexts) { Optional<ProjectionSegment> projectionSegment = each.findProjectionSegmentByColumnLabel(columnName); if (projectionSegment.isPresent() && projectionSegment.get() instanceof ColumnProjectionSegment) { diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java index b1bba2af1c7..5928a39efc2 100644 --- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java +++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java @@ -45,6 +45,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.Co import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.PivotSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; @@ -79,7 +80,7 @@ public final class SimpleTableSegmentBinder { */ public static SimpleTableSegment bind(final SimpleTableSegment segment, final SQLStatementBinderContext binderContext, final Multimap<CaseInsensitiveString, TableSegmentBinderContext> tableBinderContexts) { - fillPivotColumnNamesInBinderContext(segment, binderContext); + binderContext.getPivotColumnNames().addAll(segment.getPivot().map(PivotSegment::getPivotColumnNames).orElse(Collections.emptyList())); IdentifierValue databaseName = getDatabaseName(segment, binderContext); IdentifierValue schemaName = getSchemaName(segment, binderContext, databaseName); IdentifierValue tableName = segment.getTableName().getIdentifier(); @@ -95,10 +96,6 @@ public final class SimpleTableSegmentBinder { return result; } - private static void fillPivotColumnNamesInBinderContext(final SimpleTableSegment segment, final SQLStatementBinderContext binderContext) { - segment.getPivot().ifPresent(optional -> optional.getPivotColumns().forEach(each -> binderContext.getPivotColumnNames().add(each.getIdentifier().getValue()))); - } - private static IdentifierValue getDatabaseName(final SimpleTableSegment segment, final SQLStatementBinderContext binderContext) { DialectDatabaseMetaData dialectDatabaseMetaData = new DatabaseTypeRegistry(binderContext.getDatabaseType()).getDialectDatabaseMetaData(); Optional<OwnerSegment> owner = dialectDatabaseMetaData.getSchemaOption().getDefaultSchema().isPresent() ? segment.getOwner().flatMap(OwnerSegment::getOwner) : segment.getOwner(); diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SubqueryTableSegmentBinder.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SubqueryTableSegmentBinder.java index 0dd77e1dd1c..79a2dcf00c8 100644 --- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SubqueryTableSegmentBinder.java +++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SubqueryTableSegmentBinder.java @@ -30,11 +30,13 @@ import org.apache.shardingsphere.sql.parser.statement.core.enums.TableSourceType import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.PivotSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import java.util.Collection; +import java.util.Collections; /** * Subquery table segment binder. @@ -55,7 +57,7 @@ public final class SubqueryTableSegmentBinder { public static SubqueryTableSegment bind(final SubqueryTableSegment segment, final SQLStatementBinderContext binderContext, final Multimap<CaseInsensitiveString, TableSegmentBinderContext> tableBinderContexts, final Multimap<CaseInsensitiveString, TableSegmentBinderContext> outerTableBinderContexts, final boolean fromWithSegment) { - fillPivotColumnNamesInBinderContext(segment, binderContext); + binderContext.getPivotColumnNames().addAll(segment.getPivot().map(PivotSegment::getPivotColumnNames).orElse(Collections.emptyList())); SQLStatementBinderContext subqueryBinderContext = new SQLStatementBinderContext( binderContext.getMetaData(), binderContext.getCurrentDatabaseName(), binderContext.getHintValueContext(), binderContext.getDatabaseType(), segment.getSubquery().getSelect()); subqueryBinderContext.getExternalTableBinderContexts().putAll(binderContext.getExternalTableBinderContexts()); @@ -73,8 +75,4 @@ public final class SubqueryTableSegmentBinder { tableBinderContexts.put(new CaseInsensitiveString(subqueryTableName.getValue()), tableBinderContext); return result; } - - private static void fillPivotColumnNamesInBinderContext(final SubqueryTableSegment segment, final SQLStatementBinderContext binderContext) { - segment.getPivot().ifPresent(optional -> optional.getPivotColumns().forEach(each -> binderContext.getPivotColumnNames().add(each.getIdentifier().getValue()))); - } } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/PivotSegment.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/PivotSegment.java index 8b2f8f06bbf..f4adca48ef9 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/PivotSegment.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/PivotSegment.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.Co import java.util.Collection; import java.util.HashSet; +import java.util.stream.Collectors; /** * Pivot segment. @@ -55,16 +56,16 @@ public final class PivotSegment implements SQLSegment { } /** - * Get pivot columns. + * Get pivot column names. * - * @return pivot columns + * @return pivot column names */ - public Collection<ColumnSegment> getPivotColumns() { + public Collection<String> getPivotColumnNames() { Collection<ColumnSegment> result = new HashSet<>(pivotInColumns); result.addAll(pivotForColumns); if (null != unpivotColumns) { result.addAll(unpivotColumns); } - return result; + return result.stream().map(each -> each.getIdentifier().getValue()).collect(Collectors.toList()); } }