提交 b07e8d6e 编写于 作者: C codefairy08

Move visitor logic to VisitorUtils

上级 eb5dce13
......@@ -13,7 +13,7 @@ alterSpecification:
(tableOptions)
| ADD COLUMN? (singleColumn | multiColumn)
| ADD indexDefinition
| ADD constraintDefinition
| addConstraint
| algorithmOption
| ALTER COLUMN? columnName (SET DEFAULT | DROP DEFAULT)
| changeColumn
......@@ -49,6 +49,10 @@ alterSpecification:
| UPGRADE PARTITIONING
;
addConstraint:
ADD constraintDefinition
;
changeColumn:
changeColumnOp columnName columnDefinition (FIRST|AFTER columnName)?
;
......
......@@ -310,6 +310,25 @@ public class VisitorUtils {
statement.setDropPrimaryKey(true);
}
}
/**
* visit drop primary key.
*
* @param statement
* statement parse result
* @param ddlRootNode
* DDL root node of syntax tree
*/
public static void visitOracleDropPrimaryKey(final AlterTableStatement statement, final ParseTree ddlRootNode) {
ParseTree dropPrimaryKeyCtx = TreeUtils.getFirstChildByRuleName(ddlRootNode, "dropConstraintClause");
if (null != dropPrimaryKeyCtx) {
ParseTree primaryKeyCtx = TreeUtils.getFirstChildByRuleName(dropPrimaryKeyCtx, "primaryKey");
if (null != primaryKeyCtx) {
statement.setDropPrimaryKey(true);
}
}
}
/**
* Parse drop column.
......@@ -407,4 +426,163 @@ public class VisitorUtils {
return new ColumnDefinition(columnNameNode.getText(), typeName, length, primaryKey);
}
/**
* Visit alter table rename column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
public static void visitRenameColumn(final AlterTableStatement statement, final ParseTree rootNode) {
ParserRuleContext modifyColumnCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(rootNode,
"renameColumn");
if (null == modifyColumnCtx) {
return;
}
List<ParseTree> columnNodes = TreeUtils.getAllDescendantByRuleName(modifyColumnCtx, "columnName");
if (null == columnNodes || columnNodes.size() != 2) {
return;
}
String oldName = columnNodes.get(0).getText();
String newName = columnNodes.get(1).getText();
ColumnDefinition oldDefinition = statement.getUpdateColumns().remove(oldName);
if (null != oldDefinition) {
oldDefinition.setName(newName);
} else {
oldDefinition = new ColumnDefinition(newName, null, null, false);
}
statement.getUpdateColumns().put(newName, oldDefinition);
}
/**
* Parse alter table change column node.
*
* @param statement
* statement parse result
* @param rootNode
* root node of syntax tree
*/
public static void visitChangeColumn(final AlterTableStatement statement, final ParseTree rootNode) {
ParserRuleContext changeColumnCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(rootNode,
"changeColumn");
if(null == changeColumnCtx) {
return;
}
ParserRuleContext oldColumnCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(changeColumnCtx,
"columnName");
if(null == oldColumnCtx) {
return;
}
ParserRuleContext columnDefinitionCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(changeColumnCtx,
"columnDefinition");
if(null == columnDefinitionCtx) {
return;
}
ColumnDefinition column = VisitorUtils.parseColumnDefinition(columnDefinitionCtx);
if (null != column) {
statement.getUpdateColumns().remove(oldColumnCtx.getText());
statement.getUpdateColumns().put(column.getName(), column);
}
}
/**
* Visit alter table modify column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
* @param ruleName
* primary key node name
*/
public static void visitAddPrimaryKey(final AlterTableStatement statement, final ParseTree rootNode,
String ruleName) {
ParserRuleContext modifyColumnCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(rootNode, ruleName);
if (null == modifyColumnCtx) {
return;
}
ParseTree primaryKeyCtx = TreeUtils.getFirstChildByRuleName(modifyColumnCtx, "primaryKey");
if (null == primaryKeyCtx) {
return;
}
List<ParseTree> columnNodes = TreeUtils.getAllDescendantByRuleName(modifyColumnCtx, "columnName");
if (null == columnNodes) {
return;
}
for (final ParseTree each : columnNodes) {
String columnName = each.getText();
ColumnDefinition updateColumn = statement.getUpdateColumns().get(columnName);
if (null == updateColumn) {
updateColumn = new ColumnDefinition(columnName, null, null, true);
statement.getUpdateColumns().put(columnName, updateColumn);
} else {
updateColumn.setPrimaryKey(true);
}
statement.getUpdateColumns().put(columnName, new ColumnDefinition(columnName, null, null, true));
}
}
/**
* Visit alter table modify column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
public static void visitModifyColumn(final AlterTableStatement statement, final ParseTree rootNode) {
List<ParseTree> modifyColumnCtxs = TreeUtils.getAllDescendantByRuleName(rootNode, "modifyColumn");
if (null == modifyColumnCtxs) {
return;
}
for (ParseTree each : modifyColumnCtxs) {
// it`s not columndefinition, but can call this method
ColumnDefinition column = VisitorUtils.parseColumnDefinition(each);
if (null != column) {
statement.getUpdateColumns().put(column.getName(), column);
}
}
}
/**
* Visit alter table modify column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
public static void visitOracleModifyColumn(final AlterTableStatement statement, final ParseTree rootNode) {
ParserRuleContext modifyColumnCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(rootNode,
"modifyColumn");
if (null == modifyColumnCtx) {
return;
}
List<ParseTree> columnNodes = TreeUtils.getAllDescendantByRuleName(modifyColumnCtx, "modifyColProperties");
if (null == columnNodes) {
return;
}
for (final ParseTree each : columnNodes) {
// it`s not columndefinition, but can call this method
ColumnDefinition column = VisitorUtils.parseColumnDefinition(each);
if (null != column) {
statement.getUpdateColumns().put(column.getName(), column);
}
}
}
}
package io.shardingsphere.core.parsing.antler.visitor.mysql;
import java.util.List;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
import io.shardingsphere.core.parsing.antler.sql.ddl.AlterTableStatement;
import io.shardingsphere.core.parsing.antler.sql.ddl.ColumnDefinition;
import io.shardingsphere.core.parsing.antler.utils.TreeUtils;
import io.shardingsphere.core.parsing.antler.utils.VisitorUtils;
import io.shardingsphere.core.parsing.antler.visitor.AlterTableVisitor;
......@@ -17,50 +14,16 @@ public class MySQLAlterTableVisitor extends AlterTableVisitor {
protected void visitPrivateTree(AlterTableStatement statement, ParseTree rootNode) {
visitAddIndex(statement, rootNode);
visitDropIndex(statement, rootNode);
visitAddPrimaryKey(statement, rootNode);
VisitorUtils.visitAddPrimaryKey(statement, rootNode,"addConstraint");
visitChangeColumn(statement, rootNode);
VisitorUtils.visitChangeColumn(statement, rootNode);
VisitorUtils.parseModifyColumn(statement, rootNode);
VisitorUtils.parseRenameIndex(statement, rootNode);
VisitorUtils.parseAddPrimaryKey(statement, rootNode);
VisitorUtils.parseDropPrimaryKey(statement, rootNode);
}
/**
* Parse alter table change column node.
*
* @param statement
* statement parse result
* @param rootNode
* root node of syntax tree
*/
public static void visitChangeColumn(final AlterTableStatement statement, final ParseTree rootNode) {
ParserRuleContext changeColumnCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(rootNode,
"changeColumn");
if(null == changeColumnCtx) {
return;
}
ParserRuleContext oldColumnCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(changeColumnCtx,
"columnName");
if(null == oldColumnCtx) {
return;
}
ParserRuleContext columnDefinitionCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(changeColumnCtx,
"columnDefinition");
if(null == columnDefinitionCtx) {
return;
}
ColumnDefinition column = VisitorUtils.parseColumnDefinition(columnDefinitionCtx);
if (null != column) {
statement.getUpdateColumns().remove(oldColumnCtx.getText());
statement.getUpdateColumns().put(column.getName(), column);
}
}
/**
* Visit add index node.
......@@ -108,44 +71,4 @@ public class MySQLAlterTableVisitor extends AlterTableVisitor {
indexNameNode.getText(), statement.getTables().getSingleTableName()));
}
}
/**
* Visit add primary key.
*
* @param statement
* statement parse result
* @param ancestorNode
* ancestor of index node
* @return indexName node
*/
protected void visitAddPrimaryKey(final AlterTableStatement statement, final ParseTree ancestorNode) {
ParserRuleContext constraintDefinitionNode = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(ancestorNode,
"constraintDefinition");
if (null == constraintDefinitionNode) {
return;
}
ParserRuleContext primaryKeyOptionNode = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(ancestorNode,
"primaryKeyOption");
if (null == primaryKeyOptionNode) {
return;
}
List<ParseTree> keyPartNodes = TreeUtils.getAllDescendantByRuleName(ancestorNode, "keyPart");
if (null == keyPartNodes) {
return;
}
for (final ParseTree each : keyPartNodes) {
String columnName = each.getChild(0).getText();
ColumnDefinition updateColumn = statement.getUpdateColumns().get(columnName);
if (null == updateColumn) {
updateColumn = new ColumnDefinition(columnName, null, null, true);
statement.getUpdateColumns().put(columnName, updateColumn);
} else {
updateColumn.setPrimaryKey(true);
}
}
}
}
package io.shardingsphere.core.parsing.antler.visitor.oracle;
import java.util.List;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
import io.shardingsphere.core.parsing.antler.sql.ddl.AlterTableStatement;
import io.shardingsphere.core.parsing.antler.sql.ddl.ColumnDefinition;
import io.shardingsphere.core.parsing.antler.utils.TreeUtils;
import io.shardingsphere.core.parsing.antler.utils.VisitorUtils;
import io.shardingsphere.core.parsing.antler.visitor.AlterTableVisitor;
public class OracleAlterTableVisitor extends AlterTableVisitor {
@Override
protected void visitPrivateTree(AlterTableStatement statement, ParseTree rootNode) {
visitModifyColumn(statement, rootNode);
visitRenameColumn(statement, rootNode);
visitAddPrimaryKey(statement, rootNode);
visitDropPrimaryKey(statement, rootNode);
}
/**
* Visit alter table modify column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
protected void visitModifyColumn(final AlterTableStatement statement, final ParseTree rootNode) {
ParserRuleContext modifyColumnCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(rootNode,
"modifyColumn");
if (null == modifyColumnCtx) {
return;
}
List<ParseTree> columnNodes = TreeUtils.getAllDescendantByRuleName(modifyColumnCtx, "modifyColProperties");
if (null == columnNodes) {
return;
}
for (final ParseTree each : columnNodes) {
// it`s not columndefinition, but can call this method
ColumnDefinition column = VisitorUtils.parseColumnDefinition(each);
if (null != column) {
statement.getAddColumns().add(column);
}
}
}
/**
* Visit alter table rename column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
protected void visitRenameColumn(final AlterTableStatement statement, final ParseTree rootNode) {
ParserRuleContext modifyColumnCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(rootNode,
"renameColumn");
if (null == modifyColumnCtx) {
return;
}
List<ParseTree> columnNodes = TreeUtils.getAllDescendantByRuleName(modifyColumnCtx, "columnName");
if (null == columnNodes || columnNodes.size() != 2) {
return;
}
String oldName = columnNodes.get(0).getText();
String newName = columnNodes.get(1).getText();
ColumnDefinition oldDefinition = statement.getUpdateColumns().remove(oldName);
if (null != oldDefinition) {
oldDefinition.setName(newName);
} else {
oldDefinition = new ColumnDefinition(newName, null, null, false);
}
statement.getUpdateColumns().put(newName, oldDefinition);
}
/**
* Visit alter table modify column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
protected void visitAddPrimaryKey(final AlterTableStatement statement, final ParseTree rootNode) {
ParserRuleContext modifyColumnCtx = (ParserRuleContext) TreeUtils.getFirstChildByRuleName(rootNode,
"addConstraintClause");
if (null == modifyColumnCtx) {
return;
}
ParseTree primaryKeyCtx = TreeUtils.getFirstChildByRuleName(modifyColumnCtx, "primaryKey");
if (null == primaryKeyCtx) {
return;
}
List<ParseTree> columnNodes = TreeUtils.getAllDescendantByRuleName(modifyColumnCtx, "columnName");
if (null == columnNodes) {
return;
}
for (final ParseTree each : columnNodes) {
String columnName = each.getText();
statement.getUpdateColumns().put(columnName, new ColumnDefinition(columnName, null, null, true));
}
}
/**
* Parse drop primary key.
*
* @param statement
* statement parse result
* @param ddlRootNode
* DDL root node of syntax tree
*/
protected void visitDropPrimaryKey(final AlterTableStatement statement, final ParseTree ddlRootNode) {
ParseTree dropPrimaryKeyCtx = TreeUtils.getFirstChildByRuleName(ddlRootNode, "dropConstraintClause");
if (null != dropPrimaryKeyCtx) {
ParseTree primaryKeyCtx = TreeUtils.getFirstChildByRuleName(dropPrimaryKeyCtx, "primaryKey");
if (null != primaryKeyCtx) {
statement.setDropPrimaryKey(true);
}
}
VisitorUtils.visitOracleModifyColumn(statement, rootNode);
VisitorUtils.visitRenameColumn(statement, rootNode);
VisitorUtils.visitAddPrimaryKey(statement, rootNode, "addConstraintClause");
VisitorUtils.visitOracleDropPrimaryKey(statement, rootNode);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册