This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 341dc3b7ce7 Fix function table bind ex (#28419)
341dc3b7ce7 is described below
commit 341dc3b7ce7d984698e571e29ee38d9853791b43
Author: Chuxin Chen <[email protected]>
AuthorDate: Tue Sep 12 13:39:35 2023 +0800
Fix function table bind ex (#28419)
---
.../expression/impl/ColumnSegmentBinder.java | 47 ++++++++++++++--------
.../from/FunctionTableSegmentBinderContext.java | 40 ++++++++++++++++++
...t.java => SimpleTableSegmentBinderContext.java} | 24 ++++-------
.../binder/segment/from/TableSegmentBinder.java | 5 +++
.../segment/from/TableSegmentBinderContext.java | 35 +++-------------
.../from/impl/SimpleTableSegmentBinder.java | 9 +++--
.../from/impl/SubqueryTableSegmentBinder.java | 3 +-
.../expression/impl/ColumnSegmentBinderTest.java | 9 +++--
.../from/impl/SimpleTableSegmentBinderTest.java | 43 +++++++++++---------
.../impl/ShorthandProjectionSegmentBinderTest.java | 7 ++--
10 files changed, 129 insertions(+), 93 deletions(-)
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 cf11560d320..531320b6ef8 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
@@ -21,6 +21,8 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.groovy.util.Maps;
import org.apache.shardingsphere.infra.binder.enums.SegmentType;
+import
org.apache.shardingsphere.infra.binder.segment.from.FunctionTableSegmentBinderContext;
+import
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
import org.apache.shardingsphere.infra.exception.AmbiguousColumnException;
@@ -91,7 +93,7 @@ public final class ColumnSegmentBinder {
statementBinderContext.getExternalTableBinderContexts());
}
if (!statementBinderContext.getJoinTableProjectionSegments().isEmpty()
&& isNeedUseJoinTableProjectionBind(segment, parentSegmentType,
statementBinderContext)) {
- return Collections.singleton(new
TableSegmentBinderContext(statementBinderContext.getJoinTableProjectionSegments()));
+ return Collections.singleton(new
SimpleTableSegmentBinderContext(statementBinderContext.getJoinTableProjectionSegments()));
}
return tableBinderContexts.values();
}
@@ -121,13 +123,13 @@ public final class ColumnSegmentBinder {
ColumnSegment result = null;
boolean isFindInputColumn = false;
for (TableSegmentBinderContext each : tableBinderContexts) {
- ProjectionSegment projectionSegment =
each.getProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
- if (projectionSegment instanceof ColumnProjectionSegment) {
+ Optional<ProjectionSegment> projectionSegment =
each.findProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
+ if (projectionSegment.isPresent() && projectionSegment.get()
instanceof ColumnProjectionSegment) {
ShardingSpherePreconditions.checkState(null == result,
() -> new
AmbiguousColumnException(segment.getExpression(),
SEGMENT_TYPE_MESSAGES.getOrDefault(parentSegmentType,
UNKNOWN_SEGMENT_TYPE_MESSAGE)));
- result = ((ColumnProjectionSegment)
projectionSegment).getColumn();
+ result = ((ColumnProjectionSegment)
projectionSegment.get()).getColumn();
}
- if (!isFindInputColumn && null != projectionSegment) {
+ if (!isFindInputColumn && projectionSegment.isPresent()) {
isFindInputColumn = true;
}
}
@@ -149,7 +151,7 @@ public final class ColumnSegmentBinder {
result = findInputColumnSegmentByVariables(segment,
statementBinderContext.getVariableNames()).orElse(null);
isFindInputColumn = result != null;
}
- ShardingSpherePreconditions.checkState(isFindInputColumn,
+ ShardingSpherePreconditions.checkState(isFindInputColumn ||
containsFunctionTable(tableBinderContexts, outerTableBinderContexts.values()),
() -> new UnknownColumnException(segment.getExpression(),
SEGMENT_TYPE_MESSAGES.getOrDefault(parentSegmentType,
UNKNOWN_SEGMENT_TYPE_MESSAGE)));
return Optional.ofNullable(result);
}
@@ -158,9 +160,9 @@ public final class ColumnSegmentBinder {
ListIterator<TableSegmentBinderContext> listIterator = new
ArrayList<>(outerTableBinderContexts.values()).listIterator(outerTableBinderContexts.size());
while (listIterator.hasPrevious()) {
TableSegmentBinderContext each = listIterator.previous();
- ProjectionSegment projectionSegment =
each.getProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
- if (null != projectionSegment) {
- return Optional.of(projectionSegment);
+ Optional<ProjectionSegment> result =
each.findProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
+ if (result.isPresent()) {
+ return result;
}
}
return Optional.empty();
@@ -168,9 +170,9 @@ public final class ColumnSegmentBinder {
private static Optional<ProjectionSegment>
findInputColumnSegmentFromExternalTables(final ColumnSegment segment, final
Map<String, TableSegmentBinderContext> externalTableBinderContexts) {
for (TableSegmentBinderContext each :
externalTableBinderContexts.values()) {
- ProjectionSegment projectionSegment =
each.getProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
- if (null != projectionSegment) {
- return Optional.of(projectionSegment);
+ Optional<ProjectionSegment> result =
each.findProjectionSegmentByColumnLabel(segment.getIdentifier().getValue());
+ if (result.isPresent()) {
+ return result;
}
}
return Optional.empty();
@@ -185,6 +187,20 @@ public final class ColumnSegmentBinder {
return Optional.empty();
}
+ private static boolean containsFunctionTable(final
Collection<TableSegmentBinderContext> tableBinderContexts, final
Collection<TableSegmentBinderContext> outerBinderContexts) {
+ for (TableSegmentBinderContext each : tableBinderContexts) {
+ if (each instanceof FunctionTableSegmentBinderContext) {
+ return true;
+ }
+ }
+ for (TableSegmentBinderContext each : outerBinderContexts) {
+ if (each instanceof FunctionTableSegmentBinderContext) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private static ColumnSegmentBoundedInfo
createColumnSegmentBoundedInfo(final ColumnSegment segment, final ColumnSegment
inputColumnSegment) {
IdentifierValue originalDatabase = null == inputColumnSegment ? null :
inputColumnSegment.getColumnBoundedInfo().getOriginalDatabase();
IdentifierValue originalSchema = null == inputColumnSegment ? null :
inputColumnSegment.getColumnBoundedInfo().getOriginalSchema();
@@ -219,12 +235,11 @@ public final class ColumnSegmentBinder {
}
private static Collection<ColumnSegment>
findUsingInputColumnSegments(final String columnName, final
Collection<TableSegmentBinderContext> tableBinderContexts) {
- ProjectionSegment projectionSegment;
Collection<ColumnSegment> result = new LinkedList<>();
for (TableSegmentBinderContext each : tableBinderContexts) {
- projectionSegment =
each.getProjectionSegmentByColumnLabel(columnName);
- if (projectionSegment instanceof ColumnProjectionSegment) {
- result.add(((ColumnProjectionSegment)
projectionSegment).getColumn());
+ Optional<ProjectionSegment> projectionSegment =
each.findProjectionSegmentByColumnLabel(columnName);
+ if (projectionSegment.isPresent() && projectionSegment.get()
instanceof ColumnProjectionSegment) {
+ result.add(((ColumnProjectionSegment)
projectionSegment.get()).getColumn());
}
}
return result;
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/FunctionTableSegmentBinderContext.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/FunctionTableSegmentBinderContext.java
new file mode 100644
index 00000000000..9fc755f3374
--- /dev/null
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/FunctionTableSegmentBinderContext.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.binder.segment.from;
+
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Optional;
+
+/**
+ * Function table segment binder context.
+ */
+public final class FunctionTableSegmentBinderContext implements
TableSegmentBinderContext {
+
+ @Override
+ public Optional<ProjectionSegment>
findProjectionSegmentByColumnLabel(final String columnLabel) {
+ return Optional.empty();
+ }
+
+ @Override
+ public Collection<ProjectionSegment> getProjectionSegments() {
+ return Collections.emptyList();
+ }
+}
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/SimpleTableSegmentBinderContext.java
similarity index 79%
copy from
infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
copy to
infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/SimpleTableSegmentBinderContext.java
index 9b4c1fac777..82852b7d83d 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/SimpleTableSegmentBinderContext.java
@@ -24,16 +24,17 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Shorthan
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.Optional;
/**
- * Table segment binder context.
+ * Simple table segment binder context.
*/
@RequiredArgsConstructor
-public final class TableSegmentBinderContext {
+public final class SimpleTableSegmentBinderContext implements
TableSegmentBinderContext {
private final Map<String, ProjectionSegment> columnLabelProjectionSegments;
- public TableSegmentBinderContext(final Collection<ProjectionSegment>
projectionSegments) {
+ public SimpleTableSegmentBinderContext(final Collection<ProjectionSegment>
projectionSegments) {
columnLabelProjectionSegments = new
LinkedHashMap<>(projectionSegments.size(), 1F);
projectionSegments.forEach(each ->
putColumnLabelProjectionSegments(each, columnLabelProjectionSegments));
}
@@ -46,21 +47,12 @@ public final class TableSegmentBinderContext {
}
}
- /**
- * Get projection segment by column label.
- *
- * @param columnLabel column label
- * @return projection segment
- */
- public ProjectionSegment getProjectionSegmentByColumnLabel(final String
columnLabel) {
- return columnLabelProjectionSegments.get(columnLabel.toLowerCase());
+ @Override
+ public Optional<ProjectionSegment>
findProjectionSegmentByColumnLabel(final String columnLabel) {
+ return
Optional.ofNullable(columnLabelProjectionSegments.get(columnLabel.toLowerCase()));
}
- /**
- * Get projection segments.
- *
- * @return projection segments
- */
+ @Override
public Collection<ProjectionSegment> getProjectionSegments() {
return columnLabelProjectionSegments.values();
}
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
index d402122e080..37b778e3afa 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinder.java
@@ -25,6 +25,7 @@ import
org.apache.shardingsphere.infra.binder.segment.from.impl.SimpleTableSegme
import
org.apache.shardingsphere.infra.binder.segment.from.impl.SubqueryTableSegmentBinder;
import
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.DeleteMultiTableSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.FunctionTableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
@@ -61,6 +62,10 @@ public final class TableSegmentBinder {
if (segment instanceof DeleteMultiTableSegment) {
return
DeleteMultiTableSegmentBinder.bind((DeleteMultiTableSegment) segment,
statementBinderContext, tableBinderContexts);
}
+ if (segment instanceof FunctionTableSegment) {
+ tableBinderContexts.put(segment.getAliasName().orElseGet(() ->
((FunctionTableSegment) segment).getTableFunction().getText()).toLowerCase(),
new FunctionTableSegmentBinderContext());
+ return segment;
+ }
return segment;
}
}
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
index 9b4c1fac777..d7069152527 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/TableSegmentBinderContext.java
@@ -17,51 +17,28 @@
package org.apache.shardingsphere.infra.binder.segment.from;
-import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.Optional;
/**
* Table segment binder context.
*/
-@RequiredArgsConstructor
-public final class TableSegmentBinderContext {
-
- private final Map<String, ProjectionSegment> columnLabelProjectionSegments;
-
- public TableSegmentBinderContext(final Collection<ProjectionSegment>
projectionSegments) {
- columnLabelProjectionSegments = new
LinkedHashMap<>(projectionSegments.size(), 1F);
- projectionSegments.forEach(each ->
putColumnLabelProjectionSegments(each, columnLabelProjectionSegments));
- }
-
- private void putColumnLabelProjectionSegments(final ProjectionSegment
projectionSegment, final Map<String, ProjectionSegment>
columnLabelProjectionSegments) {
- if (projectionSegment instanceof ShorthandProjectionSegment) {
- ((ShorthandProjectionSegment)
projectionSegment).getActualProjectionSegments().forEach(each ->
columnLabelProjectionSegments.put(each.getColumnLabel().toLowerCase(), each));
- } else {
-
columnLabelProjectionSegments.put(projectionSegment.getColumnLabel().toLowerCase(),
projectionSegment);
- }
- }
+public interface TableSegmentBinderContext {
/**
- * Get projection segment by column label.
- *
+ * Find projection segment by column label.
+ *
* @param columnLabel column label
* @return projection segment
*/
- public ProjectionSegment getProjectionSegmentByColumnLabel(final String
columnLabel) {
- return columnLabelProjectionSegments.get(columnLabel.toLowerCase());
- }
+ Optional<ProjectionSegment> findProjectionSegmentByColumnLabel(String
columnLabel);
/**
* Get projection segments.
*
* @return projection segments
*/
- public Collection<ProjectionSegment> getProjectionSegments() {
- return columnLabelProjectionSegments.values();
- }
+ Collection<ProjectionSegment> getProjectionSegments();
}
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
index f46774efbdb..76431790969 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinder.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.infra.binder.segment.from.impl;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
import
org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData;
@@ -108,9 +109,9 @@ public final class SimpleTableSegmentBinder {
return new IdentifierValue(new
DatabaseTypeRegistry(databaseType).getDefaultSchemaName(statementBinderContext.getDefaultDatabaseName()));
}
- private static TableSegmentBinderContext
createSimpleTableBinderContext(final SimpleTableSegment segment, final
ShardingSphereSchema schema,
-
final IdentifierValue originalDatabase, final IdentifierValue originalSchema,
-
final SQLStatementBinderContext statementBinderContext) {
+ private static SimpleTableSegmentBinderContext
createSimpleTableBinderContext(final SimpleTableSegment segment, final
ShardingSphereSchema schema,
+
final IdentifierValue originalDatabase, final IdentifierValue originalSchema,
+
final SQLStatementBinderContext statementBinderContext) {
Collection<ShardingSphereColumn> columnNames =
Optional.ofNullable(schema.getTable(segment.getTableName().getIdentifier().getValue())).map(ShardingSphereTable::getColumnValues).orElseGet(Collections::emptyList);
Collection<ProjectionSegment> projectionSegments = new LinkedList<>();
@@ -124,7 +125,7 @@ public final class SimpleTableSegmentBinder {
columnProjectionSegment.setVisible(each.isVisible());
projectionSegments.add(columnProjectionSegment);
}
- return new TableSegmentBinderContext(projectionSegments);
+ return new SimpleTableSegmentBinderContext(projectionSegments);
}
private static void checkTableExists(final String tableName, final
SQLStatementBinderContext statementBinderContext, final String databaseName,
final String schemaName) {
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinder.java
index 2b874884028..74bb8196f6e 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinder.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SubqueryTableSegmentBinder.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.infra.binder.segment.from.impl;
import com.google.common.base.Strings;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder;
@@ -64,7 +65,7 @@ public final class SubqueryTableSegmentBinder {
segment.getAliasSegment().ifPresent(result::setAlias);
IdentifierValue subqueryTableName =
segment.getAliasSegment().map(AliasSegment::getIdentifier).orElseGet(() -> new
IdentifierValue(""));
tableBinderContexts.put(subqueryTableName.getValue().toLowerCase(),
- new
TableSegmentBinderContext(createSubqueryProjections(boundedSelect.getProjections().getProjections(),
subqueryTableName)));
+ new
SimpleTableSegmentBinderContext(createSubqueryProjections(boundedSelect.getProjections().getProjections(),
subqueryTableName)));
return result;
}
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinderTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinderTest.java
index 0de5d321033..66119adb2f1 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinderTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/expression/impl/ColumnSegmentBinderTest.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.infra.binder.segment.expression.impl;
import org.apache.shardingsphere.infra.binder.enums.SegmentType;
+import
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
@@ -48,11 +49,11 @@ class ColumnSegmentBinderTest {
ColumnSegment boundedOrderIdColumn = new ColumnSegment(0, 0, new
IdentifierValue("order_id"));
boundedOrderIdColumn.setColumnBoundedInfo(new
ColumnSegmentBoundedInfo(new IdentifierValue(DefaultDatabase.LOGIC_NAME), new
IdentifierValue(DefaultDatabase.LOGIC_NAME),
new IdentifierValue("t_order"), new
IdentifierValue("order_id")));
- tableBinderContexts.put("t_order", new
TableSegmentBinderContext(Collections.singleton(new
ColumnProjectionSegment(boundedOrderIdColumn))));
+ tableBinderContexts.put("t_order", new
SimpleTableSegmentBinderContext(Collections.singleton(new
ColumnProjectionSegment(boundedOrderIdColumn))));
ColumnSegment boundedItemIdColumn = new ColumnSegment(0, 0, new
IdentifierValue("item_id"));
boundedItemIdColumn.setColumnBoundedInfo(new
ColumnSegmentBoundedInfo(new IdentifierValue(DefaultDatabase.LOGIC_NAME), new
IdentifierValue(DefaultDatabase.LOGIC_NAME),
new IdentifierValue("t_order_item"), new
IdentifierValue("item_id")));
- tableBinderContexts.put("t_order_item", new
TableSegmentBinderContext(Collections.singleton(new
ColumnProjectionSegment(boundedItemIdColumn))));
+ tableBinderContexts.put("t_order_item", new
SimpleTableSegmentBinderContext(Collections.singleton(new
ColumnProjectionSegment(boundedItemIdColumn))));
ColumnSegment columnSegment = new ColumnSegment(0, 0, new
IdentifierValue("order_id"));
SQLStatementBinderContext statementBinderContext =
new
SQLStatementBinderContext(mock(ShardingSphereMetaData.class),
DefaultDatabase.LOGIC_NAME, TypedSPILoader.getService(DatabaseType.class,
"FIXTURE"), Collections.emptySet());
@@ -71,11 +72,11 @@ class ColumnSegmentBinderTest {
ColumnSegment boundedOrderStatusColumn = new ColumnSegment(0, 0, new
IdentifierValue("status"));
boundedOrderStatusColumn.setColumnBoundedInfo(new
ColumnSegmentBoundedInfo(new IdentifierValue(DefaultDatabase.LOGIC_NAME), new
IdentifierValue(DefaultDatabase.LOGIC_NAME),
new IdentifierValue("t_order"), new
IdentifierValue("status")));
- outerTableBinderContexts.put("t_order", new
TableSegmentBinderContext(Collections.singleton(new
ColumnProjectionSegment(boundedOrderStatusColumn))));
+ outerTableBinderContexts.put("t_order", new
SimpleTableSegmentBinderContext(Collections.singleton(new
ColumnProjectionSegment(boundedOrderStatusColumn))));
ColumnSegment boundedOrderItemStatusColumn = new ColumnSegment(0, 0,
new IdentifierValue("status"));
boundedOrderItemStatusColumn.setColumnBoundedInfo(new
ColumnSegmentBoundedInfo(new IdentifierValue(DefaultDatabase.LOGIC_NAME), new
IdentifierValue(DefaultDatabase.LOGIC_NAME),
new IdentifierValue("t_order_item"), new
IdentifierValue("status")));
- outerTableBinderContexts.put("t_order_item", new
TableSegmentBinderContext(Collections.singleton(new
ColumnProjectionSegment(boundedOrderItemStatusColumn))));
+ outerTableBinderContexts.put("t_order_item", new
SimpleTableSegmentBinderContext(Collections.singleton(new
ColumnProjectionSegment(boundedOrderItemStatusColumn))));
SQLStatementBinderContext statementBinderContext =
new
SQLStatementBinderContext(mock(ShardingSphereMetaData.class),
DefaultDatabase.LOGIC_NAME, TypedSPILoader.getService(DatabaseType.class,
"FIXTURE"), Collections.emptySet());
ColumnSegment columnSegment = new ColumnSegment(0, 0, new
IdentifierValue("status"));
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinderTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinderTest.java
index 8018ade80fa..25f6a270ff9 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinderTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/from/impl/SimpleTableSegmentBinderTest.java
@@ -62,32 +62,35 @@ class SimpleTableSegmentBinderTest {
assertThat(actual.getTableName().getTableBoundedInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
assertTrue(tableBinderContexts.containsKey("t_order"));
assertThat(tableBinderContexts.get("t_order").getProjectionSegments().size(),
is(3));
-
assertTrue(tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")
instanceof ColumnProjectionSegment);
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalDatabase().getValue(),
+
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").isPresent());
+
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").get()
instanceof ColumnProjectionSegment);
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").get()).getColumn().getColumnBoundedInfo().getOriginalDatabase()
+ .getValue(), is(DefaultDatabase.LOGIC_NAME));
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").get()).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
- is(DefaultDatabase.LOGIC_NAME));
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").get()).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
is("t_order"));
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("user_id")).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("user_id").get()).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
is("user_id"));
-
assertTrue(tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")
instanceof ColumnProjectionSegment);
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalDatabase().getValue(),
- is(DefaultDatabase.LOGIC_NAME));
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
- is(DefaultDatabase.LOGIC_NAME));
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
+
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").isPresent());
+
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").get()
instanceof ColumnProjectionSegment);
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").get()).getColumn().getColumnBoundedInfo().getOriginalDatabase()
+ .getValue(), is(DefaultDatabase.LOGIC_NAME));
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").get()).getColumn().getColumnBoundedInfo().getOriginalSchema()
+ .getValue(), is(DefaultDatabase.LOGIC_NAME));
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").get()).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
is("t_order"));
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("order_id")).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
- is("order_id"));
-
assertTrue(tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")
instanceof ColumnProjectionSegment);
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalDatabase().getValue(),
- is(DefaultDatabase.LOGIC_NAME));
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("order_id").get()).getColumn().getColumnBoundedInfo().getOriginalColumn()
+ .getValue(), is("order_id"));
+
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").isPresent());
+
assertTrue(tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").get()
instanceof ColumnProjectionSegment);
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").get()).getColumn().getColumnBoundedInfo().getOriginalDatabase()
+ .getValue(), is(DefaultDatabase.LOGIC_NAME));
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").get()).getColumn().getColumnBoundedInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").get()).getColumn().getColumnBoundedInfo().getOriginalTable().getValue(),
is("t_order"));
- assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").getProjectionSegmentByColumnLabel("status")).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
+ assertThat(((ColumnProjectionSegment)
tableBinderContexts.get("t_order").findProjectionSegmentByColumnLabel("status").get()).getColumn().getColumnBoundedInfo().getOriginalColumn().getValue(),
is("status"));
}
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/impl/ShorthandProjectionSegmentBinderTest.java
index 8200fc2213d..5a383048215 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/impl/ShorthandProjectionSegmentBinderTest.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.infra.binder.segment.projection.impl;
+import
org.apache.shardingsphere.infra.binder.segment.from.SimpleTableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
@@ -53,7 +54,7 @@ class ShorthandProjectionSegmentBinderTest {
Map<String, TableSegmentBinderContext> tableBinderContexts = new
LinkedHashMap<>();
ColumnProjectionSegment invisibleColumn = new
ColumnProjectionSegment(new ColumnSegment(0, 0, new IdentifierValue("status")));
invisibleColumn.setVisible(false);
- tableBinderContexts.put("o", new
TableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
+ tableBinderContexts.put("o", new
SimpleTableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
ShorthandProjectionSegment actual =
ShorthandProjectionSegmentBinder.bind(shorthandProjectionSegment,
mock(TableSegment.class), tableBinderContexts);
assertThat(actual.getActualProjectionSegments().size(), is(1));
ProjectionSegment visibleColumn =
actual.getActualProjectionSegments().iterator().next();
@@ -66,7 +67,7 @@ class ShorthandProjectionSegmentBinderTest {
Map<String, TableSegmentBinderContext> tableBinderContexts = new
LinkedHashMap<>();
ColumnProjectionSegment invisibleColumn = new
ColumnProjectionSegment(new ColumnSegment(0, 0, new IdentifierValue("status")));
invisibleColumn.setVisible(false);
- tableBinderContexts.put("o", new
TableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
+ tableBinderContexts.put("o", new
SimpleTableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
SimpleTableSegment boundedTableSegment = new SimpleTableSegment(new
TableNameSegment(0, 0, new IdentifierValue("t_order")));
boundedTableSegment.setAlias(new AliasSegment(0, 0, new
IdentifierValue("o")));
ShorthandProjectionSegment actual =
ShorthandProjectionSegmentBinder.bind(new ShorthandProjectionSegment(0, 0),
boundedTableSegment, tableBinderContexts);
@@ -81,7 +82,7 @@ class ShorthandProjectionSegmentBinderTest {
Map<String, TableSegmentBinderContext> tableBinderContexts = new
LinkedHashMap<>();
ColumnProjectionSegment invisibleColumn = new
ColumnProjectionSegment(new ColumnSegment(0, 0, new IdentifierValue("status")));
invisibleColumn.setVisible(false);
- tableBinderContexts.put("o", new
TableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
+ tableBinderContexts.put("o", new
SimpleTableSegmentBinderContext(Arrays.asList(new ColumnProjectionSegment(new
ColumnSegment(0, 0, new IdentifierValue("order_id"))), invisibleColumn)));
SubqueryTableSegment boundedTableSegment = new
SubqueryTableSegment(new SubquerySegment(0, 0,
mock(MySQLSelectStatement.class)));
boundedTableSegment.setAlias(new AliasSegment(0, 0, new
IdentifierValue("o")));
ShorthandProjectionSegment actual =
ShorthandProjectionSegmentBinder.bind(new ShorthandProjectionSegment(0, 0),
boundedTableSegment, tableBinderContexts);