[
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)