Skip to content

Commit e03cd0a

Browse files
authored
[HUDI-4545] Do not modify the current record directly for OverwriteNonDefaultsWithLatestAvroPayload (#6306)
1 parent a75cc02 commit e03cd0a

2 files changed

Lines changed: 15 additions & 4 deletions

File tree

hudi-common/src/main/java/org/apache/hudi/common/model/OverwriteNonDefaultsWithLatestAvroPayload.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import org.apache.avro.Schema;
2222
import org.apache.avro.generic.GenericRecord;
23+
import org.apache.avro.generic.GenericRecordBuilder;
2324
import org.apache.avro.generic.IndexedRecord;
2425

2526
import org.apache.hudi.common.util.Option;
@@ -60,16 +61,19 @@ public Option<IndexedRecord> combineAndGetUpdateValue(IndexedRecord currentValue
6061
if (isDeleteRecord(insertRecord)) {
6162
return Option.empty();
6263
} else {
64+
final GenericRecordBuilder builder = new GenericRecordBuilder(schema);
6365
List<Schema.Field> fields = schema.getFields();
6466
fields.forEach(field -> {
6567
Object value = insertRecord.get(field.name());
6668
value = field.schema().getType().equals(Schema.Type.STRING) && value != null ? value.toString() : value;
6769
Object defaultValue = field.defaultVal();
6870
if (!overwriteField(value, defaultValue)) {
69-
currentRecord.put(field.name(), value);
71+
builder.set(field, value);
72+
} else {
73+
builder.set(field, currentRecord.get(field.pos()));
7074
}
7175
});
72-
return Option.of(currentRecord);
76+
return Option.of(builder.build());
7377
}
7478
}
7579
}

hudi-common/src/test/java/org/apache/hudi/common/model/TestOverwriteNonDefaultsWithLatestAvroPayload.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.avro.Schema;
2323
import org.apache.avro.generic.GenericData;
2424
import org.apache.avro.generic.GenericRecord;
25+
import org.apache.avro.generic.IndexedRecord;
2526
import org.junit.jupiter.api.BeforeEach;
2627
import org.junit.jupiter.api.Test;
2728

@@ -31,6 +32,7 @@
3132

3233
import static org.junit.jupiter.api.Assertions.assertEquals;
3334
import static org.junit.jupiter.api.Assertions.assertFalse;
35+
import static org.junit.jupiter.api.Assertions.assertNotSame;
3436

3537
/**
3638
* Unit tests {@link TestOverwriteNonDefaultsWithLatestAvroPayload}.
@@ -85,8 +87,13 @@ public void testActiveRecords() throws IOException {
8587
assertEquals(record1, payload1.getInsertValue(schema).get());
8688
assertEquals(record2, payload2.getInsertValue(schema).get());
8789

88-
assertEquals(payload1.combineAndGetUpdateValue(record2, schema).get(), record1);
89-
assertEquals(payload2.combineAndGetUpdateValue(record1, schema).get(), record3);
90+
IndexedRecord combinedVal1 = payload1.combineAndGetUpdateValue(record2, schema).get();
91+
assertEquals(combinedVal1, record1);
92+
assertNotSame(combinedVal1, record1);
93+
94+
IndexedRecord combinedVal2 = payload2.combineAndGetUpdateValue(record1, schema).get();
95+
assertEquals(combinedVal2, record3);
96+
assertNotSame(combinedVal2, record3);
9097
}
9198

9299
@Test

0 commit comments

Comments
 (0)