[
https://issues.apache.org/jira/browse/KAFKA-14716?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17688979#comment-17688979
]
Daniel Urban commented on KAFKA-14716:
--------------------------------------
[~ChrisEgerton] Indeed, it is, thanks for pointing that out - will try to
comment on the PR of KAFKA-12694
> Connect schema does not allow struct default values
> ---------------------------------------------------
>
> Key: KAFKA-14716
> URL: https://issues.apache.org/jira/browse/KAFKA-14716
> Project: Kafka
> Issue Type: Bug
> Reporter: Daniel Urban
> Assignee: Daniel Urban
> Priority: Major
>
> The ConnectSchema API should allow specifying a composite (struct) default
> value for a field, but with the current API, it is impossible to do so.
> # There is a circular dependency between creating a struct as a default
> value and creating the schema which holds it as the default value. The Struct
> constructor expects a Schema object, and the default value setter of
> SchemaBuilder checks schema conformity by using the
> ConnectSchema.validateValue, which in turn uses ConnectSchema.equals. This
> can only be bypassed if the struct references a SchemaBuilder instance, and
> defaultValue is called on that builder instance, but this goes against the
> Struct docs stating that "Struct objects must specify a complete \{@link
> Schema} up front".
> # ConnectSchema.equals is not prepared to be used with other Schema
> implementations, so equals checks between ConnectSchema and SchemaBuilder
> instances will always fail. This is only causing an issue if equals has to be
> used for schema conformity checks.
> Code examples:
> Working code (mind that the schema referenced by the Struct is a
> SchemaBuilder, and it is mutated after the Struct is constructed):
> {code:java}
> @Test
> public void testCompositeDefault() {
> SchemaBuilder nestedSchema = SchemaBuilder.struct()
> .field("bar", Schema.STRING_SCHEMA);
> Struct nestedDefault = new Struct(nestedSchema);
> nestedDefault.put("bar", "default_value");
> Schema schema = SchemaBuilder.struct()
> .field("foo",
> nestedSchema
> .defaultValue(nestedDefault)
> .build()
> )
> .build();
> } {code}
> Not working code (but better aligned with the current API and docs - 2
> separate Schema instances used by the Struct and the field, only diff is the
> default value between the 2):
> {code:java}
> @Test
> public void testCompositeDefault() {
> Schema nestedSchema = SchemaBuilder.struct()
> .field("bar", Schema.STRING_SCHEMA)
> .build();
> Struct nestedDefault = new Struct(nestedSchema);
> nestedDefault.put("bar", "default_value");
> Schema schema = SchemaBuilder.struct()
> .field("foo",
> SchemaBuilder
> .struct()
> .field("bar", Schema.STRING_SCHEMA)
> .defaultValue(nestedDefault)
> .build()
> )
> .build();
> }{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)