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

Reply via email to