Skip to content

Commit 589efe8

Browse files
author
Srilakshmi Manjunath Bharadwaj
committed
Fix to default values issue
1 parent a844338 commit 589efe8

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

data-avro/src/main/java/com/linkedin/data/avro/DataTranslator.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ public class DataTranslator implements DataTranslatorContext
6161
{
6262
protected DataTranslationOptions _dataTranslationOptions;
6363

64+
public static void backFillMissingDeafultInDataMap(DataMap map, RecordDataSchema dataSchema) {
65+
for (RecordDataSchema.Field field: dataSchema.getFields()) {
66+
// System.out.println(field.getType()+ " " + field.getDefault());
67+
if (field.getDefault() != null && (!map.containsKey(field.getName()) || map.get(field.getName()) == null)) {
68+
map.put(field.getName(), field.getDefault());
69+
}
70+
}
71+
}
72+
6473
/**
6574
* Convert the given {@link DataMap} conforming to the provided {@link RecordDataSchema} to a {@link GenericRecord}.
6675
*
@@ -74,6 +83,7 @@ public class DataTranslator implements DataTranslatorContext
7483
*/
7584
public static GenericRecord dataMapToGenericRecord(DataMap map, RecordDataSchema dataSchema) throws DataTranslationException
7685
{
86+
backFillMissingDeafultInDataMap(map, dataSchema);
7787
Schema avroSchema = SchemaTranslator.dataToAvroSchema(dataSchema);
7888
return dataMapToGenericRecord(map, dataSchema, avroSchema, null);
7989
}
@@ -94,6 +104,7 @@ public static GenericRecord dataMapToGenericRecord(DataMap map, RecordDataSchema
94104
DataMapToAvroRecordTranslationOptions options)
95105
throws DataTranslationException
96106
{
107+
backFillMissingDeafultInDataMap(map, dataSchema);
97108
Schema avroSchema = SchemaTranslator.dataToAvroSchema(dataSchema);
98109
return dataMapToGenericRecord(map, dataSchema, avroSchema, options);
99110
}
@@ -102,6 +113,7 @@ public static GenericRecord dataMapToGenericRecord(DataMap map, RecordDataSchema
102113
DataMapToAvroRecordTranslationOptions options)
103114
throws DataTranslationException
104115
{
116+
backFillMissingDeafultInDataMap(map, dataSchema);
105117
DataMapToGenericRecordTranslator translator = new DataMapToGenericRecordTranslator(options);
106118
try
107119
{
@@ -116,6 +128,7 @@ public static GenericRecord dataMapToGenericRecord(DataMap map, RecordDataSchema
116128

117129
public static <T extends SpecificRecordBase> T dataMapToSpecificRecord(DataMap map, RecordDataSchema dataSchema,
118130
Schema avroSchema) throws DataTranslationException {
131+
backFillMissingDeafultInDataMap(map, dataSchema);
119132
DataMapToSpecificRecordTranslator translator = new DataMapToSpecificRecordTranslator();
120133
try {
121134
T avroRecord = translator.translate(map, dataSchema, avroSchema);
@@ -145,6 +158,7 @@ public static <T extends SpecificRecordBase> T dataMapToSpecificRecord(DataMap m
145158
*/
146159
public static GenericRecord dataMapToGenericRecord(DataMap map, RecordDataSchema dataSchema, Schema avroSchema) throws DataTranslationException
147160
{
161+
backFillMissingDeafultInDataMap(map, dataSchema);
148162
return dataMapToGenericRecord(map, dataSchema, avroSchema, null);
149163
}
150164

data-avro/src/test/java/com/linkedin/data/avro/TestDataTranslator.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package com.linkedin.data.avro;
1818

1919
import com.google.common.collect.ImmutableMap;
20+
import com.linkedin.avroutil1.compatibility.AvroCompatibilityHelper;
21+
import com.linkedin.data.Data;
2022
import com.linkedin.data.DataList;
2123
import com.linkedin.data.DataMap;
2224
import com.linkedin.data.TestUtil;
@@ -28,6 +30,7 @@
2830
import com.linkedin.data.avro.testevents.RecordArray;
2931
import com.linkedin.data.avro.testevents.RecordMap;
3032
import com.linkedin.data.avro.testevents.StringRecord;
33+
import com.linkedin.data.avro.testevents.TestArray;
3134
import com.linkedin.data.avro.testevents.TestEventRecordOfRecord;
3235
import com.linkedin.data.avro.testevents.TestEventWithUnionAndEnum;
3336
import com.linkedin.data.avro.util.AvroUtil;
@@ -1165,7 +1168,9 @@ private void testDataTranslation(String schemaText, String[][] row) throws IOExc
11651168
String expectedBeforeNamespaceProcessor = row[col][i];
11661169
String expected = TestAvroUtil.namespaceProcessor(expectedBeforeNamespaceProcessor);
11671170
if (debug && expected != expectedBeforeNamespaceProcessor) out.println(" Expected:" + expected);
1168-
1171+
if (!result.contains(expected)) {
1172+
System.out.println("RESULT: "+result+"\n"+"EXPECTED: "+expected);
1173+
}
11691174
assertTrue(result.contains(expected));
11701175
}
11711176

@@ -2291,5 +2296,29 @@ public void testMapArrayUnion() throws IOException {
22912296
Assert.assertTrue(mapOfMapOfArrayOfMapArrayUnion.get(0) instanceof Map);
22922297
Assert.assertEquals(((Map<?, ?>) mapOfMapOfArrayOfMapArrayUnion.get(0)).get("recordMap"), mapOfArrayOfMapArrayUnion);
22932298
}
2299+
2300+
@Test
2301+
public void testDataMapBackfill() throws IOException {
2302+
final String SCHEMA =
2303+
"{" +
2304+
" \"type\":\"record\"," +
2305+
" \"name\":\"Foo\"," +
2306+
" \"fields\":[" +
2307+
" {" +
2308+
" \"name\":\"arrayField\"," +
2309+
" \"type\":{" +
2310+
" \"type\":\"array\"," +
2311+
" \"items\":\"string\"" +
2312+
" }," +
2313+
" \"default\":[ ]" +
2314+
" }" +
2315+
" ]" +
2316+
"}";
2317+
RecordDataSchema recordDataSchema =
2318+
(RecordDataSchema) TestUtil.dataSchemaFromString(SCHEMA);
2319+
DataMap map = new DataMap();
2320+
GenericRecord record = DataTranslator.dataMapToGenericRecord(map, recordDataSchema);
2321+
Assert.assertEquals(record.get("arrayField"), map.get("arrayField"));
2322+
}
22942323
}
22952324

0 commit comments

Comments
 (0)