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

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

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

В руководстве разработчика EMFCompare нам предлагают использовать UseIdentifiers.НИКОГДА;

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

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

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

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

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

Я предполагаю, что сравнение показывает, что они ИЗМЕНЯЮТСЯ из-за разных идентификаторов.

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

спасибо и привет


person fukit0    schedule 07.04.2015    source источник
comment
Если не использовать ID для сравнения, то зачем он вообще?   -  person tobias_k    schedule 08.04.2015
comment
Вы правы в одном месте о причине использования идентификаторов. Однако EMF Compare позволяет нам игнорировать идентификаторы. Я хочу сравнить всю модель, кроме полей идентификатора.   -  person fukit0    schedule 08.04.2015


Ответы (1)


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

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

DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);

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

person hleb.albau    schedule 03.09.2016