in fastmodel-compare/src/main/java/com/aliyun/fastmodel/compare/impl/CompositeCompareNode.java [73:135]
public List<BaseStatement> compareResult(CompositeStatement before,
CompositeStatement after,
CompareStrategy strategy) {
List<BaseStatement> result = getBaseStatementsIfOneNull(before, after, strategy);
if (result != null) {return result;}
result = new ArrayList<>();
//将传入的statement都改为可以排序的列表
List<BaseStatement> beforeList = Lists.newArrayList(before.getStatements());
List<BaseStatement> afterList = Lists.newArrayList(after.getStatements());
List<QualifiedName> beforeQualifiedName = getQualifiedNames(beforeList);
List<QualifiedName> afterQualifiedName = getQualifiedNames(afterList);
int beforeSize = beforeList.size();
int afterSize = afterList.size();
int size = Math.min(beforeSize, afterSize);
//如果before集合大小,大于after的集合大小,那么将before集合按照after的集合的名字进行排序
if (beforeSize >= afterSize) {
//排序,将相同的名字的操作进行处理
sort(beforeList, afterQualifiedName);
beforeQualifiedName = getQualifiedNames(beforeList);
sort(afterList, beforeQualifiedName);
} else {
//排序,将相同的名字的操作进行处理
//如果before集合大小,小于after的集合大小,那么将after集合按照before的集合的名字进行排序
sort(afterList, beforeQualifiedName);
afterQualifiedName = getQualifiedNames(afterList);
sort(beforeList, afterQualifiedName);
}
for (int i = 0; i < size; i++) {
BaseStatement baseStatement = beforeList.get(i);
BaseStatement afterStatement = afterList.get(i);
BaseCompareNode baseCompareNode = singleStatementCompare.get(baseStatement.getClass().getName());
//if compare node is null, skip
if (baseCompareNode == null) {
continue;
}
result.addAll(baseCompareNode.compareResult(baseStatement, afterStatement, strategy));
}
if (size < beforeSize) {
for (int start = size; start < beforeSize; start++) {
BaseStatement baseStatement = beforeList.get(start);
BaseCompareNode baseCompareNode = singleStatementCompare.get(baseStatement.getClass().getName());
//if compare node is null, skip
if (baseCompareNode == null) {
continue;
}
List compareResult = baseCompareNode.compareResult(baseStatement, null, strategy);
result.addAll(compareResult);
}
} else if (size < afterSize) {
for (int start = size; start < afterSize; start++) {
BaseStatement baseStatement = afterList.get(start);
BaseCompareNode baseCompareNode = singleStatementCompare.get(baseStatement.getClass().getName());
//if compare node is null, skip
if (baseCompareNode == null) {
continue;
}
result.addAll(baseCompareNode.compareResult(null, baseStatement, strategy));
}
}
return result;
}