You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/05/11 06:33:32 UTC
[shardingsphere] branch master updated: support decorate comment sql and index sql (#17544)
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 <ch...@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;
}