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;