0

比較する2つのモデルがあります。私の *.ecore モデルには、「Id」属性があり、その ID プロパティはtrueに設定されています。一意の ID に EcoreUtil.generateUUID() を使用しています。

私の場合、準備が整ったモデルが 1 つあり、実行時に新しいモデルを作成しています。したがって、ID は互いに異なります。

EMFCompare の開発者ガイドでは、 UseIdentifiers.NEVER の使用を提案しています

IEObjectMatcher matcher = DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);

それでも、以下のような id を持つノードごとに数学を生成します。

左のオブジェクト: DocModel.impl.ParagraphImpl@2767e23c (Id: _8pidAdVSEeSCK78kxjXrDg) (名前: null) (rawText: Lorem ipsum ....)

右のオブジェクト: DocModel.impl.ParagraphImpl@33bc72d1 (Id: _QSFJodrUEeSkqsl19NdwQQ) (名前: null) (rawText: Lorem ipsum ....)

d.getKind(): 変更

比較すると、IDが異なるために変更されていることがわかります。

つまり、ID 属性を無視して比較したいのです。

感謝とよろしく

4

1 に答える 1

1

答えを出す前に、私は理論に陥りたいと思います。

Emf 比較は、オブジェクトを照合する 2 つの異なる方法を使用します。1 つ目はId 関数で、もう 1 つは1 つのグループ内のオブジェクト間の計算距離に関するものです。デフォルトでは、emf 比較はハイブリッド アプローチを使用します。要素のid 関数が使用可能な場合は、それが呼び出されます。それ以外の場合は、距離関数を使用して最近傍によってオブジェクトを照合します。したがって、マッチャーを作成するときは、戦略を指定する必要があります。あなたの場合、id 関数を使用しないことを選択しました。

DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);

実際の比較は match エンジンではなくdiff エンジンで行われます。必要なのは、DefaultDiffEngineを拡張し、 createFeatureFilterメソッドをオーバーライドして、独自のFeatureFilterを提供することだけです。

于 2016-09-03T13:21:11.140 に答える