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 <omars...@gmail.com> 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)