You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ch...@apache.org on 2022/02/16 20:34:55 UTC

[nifi] branch main updated: 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 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 <ma...@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()));