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 56474b8e173 support decorate comment sql and index sql (#17544) 56474b8e173 is described below commit 56474b8e17337a25a05e31683764a3cd0988a3ed Author: Chuxin Chen <chuxinche...@qq.com> AuthorDate: Wed May 11 14:33:26 2022 +0800 support decorate comment sql and index sql (#17544) --- .../metadata/generator/PipelineDDLGenerator.java | 80 ++++++++++++++-------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java index 45640353160..ddfd926fd48 100644 --- a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java +++ b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java @@ -23,7 +23,12 @@ import lombok.SneakyThrows; import org.apache.shardingsphere.infra.binder.LogicSQL; import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory; import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.statement.ddl.CommentStatementContext; +import org.apache.shardingsphere.infra.binder.statement.ddl.CreateIndexStatementContext; import org.apache.shardingsphere.infra.binder.statement.ddl.CreateTableStatementContext; +import org.apache.shardingsphere.infra.binder.type.ConstraintAvailable; +import org.apache.shardingsphere.infra.binder.type.IndexAvailable; +import org.apache.shardingsphere.infra.binder.type.TableAvailable; import org.apache.shardingsphere.infra.database.type.DatabaseType; import org.apache.shardingsphere.infra.datanode.DataNode; import org.apache.shardingsphere.infra.datanode.DataNodes; @@ -36,7 +41,6 @@ import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRul import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.parser.rule.SQLParserRule; import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment; -import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintDefinitionSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment; @@ -44,9 +48,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.Tab import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement; import java.sql.SQLException; -import java.util.Collection; import java.util.Collections; -import java.util.LinkedList; import java.util.Objects; import java.util.Optional; @@ -58,8 +60,6 @@ public final class PipelineDDLGenerator { private static final String DELIMITER = ";"; - private static final String NEWLINE = "\n"; - private final ContextManager contextManager; /** @@ -78,7 +78,7 @@ public final class PipelineDDLGenerator { StringBuilder result = new StringBuilder(); for (String each : sql.split(DELIMITER)) { if (!each.trim().isEmpty()) { - result.append(decorateActualSQL(each.trim(), metaData, databaseType, databaseName)).append(DELIMITER + NEWLINE); + result.append(decorateActualSQL(each.trim(), metaData, databaseType, databaseName)).append(DELIMITER).append(System.lineSeparator()); } } return result.toString(); @@ -96,11 +96,12 @@ public final class PipelineDDLGenerator { public String replaceTableNameWithPrefix(final String sql, final String prefix, final DatabaseType databaseType, final String databaseName) { LogicSQL logicSQL = getLogicSQL(sql, databaseType, databaseName); SQLStatementContext<?> sqlStatementContext = logicSQL.getSqlStatementContext(); - if (sqlStatementContext instanceof CreateTableStatementContext) { - TableNameSegment tableNameSegment = sqlStatementContext.getTablesContext().getTables().iterator().next().getTableName(); - return replace(sql, tableNameSegment, prefix + tableNameSegment.getIdentifier().getValue()); + if (sqlStatementContext instanceof CreateTableStatementContext || sqlStatementContext instanceof CommentStatementContext || sqlStatementContext instanceof CreateIndexStatementContext) { + if (!sqlStatementContext.getTablesContext().getTables().isEmpty()) { + TableNameSegment tableNameSegment = sqlStatementContext.getTablesContext().getTables().iterator().next().getTableName(); + return replace(sql, tableNameSegment, prefix + tableNameSegment.getIdentifier().getValue()); + } } - // TODO COMMENT STATEMENT return sql; } @@ -120,16 +121,23 @@ public final class PipelineDDLGenerator { String result = logicSQL.getSql(); SQLStatementContext<?> sqlStatementContext = logicSQL.getSqlStatementContext(); if (sqlStatementContext instanceof CreateTableStatementContext) { - result = decorateIndex(metaData, result, (CreateTableStatementContext) sqlStatementContext); - result = decorateTable(metaData, result, (CreateTableStatementContext) sqlStatementContext); + result = decorateIndexAndConstraint(metaData, result, sqlStatementContext); + result = decorateTable(metaData, result, (TableAvailable) sqlStatementContext); + } + if (sqlStatementContext instanceof CommentStatementContext) { + result = decorateTable(metaData, result, (TableAvailable) sqlStatementContext); + } + if (sqlStatementContext instanceof CreateIndexStatementContext) { + result = decorateTable(metaData, result, (TableAvailable) sqlStatementContext); + result = decorateIndexAndConstraint(metaData, result, sqlStatementContext); } - // TODO COMMENT STATEMENT + return result; } - private String decorateTable(final ShardingSphereMetaData metaData, final String sql, final CreateTableStatementContext sqlStatementContext) { + private String decorateTable(final ShardingSphereMetaData metaData, final String sql, final TableAvailable sqlStatementContext) { String result = sql; - for (SimpleTableSegment each : getAllTableSegments(sqlStatementContext)) { + for (SimpleTableSegment each : sqlStatementContext.getAllTables()) { String logicTable = findLogicTable(each.getTableName(), metaData); if (!logicTable.equals(each.getTableName().getIdentifier().getValue())) { result = replace(result, each.getTableName(), logicTable); @@ -138,27 +146,39 @@ public final class PipelineDDLGenerator { return result; } - private Collection<SimpleTableSegment> getAllTableSegments(final CreateTableStatementContext sqlStatementContext) { - Collection<SimpleTableSegment> result = new LinkedList<>(sqlStatementContext.getTablesContext().getTables()); - for (ConstraintDefinitionSegment each : sqlStatementContext.getSqlStatement().getConstraintDefinitions()) { - each.getReferencedTable().ifPresent(result::add); + private String decorateIndexAndConstraint(final ShardingSphereMetaData metaData, final String sql, final SQLStatementContext<?> sqlStatementContext) { + if (!(sqlStatementContext instanceof TableAvailable) || ((TableAvailable) sqlStatementContext).getTablesContext().getTables().isEmpty()) { + return sql; } - return result; - } - - private String decorateIndex(final ShardingSphereMetaData metaData, final String sql, final CreateTableStatementContext sqlStatementContext) { String result = sql; - TableNameSegment tableNameSegment = sqlStatementContext.getTablesContext().getTables().iterator().next().getTableName(); + TableNameSegment tableNameSegment = ((TableAvailable) sqlStatementContext).getTablesContext().getTables().iterator().next().getTableName(); String logicTable = findLogicTable(tableNameSegment, metaData); if (!tableNameSegment.getIdentifier().getValue().equals(logicTable)) { - for (IndexSegment each : sqlStatementContext.getIndexes()) { - String logicIndexName = IndexMetaDataUtil.getLogicIndexName(each.getIndexName().getIdentifier().getValue(), tableNameSegment.getIdentifier().getValue()); - result = replace(result, each, logicIndexName); + if (sqlStatementContext instanceof IndexAvailable) { + result = decorateIndex((IndexAvailable) sqlStatementContext, result, tableNameSegment); } - for (ConstraintSegment each : sqlStatementContext.getConstraints()) { - String logicConstraint = IndexMetaDataUtil.getLogicIndexName(each.getIdentifier().getValue(), tableNameSegment.getIdentifier().getValue()); - result = replace(result, each, logicConstraint); + if (sqlStatementContext instanceof ConstraintAvailable) { + result = decorateConstraint((ConstraintAvailable) sqlStatementContext, result, tableNameSegment); } + + } + return result; + } + + private String decorateIndex(final IndexAvailable indexAvailable, final String sql, final TableNameSegment tableNameSegment) { + String result = sql; + for (IndexSegment each : indexAvailable.getIndexes()) { + String logicIndexName = IndexMetaDataUtil.getLogicIndexName(each.getIndexName().getIdentifier().getValue(), tableNameSegment.getIdentifier().getValue()); + result = replace(result, each, logicIndexName); + } + return result; + } + + private String decorateConstraint(final ConstraintAvailable constraintAvailable, final String sql, final TableNameSegment tableNameSegment) { + String result = sql; + for (ConstraintSegment each : constraintAvailable.getConstraints()) { + String logicConstraint = IndexMetaDataUtil.getLogicIndexName(each.getIdentifier().getValue(), tableNameSegment.getIdentifier().getValue()); + result = replace(result, each, logicConstraint); } return result; }