This is an automated email from the ASF dual-hosted git repository.
vivekrai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/gobblin.git
The following commit(s) were added to refs/heads/master by this push:
new c12e3211ae [GOBBLIN-2237]Make AvroUtils compatible with avro 1.10
(#4152)
c12e3211ae is described below
commit c12e3211ae9eab7229a9d61224c57cf11d6c7fdb
Author: pratapaditya04 <[email protected]>
AuthorDate: Mon Nov 3 12:37:14 2025 +0530
[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
---
.../java/org/apache/gobblin/util/AvroUtils.java | 23 +++++++++++---
.../org/apache/gobblin/util/AvroUtilsTest.java | 36 +++++++++++++++++++++-
2 files changed, 54 insertions(+), 5 deletions(-)
diff --git
a/gobblin-utility/src/main/java/org/apache/gobblin/util/AvroUtils.java
b/gobblin-utility/src/main/java/org/apache/gobblin/util/AvroUtils.java
index 8d4985f6f6..92cecf8a2a 100644
--- a/gobblin-utility/src/main/java/org/apache/gobblin/util/AvroUtils.java
+++ b/gobblin-utility/src/main/java/org/apache/gobblin/util/AvroUtils.java
@@ -306,9 +306,12 @@ public class AvroUtils {
if (data instanceof Map) {
val = getObjectFromMap((Map)data, pathList.get(field));
} else if (data instanceof List) {
- val = getObjectFromArray((List)data,
Integer.parseInt(pathList.get(field)));
+ val = getObjectFromArray((List) data,
Integer.parseInt(pathList.get(field)));
+ } else if (data instanceof GenericRecord) {
+ val = getSafeField((GenericRecord) data, pathList.get(field));
} else {
- val = ((GenericRecord)data).get(pathList.get(field));
+ log.warn("Unexpected data type '{}' encountered while traversing field
'{}'. Value: {}", data.getClass().getName(),
+ field, data);
}
if (val != null) {
@@ -340,8 +343,20 @@ public class AvroUtils {
return;
}
- AvroUtils.getFieldHelper(retVal, ((GenericRecord)
data).get(pathList.get(field)), pathList, ++field);
- return;
+ if (data instanceof GenericRecord) {
+ Object next = getSafeField((GenericRecord) data, pathList.get(field));
+ getFieldHelper(retVal, next, pathList, field + 1);
+ }
+ }
+
+ private static Object getSafeField(GenericRecord record, String fieldName) {
+ if (record == null || fieldName == null) return null;
+ try{
+ return record.get(fieldName);
+ } catch (AvroRuntimeException e) {
+ log.debug("Unable to get field {} from record {}", fieldName, record, e);
+ return null;
+ }
}
/**
diff --git
a/gobblin-utility/src/test/java/org/apache/gobblin/util/AvroUtilsTest.java
b/gobblin-utility/src/test/java/org/apache/gobblin/util/AvroUtilsTest.java
index c60bc7db22..2f0eeb5ae8 100644
--- a/gobblin-utility/src/test/java/org/apache/gobblin/util/AvroUtilsTest.java
+++ b/gobblin-utility/src/test/java/org/apache/gobblin/util/AvroUtilsTest.java
@@ -247,7 +247,7 @@ public class AvroUtilsTest {
AvroCompatibilityHelper.createSchemaField("key",
Schema.create(Schema.Type.LONG), "", 0L);
field1.addProp("primaryKey", "true");
fieldList.add(field1);
- Schema.Field field2 =
+ Schema.Field field2 =
AvroCompatibilityHelper.createSchemaField("double",
Schema.create(Schema.Type.DOUBLE), "", 0.0);
fieldList.add(field2);
@@ -656,4 +656,38 @@ public class AvroUtilsTest {
}
}
+ @Test
+ public void testGetFieldValue_existingField() {
+ String schemaStr =
"{\"type\":\"record\",\"name\":\"TestRecord\",\"fields\":[{\"name\":\"id\",\"type\":\"string\"}]}";
+ Schema schema = new Schema.Parser().parse(schemaStr);
+ GenericRecord record = new GenericData.Record(schema);
+ record.put("id", "123");
+
+ Map<String, Object> result = AvroUtils.getMultiFieldValue(record, "id");
+ Assert.assertEquals("123", result.get("id"));
+ }
+
+ @Test
+ public void testGetFieldValue_missingField_returnsNull() {
+ String schemaStr =
"{\"type\":\"record\",\"name\":\"TestRecord\",\"fields\":[{\"name\":\"id\",\"type\":\"string\"}]}";
+ Schema schema = new Schema.Parser().parse(schemaStr);
+ GenericRecord record = new GenericData.Record(schema);
+ record.put("id", "123");
+
+ Map<String, Object> result = AvroUtils.getMultiFieldValue(record,
"nonexistent");
+ Assert.assertTrue(result.isEmpty());
+ }
+
+ @Test
+ public void testNestedFieldAccess() {
+ String schemaStr =
"{\"type\":\"record\",\"name\":\"Outer\",\"fields\":[{\"name\":\"inner\",\"type\":{\"type\":\"record\",\"name\":\"Inner\",\"fields\":[{\"name\":\"value\",\"type\":\"int\"}]}}]}";
+ Schema schema = new Schema.Parser().parse(schemaStr);
+ GenericRecord inner = new
GenericData.Record(schema.getField("inner").schema());
+ inner.put("value", 42);
+ GenericRecord outer = new GenericData.Record(schema);
+ outer.put("inner", inner);
+
+ Map<String, Object> result = AvroUtils.getMultiFieldValue(outer,
"inner.value");
+ Assert.assertEquals(42, result.get("inner.value"));
+ }
}