This is an automated email from the ASF dual-hosted git repository. codope pushed a commit to branch release-0.12.0 in repository https://gitbox.apache.org/repos/asf/hudi.git
commit 4d6aac90d9027077d361952454d8a9b1fc99dff5 Author: Danny Chan <[email protected]> AuthorDate: Fri Aug 5 14:16:53 2022 +0800 [HUDI-4545] Do not modify the current record directly for OverwriteNonDefaultsWithLatestAvroPayload (#6306) --- .../model/OverwriteNonDefaultsWithLatestAvroPayload.java | 8 ++++++-- .../model/TestOverwriteNonDefaultsWithLatestAvroPayload.java | 11 +++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/hudi-common/src/main/java/org/apache/hudi/common/model/OverwriteNonDefaultsWithLatestAvroPayload.java b/hudi-common/src/main/java/org/apache/hudi/common/model/OverwriteNonDefaultsWithLatestAvroPayload.java index 93ac96cb42..6ce99aae21 100644 --- a/hudi-common/src/main/java/org/apache/hudi/common/model/OverwriteNonDefaultsWithLatestAvroPayload.java +++ b/hudi-common/src/main/java/org/apache/hudi/common/model/OverwriteNonDefaultsWithLatestAvroPayload.java @@ -20,6 +20,7 @@ package org.apache.hudi.common.model; import org.apache.avro.Schema; import org.apache.avro.generic.GenericRecord; +import org.apache.avro.generic.GenericRecordBuilder; import org.apache.avro.generic.IndexedRecord; import org.apache.hudi.common.util.Option; @@ -60,16 +61,19 @@ public class OverwriteNonDefaultsWithLatestAvroPayload extends OverwriteWithLate if (isDeleteRecord(insertRecord)) { return Option.empty(); } else { + final GenericRecordBuilder builder = new GenericRecordBuilder(schema); List<Schema.Field> fields = schema.getFields(); fields.forEach(field -> { Object value = insertRecord.get(field.name()); value = field.schema().getType().equals(Schema.Type.STRING) && value != null ? value.toString() : value; Object defaultValue = field.defaultVal(); if (!overwriteField(value, defaultValue)) { - currentRecord.put(field.name(), value); + builder.set(field, value); + } else { + builder.set(field, currentRecord.get(field.pos())); } }); - return Option.of(currentRecord); + return Option.of(builder.build()); } } } diff --git a/hudi-common/src/test/java/org/apache/hudi/common/model/TestOverwriteNonDefaultsWithLatestAvroPayload.java b/hudi-common/src/test/java/org/apache/hudi/common/model/TestOverwriteNonDefaultsWithLatestAvroPayload.java index c6eee05b87..9e3405b304 100644 --- a/hudi-common/src/test/java/org/apache/hudi/common/model/TestOverwriteNonDefaultsWithLatestAvroPayload.java +++ b/hudi-common/src/test/java/org/apache/hudi/common/model/TestOverwriteNonDefaultsWithLatestAvroPayload.java @@ -22,6 +22,7 @@ import org.apache.avro.JsonProperties; import org.apache.avro.Schema; import org.apache.avro.generic.GenericData; import org.apache.avro.generic.GenericRecord; +import org.apache.avro.generic.IndexedRecord; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -31,6 +32,7 @@ import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotSame; /** * Unit tests {@link TestOverwriteNonDefaultsWithLatestAvroPayload}. @@ -85,8 +87,13 @@ public class TestOverwriteNonDefaultsWithLatestAvroPayload { assertEquals(record1, payload1.getInsertValue(schema).get()); assertEquals(record2, payload2.getInsertValue(schema).get()); - assertEquals(payload1.combineAndGetUpdateValue(record2, schema).get(), record1); - assertEquals(payload2.combineAndGetUpdateValue(record1, schema).get(), record3); + IndexedRecord combinedVal1 = payload1.combineAndGetUpdateValue(record2, schema).get(); + assertEquals(combinedVal1, record1); + assertNotSame(combinedVal1, record1); + + IndexedRecord combinedVal2 = payload2.combineAndGetUpdateValue(record1, schema).get(); + assertEquals(combinedVal2, record3); + assertNotSame(combinedVal2, record3); } @Test
