This is an automated email from the ASF dual-hosted git repository.

chriss pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 76ffae4  NIFI-9698: When creating an Avro schema, ensure that any 
default value is converted from what is returned by 
RecordField.getDefaultValue() to what Avro requires.
76ffae4 is described below

commit 76ffae424401c878a89ea0319ce593c4ba4a684a
Author: Mark Payne <marka...@hotmail.com>
AuthorDate: Wed Feb 16 11:59:56 2022 -0500

    NIFI-9698: When creating an Avro schema, ensure that any default value is 
converted from what is returned by RecordField.getDefaultValue() to what Avro 
requires.
    
    This closes #5776
---
 .../java/org/apache/nifi/avro/AvroTypeUtil.java    |  8 +++++---
 .../org/apache/nifi/avro/TestAvroTypeUtil.java     | 23 ++++++++++++++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
 
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
index 36c62a5..fb29f66 100644
--- 
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
+++ 
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
@@ -124,16 +124,18 @@ public class AvroTypeUtil {
         return avroSchema;
     }
 
-    private static Field buildAvroField(final RecordField recordField, String 
fieldNamePrefix) {
+    private static Field buildAvroField(final RecordField recordField, final 
String fieldNamePrefix) {
         final Schema schema = buildAvroSchema(recordField.getDataType(), 
recordField.getFieldName(), fieldNamePrefix, recordField.isNullable());
 
         final Field field;
         final String recordFieldName = recordField.getFieldName();
         if (isValidAvroFieldName(recordFieldName)) {
-            field = new Field(recordField.getFieldName(), schema, null, 
recordField.getDefaultValue());
+            final Object avroDefaultValue = 
convertToAvroObject(recordField.getDefaultValue(), schema);
+            field = new Field(recordField.getFieldName(), schema, null, 
avroDefaultValue);
         } else {
             final String validName = 
createValidAvroFieldName(recordField.getFieldName());
-            field = new Field(validName, schema, null, 
recordField.getDefaultValue());
+            final Object avroDefaultValue = 
convertToAvroObject(recordField.getDefaultValue(), schema);
+            field = new Field(validName, schema, null, avroDefaultValue);
             field.addAlias(recordField.getFieldName());
         }
 
diff --git 
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/test/java/org/apache/nifi/avro/TestAvroTypeUtil.java
 
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/test/java/org/apache/nifi/avro/TestAvroTypeUtil.java
index 5f2204b..42e9141 100644
--- 
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/test/java/org/apache/nifi/avro/TestAvroTypeUtil.java
+++ 
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/test/java/org/apache/nifi/avro/TestAvroTypeUtil.java
@@ -123,6 +123,29 @@ public class TestAvroTypeUtil {
     }
 
     @Test
+    public void testExtractAvroSchemaWithDefaults() {
+        final List<RecordField> fields = new ArrayList<>();
+        fields.add(new RecordField("string", 
RecordFieldType.STRING.getDataType(), "hello"));
+        fields.add(new RecordField("int", RecordFieldType.INT.getDataType(), 
17));
+        fields.add(new RecordField("long", RecordFieldType.LONG.getDataType(), 
42));
+        fields.add(new RecordField("float", 
RecordFieldType.FLOAT.getDataType(), 2.4F));
+        fields.add(new RecordField("double", 
RecordFieldType.DOUBLE.getDataType(), 28.1D));
+        fields.add(new RecordField("stringArray", 
RecordFieldType.ARRAY.getArrayDataType(RecordFieldType.STRING.getDataType()), 
new String[0]));
+        fields.add(new RecordField("intArray", 
RecordFieldType.ARRAY.getArrayDataType(RecordFieldType.INT.getDataType()), new 
Integer[0]));
+
+        final RecordSchema schema = new SimpleRecordSchema(fields);
+        final Schema avroSchema = AvroTypeUtil.extractAvroSchema(schema);
+
+        assertEquals("hello", avroSchema.getField("string").defaultVal());
+        assertEquals(17, avroSchema.getField("int").defaultVal());
+        assertEquals(42L, avroSchema.getField("long").defaultVal());
+        assertEquals(2.4D, (double) avroSchema.getField("float").defaultVal(), 
0.002D); // Even though we provide a Float, avro converts it into a Double 
value.
+        assertEquals(28.1D, (double) 
avroSchema.getField("double").defaultVal(), 0.002D);
+        assertEquals(new ArrayList<String>(), 
avroSchema.getField("stringArray").defaultVal());
+        assertEquals(new ArrayList<Integer>(), 
avroSchema.getField("intArray").defaultVal());
+    }
+
+    @Test
     public void testAvroDefaultValueWithFieldInSchemaButNotRecord() throws 
IOException {
         final List<RecordField> fields = new ArrayList<>();
         fields.add(new RecordField("name", 
RecordFieldType.STRING.getDataType()));

Reply via email to