【问题标题】:JaVers gives incorrect result for the custom list diffJaVers 为自定义列表差异提供了不正确的结果
【发布时间】:2020-02-26 15:48:22
【问题描述】:

我有一个类节点,它有设备列表。例如

    class Node {
        String nodeCode;
        String name;
        List devices;
    }

    class Device {
        String deviceCode;
        String name;
    }

我正在使用 LEVENSHTEIN_DISTANCE 算法比较两个 Node 对象,下面提到了场景:

Senario - 1. 移除 device1:

 Old Version:
         var device1 = Device("d1", "device1")
         var device2 = Device("d2", "device2")
         var devices = mutableListOf<Device>()
         devices.add(device1)
         devices.add(device2)
         val before = Node("n1", "node1", devices)  // Old Version


 Current Version:
       var newDevice1 = Device("d1", "device1")
       var newDevices = mutableListOf<Device>()
       newDevices.add(newDevice1)
       var after = Node("n1", "node1", newDevices) // New Version

 Compare both version:
 var diff = javers.compare(before, after)
 println("$diff")

Output:

changes on com.example.audit.Node/ :
'devices' collection changes :
1. 'com.example.audit.Node/#devices/1' removed

Senario - 2. 添加设备 2:

  Old Version:
       var newDevice1 = Device("d1", "device1")
       var newDevices = mutableListOf<Device>()
       newDevices.add(newDevice1)
       var after = Node("n1", "node1", newDevices) // Old Version

  Current Version:
       var device1 = Device("d1", "device1") 
       var device2 = Device("d2", "device2")
       var devices = mutableListOf<Device>()
       devices.add(device1)
       devices.add(device2)
       val after1 = Node("n1", "node1", devices)  // New Version

  Compare both version:
  var diff = javers.compare(after, after1)

Output:

changes on com.example.audit.Node/ :
'devices' collection changes :
1. 'com.example.audit.Node/#devices/1' added

Senario - 3. 从设备列表中的位置 0 移除 device1:

  Old Version:
       var device1 = Device("d1", "device1") 
       var device2 = Device("d2", "device2")
       var devices = mutableListOf<Device>()
       devices.add(device1)
       devices.add(device2)
       val after1 = Node("n1", "node1", devices)  //Old Version

 Current Version:
      device2 = Device("d2", "device2") 
      var newDevices2 = mutableListOf<Device>()
      newDevices2.add(device2)
      val after2 = Node("n1", "node1", newDevices2) // New Version

    Compare both version:
    diff = javers.compare(after1, after2)

Output:

changes on com.example.audit.Node/ :
'devices' collection changes :
1. 'com.example.audit.Node/#devices/1' removed

第三种情况给出了错误的输出。我从列表中的第 0 位删除了 device1,但它从设备列表中的第 1 位中删除了。

我想要第 3 个场景输出,例如:

changes on com.example.audit.Node/ :
'devices' collection changes :
0. 'com.example.audit.Node/#devices/0' removed

JaVers 对自定义对象列表有限制吗?

我错过了原型中的第 3 个场景。我去了并集成到我的项目中,并且更改已移至阶段。这是阻止我发布。

您能否提供您的意见,我必须做出哪些改变才能获得预期的结果?

【问题讨论】:

标签: spring-boot kotlin javers


【解决方案1】:

JaVers 工作正常,你误用了Value Objects。值对象列表不便于比较,因为值对象(根据定义)没有标识。当您将列表中的对象映射为 Values

时,您可以获得预期的结果

(时髦的)

package org.javers.core.cases

import org.javers.core.JaversBuilder
import org.javers.core.diff.ListCompareAlgorithm
import org.javers.core.diff.changetype.container.ListChange
import org.javers.core.metamodel.annotation.Id
import org.javers.core.metamodel.annotation.TypeName
import spock.lang.Specification

import static java.util.Objects.equals

class shivusajjan extends Specification {

    @TypeName("Address")
    class Address {
        String city
        String street

        Address(String city, String street) {
            this.city = city
            this.street = street
        }

        @Override
        String toString() {
            return "Address{" +
                    "city='" + city + '\'' +
                    ", street='" + street + '\'' +
                    '}';
        }
    }

    @TypeName("Employee")
    class EmployeeClass {
        @Id String name
        List<Address> addressList

        EmployeeClass(String name, List<Address> addressList) {
            this.name = name
            this.addressList = addressList
        }
    }

    def "should compare list of Values using LEVENSHTEIN_DISTANCE"() {
        given:
        def javers = JaversBuilder.javers()
                .withListCompareAlgorithm(ListCompareAlgorithm.LEVENSHTEIN_DISTANCE)
                .registerValue(
                        Address,
                        { a, b -> equals(a.city, b.city) && equals(a.street, b.street) },
                        {a -> a.toString() }
                )
                .build()

        def previousAddresses = [ new Address("Bangalore", "Vinayaka"),
                                  new Address("Bangalore", "Vijayanagar")]
        def previousEmp = new EmployeeClass("Frodo", previousAddresses)

        def currentAddresses = [ new Address("Bangalore", "Vijayanagar") ]
        def newEmp = new EmployeeClass("Frodo", currentAddresses)

        when:
        def diff = javers.compare(previousEmp, newEmp)

        then:
        println diff.prettyPrint()
        ListChange change = diff.getChangesByType(ListChange)[0]
        change.changes[0].index == 0
    }
}

输出

Diff:
* changes on Employee/Frodo :
  - 'addressList' collection changes :
    0. 'Address{city='Bangalore', street='Vinayaka'}' removed

【讨论】:

  • 我们不能得到如下所述的输出吗? ` Employee/Frodo 上的更改:-'addressList' 集合更改:0。'Employee/#addressList/0' 已删除` `
猜你喜欢
  • 2014-03-27
  • 2018-04-11
  • 2016-01-06
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 2021-03-30
  • 2017-02-22
  • 1970-01-01
相关资源
最近更新 更多