You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ma...@apache.org on 2022/06/21 21:00:41 UTC

[nifi] branch main updated: NIFI-10109 Changed HashMap to LinkedHashMap in JsonTreeRowRecordReader (#6112)

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

markap14 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 5febd47c72 NIFI-10109 Changed HashMap to LinkedHashMap in JsonTreeRowRecordReader (#6112)
5febd47c72 is described below

commit 5febd47c72db79a0dd063b662ed8f23c2d9530be
Author: exceptionfactory <ex...@apache.org>
AuthorDate: Tue Jun 21 16:00:34 2022 -0500

    NIFI-10109 Changed HashMap to LinkedHashMap in JsonTreeRowRecordReader (#6112)
    
    - Added unit test to confirm preservation of field ordering
---
 .../apache/nifi/serialization/record/MapRecord.java  |  8 ++++----
 .../apache/nifi/json/JsonTreeRowRecordReader.java    |  6 +++---
 .../nifi/json/TestJsonTreeRowRecordReader.java       | 20 ++++++++++++++++++++
 3 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/MapRecord.java b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/MapRecord.java
index 3df8e6d752..58ce590551 100644
--- a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/MapRecord.java
+++ b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/MapRecord.java
@@ -32,7 +32,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -346,7 +346,7 @@ public class MapRecord implements Record {
 
     public Map<String, Object> toMap(boolean convertSubRecords) {
         if (convertSubRecords) {
-            Map<String, Object> newMap = new HashMap<>();
+            Map<String, Object> newMap = new LinkedHashMap<>();
             values.forEach((key, value) -> {
                 Object valueToAdd;
 
@@ -362,7 +362,7 @@ public class MapRecord implements Record {
                     }
                     valueToAdd = maps;
                 } else if (value instanceof List) {
-                    List valueList = (List) value;
+                    List<?> valueList = (List<?>) value;
                     if (!valueList.isEmpty() && valueList.get(0) instanceof MapRecord) {
                         List<Map<String, Object>> newRecords = new ArrayList<>();
                         for (Object o : valueList) {
@@ -495,7 +495,7 @@ public class MapRecord implements Record {
 
         Object mapObject = values.get(recordField.getFieldName());
         if (mapObject == null) {
-            mapObject = new HashMap<String, Object>();
+            mapObject = new LinkedHashMap<String, Object>();
         }
         if (!(mapObject instanceof Map)) {
             return;
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonTreeRowRecordReader.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonTreeRowRecordReader.java
index daa518e15c..7f36e64bc6 100644
--- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonTreeRowRecordReader.java
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonTreeRowRecordReader.java
@@ -37,7 +37,7 @@ import org.apache.nifi.serialization.record.util.DataTypeUtils;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -130,7 +130,7 @@ public class JsonTreeRowRecordReader extends AbstractJsonRowRecordReader {
     private Record convertJsonNodeToRecord(final JsonNode jsonNode, final RecordSchema schema, final String fieldNamePrefix,
                                            final boolean coerceTypes, final boolean dropUnknown) throws IOException, MalformedRecordException {
 
-        final Map<String, Object> values = new HashMap<>(schema.getFieldCount() * 2);
+        final Map<String, Object> values = new LinkedHashMap<>(schema.getFieldCount() * 2);
 
         if (dropUnknown) {
             for (final RecordField recordField : schema.getFields()) {
@@ -205,7 +205,7 @@ public class JsonTreeRowRecordReader extends AbstractJsonRowRecordReader {
             case MAP: {
                 final DataType valueType = ((MapDataType) desiredType).getValueType();
 
-                final Map<String, Object> map = new HashMap<>();
+                final Map<String, Object> map = new LinkedHashMap<>();
                 final Iterator<String> fieldNameItr = fieldNode.fieldNames();
                 while (fieldNameItr.hasNext()) {
                     final String childName = fieldNameItr.next();
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
index 06d8acd2cc..e885c95df7 100644
--- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
@@ -50,6 +50,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -422,6 +423,25 @@ class TestJsonTreeRowRecordReader {
         }
     }
 
+    @Test
+    void testReadRawRecordFieldOrderPreserved() throws IOException, MalformedRecordException {
+        final List<RecordField> fields = new ArrayList<>();
+        fields.add(new RecordField("id", RecordFieldType.INT.getDataType()));
+        final RecordSchema schema = new SimpleRecordSchema(fields);
+
+        final String expectedMap = "{id=1, name=John Doe, address=123 My Street, city=My City, state=MS, zipCode=11111, country=USA, account=MapRecord[{balance=4750.89, id=42}]}";
+        final String expectedRecord = String.format("MapRecord[%s]", expectedMap);
+        try (final InputStream in = new FileInputStream("src/test/resources/json/single-element-nested.json");
+             final JsonTreeRowRecordReader reader = new JsonTreeRowRecordReader(in, mock(ComponentLog.class), schema, dateFormat, timeFormat, timestampFormat)) {
+
+            final Record rawRecord = reader.nextRecord(false, false);
+
+            assertEquals(expectedRecord, rawRecord.toString());
+
+            final Map<String, Object> map = rawRecord.toMap();
+            assertEquals(expectedMap, map.toString());
+        }
+    }
 
     @Test
     void testReadRawRecordTypeCoercion() throws IOException, MalformedRecordException {