This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 454f14fcdf8 Refactor SimpleTableSegmentBinder (#32092)
454f14fcdf8 is described below
commit 454f14fcdf8085725cd684ac32a45084a7421f0c
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jul 13 18:39:36 2024 +0800
Refactor SimpleTableSegmentBinder (#32092)
* Refactor ExpressionSegmentBinder
* Refactor ExpressionSegmentBinder
* Refactor ExpressionSegmentBinder
* Refactor SubqueryTableSegmentBinder
* Refactor SimpleTableSegmentBinder
* Refactor SimpleTableSegmentBinder
* Refactor SimpleTableSegmentBinder
* Refactor SimpleTableSegmentBinder
* Refactor SimpleTableSegmentBinder
* Refactor SimpleTableSegmentBinder
---
.../from/type/SimpleTableSegmentBinder.java | 74 ++++++++++++----------
.../from/type/SubqueryTableSegmentBinder.java | 18 +++---
2 files changed, 49 insertions(+), 43 deletions(-)
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/type/SimpleTableSegmentBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/type/SimpleTableSegmentBinder.java
index 88a4aad3195..9619003a350 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/type/SimpleTableSegmentBinder.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/type/SimpleTableSegmentBinder.java
@@ -20,10 +20,11 @@ package
org.apache.shardingsphere.infra.binder.segment.from.type;
import com.cedarsoftware.util.CaseInsensitiveSet;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.infra.binder.segment.from.context.type.SimpleTableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.segment.from.context.TableSegmentBinderContext;
+import
org.apache.shardingsphere.infra.binder.segment.from.context.type.SimpleTableSegmentBinderContext;
import
org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
import
org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData;
+import
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import
org.apache.shardingsphere.infra.database.opengauss.type.OpenGaussDatabaseType;
@@ -34,7 +35,6 @@ import
org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundEx
import
org.apache.shardingsphere.infra.metadata.database.schema.manager.SystemSchemaManager;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
@@ -78,15 +78,16 @@ public final class SimpleTableSegmentBinder {
*/
public static SimpleTableSegment bind(final SimpleTableSegment segment,
final SQLStatementBinderContext binderContext, final Map<String,
TableSegmentBinderContext> tableBinderContexts) {
fillPivotColumnNamesInBinderContext(segment, binderContext);
- IdentifierValue originalDatabase = getDatabaseName(segment,
binderContext);
- IdentifierValue originalSchema = getSchemaName(segment, binderContext);
- ShardingSpherePreconditions.checkNotNull(originalDatabase.getValue(),
NoDatabaseSelectedException::new);
- checkTableExists(segment.getTableName().getIdentifier().getValue(),
binderContext, originalDatabase.getValue(), originalSchema.getValue());
- ShardingSphereSchema schema =
binderContext.getMetaData().getDatabase(originalDatabase.getValue()).getSchema(originalSchema.getValue());
- tableBinderContexts.putIfAbsent((segment.getAliasName().orElseGet(()
-> segment.getTableName().getIdentifier().getValue())).toLowerCase(),
- createSimpleTableBinderContext(segment, schema,
originalDatabase, originalSchema, binderContext));
- TableNameSegment tableNameSegment = new
TableNameSegment(segment.getTableName().getStartIndex(),
segment.getTableName().getStopIndex(), segment.getTableName().getIdentifier());
- tableNameSegment.setTableBoundInfo(new
TableSegmentBoundInfo(originalDatabase, originalSchema));
+ IdentifierValue databaseName = getDatabaseName(segment, binderContext);
+ ShardingSpherePreconditions.checkNotNull(databaseName.getValue(),
NoDatabaseSelectedException::new);
+ IdentifierValue schemaName = getSchemaName(segment, binderContext);
+ IdentifierValue tableName = segment.getTableName().getIdentifier();
+ checkTableExists(binderContext, databaseName.getValue(),
schemaName.getValue(), tableName.getValue());
+ ShardingSphereSchema schema =
binderContext.getMetaData().getDatabase(databaseName.getValue()).getSchema(schemaName.getValue());
+ tableBinderContexts.putIfAbsent(
+
(segment.getAliasName().orElseGet(tableName::getValue)).toLowerCase(),
createSimpleTableBinderContext(segment, schema, databaseName, schemaName,
binderContext));
+ TableNameSegment tableNameSegment = new
TableNameSegment(segment.getTableName().getStartIndex(),
segment.getTableName().getStopIndex(), tableName);
+ tableNameSegment.setTableBoundInfo(new
TableSegmentBoundInfo(databaseName, schemaName));
SimpleTableSegment result = new SimpleTableSegment(tableNameSegment);
segment.getOwner().ifPresent(result::setOwner);
segment.getAliasSegment().ifPresent(result::setAlias);
@@ -97,9 +98,9 @@ public final class SimpleTableSegmentBinder {
segment.getPivot().ifPresent(optional ->
optional.getPivotColumns().forEach(each ->
binderContext.getPivotColumnNames().add(each.getIdentifier().getValue().toLowerCase())));
}
- private static IdentifierValue getDatabaseName(final SimpleTableSegment
tableSegment, final SQLStatementBinderContext binderContext) {
+ private static IdentifierValue getDatabaseName(final SimpleTableSegment
segment, final SQLStatementBinderContext binderContext) {
DialectDatabaseMetaData dialectDatabaseMetaData = new
DatabaseTypeRegistry(binderContext.getDatabaseType()).getDialectDatabaseMetaData();
- Optional<OwnerSegment> owner =
dialectDatabaseMetaData.getDefaultSchema().isPresent() ?
tableSegment.getOwner().flatMap(OwnerSegment::getOwner) :
tableSegment.getOwner();
+ Optional<OwnerSegment> owner =
dialectDatabaseMetaData.getDefaultSchema().isPresent() ?
segment.getOwner().flatMap(OwnerSegment::getOwner) : segment.getOwner();
return new IdentifierValue(owner.map(optional ->
optional.getIdentifier().getValue()).orElse(binderContext.getCurrentDatabaseName()));
}
@@ -109,32 +110,13 @@ public final class SimpleTableSegmentBinder {
}
// TODO getSchemaName according to search path
DatabaseType databaseType = binderContext.getDatabaseType();
- if ((databaseType instanceof PostgreSQLDatabaseType || databaseType
instanceof OpenGaussDatabaseType)
- &&
SYSTEM_CATALOG_TABLES.contains(segment.getTableName().getIdentifier().getValue()))
{
+ if ((databaseType instanceof PostgreSQLDatabaseType || databaseType
instanceof OpenGaussDatabaseType) &&
SYSTEM_CATALOG_TABLES.contains(segment.getTableName().getIdentifier().getValue()))
{
return new IdentifierValue(PG_CATALOG);
}
return new IdentifierValue(new
DatabaseTypeRegistry(databaseType).getDefaultSchemaName(binderContext.getCurrentDatabaseName()));
}
- private static SimpleTableSegmentBinderContext
createSimpleTableBinderContext(final SimpleTableSegment segment, final
ShardingSphereSchema schema, final IdentifierValue originalDatabase,
-
final IdentifierValue originalSchema, final SQLStatementBinderContext
binderContext) {
- Collection<ShardingSphereColumn> columnNames = Optional.ofNullable(
-
schema.getTable(segment.getTableName().getIdentifier().getValue())).map(ShardingSphereTable::getColumnValues).orElseGet(Collections::emptyList);
- Collection<ProjectionSegment> projectionSegments = new LinkedList<>();
- DialectDatabaseMetaData dialectDatabaseMetaData = new
DatabaseTypeRegistry(binderContext.getDatabaseType()).getDialectDatabaseMetaData();
- for (ShardingSphereColumn each : columnNames) {
- ColumnSegment columnSegment = new ColumnSegment(0, 0, new
IdentifierValue(each.getName(), dialectDatabaseMetaData.getQuoteCharacter()));
- columnSegment.setOwner(new OwnerSegment(0, 0,
segment.getAlias().orElse(segment.getTableName().getIdentifier())));
- columnSegment.setColumnBoundInfo(new
ColumnSegmentBoundInfo(originalDatabase, originalSchema,
segment.getTableName().getIdentifier(),
- new IdentifierValue(each.getName(),
dialectDatabaseMetaData.getQuoteCharacter())));
- ColumnProjectionSegment columnProjectionSegment = new
ColumnProjectionSegment(columnSegment);
- columnProjectionSegment.setVisible(each.isVisible());
- projectionSegments.add(columnProjectionSegment);
- }
- return new SimpleTableSegmentBinderContext(projectionSegments);
- }
-
- private static void checkTableExists(final String tableName, final
SQLStatementBinderContext binderContext, final String databaseName, final
String schemaName) {
+ private static void checkTableExists(final SQLStatementBinderContext
binderContext, final String databaseName, final String schemaName, final String
tableName) {
if ("dual".equalsIgnoreCase(tableName)) {
return;
}
@@ -149,4 +131,28 @@ public final class SimpleTableSegmentBinder {
&&
binderContext.getMetaData().getDatabase(databaseName).getSchema(schemaName).containsTable(tableName),
() -> new TableNotFoundException(tableName));
}
+
+ private static SimpleTableSegmentBinderContext
createSimpleTableBinderContext(final SimpleTableSegment segment, final
ShardingSphereSchema schema, final IdentifierValue databaseName,
+
final IdentifierValue schemaName, final SQLStatementBinderContext
binderContext) {
+ IdentifierValue tableName = segment.getTableName().getIdentifier();
+ if
(!binderContext.getMetaData().getDatabase(databaseName.getValue()).getSchema(schemaName.getValue()).containsTable(tableName.getValue()))
{
+ return new
SimpleTableSegmentBinderContext(Collections.emptyList());
+ }
+ Collection<ProjectionSegment> projectionSegments = new LinkedList<>();
+ QuoteCharacter quoteCharacter = new
DatabaseTypeRegistry(binderContext.getDatabaseType()).getDialectDatabaseMetaData().getQuoteCharacter();
+ for (ShardingSphereColumn each :
schema.getTable(tableName.getValue()).getColumnValues()) {
+ ColumnProjectionSegment columnProjectionSegment = new
ColumnProjectionSegment(createColumnSegment(segment, databaseName, schemaName,
each, quoteCharacter, tableName));
+ columnProjectionSegment.setVisible(each.isVisible());
+ projectionSegments.add(columnProjectionSegment);
+ }
+ return new SimpleTableSegmentBinderContext(projectionSegments);
+ }
+
+ private static ColumnSegment createColumnSegment(final SimpleTableSegment
segment, final IdentifierValue databaseName, final IdentifierValue schemaName,
+ final
ShardingSphereColumn column, final QuoteCharacter quoteCharacter, final
IdentifierValue tableName) {
+ ColumnSegment result = new ColumnSegment(0, 0, new
IdentifierValue(column.getName(), quoteCharacter));
+ result.setOwner(new OwnerSegment(0, 0,
segment.getAlias().orElse(tableName)));
+ result.setColumnBoundInfo(new ColumnSegmentBoundInfo(databaseName,
schemaName, tableName, new IdentifierValue(column.getName(), quoteCharacter)));
+ return result;
+ }
}
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/type/SubqueryTableSegmentBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/type/SubqueryTableSegmentBinder.java
index 5e2c8bab757..b1886379608 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/type/SubqueryTableSegmentBinder.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/from/type/SubqueryTableSegmentBinder.java
@@ -68,20 +68,24 @@ public final class SubqueryTableSegmentBinder {
public static SubqueryTableSegment bind(final SubqueryTableSegment
segment, final SQLStatementBinderContext binderContext,
final Map<String,
TableSegmentBinderContext> tableBinderContexts, final Map<String,
TableSegmentBinderContext> outerTableBinderContexts) {
fillPivotColumnNamesInBinderContext(segment, binderContext);
- SQLStatementBinderContext subQueryBinderContext = new
SQLStatementBinderContext(segment.getSubquery().getSelect(),
binderContext.getMetaData(), binderContext.getCurrentDatabaseName());
-
subQueryBinderContext.getExternalTableBinderContexts().putAll(binderContext.getExternalTableBinderContexts());
- SelectStatement boundSelect = new
SelectStatementBinder(outerTableBinderContexts).bind(segment.getSubquery().getSelect(),
subQueryBinderContext);
- SubquerySegment boundSubquerySegment = new
SubquerySegment(segment.getSubquery().getStartIndex(),
segment.getSubquery().getStopIndex(), boundSelect,
segment.getSubquery().getText());
+ SQLStatementBinderContext subqueryBinderContext = new
SQLStatementBinderContext(segment.getSubquery().getSelect(),
binderContext.getMetaData(), binderContext.getCurrentDatabaseName());
+
subqueryBinderContext.getExternalTableBinderContexts().putAll(binderContext.getExternalTableBinderContexts());
+ SelectStatement boundSubSelect = new
SelectStatementBinder(outerTableBinderContexts).bind(segment.getSubquery().getSelect(),
subqueryBinderContext);
+ SubquerySegment boundSubquerySegment = new
SubquerySegment(segment.getSubquery().getStartIndex(),
segment.getSubquery().getStopIndex(), boundSubSelect,
segment.getSubquery().getText());
boundSubquerySegment.setSubqueryType(segment.getSubquery().getSubqueryType());
IdentifierValue subqueryTableName =
segment.getAliasSegment().map(AliasSegment::getIdentifier).orElseGet(() -> new
IdentifierValue(""));
bindParameterMarkerProjection(boundSubquerySegment, subqueryTableName);
SubqueryTableSegment result = new
SubqueryTableSegment(segment.getStartIndex(), segment.getStopIndex(),
boundSubquerySegment);
segment.getAliasSegment().ifPresent(result::setAlias);
tableBinderContexts.put(subqueryTableName.getValue().toLowerCase(),
- new
SimpleTableSegmentBinderContext(createSubqueryProjections(boundSelect.getProjections().getProjections(),
subqueryTableName, binderContext.getDatabaseType())));
+ new
SimpleTableSegmentBinderContext(createSubqueryProjections(boundSubSelect.getProjections().getProjections(),
subqueryTableName, binderContext.getDatabaseType())));
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().toLowerCase())));
+ }
+
private static void bindParameterMarkerProjection(final SubquerySegment
boundSubquerySegment, final IdentifierValue subqueryTableName) {
SelectStatement boundSelect = boundSubquerySegment.getSelect();
Collection<ProjectionSegment> projections = new
LinkedList<>(boundSelect.getProjections().getProjections());
@@ -98,10 +102,6 @@ public final class SubqueryTableSegmentBinder {
}
}
- private static void fillPivotColumnNamesInBinderContext(final
SubqueryTableSegment segment, final SQLStatementBinderContext binderContext) {
- segment.getPivot().ifPresent(optional ->
optional.getPivotColumns().forEach(each ->
binderContext.getPivotColumnNames().add(each.getIdentifier().getValue().toLowerCase())));
- }
-
private static Collection<ProjectionSegment>
createSubqueryProjections(final Collection<ProjectionSegment> projections,
final IdentifierValue subqueryTableName, final DatabaseType databaseType) {
Collection<ProjectionSegment> result = new LinkedList<>();
for (ProjectionSegment each : projections) {