我有2个模型可供比较。在我的* .ecore模型中,我有一个“Id”属性,其ID属性已设置为 true 。我正在使用EcoreUtil.generateUUID()来获取唯一的ID。
在我的情况下,我有一个准备好的模型,我在运行时创建一个新模型。因此,ID彼此不同。
在EMFCompare的开发者指南中,他们提供我们使用 UseIdentifiers.NEVER ;
IEObjectMatcher matcher = DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);
但是,它会产生每个节点的数学,其ID如下所示:
左对象:DocModel.impl.ParagraphImpl@2767e23c(Id:_8pidAdVSEeSCK78kxjXrDg)(name:null)(rawText:Lorem ipsum ....)
正确的对象:DocModel.impl.ParagraphImpl@33bc72d1(Id:_QSFJodrUEeSkqsl19NdwQQ)(name:null)(rawText:Lorem ipsum ....)
d.getKind():CHANGE
我猜比较会看到他们因为不同的ID而改变。
简而言之,我想在比较中忽略Id属性。
感谢和问候
答案 0 :(得分:0)
在给你答案之前,我想理解。
Emf compare使用两种不同的匹配对象的方式。第一个是 Id功能,另一个是关于一个组中对象之间的计算距离。默认情况下,emf compare使用混合方法。如果元素的 id函数可用,则调用它,否则它将使用距离函数匹配最近邻居的对象。因此,在创建匹配器时,应指定策略。在您的情况下,您选择永远不使用id函数。
DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);
实际比较不在匹配引擎中,而是在 diff引擎中。 您只需要扩展 DefaultDiffEngine 并覆盖 createFeatureFilter 方法,即可为您提供 FeatureFilter 。