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

Reply via email to