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

Reply via email to