Skip to content

Commit

Permalink
AVRO-3789: [java] fix map comparison in GenericData (#2318)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
felixkrull-neuland committed Jul 12, 2023
1 parent 8c3ee16 commit a88cc9e
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -1178,7 +1178,11 @@ protected int compareMaps(final Map<?, ?> m1, final Map<?, ?> m2) {
return 0;
}

if (m2.size() != m2.size()) {
if (m1.isEmpty() && m2.isEmpty()) {
return 0;
}

if (m1.size() != m2.size()) {
return 1;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,99 @@ public void testMapValuesEqualsStringAndUtf8Compatibility() {
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);
Expand Down

0 comments on commit a88cc9e

Please sign in to comment.