This is an automated email from the ASF dual-hosted git repository.
danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git
The following commit(s) were added to refs/heads/master by this push:
new e03cd0a198 [HUDI-4545] Do not modify the current record directly for
OverwriteNonDefaultsWithLatestAvroPayload (#6306)
e03cd0a198 is described below
commit e03cd0a198f63df7fb7ba71d1c9a0b01ae33f021
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