in fastmodel-transform/fastmodel-transform-mysql/src/main/java/com/aliyun/fastmodel/transform/mysql/parser/MysqlAstBuilder.java [708:766]
public Node visitAlterByAddForeignKey(AlterByAddForeignKeyContext ctx) {
QualifiedName tableName = getQualifiedName((TableNameContext)ctx.value);
Identifier constraint = null;
List<Identifier> columns = ImmutableList.of();
if (ctx.name != null) {
constraint = (Identifier)visit(ctx.name);
} else if (ctx.indexName != null) {
constraint = (Identifier)visit(ctx.indexName);
} else {
constraint = IdentifierUtil.sysIdentifier();
}
//columns parse
IndexColumnNamesContext indexColumnNamesContext = ctx.indexColumnNames();
if (indexColumnNamesContext != null) {
List<IndexColumnName> indexColumnNames =
ParserHelper.visit(this, indexColumnNamesContext.indexColumnName(), IndexColumnName.class);
columns = indexColumnNames
.stream()
.map(IndexColumnName::getColumnName)
.collect(Collectors.toList());
}
QualifiedName reference = getQualifiedName(ctx.referenceDefinition().tableName());
List<Identifier> referenceColumns = ImmutableList.of();
if (ctx.referenceDefinition().indexColumnNames() != null) {
List<IndexColumnName> indexColumnNames = ParserHelper.visit(this,
ctx.referenceDefinition().indexColumnNames().indexColumnName(),
IndexColumnName.class);
referenceColumns = indexColumnNames
.stream()
.map(IndexColumnName::getColumnName)
.collect(Collectors.toList());
}
DimConstraint dimConstraint = new DimConstraint(
constraint,
columns,
reference,
referenceColumns
);
switch (reverseContext.getReverseRelationStrategy()) {
case DDL:
AddConstraint addConstraint = new AddConstraint(
tableName,
dimConstraint
);
return addConstraint;
case SCRIPT:
return new RefRelation(
QualifiedName.of(
Lists.newArrayList(constraint)),
new RefObject(tableName, columns, null),
new RefObject(reference, referenceColumns, null),
RefDirection.LEFT_DIRECTION_RIGHT
);
default:
throw new ReverseUnsupportedOperationException(ParserHelper.getOrigin(ctx),
"unsupported the strategy:" + reverseContext.getReverseRelationStrategy());
}
}