This is an automated email from the ASF dual-hosted git repository. exceptionfactory pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi.git
commit ba599d29c24a95cec568d0a96614f67506d2e527 Author: Mark Payne <marka...@hotmail.com> AuthorDate: Tue Dec 5 16:33:18 2023 -0500 NIFI-12480 Updated MapRecord's toString() method to use the SerializedForm of the record when available and fixed bugs around ensuring that the serialized form is properly set This closes #8132 Signed-off-by: David Handermann <exceptionfact...@apache.org> --- .../nifi/record/path/functions/EscapeJson.java | 36 +++--- .../nifi/serialization/record/MapRecord.java | 131 ++++++++++++++++----- .../nifi/serialization/record/SerializedForm.java | 11 +- .../nifi/json/AbstractJsonRowRecordReader.java | 4 +- .../java/org/apache/nifi/json/WriteJsonResult.java | 11 +- .../nifi/json/TestJsonTreeRowRecordReader.java | 9 +- .../org/apache/nifi/json/TestWriteJsonResult.java | 17 ++- .../nifi/yaml/TestYamlTreeRowRecordReader.java | 10 +- 8 files changed, 160 insertions(+), 69 deletions(-) diff --git a/nifi-commons/nifi-record-path/src/main/java/org/apache/nifi/record/path/functions/EscapeJson.java b/nifi-commons/nifi-record-path/src/main/java/org/apache/nifi/record/path/functions/EscapeJson.java index 461d3b8e11..ad4ec7f2b6 100644 --- a/nifi-commons/nifi-record-path/src/main/java/org/apache/nifi/record/path/functions/EscapeJson.java +++ b/nifi-commons/nifi-record-path/src/main/java/org/apache/nifi/record/path/functions/EscapeJson.java @@ -25,6 +25,7 @@ import org.apache.nifi.record.path.StandardFieldValue; import org.apache.nifi.record.path.exception.RecordPathException; import org.apache.nifi.record.path.paths.RecordPathSegment; import org.apache.nifi.serialization.record.Record; +import org.apache.nifi.serialization.record.RecordField; import org.apache.nifi.serialization.record.RecordFieldType; import org.apache.nifi.serialization.record.util.DataTypeUtils; @@ -43,23 +44,28 @@ public class EscapeJson extends RecordPathSegment { @Override public Stream<FieldValue> evaluate(final RecordPathEvaluationContext context) { final Stream<FieldValue> fieldValues = recordPath.evaluate(context); - return fieldValues.filter(fv -> fv.getValue() != null) - .map(fv -> { - Object value = fv.getValue(); - if (value == null) { - return new StandardFieldValue(null, fv.getField(), fv.getParent().orElse(null)); - } else { - if (value instanceof Record) { - value = DataTypeUtils.convertRecordFieldtoObject(value, RecordFieldType.RECORD.getDataType()); - } + return fieldValues + .filter(fieldValue -> fieldValue.getValue() != null) + .map(fieldValue -> { + Object value = fieldValue.getValue(); + if (value == null) { + return new StandardFieldValue(null, fieldValue.getField(), fieldValue.getParent().orElse(null)); + } else { + if (value instanceof Record) { + value = DataTypeUtils.convertRecordFieldtoObject(value, RecordFieldType.RECORD.getDataType()); + } + + try { + final RecordField originalField = fieldValue.getField(); + final RecordField escapedField = new RecordField(originalField.getFieldName(), RecordFieldType.STRING.getDataType(), + null, originalField.getAliases(), originalField.isNullable()); - try { - return new StandardFieldValue(objectMapper.writeValueAsString(value), fv.getField(), fv.getParent().orElse(null)); - } catch (JsonProcessingException e) { - throw new RecordPathException("Unable to serialise Record Path value as JSON String", e); - } + return new StandardFieldValue(objectMapper.writeValueAsString(value), escapedField, fieldValue.getParent().orElse(null)); + } catch (JsonProcessingException e) { + throw new RecordPathException("Unable to serialise Record Path value as JSON String", e); } - }); + } + }); } } 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 e26c6bce22..2ba5c2607f 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,6 +32,7 @@ import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.LinkedHashMap; @@ -52,6 +53,7 @@ public class MapRecord implements Record { private final boolean checkTypes; private final boolean dropUnknownFields; private Set<RecordField> inactiveFields = null; + private Map<String, RecordField> updatedFields = null; public MapRecord(final RecordSchema schema, final Map<String, Object> values) { this(schema, values, false, false); @@ -298,10 +300,9 @@ public class MapRecord implements Record { if (obj == null) { return false; } - if (!(obj instanceof MapRecord)) { + if (!(obj instanceof final MapRecord other)) { return false; } - final MapRecord other = (MapRecord) obj; return schema.equals(other.schema) && valuesEqual(values, other.values); } @@ -335,14 +336,68 @@ public class MapRecord implements Record { @Override public String toString() { - return "MapRecord[" + values + "]"; + final Optional<SerializedForm> serializedForm = getSerializedForm(); + if (serializedForm.isEmpty()) { + return "MapRecord[" + values + "]"; + } + + final Object serialized = serializedForm.get().getSerialized(); + return serialized == null ? "MapRecord[" + values + "]" : serialized.toString(); } @Override public Optional<SerializedForm> getSerializedForm() { + if (serializedForm.isEmpty()) { + return Optional.empty(); + } + + if (isSerializedFormReset()) { + return Optional.empty(); + } + return serializedForm; } + private boolean isSerializedFormReset() { + if (serializedForm.isEmpty()) { + return true; + } + + for (final Object value : values.values()) { + if (isSerializedFormReset(value)) { + return true; + } + } + + return false; + } + + private boolean isSerializedFormReset(final Object value) { + if (value == null) { + return true; + } + + if (value instanceof final MapRecord childRecord) { + if (childRecord.isSerializedFormReset()) { + return true; + } + } else if (value instanceof final Collection<?> collection) { + for (final Object collectionValue : collection) { + if (isSerializedFormReset(collectionValue)) { + return true; + } + } + } else if (value instanceof final Object[] array) { + for (final Object arrayValue : array) { + if (isSerializedFormReset(arrayValue)) { + return true; + } + } + } + + return false; + } + @Override public Map<String, Object> toMap() { return toMap(false); @@ -365,8 +420,7 @@ public class MapRecord implements Record { maps[index] = ((MapRecord) records[index]).toMap(true); } valueToAdd = maps; - } else if (value instanceof List) { - List<?> valueList = (List<?>) value; + } else if (value instanceof final List<?> valueList) { if (!valueList.isEmpty() && valueList.get(0) instanceof MapRecord) { List<Map<String, Object>> newRecords = new ArrayList<>(); for (Object o : valueList) { @@ -395,7 +449,18 @@ public class MapRecord implements Record { public void setValue(final RecordField field, final Object value) { final Optional<RecordField> existingField = setValueAndGetField(field.getFieldName(), value); - if (!existingField.isPresent()) { + // Keep track of any fields whose definition has been added or changed so that it can be taken into account when + // calling #incorporateInactiveFields + if (existingField.isPresent()) { + final RecordField existingRecordField = existingField.get(); + final RecordField merged = DataTypeUtils.merge(existingRecordField, field); + if (!Objects.equals(existingRecordField, merged)) { + if (updatedFields == null) { + updatedFields = new LinkedHashMap<>(); + } + updatedFields.put(field.getFieldName(), merged); + } + } else { if (inactiveFields == null) { inactiveFields = new LinkedHashSet<>(); } @@ -442,8 +507,7 @@ public class MapRecord implements Record { final Object fieldValue = getValue(schemaField); if (schemaField.getDataType().getFieldType() == RecordFieldType.CHOICE) { schemaFields.add(schemaField); - } else if (fieldValue instanceof Record) { - final Record childRecord = (Record) fieldValue; + } else if (fieldValue instanceof final Record childRecord) { schemaFields.add(new RecordField(schemaField.getFieldName(), RecordFieldType.RECORD.getRecordDataType(childRecord.getSchema()), schemaField.isNullable())); } else { schemaFields.add(schemaField); @@ -457,7 +521,7 @@ public class MapRecord implements Record { public void setValue(final String fieldName, final Object value) { final Optional<RecordField> existingField = setValueAndGetField(fieldName, value); - if (!existingField.isPresent()) { + if (existingField.isEmpty()) { if (inactiveFields == null) { inactiveFields = new LinkedHashSet<>(); } @@ -468,9 +532,10 @@ public class MapRecord implements Record { } } + private Optional<RecordField> setValueAndGetField(final String fieldName, final Object value) { final Optional<RecordField> field = getSchema().getField(fieldName); - if (!field.isPresent()) { + if (field.isEmpty()) { if (dropUnknownFields) { return field; } @@ -496,7 +561,7 @@ public class MapRecord implements Record { @Override public void setArrayValue(final String fieldName, final int arrayIndex, final Object value) { final Optional<RecordField> field = getSchema().getField(fieldName); - if (!field.isPresent()) { + if (field.isEmpty()) { return; } @@ -535,7 +600,7 @@ public class MapRecord implements Record { @SuppressWarnings("unchecked") public void setMapValue(final String fieldName, final String mapKey, final Object value) { final Optional<RecordField> field = getSchema().getField(fieldName); - if (!field.isPresent()) { + if (field.isEmpty()) { return; } @@ -601,16 +666,24 @@ public class MapRecord implements Record { } private RecordField getUpdatedRecordField(final RecordField field) { - final DataType dataType = field.getDataType(); + final String fieldName = field.getFieldName(); + final RecordField specField; + if (updatedFields == null) { + specField = field; + } else { + specField = updatedFields.getOrDefault(fieldName, field); + } + + final DataType dataType = specField.getDataType(); final RecordFieldType fieldType = dataType.getFieldType(); if (isSimpleType(fieldType)) { - return field; + return specField; } - final Object value = getValue(field); + final Object value = getValue(specField); if (value == null) { - return field; + return specField; } if (fieldType == RecordFieldType.RECORD && value instanceof Record) { @@ -622,8 +695,7 @@ public class MapRecord implements Record { final RecordSchema combinedChildSchema = DataTypeUtils.merge(definedChildSchema, actualChildSchema); final DataType combinedDataType = RecordFieldType.RECORD.getRecordDataType(combinedChildSchema); - final RecordField updatedField = new RecordField(field.getFieldName(), combinedDataType, field.getDefaultValue(), field.getAliases(), field.isNullable()); - return updatedField; + return new RecordField(specField.getFieldName(), combinedDataType, specField.getDefaultValue(), specField.getAliases(), specField.isNullable()); } if (fieldType == RecordFieldType.ARRAY && value instanceof Object[]) { @@ -646,11 +718,10 @@ public class MapRecord implements Record { final DataType mergedRecordType = RecordFieldType.RECORD.getRecordDataType(mergedSchema); final DataType mergedDataType = RecordFieldType.ARRAY.getArrayDataType(mergedRecordType); - final RecordField updatedField = new RecordField(field.getFieldName(), mergedDataType, field.getDefaultValue(), field.getAliases(), field.isNullable()); - return updatedField; + return new RecordField(specField.getFieldName(), mergedDataType, specField.getDefaultValue(), specField.getAliases(), specField.isNullable()); } - return field; + return specField; } if (fieldType == RecordFieldType.CHOICE) { @@ -659,7 +730,7 @@ public class MapRecord implements Record { final DataType chosenDataType = DataTypeUtils.chooseDataType(value, choiceDataType); if (chosenDataType.getFieldType() != RecordFieldType.RECORD || !(value instanceof Record)) { - return field; + return specField; } final RecordDataType recordDataType = (RecordDataType) chosenDataType; @@ -681,22 +752,18 @@ public class MapRecord implements Record { } final DataType mergedDataType = RecordFieldType.CHOICE.getChoiceDataType(updatedPossibleTypes); - return new RecordField(field.getFieldName(), mergedDataType, field.getDefaultValue(), field.getAliases(), field.isNullable()); + return new RecordField(specField.getFieldName(), mergedDataType, specField.getDefaultValue(), specField.getAliases(), specField.isNullable()); } - return field; + return specField; } private boolean isSimpleType(final RecordFieldType fieldType) { - switch (fieldType) { - case ARRAY: - case RECORD: - case MAP: - case CHOICE: - return false; - } + return switch (fieldType) { + case ARRAY, RECORD, MAP, CHOICE -> false; + default -> true; + }; - return true; } @Override diff --git a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/SerializedForm.java b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/SerializedForm.java index 438c8953c7..5856bdb656 100644 --- a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/SerializedForm.java +++ b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/SerializedForm.java @@ -18,6 +18,7 @@ package org.apache.nifi.serialization.record; import java.util.Objects; +import java.util.function.Supplier; public interface SerializedForm { /** @@ -30,7 +31,7 @@ public interface SerializedForm { */ String getMimeType(); - public static SerializedForm of(final java.util.function.Supplier<Object> serializedSupplier, final String mimeType) { + static SerializedForm of(final Supplier<?> serializedSupplier, final String mimeType) { Objects.requireNonNull(serializedSupplier); Objects.requireNonNull(mimeType); @@ -68,17 +69,16 @@ public interface SerializedForm { return false; } - if (!(obj instanceof SerializedForm)) { + if (!(obj instanceof final SerializedForm other)) { return false; } - final SerializedForm other = (SerializedForm) obj; return other.getMimeType().equals(mimeType) && Objects.deepEquals(other.getSerialized(), getSerialized()); } }; } - public static SerializedForm of(final Object serialized, final String mimeType) { + static SerializedForm of(final Object serialized, final String mimeType) { Objects.requireNonNull(serialized); Objects.requireNonNull(mimeType); @@ -108,11 +108,10 @@ public interface SerializedForm { return false; } - if (!(obj instanceof SerializedForm)) { + if (!(obj instanceof final SerializedForm other)) { return false; } - final SerializedForm other = (SerializedForm) obj; return other.getMimeType().equals(mimeType) && Objects.deepEquals(other.getSerialized(), getSerialized()); } }; diff --git a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/AbstractJsonRowRecordReader.java b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/AbstractJsonRowRecordReader.java index e3f6d8567e..fd3bb71465 100644 --- a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/AbstractJsonRowRecordReader.java +++ b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/AbstractJsonRowRecordReader.java @@ -35,6 +35,7 @@ import org.apache.nifi.serialization.record.MapRecord; import org.apache.nifi.serialization.record.Record; import org.apache.nifi.serialization.record.RecordFieldType; import org.apache.nifi.serialization.record.RecordSchema; +import org.apache.nifi.serialization.record.SerializedForm; import org.apache.nifi.serialization.record.type.ArrayDataType; import org.apache.nifi.serialization.record.type.ChoiceDataType; import org.apache.nifi.serialization.record.type.MapDataType; @@ -399,7 +400,8 @@ public abstract class AbstractJsonRowRecordReader implements RecordReader { childValues.put(childFieldName, childValue); } - return new MapRecord(childSchema, childValues); + final SerializedForm serializedForm = SerializedForm.of(fieldNode::toString, "application/json"); + return new MapRecord(childSchema, childValues, serializedForm); } protected JsonNode getNextJsonNode() throws IOException, MalformedRecordException { diff --git a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/WriteJsonResult.java b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/WriteJsonResult.java index b696344d94..61eb1b2d45 100644 --- a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/WriteJsonResult.java +++ b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/WriteJsonResult.java @@ -61,6 +61,7 @@ public class WriteJsonResult extends AbstractRecordSetWriter implements RecordSe private final Supplier<DateFormat> LAZY_TIME_FORMAT; private final Supplier<DateFormat> LAZY_TIMESTAMP_FORMAT; private String mimeType = "application/json"; + private final boolean prettyPrint; private static final ObjectMapper objectMapper = new ObjectMapper(); @@ -94,6 +95,7 @@ public class WriteJsonResult extends AbstractRecordSetWriter implements RecordSe factory.setCodec(objectMapper); this.generator = factory.createGenerator(out); + this.prettyPrint = prettyPrint; if (prettyPrint) { generator.useDefaultPrettyPrinter(); } else if (OutputGrouping.OUTPUT_ONELINE.equals(outputGrouping)) { @@ -173,9 +175,12 @@ public class WriteJsonResult extends AbstractRecordSetWriter implements RecordSe final SerializedForm form = serializedForm.get(); if (form.getMimeType().equals(getMimeType()) && record.getSchema().equals(writeSchema)) { final Object serialized = form.getSerialized(); - if (serialized instanceof String) { - generator.writeRawValue((String) serialized); - return; + if (serialized instanceof final String serializedString) { + final boolean serializedPretty = serializedString.contains("\n"); + if (serializedPretty == this.prettyPrint) { + generator.writeRawValue((String) serialized); + return; + } } } } 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 5f9e01ce12..58b5bf57fa 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 @@ -450,14 +450,17 @@ class TestJsonTreeRowRecordReader { 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[{id=42, balance=4750.89}]}"; - final String expectedRecord = String.format("MapRecord[%s]", expectedMap); + final String expectedRecordToString = """ + {"id":1,"name":"John Doe","address":"123 My Street","city":"My City","state":"MS","zipCode":"11111","country":"USA","account":{"id":42,"balance":4750.89}}"""; + + final String expectedMap = "{id=1, name=John Doe, address=123 My Street, city=My City, state=MS, zipCode=11111, country=USA, account={\"id\":42,\"balance\":4750.89}}"; + 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()); + assertEquals(expectedRecordToString, rawRecord.toString()); final Map<String, Object> map = rawRecord.toMap(); assertEquals(expectedMap, map.toString()); 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/TestWriteJsonResult.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestWriteJsonResult.java index 9169af8c6c..a55c359cf9 100644 --- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestWriteJsonResult.java +++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestWriteJsonResult.java @@ -133,14 +133,23 @@ class TestWriteJsonResult { final Map<String, Object> values1 = new HashMap<>(); values1.put("name", "John Doe"); values1.put("age", 42); - final String serialized1 = "{ \"name\": \"John Doe\", \"age\": 42 }"; + final String serialized1 = """ + { + "name": "John Doe", + "age": 42 + }"""; final SerializedForm serializedForm1 = SerializedForm.of(serialized1, "application/json"); final Record record1 = new MapRecord(schema, values1, serializedForm1); final Map<String, Object> values2 = new HashMap<>(); values2.put("name", "Jane Doe"); values2.put("age", 43); - final String serialized2 = "{ \"name\": \"Jane Doe\", \"age\": 43 }"; + + final String serialized2 = """ + { + "name": "Jane Doe", + "age": 43 + }"""; final SerializedForm serializedForm2 = SerializedForm.of(serialized2, "application/json"); final Record record2 = new MapRecord(schema, values1, serializedForm2); @@ -154,11 +163,9 @@ class TestWriteJsonResult { writer.write(rs); } - final byte[] data = baos.toByteArray(); - final String expected = "[ " + serialized1 + ", " + serialized2 + " ]"; - final String output = new String(data, StandardCharsets.UTF_8); + final String output = baos.toString(StandardCharsets.UTF_8); assertEquals(expected, output); } diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/yaml/TestYamlTreeRowRecordReader.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/yaml/TestYamlTreeRowRecordReader.java index 843d16b68f..26493c4daf 100644 --- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/yaml/TestYamlTreeRowRecordReader.java +++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/yaml/TestYamlTreeRowRecordReader.java @@ -276,14 +276,16 @@ class TestYamlTreeRowRecordReader { 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[{id=42, balance=4750.89}]}"; - final String expectedRecord = String.format("MapRecord[%s]", expectedMap); + final String expectedRecordToString = """ + {"id":1,"name":"John Doe","address":"123 My Street","city":"My City","state":"MS","zipCode":"11111","country":"USA","account":{"id":42,"balance":4750.89}}"""; + + final String expectedMap = "{id=1, name=John Doe, address=123 My Street, city=My City, state=MS, zipCode=11111, country=USA, account={\"id\":42,\"balance\":4750.89}}"; + try (final InputStream in = Files.newInputStream(Paths.get("src/test/resources/yaml/single-element-nested.yaml")); final YamlTreeRowRecordReader reader = new YamlTreeRowRecordReader(in, mock(ComponentLog.class), schema, dateFormat, timeFormat, timestampFormat)) { final Record rawRecord = reader.nextRecord(false, false); - - assertEquals(expectedRecord, rawRecord.toString()); + assertEquals(expectedRecordToString, rawRecord.toString()); final Map<String, Object> map = rawRecord.toMap(); assertEquals(expectedMap, map.toString());