diff --git a/CHANGELOG.md b/CHANGELOG.md index 28a2ba5f..57a79153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### Unreleased - Add `divert` stream operation +- Fix type union coercion fails when record types come before others ### [0.9.6] - [2022-08-01] diff --git a/src/jackdaw/serdes/avro.clj b/src/jackdaw/serdes/avro.clj index a9e253e3..48857519 100644 --- a/src/jackdaw/serdes/avro.clj +++ b/src/jackdaw/serdes/avro.clj @@ -397,15 +397,16 @@ (defrecord RecordType [^Schema schema field->schema+coercion] SchemaCoercion (match-clj? [_ clj-map] - (let [[_ unknown-fields _] (clojure.data/diff (set (keys field->schema+coercion)) - (set (keys clj-map)))] - (and (every? (fn [[field-key [^Schema$Field field field-coercion]]] - (let [field-value (get clj-map field-key ::missing)] - (if (= field-value ::missing) - (.defaultVal field) - (match-clj? field-coercion field-value)))) - field->schema+coercion) - (empty? unknown-fields)))) + (when clj-map + (let [[_ unknown-fields _] (clojure.data/diff (set (keys field->schema+coercion)) + (set (keys clj-map)))] + (and (every? (fn [[field-key [^Schema$Field field field-coercion]]] + (let [field-value (get clj-map field-key ::missing)] + (if (= field-value ::missing) + (.defaultVal field) + (match-clj? field-coercion field-value)))) + field->schema+coercion) + (empty? unknown-fields))))) (match-avro? [_ avro-record] (cond diff --git a/test/jackdaw/serdes/avro_test.clj b/test/jackdaw/serdes/avro_test.clj index 7f4d4a2b..17673a82 100644 --- a/test/jackdaw/serdes/avro_test.clj +++ b/test/jackdaw/serdes/avro_test.clj @@ -290,10 +290,10 @@ enum-schema {:name "enum" :type "enum" :symbols ["a" "b" "c"]} - avro-schema (parse-schema ["long" + avro-schema (parse-schema [record-1-schema + "long" "string" enum-schema - record-1-schema record-2-schema record-3-schema]) schema-type (schema-type avro-schema)