This is an automated email from the ASF dual-hosted git repository.

sunnianjun 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 f9c0200dd55 Refactor ProjectionsSegmentBinder (#32088)
f9c0200dd55 is described below

commit f9c0200dd55e01d10bb66bada0da0c34fed71375
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jul 13 12:05:25 2024 +0800

    Refactor ProjectionsSegmentBinder (#32088)
    
    * Refactor ParameterMarkerExpressionSegmentBinder
    
    * Refactor ProjectionsSegmentBinder
    
    * Refactor ShorthandProjectionSegmentBinder
    
    * Refactor ShorthandProjectionSegmentBinder
    
    * Refactor SubqueryProjectionSegmentBinder
    
    * Refactor SubqueryProjectionSegmentBinder
---
 .../ParameterMarkerExpressionSegmentBinder.java    |  9 +++---
 .../projection/ProjectionsSegmentBinder.java       | 25 +++++++++-------
 .../ColumnProjectionSegmentBinder.java             |  2 +-
 .../ShorthandProjectionSegmentBinder.java          | 35 ++++++++++++----------
 .../SubqueryProjectionSegmentBinder.java           |  6 ++--
 .../statement/SQLStatementContextFactoryTest.java  |  1 +
 .../ShorthandProjectionSegmentBinderTest.java      |  2 +-
 7 files changed, 44 insertions(+), 36 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/parameter/ParameterMarkerExpressionSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/parameter/ParameterMarkerExpressionSegmentBinder.java
index 4a5e94f9af1..786e6634d78 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/parameter/ParameterMarkerExpressionSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/parameter/ParameterMarkerExpressionSegmentBinder.java
@@ -39,14 +39,13 @@ public final class ParameterMarkerExpressionSegmentBinder {
      * @return bound parameter marker expression segment
      */
     public static ParameterMarkerExpressionSegment bind(final 
ParameterMarkerExpressionSegment segment, final Map<ParameterMarkerSegment, 
ColumnSegmentBoundInfo> boundInfos) {
-        ColumnSegmentBoundInfo boundInfo = boundInfos.get(segment);
-        if (null == boundInfo) {
+        if (!boundInfos.containsKey(segment)) {
             return segment;
         }
-        ParameterMarkerExpressionSegment result =
-                new ParameterMarkerExpressionSegment(segment.getStartIndex(), 
segment.getStopIndex(), segment.getParameterMarkerIndex(), 
segment.getParameterMarkerType());
+        ParameterMarkerExpressionSegment result = new 
ParameterMarkerExpressionSegment(
+                segment.getStartIndex(), segment.getStopIndex(), 
segment.getParameterMarkerIndex(), segment.getParameterMarkerType());
         segment.getAliasSegment().ifPresent(result::setAlias);
-        result.setBoundInfo(boundInfo);
+        result.setBoundInfo(boundInfos.get(segment));
         return result;
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/ProjectionsSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/ProjectionsSegmentBinder.java
index a8ab1ab80fd..27e3e81c5a6 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/ProjectionsSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/ProjectionsSegmentBinder.java
@@ -22,10 +22,11 @@ import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.binder.segment.SegmentType;
 import 
org.apache.shardingsphere.infra.binder.segment.expression.ExpressionSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
-import 
org.apache.shardingsphere.infra.binder.segment.projection.impl.ColumnProjectionSegmentBinder;
-import 
org.apache.shardingsphere.infra.binder.segment.projection.impl.ShorthandProjectionSegmentBinder;
-import 
org.apache.shardingsphere.infra.binder.segment.projection.impl.SubqueryProjectionSegmentBinder;
+import 
org.apache.shardingsphere.infra.binder.segment.projection.type.ColumnProjectionSegmentBinder;
+import 
org.apache.shardingsphere.infra.binder.segment.projection.type.ShorthandProjectionSegmentBinder;
+import 
org.apache.shardingsphere.infra.binder.segment.projection.type.SubqueryProjectionSegmentBinder;
 import 
org.apache.shardingsphere.infra.binder.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.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;
@@ -36,6 +37,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table
 
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * Projections segment binder.
@@ -57,13 +59,13 @@ public final class ProjectionsSegmentBinder {
                                           final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
         ProjectionsSegment result = new 
ProjectionsSegment(segment.getStartIndex(), segment.getStopIndex());
         result.setDistinctRow(segment.isDistinctRow());
-        segment.getProjections().forEach(each -> 
result.getProjections().add(bind(each, binderContext, boundTableSegment, 
tableBinderContexts, outerTableBinderContexts)));
+        result.getProjections().addAll(segment.getProjections().stream()
+                .map(each -> bind(each, binderContext, boundTableSegment, 
tableBinderContexts, outerTableBinderContexts)).collect(Collectors.toList()));
         return result;
     }
     
-    private static ProjectionSegment bind(final ProjectionSegment 
projectionSegment, final SQLStatementBinderContext binderContext,
-                                          final TableSegment 
boundTableSegment, final Map<String, TableSegmentBinderContext> 
tableBinderContexts,
-                                          final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
+    private static ProjectionSegment bind(final ProjectionSegment 
projectionSegment, final SQLStatementBinderContext binderContext, final 
TableSegment boundTableSegment,
+                                          final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final Map<String, 
TableSegmentBinderContext> outerTableBinderContexts) {
         if (projectionSegment instanceof ColumnProjectionSegment) {
             return 
ColumnProjectionSegmentBinder.bind((ColumnProjectionSegment) projectionSegment, 
binderContext, tableBinderContexts);
         }
@@ -77,13 +79,14 @@ public final class ProjectionsSegmentBinder {
             return 
SubqueryProjectionSegmentBinder.bind((SubqueryProjectionSegment) 
projectionSegment, binderContext, newOuterTableBinderContexts);
         }
         if (projectionSegment instanceof ExpressionProjectionSegment) {
-            ExpressionProjectionSegment result = new 
ExpressionProjectionSegment(projectionSegment.getStartIndex(), 
projectionSegment.getStopIndex(),
-                    ((ExpressionProjectionSegment) 
projectionSegment).getText(), 
ExpressionSegmentBinder.bind(((ExpressionProjectionSegment) 
projectionSegment).getExpr(), SegmentType.PROJECTION,
-                            binderContext, tableBinderContexts, 
outerTableBinderContexts));
+            ExpressionSegment boundExpressionSegment = 
ExpressionSegmentBinder.bind(
+                    ((ExpressionProjectionSegment) 
projectionSegment).getExpr(), SegmentType.PROJECTION, binderContext, 
tableBinderContexts, outerTableBinderContexts);
+            ExpressionProjectionSegment result = new 
ExpressionProjectionSegment(
+                    projectionSegment.getStartIndex(), 
projectionSegment.getStopIndex(), ((ExpressionProjectionSegment) 
projectionSegment).getText(), boundExpressionSegment);
             result.setAlias(((ExpressionProjectionSegment) 
projectionSegment).getAliasSegment());
             return result;
         }
-        // TODO support more ProjectionSegment bind
+        // TODO support more ProjectionSegment bound
         return projectionSegment;
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ColumnProjectionSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/type/ColumnProjectionSegmentBinder.java
similarity index 99%
rename from 
infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ColumnProjectionSegmentBinder.java
rename to 
infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/type/ColumnProjectionSegmentBinder.java
index b836f5157da..33f2298b554 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ColumnProjectionSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/type/ColumnProjectionSegmentBinder.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.binder.segment.projection.impl;
+package org.apache.shardingsphere.infra.binder.segment.projection.type;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/type/ShorthandProjectionSegmentBinder.java
similarity index 73%
rename from 
infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinder.java
rename to 
infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/type/ShorthandProjectionSegmentBinder.java
index 2de1eaa2877..02a6effdf65 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/type/ShorthandProjectionSegmentBinder.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.binder.segment.projection.impl;
+package org.apache.shardingsphere.infra.binder.segment.projection.type;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
@@ -32,39 +32,44 @@ import java.util.Collection;
 import java.util.Map;
 
 /**
- * Column projection segment binder.
+ * Shorthand projection segment binder.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class ShorthandProjectionSegmentBinder {
     
     /**
-     * Bind column projection segment.
+     * Bind shorthand projection segment.
      *
      * @param segment table segment
      * @param boundTableSegment bound table segment
      * @param tableBinderContexts table binder contexts
-     * @return bound column projection segment
+     * @return bound shorthand projection segment
      */
     public static ShorthandProjectionSegment bind(final 
ShorthandProjectionSegment segment, final TableSegment boundTableSegment,
                                                   final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
-        ShorthandProjectionSegment result = new 
ShorthandProjectionSegment(segment.getStartIndex(), segment.getStopIndex());
-        segment.getOwner().ifPresent(result::setOwner);
-        segment.getAliasSegment().ifPresent(result::setAlias);
+        ShorthandProjectionSegment result = copy(segment);
         if (segment.getOwner().isPresent()) {
-            
expandVisibleColumn(getProjectionSegmentsByTableAliasOrName(tableBinderContexts,
 segment.getOwner().get().getIdentifier().getValue()), result);
+            
expandVisibleColumns(getProjectionSegmentsByTableAliasOrName(tableBinderContexts,
 segment.getOwner().get().getIdentifier().getValue()), result);
         } else {
-            bindNoOwnerProjections(boundTableSegment, tableBinderContexts, 
result);
+            expandNoOwnerProjections(boundTableSegment, tableBinderContexts, 
result);
         }
         return result;
     }
     
+    private static ShorthandProjectionSegment copy(final 
ShorthandProjectionSegment segment) {
+        ShorthandProjectionSegment result = new 
ShorthandProjectionSegment(segment.getStartIndex(), segment.getStopIndex());
+        segment.getOwner().ifPresent(result::setOwner);
+        segment.getAliasSegment().ifPresent(result::setAlias);
+        return result;
+    }
+    
     private static Collection<ProjectionSegment> 
getProjectionSegmentsByTableAliasOrName(final Map<String, 
TableSegmentBinderContext> tableBinderContexts, final String tableAliasOrName) {
         ShardingSpherePreconditions.checkContainsKey(tableBinderContexts, 
tableAliasOrName.toLowerCase(),
                 () -> new IllegalStateException(String.format("Can not find 
table binder context by table alias or name %s.", tableAliasOrName)));
         return 
tableBinderContexts.get(tableAliasOrName.toLowerCase()).getProjectionSegments();
     }
     
-    private static void expandVisibleColumn(final 
Collection<ProjectionSegment> projectionSegments, final 
ShorthandProjectionSegment segment) {
+    private static void expandVisibleColumns(final 
Collection<ProjectionSegment> projectionSegments, final 
ShorthandProjectionSegment segment) {
         for (ProjectionSegment each : projectionSegments) {
             if (each.isVisible()) {
                 segment.getActualProjectionSegments().add(each);
@@ -72,15 +77,15 @@ public final class ShorthandProjectionSegmentBinder {
         }
     }
     
-    private static void bindNoOwnerProjections(final TableSegment 
boundTableSegment, final Map<String, TableSegmentBinderContext> 
tableBinderContexts,
-                                               final 
ShorthandProjectionSegment segment) {
+    private static void expandNoOwnerProjections(final TableSegment 
boundTableSegment, final Map<String, TableSegmentBinderContext> 
tableBinderContexts,
+                                                 final 
ShorthandProjectionSegment segment) {
         if (boundTableSegment instanceof SimpleTableSegment) {
             String tableAliasOrName = 
boundTableSegment.getAliasName().orElseGet(() -> ((SimpleTableSegment) 
boundTableSegment).getTableName().getIdentifier().getValue());
-            
expandVisibleColumn(getProjectionSegmentsByTableAliasOrName(tableBinderContexts,
 tableAliasOrName), segment);
+            
expandVisibleColumns(getProjectionSegmentsByTableAliasOrName(tableBinderContexts,
 tableAliasOrName), segment);
         } else if (boundTableSegment instanceof JoinTableSegment) {
-            expandVisibleColumn(((JoinTableSegment) 
boundTableSegment).getDerivedJoinTableProjectionSegments(), segment);
+            expandVisibleColumns(((JoinTableSegment) 
boundTableSegment).getDerivedJoinTableProjectionSegments(), segment);
         } else if (boundTableSegment instanceof SubqueryTableSegment) {
-            
expandVisibleColumn(getProjectionSegmentsByTableAliasOrName(tableBinderContexts,
 boundTableSegment.getAliasName().orElse("")), segment);
+            
expandVisibleColumns(getProjectionSegmentsByTableAliasOrName(tableBinderContexts,
 boundTableSegment.getAliasName().orElse("")), segment);
         }
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/SubqueryProjectionSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/type/SubqueryProjectionSegmentBinder.java
similarity index 91%
rename from 
infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/SubqueryProjectionSegmentBinder.java
rename to 
infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/type/SubqueryProjectionSegmentBinder.java
index a2b1419ad4c..cf6b88dbb84 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/SubqueryProjectionSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/projection/type/SubqueryProjectionSegmentBinder.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.binder.segment.projection.impl;
+package org.apache.shardingsphere.infra.binder.segment.projection.type;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
@@ -41,8 +41,8 @@ public final class SubqueryProjectionSegmentBinder {
      * @param tableBinderContexts table binder contexts
      * @return bound subquery projection segment
      */
-    public static SubqueryProjectionSegment bind(final 
SubqueryProjectionSegment segment, final SQLStatementBinderContext 
binderContext,
-                                                 final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
+    public static SubqueryProjectionSegment bind(final 
SubqueryProjectionSegment segment,
+                                                 final 
SQLStatementBinderContext binderContext, final Map<String, 
TableSegmentBinderContext> tableBinderContexts) {
         SubquerySegment boundSubquerySegment = 
SubquerySegmentBinder.bind(segment.getSubquery(), binderContext, 
tableBinderContexts);
         SubqueryProjectionSegment result = new 
SubqueryProjectionSegment(boundSubquerySegment, segment.getText());
         segment.getAliasSegment().ifPresent(result::setAlias);
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
index 3aede415ca2..d5150632b46 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
@@ -124,6 +124,7 @@ class SQLStatementContextFactoryTest {
         OpenGaussCursorStatement cursorStatement = 
mock(OpenGaussCursorStatement.class, RETURNS_DEEP_STUBS);
         MySQLSelectStatement selectStatement = 
mock(MySQLSelectStatement.class, RETURNS_DEEP_STUBS);
         
when(selectStatement.getProjections().isDistinctRow()).thenReturn(false);
+        
when(selectStatement.getProjections().getProjections()).thenReturn(Collections.emptyList());
         
when(selectStatement.getCommentSegments()).thenReturn(Collections.emptyList());
         when(cursorStatement.getSelect()).thenReturn(selectStatement);
         
when(cursorStatement.getCommentSegments()).thenReturn(Collections.emptyList());
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinderTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/projection/type/ShorthandProjectionSegmentBinderTest.java
similarity index 99%
rename from 
infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinderTest.java
rename to 
infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/projection/type/ShorthandProjectionSegmentBinderTest.java
index fd597dd4020..5611e8c6add 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/projection/impl/ShorthandProjectionSegmentBinderTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/projection/type/ShorthandProjectionSegmentBinderTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.binder.segment.projection.impl;
+package org.apache.shardingsphere.infra.binder.segment.projection.type;
 
 import 
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
 import 
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;

Reply via email to