This is an automated email from the ASF dual-hosted git repository.
rskraba pushed a commit to branch branch-1.11
in repository https://gitbox.apache.org/repos/asf/avro.git
The following commit(s) were added to refs/heads/branch-1.11 by this push:
new 4475d7e0b AVRO-3789: [java] fix map comparison in GenericData (#2318)
4475d7e0b is described below
commit 4475d7e0bcde2e2703ce72a78dba4ea47e89dbde
Author: Felix Krull <[email protected]>
AuthorDate: Wed Jul 12 13:24:51 2023 +0200
AVRO-3789: [java] fix map comparison in GenericData (#2318)
* AVRO-3789: add more tests for GenericData map comparison
* AVRO-3789: fix GenericData map comparison for empty maps and
different-sized maps
* AVRO-3789: use isEmpty to check for empty maps
---
.../java/org/apache/avro/generic/GenericData.java | 6 +-
.../org/apache/avro/generic/TestGenericData.java | 93 ++++++++++++++++++++++
2 files changed, 98 insertions(+), 1 deletion(-)
diff --git
a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
index e82dde040..ee86ddeb3 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
@@ -1153,7 +1153,11 @@ public class GenericData {
return 0;
}
- if (m2.size() != m2.size()) {
+ if (m1.isEmpty() && m2.isEmpty()) {
+ return 0;
+ }
+
+ if (m1.size() != m2.size()) {
return 1;
}
diff --git
a/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
b/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
index 54e8c662a..abae2cbd4 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
@@ -185,6 +185,99 @@ public class TestGenericData {
assertEquals(r1, r0);
}
+ @Test
+ public void testEqualsEmptyMaps() {
+ Field myMapField = new Field("my_map",
Schema.createMap(Schema.create(Schema.Type.STRING)), null, null);
+ Schema schema = Schema.createRecord("my_record", "doc", "mytest", false);
+ schema.setFields(Arrays.asList(myMapField));
+
+ GenericRecord r0 = new GenericData.Record(schema);
+ r0.put("my_map", new HashMap<>());
+ GenericRecord r1 = new GenericData.Record(schema);
+ r1.put("my_map", new HashMap<>());
+
+ assertEquals(r0, r1);
+ assertEquals(r1, r0);
+ }
+
+ @Test
+ public void testEqualsEmptyMapAndNonEmptyMap() {
+ Field myMapField = new Field("my_map",
Schema.createMap(Schema.create(Schema.Type.STRING)), null, null);
+ Schema schema = Schema.createRecord("my_record", "doc", "mytest", false);
+ schema.setFields(Arrays.asList(myMapField));
+
+ GenericRecord r0 = new GenericData.Record(schema);
+ r0.put("my_map", new HashMap<>());
+ GenericRecord r1 = new GenericData.Record(schema);
+ HashMap<CharSequence, CharSequence> pair1 = new HashMap<>();
+ pair1.put("keyOne", "valueOne");
+ r1.put("my_map", pair1);
+
+ assertNotEquals(r0, r1);
+ assertNotEquals(r1, r0);
+ }
+
+ @Test
+ public void testEqualsMapAndSubset() {
+ Field myMapField = new Field("my_map",
Schema.createMap(Schema.create(Schema.Type.STRING)), null, null);
+ Schema schema = Schema.createRecord("my_record", "doc", "mytest", false);
+ schema.setFields(Arrays.asList(myMapField));
+
+ GenericRecord r0 = new GenericData.Record(schema);
+ HashMap<CharSequence, String> m1 = new HashMap<>();
+ m1.put("keyOne", "valueOne");
+ m1.put("keyTwo", "valueTwo");
+ r0.put("my_map", m1);
+
+ GenericRecord r1 = new GenericData.Record(schema);
+ HashMap<CharSequence, String> m2 = new HashMap<>();
+ m2.put("keyOne", "valueOne");
+ r1.put("my_map", m2);
+
+ assertNotEquals(r0, r1);
+ assertNotEquals(r1, r0);
+ }
+
+ @Test
+ public void testEqualsMapAndSameSizeMapWithDifferentKeys() {
+ Field myMapField = new Field("my_map",
Schema.createMap(Schema.create(Schema.Type.STRING)), null, null);
+ Schema schema = Schema.createRecord("my_record", "doc", "mytest", false);
+ schema.setFields(Arrays.asList(myMapField));
+
+ GenericRecord r0 = new GenericData.Record(schema);
+ HashMap<CharSequence, String> m1 = new HashMap<>();
+ m1.put("keyOne", "valueOne");
+ r0.put("my_map", m1);
+
+ GenericRecord r1 = new GenericData.Record(schema);
+ HashMap<CharSequence, String> m2 = new HashMap<>();
+ m2.put("keyTwo", "valueTwo");
+ r1.put("my_map", m2);
+
+ assertNotEquals(r0, r1);
+ assertNotEquals(r1, r0);
+ }
+
+ @Test
+ public void testEqualsMapAndSameSizeMapWithDifferentValues() {
+ Field myMapField = new Field("my_map",
Schema.createMap(Schema.create(Schema.Type.STRING)), null, null);
+ Schema schema = Schema.createRecord("my_record", "doc", "mytest", false);
+ schema.setFields(Arrays.asList(myMapField));
+
+ GenericRecord r0 = new GenericData.Record(schema);
+ HashMap<CharSequence, String> m1 = new HashMap<>();
+ m1.put("keyOne", "valueOne");
+ r0.put("my_map", m1);
+
+ GenericRecord r1 = new GenericData.Record(schema);
+ HashMap<CharSequence, String> m2 = new HashMap<>();
+ m2.put("keyOne", "valueTwo");
+ r1.put("my_map", m2);
+
+ assertNotEquals(r0, r1);
+ assertNotEquals(r1, r0);
+ }
+
@Test
public void testArrayValuesEqualsStringAndUtf8Compatibility() {
Field myArrayField = new Field("my_array",
Schema.createArray(Schema.create(Schema.Type.STRING)), null, null);