Skip to content

Commit c12e321

Browse files
[GOBBLIN-2237]Make AvroUtils compatible with avro 1.10 (#4152)
* made avro get field compatible with avro 1.10 * addressed comments * addressed comments * made debug logs
1 parent 8ba6c1f commit c12e321

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

gobblin-utility/src/main/java/org/apache/gobblin/util/AvroUtils.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -306,9 +306,12 @@ private static void getFieldHelper(Map<String, Object> retVal,
306306
if (data instanceof Map) {
307307
val = getObjectFromMap((Map)data, pathList.get(field));
308308
} else if (data instanceof List) {
309-
val = getObjectFromArray((List)data, Integer.parseInt(pathList.get(field)));
309+
val = getObjectFromArray((List) data, Integer.parseInt(pathList.get(field)));
310+
} else if (data instanceof GenericRecord) {
311+
val = getSafeField((GenericRecord) data, pathList.get(field));
310312
} else {
311-
val = ((GenericRecord)data).get(pathList.get(field));
313+
log.warn("Unexpected data type '{}' encountered while traversing field '{}'. Value: {}", data.getClass().getName(),
314+
field, data);
312315
}
313316

314317
if (val != null) {
@@ -340,8 +343,20 @@ private static void getFieldHelper(Map<String, Object> retVal,
340343
return;
341344
}
342345

343-
AvroUtils.getFieldHelper(retVal, ((GenericRecord) data).get(pathList.get(field)), pathList, ++field);
344-
return;
346+
if (data instanceof GenericRecord) {
347+
Object next = getSafeField((GenericRecord) data, pathList.get(field));
348+
getFieldHelper(retVal, next, pathList, field + 1);
349+
}
350+
}
351+
352+
private static Object getSafeField(GenericRecord record, String fieldName) {
353+
if (record == null || fieldName == null) return null;
354+
try{
355+
return record.get(fieldName);
356+
} catch (AvroRuntimeException e) {
357+
log.debug("Unable to get field {} from record {}", fieldName, record, e);
358+
return null;
359+
}
345360
}
346361

347362
/**

gobblin-utility/src/test/java/org/apache/gobblin/util/AvroUtilsTest.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ public void testSwitchNamespace() {
247247
AvroCompatibilityHelper.createSchemaField("key", Schema.create(Schema.Type.LONG), "", 0L);
248248
field1.addProp("primaryKey", "true");
249249
fieldList.add(field1);
250-
Schema.Field field2 =
250+
Schema.Field field2 =
251251
AvroCompatibilityHelper.createSchemaField("double", Schema.create(Schema.Type.DOUBLE), "", 0.0);
252252
fieldList.add(field2);
253253

@@ -656,4 +656,38 @@ public void testDropRecursiveSchema()
656656

657657
}
658658
}
659+
@Test
660+
public void testGetFieldValue_existingField() {
661+
String schemaStr = "{\"type\":\"record\",\"name\":\"TestRecord\",\"fields\":[{\"name\":\"id\",\"type\":\"string\"}]}";
662+
Schema schema = new Schema.Parser().parse(schemaStr);
663+
GenericRecord record = new GenericData.Record(schema);
664+
record.put("id", "123");
665+
666+
Map<String, Object> result = AvroUtils.getMultiFieldValue(record, "id");
667+
Assert.assertEquals("123", result.get("id"));
668+
}
669+
670+
@Test
671+
public void testGetFieldValue_missingField_returnsNull() {
672+
String schemaStr = "{\"type\":\"record\",\"name\":\"TestRecord\",\"fields\":[{\"name\":\"id\",\"type\":\"string\"}]}";
673+
Schema schema = new Schema.Parser().parse(schemaStr);
674+
GenericRecord record = new GenericData.Record(schema);
675+
record.put("id", "123");
676+
677+
Map<String, Object> result = AvroUtils.getMultiFieldValue(record, "nonexistent");
678+
Assert.assertTrue(result.isEmpty());
679+
}
680+
681+
@Test
682+
public void testNestedFieldAccess() {
683+
String schemaStr = "{\"type\":\"record\",\"name\":\"Outer\",\"fields\":[{\"name\":\"inner\",\"type\":{\"type\":\"record\",\"name\":\"Inner\",\"fields\":[{\"name\":\"value\",\"type\":\"int\"}]}}]}";
684+
Schema schema = new Schema.Parser().parse(schemaStr);
685+
GenericRecord inner = new GenericData.Record(schema.getField("inner").schema());
686+
inner.put("value", 42);
687+
GenericRecord outer = new GenericData.Record(schema);
688+
outer.put("inner", inner);
689+
690+
Map<String, Object> result = AvroUtils.getMultiFieldValue(outer, "inner.value");
691+
Assert.assertEquals(42, result.get("inner.value"));
692+
}
659693
}

0 commit comments

Comments
 (0)