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 {