This is an automated email from the ASF dual-hosted git repository.
oalsafi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push:
new 872b74a CAMEL-16254: Add nested Structs support (#5117)
872b74a is described below
commit 872b74a54c0f08891d32ddbf48e9417dbace8daa
Author: Omar Al-Safi <[email protected]>
AuthorDate: Wed Feb 24 11:29:29 2021 +0100
CAMEL-16254: Add nested Structs support (#5117)
---
.../component/debezium/DebeziumTypeConverter.java | 12 +++++-----
.../debezium/DebeziumTypeConverterTest.java | 26 ++++++++++++++++++++++
2 files changed, 33 insertions(+), 5 deletions(-)
diff --git
a/components/camel-debezium-common/camel-debezium-common-component/src/main/java/org/apache/camel/component/debezium/DebeziumTypeConverter.java
b/components/camel-debezium-common/camel-debezium-common-component/src/main/java/org/apache/camel/component/debezium/DebeziumTypeConverter.java
index ffd9184..867d10d 100644
---
a/components/camel-debezium-common/camel-debezium-common-component/src/main/java/org/apache/camel/component/debezium/DebeziumTypeConverter.java
+++
b/components/camel-debezium-common/camel-debezium-common-component/src/main/java/org/apache/camel/component/debezium/DebeziumTypeConverter.java
@@ -21,7 +21,6 @@ import java.util.Map;
import org.apache.camel.Converter;
import org.apache.kafka.connect.data.Struct;
-import org.apache.kafka.connect.errors.DataException;
@Converter(generateLoader = true)
public final class DebeziumTypeConverter {
@@ -41,10 +40,13 @@ public final class DebeziumTypeConverter {
final HashMap<String, Object> fieldsToValues = new HashMap<>();
struct.schema().fields().forEach(field -> {
- try {
- fieldsToValues.put(field.name(), struct.get(field));
- } catch (DataException e) {
- fieldsToValues.put(field.name(), null);
+ Object value = struct.get(field);
+
+ // recursive call if we have nested structs
+ if (value instanceof Struct) {
+ fieldsToValues.put(field.name(), toMap((Struct) value));
+ } else {
+ fieldsToValues.put(field.name(), value);
}
});
diff --git
a/components/camel-debezium-common/camel-debezium-common-component/src/test/java/org/apache/camel/component/debezium/DebeziumTypeConverterTest.java
b/components/camel-debezium-common/camel-debezium-common-component/src/test/java/org/apache/camel/component/debezium/DebeziumTypeConverterTest.java
index ecf1112..8381b4f 100644
---
a/components/camel-debezium-common/camel-debezium-common-component/src/test/java/org/apache/camel/component/debezium/DebeziumTypeConverterTest.java
+++
b/components/camel-debezium-common/camel-debezium-common-component/src/test/java/org/apache/camel/component/debezium/DebeziumTypeConverterTest.java
@@ -45,6 +45,32 @@ public class DebeziumTypeConverterTest {
assertTrue((boolean) outputValue.get("valid"));
}
+ @Test
+ void testToMapNestedStruct() {
+ Schema detailsSchema = SchemaBuilder.struct().field("age",
SchemaBuilder.INT32_SCHEMA).build();
+
+ Schema valueSchema = SchemaBuilder.struct()
+ .name("valueSchema")
+ .field("id", SchemaBuilder.INT32_SCHEMA)
+ .field("name", SchemaBuilder.STRING_SCHEMA)
+ .field("isAdult", SchemaBuilder.BOOLEAN_SCHEMA)
+ .field("details", detailsSchema)
+ .build();
+
+ Struct inputValue = new Struct(valueSchema)
+ .put("id", 12)
+ .put("name", "jane doe")
+ .put("isAdult", true)
+ .put("details", new Struct(detailsSchema).put("age", 30));
+
+ final Map<String, Object> outputValue =
DebeziumTypeConverter.toMap(inputValue);
+
+ assertEquals("jane doe", outputValue.get("name"));
+ assertEquals(12, outputValue.get("id"));
+ assertTrue((Boolean) outputValue.get("isAdult"));
+ assertEquals(30, ((Map) outputValue.get("details")).get("age"));
+ }
+
private Struct createTestStruct(final int id, final String name, final
boolean valid) {
final Schema schema = SchemaBuilder.struct()
.field("id", Schema.INT32_SCHEMA)