[ https://issues.apache.org/jira/browse/AVRO-4036?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17923858#comment-17923858 ]
Andriy Onyshchuk commented on AVRO-4036: ---------------------------------------- We have related issue when in tests we compare Lists of Maps ``` @AvroGenerated class Model extends SpecificRecordBase implements SpecificRecord { ... List<Map<String, String>> events; ... } ``` than in tests we do ``` final var deserializedModel = avro serde stuff assertThat(deserializedModel.getEvents()).equalsTo(expectation); ``` as the result we can see ``` Can't compare maps! org.apache.avro.AvroRuntimeException: Can't compare maps! at org.apache.avro.generic.GenericData.compare(GenericData.java:1308) at org.apache.avro.generic.GenericData.compare(GenericData.java:1300) at org.apache.avro.generic.GenericData.compare(GenericData.java:1201) at org.apache.avro.generic.GenericData$AbstractArray.equals(GenericData.java:357) at org.assertj.core.internal.StandardComparisonStrategy.areEqual(StandardComparisonStrategy.java:108) at org.assertj.core.internal.Objects.areEqual(Objects.java:228) at org.assertj.core.internal.Objects.assertEqual(Objects.java:219) at org.assertj.core.api.AbstractAssert.isEqualTo(AbstractAssert.java:374) ``` Rollback to `1.11.4` helps. Another workaround is to use `assertThat(List.copyOf(deserializedModel.getEvents())).equalsTo(expectation);` But overall new implementation of `GenericData.AbstractArray.compare` (ans subsequently `GenericData.AbstractArray.equals` that depends on it) that uses `equals=false` for underlying `compare` method invocations will fail on any `array<map>` types which doesn't seem right. > GenericData.Array.equals() method does not adhere to standards > -------------------------------------------------------------- > > Key: AVRO-4036 > URL: https://issues.apache.org/jira/browse/AVRO-4036 > Project: Apache Avro > Issue Type: Bug > Components: java > Affects Versions: 1.12.0 > Environment: Avro 1.12.0 > JDK 21 > Maven > > Reporter: Krzysztof Barczynski > Priority: Major > > There is a unit test which shows what's the issue: > * > [https://github.com/krisso-rtb/avro-custom-logical-types/blob/avro-1.12.0-test-case-for-weird-equals/custom-logical-types-used/src/test/java/com/rtbhouse/custom/logical/types/SerializeDeserializeTest.java] > Most important part is block of code around line 40. > In version 1.12.0 implementation of *equals()* has been changed to > {code:java} > public boolean equals(final Object o) { > if (!(o instanceof Collection)) { > return false; > } > return GenericData.get().compare(this, o, this.getSchema()) == 0; > } > {code} > which fails when logical types are used. > More precisely: when record's field is an array of union of "null" and > logical type. > ---- > Basically when originalPoi and deserializedPoi are Java class instances and > {code:java} > originalPoi.getLocations().equals(deserializedPoi.getLocations()) == true > {code} > then > {code:java} > deserializedPoi.getLocations().equals(originalPoi.getLocations()) {code} > should be also true but it throws an exception: > {code:java} > org.apache.avro.AvroRuntimeException: Unknown datum type > com.rtbhouse.custom.logical.types.LatLon: LatLon[latitude=30.123, > longitude=-90.98762] > at org.apache.avro.generic.GenericData.getSchemaName(GenericData.java:975) > at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:934) > at org.apache.avro.generic.GenericData.compare(GenericData.java:1310) > at org.apache.avro.generic.GenericData.compare(GenericData.java:1286) > at org.apache.avro.generic.GenericData.compare(GenericData.java:1300) > at org.apache.avro.generic.GenericData.compare(GenericData.java:1201) > at > org.apache.avro.generic.GenericData$AbstractArray.equals(GenericData.java:357) > at > com.rtbhouse.custom.logical.types.SerializeDeserializeTest.shouldSerializeAndDeserializeAvro(SerializeDeserializeTest.java:46){code} -- This message was sent by Atlassian Jira (v8.20.10#820010)