2017-02-13 12 views
1

Я сравниваю два объекта, содержащие список объектов, используя JaVers v3.0.0. Объекты, которые я сравниваю, различаются по содержимому списка, например, объект удаляется из списка.javers: Определить или избежать дублирования результатов diff

Я получаю два объекта изменения, когда выполняю это сравнение: один ListChange и один ObjectRemoved.

При представлении результата мне необходимо убедиться, что одно и то же изменение не представлено дважды. Мне сложно определить, как идентифицировать или избежать этих дубликатов, которые я получаю. Я попытался использовать GlobalID, но в итоге я разбираю строки, которые не чувствуют себя абсолютно безопасными. Я также попытался пропустить ListChange или ObjectRemoved из моей презентации, но это создает проблемы, когда у меня также есть ListChange из списка значений или ObjectRemoved для объекта, которого нет в списке.

@Test 
public void javersDuplicateDiffResult() { 

    MyMainObj objA = new MyMainObj(Arrays.asList(new MyListedObj("hello"), new MyListedObj("world"))); 
    MyMainObj objB = new MyMainObj(Arrays.asList(new MyListedObj("hello"))); 

    Javers javers = JaversBuilder.javers() 
      .withListCompareAlgorithm(ListCompareAlgorithm.LEVENSHTEIN_DISTANCE) 
      .build(); 
    Diff res = javers.compare(objA, objB); 

    System.out.println(res); 

    Assert.assertEquals(1, res.getChanges().size()); 
} 

class MyMainObj { 
    private List<MyListedObj> theObjectList; 

    public MyMainObj(List<MyListedObj> anObjectList) { 
     this.theObjectList = anObjectList; 
    } 
} 

class MyListedObj { 
    private String theText; 

    public MyListedObj(String aText) { 
     this.theText = aText; 
    } 
} 

Вот выход из работы код примера выше:

Diff: 
1. ObjectRemoved{globalId:'org.example.TestJavers$MyMainObj/#theObjectList/1'} 
2. ListChange{globalId:'org.example.TestJavers$MyMainObj/', property:'theObjectList', containerChanges:[(1).removed:'[email protected]']} 


java.lang.AssertionError: 
Expected :1 
Actual :2 

ответ

0

В JaVers, ObjectRemoved информирует вас о том, что объект исчез из объекта графа слева. В то время как ListChange->ValueRemoved является PropertyChange и сообщает о конкретном месте на графе объектов, где произошло изменение.

Эти два изменения относятся к одному и тому же объекту (удалены), но не дублируются.

Например:

Class A { 
    List<B> listOfB 
    B bRef 
} 

Если вы сравните:

def b1 = new B() 
javers.compare(new A(listOfB:[b1], bRef:b1), new A(listOfB:[], bRef:null)) 

У вас будет три изменения:

  • b1 ObjectRemoved (общая информация)
  • b1 ListChange->ValueRemoved на listOfB собственности (конкретное место в графе объектов)
  • ValueChanged от b1 до нулевого на bRef собственности (другое конкретное место в графе объектов)

Что я могу предложить вам просто игнорируя ObjectRemoved изменений и полагаться только по PropertyChanges (ListChange, ValueChange ...)