EMF Compare - Как игнорировать идентификаторы

У меня есть 2 модели для сравнения. В моей модели *.ecore у меня есть атрибут "Id", а для его свойства ID установлено значение true. Я использую EcoreUtil.generateUUID() для уникальных идентификаторов.

В моем случае у меня есть одна готовая модель, и я создаю новую во время выполнения. Поэтому идентификаторы отличаются друг от друга.

В руководстве разработчика EMFCompare они предлагают нам использовать UseIdentifiers.NEVER;

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

Тем не менее, он производит математические расчеты на узел, которые имеют идентификатор, как показано ниже:

Левый объект: DocModel.impl.ParagraphImpl@2767e23c (Id: _8pidAdVSEeSCK78kxjXrDg) (имя: ноль) (rawText: Lorem ipsum ....)

Правый объект: DocModel.impl.ParagraphImpl@33bc72d1 (Id: _QSFJodrUEeSkqsl19NdwQQ) (name: null) (rawText: Lorem ipsum ....)

d.getKind (): ИЗМЕНИТЬ

Я думаю, что сравнение видит их ИЗМЕНЕНИЕ из-за различных идентификаторов.

Короче говоря, я хочу игнорировать атрибуты Id в сравнении.

спасибо и всего наилучшего

1 ответ

Прежде чем дать вам ответ, я хочу углубиться в теорию.

Emf Compare использует два разных способа сопоставления объекта. Первый - это Id-функции, а другой - о расчете расстояния между объектами в одной группе. По умолчанию сравнение ЭДС использует гибридный подход. Если функция id для элемента доступна, то она будет вызвана, иначе она будет сопоставлять объекты ближайшим соседом, используя функции расстояния. Итак, когда вы создаете matcher, вы должны указать стратегию. В вашем случае вы решили никогда не использовать функции id.

DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);

Фактическое сравнение происходит не в спичечном двигателе, а в различном. Все, что вам нужно, это просто расширить DefaultDiffEngine и переопределить метод createFeatureFilter, чтобы предоставить вам свой FeatureFilter.

Другие вопросы по тегам