in fastmodel-compare/src/main/java/com/aliyun/fastmodel/compare/impl/table/ColumnCompare.java [62:109]
public List<BaseStatement> compareTableElement(CreateTable before, CreateTable after) {
List<ColumnDefinition> beforeColumnDefines = before.getColumnDefines();
List<ColumnDefinition> afterColumnDefines = after.getColumnDefines();
boolean beforeEmpty = beforeColumnDefines == null || beforeColumnDefines.isEmpty();
boolean afterNotEmpty = afterColumnDefines != null && !afterColumnDefines.isEmpty();
if (beforeEmpty && !afterNotEmpty) {
return ImmutableList.of();
}
QualifiedName qualifiedName = after.getQualifiedName();
if (beforeEmpty && afterNotEmpty) {
AddCols addCols = new AddCols(
qualifiedName,
afterColumnDefines
);
return ImmutableList.of(addCols);
}
//如果after的列都是空的
if (!afterNotEmpty) {
List<DropCol> dropCols = beforeColumnDefines.stream().map(
x -> new DropCol(qualifiedName, x.getColName())).collect(Collectors.toList());
return ImmutableList.copyOf(dropCols);
}
Builder<BaseStatement> builder
= incrementCompare(qualifiedName, beforeColumnDefines, afterColumnDefines, (q, c) -> {
return new DropCol(q, c.getColName());
}, (q, c) -> {
AddCols addCols = new AddCols(q, c);
return ImmutableList.of(addCols);
});
//顺序的调整
//copy beforeColumn
List<ColumnDefinition> beforeCopy = new CopyOnWriteArrayList<>(beforeColumnDefines);
OrderColumnManager beforeOrderColumnManager = new OrderColumnManager(qualifiedName, beforeCopy);
OrderColumnManager afterOrderColumnManager = new OrderColumnManager(qualifiedName, afterColumnDefines);
for (ColumnDefinition c : afterColumnDefines) {
SetColumnOrder compare = beforeOrderColumnManager.compare(c.getColName(), afterOrderColumnManager);
if (compare == null) {
continue;
}
//if change then add and apply compare
builder.add(compare);
beforeOrderColumnManager.apply(compare);
}
return builder.build();
}