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 <[email protected]>
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());
}
}