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 e056cc57cbd Refactor ColumnSegmentBinder (#32075)
e056cc57cbd is described below

commit e056cc57cbd6e27348ddc66f74fffa92dd3b83f8
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Jul 12 15:21:35 2024 +0800

    Refactor ColumnSegmentBinder (#32075)
    
    * Refactor AssignmentSegmentBinder
    
    * Refactor ColumnSegmentBinder
---
 .../segment/assign/AssignmentSegmentBinder.java    | 23 +++++-----
 .../expression/impl/ColumnSegmentBinder.java       | 53 ++++++++++++----------
 2 files changed, 41 insertions(+), 35 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/assign/AssignmentSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/assign/AssignmentSegmentBinder.java
index 721086c9350..97e8b9962c6 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/assign/AssignmentSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/assign/AssignmentSegmentBinder.java
@@ -30,9 +30,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.Co
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
 
 import java.util.Collection;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  *  Assignment segment binder.
@@ -51,21 +51,22 @@ public final class AssignmentSegmentBinder {
      */
     public static SetAssignmentSegment bind(final SetAssignmentSegment 
segment, final SQLStatementBinderContext binderContext,
                                             final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
-        Collection<ColumnAssignmentSegment> assignments = new LinkedList<>();
-        for (ColumnAssignmentSegment each : segment.getAssignments()) {
-            assignments.add(new ColumnAssignmentSegment(each.getStartIndex(), 
each.getStopIndex(), bindColumns(each.getColumns(), binderContext, 
tableBinderContexts,
-                    outerTableBinderContexts), bindValue(each.getValue(), 
binderContext, tableBinderContexts, outerTableBinderContexts)));
-        }
+        Collection<ColumnAssignmentSegment> assignments = 
segment.getAssignments().stream()
+                .map(each -> createColumnAssignmentSegment(each, 
binderContext, tableBinderContexts, 
outerTableBinderContexts)).collect(Collectors.toList());
         return new SetAssignmentSegment(segment.getStartIndex(), 
segment.getStopIndex(), assignments);
     }
     
+    private static ColumnAssignmentSegment createColumnAssignmentSegment(final 
ColumnAssignmentSegment columnAssignmentSegment, final 
SQLStatementBinderContext binderContext,
+                                                                         final 
Map<String, TableSegmentBinderContext> tableBinderContexts,
+                                                                         final 
Map<String, TableSegmentBinderContext> outerTableBinderContexts) {
+        return new 
ColumnAssignmentSegment(columnAssignmentSegment.getStartIndex(), 
columnAssignmentSegment.getStopIndex(),
+                bindColumns(columnAssignmentSegment.getColumns(), 
binderContext, tableBinderContexts, outerTableBinderContexts),
+                bindValue(columnAssignmentSegment.getValue(), binderContext, 
tableBinderContexts, outerTableBinderContexts));
+    }
+    
     private static List<ColumnSegment> bindColumns(final List<ColumnSegment> 
columns, final SQLStatementBinderContext binderContext,
                                                    final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
-        List<ColumnSegment> result = new LinkedList<>();
-        for (ColumnSegment each : columns) {
-            result.add(ColumnSegmentBinder.bind(each, 
SegmentType.SET_ASSIGNMENT, binderContext, tableBinderContexts, 
outerTableBinderContexts));
-        }
-        return result;
+        return columns.stream().map(each -> ColumnSegmentBinder.bind(each, 
SegmentType.SET_ASSIGNMENT, binderContext, tableBinderContexts, 
outerTableBinderContexts)).collect(Collectors.toList());
     }
     
     private static ExpressionSegment bindValue(final ExpressionSegment value, 
final SQLStatementBinderContext binderContext,
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinder.java
index 2082feab2c6..8c1b637abbc 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinder.java
@@ -52,8 +52,8 @@ import java.util.Optional;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class ColumnSegmentBinder {
     
-    private static final Collection<String> EXCLUDE_BIND_COLUMNS = new 
LinkedHashSet<>(Arrays.asList("ROWNUM", "ROW_NUMBER", "ROWNUM_", "SYSDATE", 
"SYSTIMESTAMP", "CURRENT_TIMESTAMP",
-            "LOCALTIMESTAMP", "UID", "USER", "NEXTVAL", "ROWID", "LEVEL"));
+    private static final Collection<String> EXCLUDE_BIND_COLUMNS = new 
LinkedHashSet<>(Arrays.asList(
+            "ROWNUM", "ROW_NUMBER", "ROWNUM_", "ROWID", "SYSDATE", 
"SYSTIMESTAMP", "CURRENT_TIMESTAMP", "LOCALTIMESTAMP", "UID", "USER", 
"NEXTVAL", "LEVEL"));
     
     private static final Map<SegmentType, String> SEGMENT_TYPE_MESSAGES = 
Maps.of(SegmentType.PROJECTION, "field list", SegmentType.JOIN_ON, "on clause", 
SegmentType.JOIN_USING, "from clause",
             SegmentType.PREDICATE, "where clause", SegmentType.ORDER_BY, 
"order clause", SegmentType.GROUP_BY, "group statement", 
SegmentType.INSERT_COLUMNS, "field list");
@@ -63,26 +63,30 @@ public final class ColumnSegmentBinder {
     /**
      * Bind column segment.
      *
-     * @param segment table segment
+     * @param segment column segment
      * @param parentSegmentType parent segment type
      * @param binderContext statement binder context
      * @param tableBinderContexts table binder contexts
      * @param outerTableBinderContexts outer table binder contexts
-     * @return bounded column segment
+     * @return bound column segment
      */
     public static ColumnSegment bind(final ColumnSegment segment, final 
SegmentType parentSegmentType, final SQLStatementBinderContext binderContext,
                                      final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
         if 
(EXCLUDE_BIND_COLUMNS.contains(segment.getIdentifier().getValue().toUpperCase()))
 {
             return segment;
         }
-        ColumnSegment result = new ColumnSegment(segment.getStartIndex(), 
segment.getStopIndex(), segment.getIdentifier());
-        segment.getOwner().ifPresent(result::setOwner);
-        Collection<TableSegmentBinderContext> tableBinderContextValues =
-                getTableSegmentBinderContexts(segment, parentSegmentType, 
binderContext, tableBinderContexts, outerTableBinderContexts);
-        Optional<ColumnSegment> inputColumnSegment = 
findInputColumnSegment(segment, parentSegmentType, tableBinderContextValues, 
outerTableBinderContexts, binderContext);
+        ColumnSegment result = copy(segment);
+        Collection<TableSegmentBinderContext> tableSegmentBinderContexts = 
getTableSegmentBinderContexts(segment, parentSegmentType, binderContext, 
tableBinderContexts, outerTableBinderContexts);
+        Optional<ColumnSegment> inputColumnSegment = 
findInputColumnSegment(segment, parentSegmentType, tableSegmentBinderContexts, 
outerTableBinderContexts, binderContext);
         inputColumnSegment.ifPresent(optional -> 
result.setVariable(optional.isVariable()));
         result.setColumnBoundedInfo(createColumnSegmentBoundedInfo(segment, 
inputColumnSegment.orElse(null)));
-        segment.getParentheses().forEach(each -> 
result.getParentheses().add(each));
+        return result;
+    }
+    
+    private static ColumnSegment copy(final ColumnSegment segment) {
+        ColumnSegment result = new ColumnSegment(segment.getStartIndex(), 
segment.getStopIndex(), segment.getIdentifier());
+        segment.getOwner().ifPresent(result::setOwner);
+        result.getParentheses().addAll(segment.getParentheses());
         return result;
     }
     
@@ -91,8 +95,9 @@ public final class ColumnSegmentBinder {
                                                                                
        final Map<String, TableSegmentBinderContext> tableBinderContexts,
                                                                                
        final Map<String, TableSegmentBinderContext> outerTableBinderContexts) {
         if (segment.getOwner().isPresent()) {
-            return 
getTableBinderContextByOwner(segment.getOwner().get().getIdentifier().getValue().toLowerCase(),
 tableBinderContexts, outerTableBinderContexts,
-                    binderContext.getExternalTableBinderContexts());
+            String owner = 
segment.getOwner().get().getIdentifier().getValue().toLowerCase();
+            return findTableBinderContextByOwner(owner, tableBinderContexts, 
outerTableBinderContexts, binderContext.getExternalTableBinderContexts())
+                    
.map(Collections::singletonList).orElse(Collections.emptyList());
         }
         if (!binderContext.getJoinTableProjectionSegments().isEmpty() && 
isNeedUseJoinTableProjectionBind(segment, parentSegmentType, binderContext)) {
             return Collections.singleton(new 
SimpleTableSegmentBinderContext(binderContext.getJoinTableProjectionSegments()));
@@ -100,24 +105,24 @@ public final class ColumnSegmentBinder {
         return tableBinderContexts.values();
     }
     
-    private static boolean isNeedUseJoinTableProjectionBind(final 
ColumnSegment segment, final SegmentType parentSegmentType, final 
SQLStatementBinderContext binderContext) {
-        return SegmentType.PROJECTION == parentSegmentType
-                || SegmentType.PREDICATE == parentSegmentType && 
binderContext.getUsingColumnNames().contains(segment.getIdentifier().getValue().toLowerCase());
-    }
-    
-    private static Collection<TableSegmentBinderContext> 
getTableBinderContextByOwner(final String owner, final Map<String, 
TableSegmentBinderContext> tableBinderContexts,
-                                                                               
       final Map<String, TableSegmentBinderContext> outerTableBinderContexts,
-                                                                               
       final Map<String, TableSegmentBinderContext> 
externalTableBinderContexts) {
+    private static Optional<TableSegmentBinderContext> 
findTableBinderContextByOwner(final String owner, final Map<String, 
TableSegmentBinderContext> tableBinderContexts,
+                                                                               
      final Map<String, TableSegmentBinderContext> outerTableBinderContexts,
+                                                                               
      final Map<String, TableSegmentBinderContext> externalTableBinderContexts) 
{
         if (tableBinderContexts.containsKey(owner)) {
-            return Collections.singleton(tableBinderContexts.get(owner));
+            return Optional.of(tableBinderContexts.get(owner));
         }
         if (outerTableBinderContexts.containsKey(owner)) {
-            return Collections.singleton(outerTableBinderContexts.get(owner));
+            return Optional.of(outerTableBinderContexts.get(owner));
         }
         if (externalTableBinderContexts.containsKey(owner)) {
-            return 
Collections.singleton(externalTableBinderContexts.get(owner));
+            return Optional.of(externalTableBinderContexts.get(owner));
         }
-        return Collections.emptyList();
+        return Optional.empty();
+    }
+    
+    private static boolean isNeedUseJoinTableProjectionBind(final 
ColumnSegment segment, final SegmentType parentSegmentType, final 
SQLStatementBinderContext binderContext) {
+        return SegmentType.PROJECTION == parentSegmentType
+                || SegmentType.PREDICATE == parentSegmentType && 
binderContext.getUsingColumnNames().contains(segment.getIdentifier().getValue().toLowerCase());
     }
     
     private static Optional<ColumnSegment> findInputColumnSegment(final 
ColumnSegment segment, final SegmentType parentSegmentType, final 
Collection<TableSegmentBinderContext> tableBinderContexts,

Reply via email to