2017-02-13 3 views
1

Ich vergleiche zwei Objekte, die eine Liste von Objekten enthalten, mit JaVers v3.0.0. Die Objekte, die ich vergleiche, unterscheiden sich im Inhalt der Liste, zum Beispiel wird ein Objekt aus der Liste entfernt.Javers: Identifizieren oder vermeiden Sie doppelte Diff Ergebnisse

Ich erhalte zwei Änderungsobjekte, wenn ich diesen Vergleich durchführe: ein ListChange und ein ObjectRemoved.

Wenn ich das Ergebnis präsentiere, muss ich sicherstellen, dass dieselbe Änderung nicht zweimal angezeigt wird. Es fällt mir schwer herauszufinden, wie ich diese Duplikate, die ich bekomme, entweder identifizieren oder vermeiden kann. Ich habe versucht, mit GlobalID, aber ich am Ende Parsing Strings, die nicht ganz sicher fühlen. Ich habe auch versucht, ListChange oder ObjectRemoved aus meiner Präsentation zu überspringen, aber das wirft Probleme auf, wenn ich auch eine ListChange einer Liste von Werten oder eine ObjectRemoved für ein Objekt habe, das nicht in einer Liste ist. Hier

@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; 
    } 
} 

ist die Ausgabe von Ausführen des Beispielcode oben:

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 

Antwort

0

In Javers, ObjectRemoved informiert Sie, dass ein Objekt von einem Objekt Grafik links verschwunden. Während ListChange->ValueRemoved ist die PropertyChange und informiert über konkrete Stelle in der Objektgrafik, wo die Änderung aufgetreten ist.

Diese beiden Änderungen betreffen dasselbe Objekt (entfernt), sind aber keine Duplikate.

Zum Beispiel:

Class A { 
    List<B> listOfB 
    B bRef 
} 

Wenn Sie vergleichen:

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

Sie drei Änderungen haben:

  • b1 ObjectRemoved (allgemeine Informationen)
  • b1 ListChange->ValueRemoved auf listOfB Eigenschaft (bestimmter Ort im Objektdiagramm)
  • ValueChanged von b1 bis null auf bRef Eigenschaft (ein weiterer bestimmte Ort im Objektdiagramm)

Was kann ich schlage vor, Sie ist einfach ObjectRemoved Änderungen ignoriert und unter Berufung nur auf PropertyChanges (ListChange, ValueChange ...)

Verwandte Themen