private static ComparisonResult Compare(IModelNode vertex, IModelNode pattern)
{
if (vertex.QualifiedName.EndsWith(pattern.QualifiedName))
{
var node = (IModelNode)vertex;
var patternNode = (IModelNode)pattern;
if (!node.Children.Any() && !patternNode.Children.Any())
{
return new ComparisonResult(ComparisonResultKind.Same, pattern, vertex);
}
if (!patternNode.Children.Any())
{
return new ComparisonResult(ComparisonResultKind.Partial, pattern, vertex);
}
var childComparisons = node.Children.Zip(patternNode.Children, Compare).AsArray();
return childComparisons.All(x => x.Kind == ComparisonResultKind.Same)
? new ComparisonResult(ComparisonResultKind.Same, pattern, vertex)
: childComparisons.All(x => x.Kind != ComparisonResultKind.Different)
? new ComparisonResult(ComparisonResultKind.Partial, pattern, vertex)
: new ComparisonResult(ComparisonResultKind.Different, pattern, null);
}
return new ComparisonResult(ComparisonResultKind.Different, pattern, null);
}
}