mirror of https://github.com/apache/nifi.git
NIFI-4340 - fix record path evaluation when array is [ null ]
This closes #2122.
This commit is contained in:
parent
cd213db0e2
commit
bdab3cda0a
|
@ -122,6 +122,8 @@ public class StandardFieldValue implements FieldValue {
|
||||||
if (value instanceof Record) {
|
if (value instanceof Record) {
|
||||||
((Record) value).setValue(getField().getFieldName(), newValue);
|
((Record) value).setValue(getField().getFieldName(), newValue);
|
||||||
return;
|
return;
|
||||||
|
} else if (value == null) {
|
||||||
|
return; // value is null, nothing to update
|
||||||
} else {
|
} else {
|
||||||
throw new UnsupportedOperationException("Cannot update the field value because the value is not associated with any record");
|
throw new UnsupportedOperationException("Cannot update the field value because the value is not associated with any record");
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,10 @@ public class ChildFieldPath extends RecordPathSegment {
|
||||||
}
|
}
|
||||||
|
|
||||||
final Record record = (Record) fieldValue.getValue();
|
final Record record = (Record) fieldValue.getValue();
|
||||||
|
if(record == null) {
|
||||||
|
return missingChild(fieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
final Object value = record.getValue(childName);
|
final Object value = record.getValue(childName);
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
return missingChild(fieldValue);
|
return missingChild(fieldValue);
|
||||||
|
|
|
@ -498,11 +498,16 @@
|
||||||
<exclude>src/test/resources/TestExtractGrok/simple_text.log</exclude>
|
<exclude>src/test/resources/TestExtractGrok/simple_text.log</exclude>
|
||||||
<exclude>src/test/resources/TestExtractGrok/patterns</exclude>
|
<exclude>src/test/resources/TestExtractGrok/patterns</exclude>
|
||||||
<exclude>src/test/resources/TestUpdateRecord/input/person.json</exclude>
|
<exclude>src/test/resources/TestUpdateRecord/input/person.json</exclude>
|
||||||
|
<exclude>src/test/resources/TestUpdateRecord/input/person-address.json</exclude>
|
||||||
|
<exclude>src/test/resources/TestUpdateRecord/input/person-with-null-array.json</exclude>
|
||||||
|
<exclude>src/test/resources/TestUpdateRecord/output/person-with-null-array.json</exclude>
|
||||||
<exclude>src/test/resources/TestUpdateRecord/output/person-with-firstname.json</exclude>
|
<exclude>src/test/resources/TestUpdateRecord/output/person-with-firstname.json</exclude>
|
||||||
<exclude>src/test/resources/TestUpdateRecord/output/person-with-firstname-lastname.json</exclude>
|
<exclude>src/test/resources/TestUpdateRecord/output/person-with-firstname-lastname.json</exclude>
|
||||||
<exclude>src/test/resources/TestUpdateRecord/output/person-with-capital-lastname.json</exclude>
|
<exclude>src/test/resources/TestUpdateRecord/output/person-with-capital-lastname.json</exclude>
|
||||||
<exclude>src/test/resources/TestUpdateRecord/output/name-fields-only.json</exclude>
|
<exclude>src/test/resources/TestUpdateRecord/output/name-fields-only.json</exclude>
|
||||||
<exclude>src/test/resources/TestUpdateRecord/output/name-and-mother-same.json</exclude>
|
<exclude>src/test/resources/TestUpdateRecord/output/name-and-mother-same.json</exclude>
|
||||||
|
<exclude>src/test/resources/TestUpdateRecord/output/person-with-new-city.json</exclude>
|
||||||
|
<exclude>src/test/resources/TestUpdateRecord/schema/person-with-address.avsc</exclude>
|
||||||
<exclude>src/test/resources/TestUpdateRecord/schema/person-with-name-record.avsc</exclude>
|
<exclude>src/test/resources/TestUpdateRecord/schema/person-with-name-record.avsc</exclude>
|
||||||
<exclude>src/test/resources/TestUpdateRecord/schema/person-with-name-string.avsc</exclude>
|
<exclude>src/test/resources/TestUpdateRecord/schema/person-with-name-string.avsc</exclude>
|
||||||
<exclude>src/test/resources/TestUpdateRecord/schema/person-with-name-string-fields.avsc</exclude>
|
<exclude>src/test/resources/TestUpdateRecord/schema/person-with-name-string-fields.avsc</exclude>
|
||||||
|
|
|
@ -184,6 +184,66 @@ public class TestUpdateRecord {
|
||||||
runner.getFlowFilesForRelationship(UpdateRecord.REL_SUCCESS).get(0).assertContentEquals(expectedOutput);
|
runner.getFlowFilesForRelationship(UpdateRecord.REL_SUCCESS).get(0).assertContentEquals(expectedOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUpdateInArray() throws InitializationException, IOException {
|
||||||
|
final JsonTreeReader jsonReader = new JsonTreeReader();
|
||||||
|
runner.addControllerService("reader", jsonReader);
|
||||||
|
|
||||||
|
final String inputSchemaText = new String(Files.readAllBytes(Paths.get("src/test/resources/TestUpdateRecord/schema/person-with-address.avsc")));
|
||||||
|
final String outputSchemaText = new String(Files.readAllBytes(Paths.get("src/test/resources/TestUpdateRecord/schema/person-with-address.avsc")));
|
||||||
|
|
||||||
|
runner.setProperty(jsonReader, SchemaAccessUtils.SCHEMA_ACCESS_STRATEGY, SchemaAccessUtils.SCHEMA_TEXT_PROPERTY);
|
||||||
|
runner.setProperty(jsonReader, SchemaAccessUtils.SCHEMA_TEXT, inputSchemaText);
|
||||||
|
runner.enableControllerService(jsonReader);
|
||||||
|
|
||||||
|
final JsonRecordSetWriter jsonWriter = new JsonRecordSetWriter();
|
||||||
|
runner.addControllerService("writer", jsonWriter);
|
||||||
|
runner.setProperty(jsonWriter, SchemaAccessUtils.SCHEMA_ACCESS_STRATEGY, SchemaAccessUtils.SCHEMA_TEXT_PROPERTY);
|
||||||
|
runner.setProperty(jsonWriter, SchemaAccessUtils.SCHEMA_TEXT, outputSchemaText);
|
||||||
|
runner.setProperty(jsonWriter, "Pretty Print JSON", "true");
|
||||||
|
runner.setProperty(jsonWriter, "Schema Write Strategy", "full-schema-attribute");
|
||||||
|
runner.enableControllerService(jsonWriter);
|
||||||
|
|
||||||
|
runner.enqueue(Paths.get("src/test/resources/TestUpdateRecord/input/person-address.json"));
|
||||||
|
runner.setProperty("/address[*]/city", "newCity");
|
||||||
|
runner.setProperty(UpdateRecord.REPLACEMENT_VALUE_STRATEGY, UpdateRecord.LITERAL_VALUES);
|
||||||
|
|
||||||
|
runner.run();
|
||||||
|
runner.assertAllFlowFilesTransferred(UpdateRecord.REL_SUCCESS, 1);
|
||||||
|
final String expectedOutput = new String(Files.readAllBytes(Paths.get("src/test/resources/TestUpdateRecord/output/person-with-new-city.json")));
|
||||||
|
runner.getFlowFilesForRelationship(UpdateRecord.REL_SUCCESS).get(0).assertContentEquals(expectedOutput);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUpdateInNullArray() throws InitializationException, IOException {
|
||||||
|
final JsonTreeReader jsonReader = new JsonTreeReader();
|
||||||
|
runner.addControllerService("reader", jsonReader);
|
||||||
|
|
||||||
|
final String inputSchemaText = new String(Files.readAllBytes(Paths.get("src/test/resources/TestUpdateRecord/schema/person-with-address.avsc")));
|
||||||
|
final String outputSchemaText = new String(Files.readAllBytes(Paths.get("src/test/resources/TestUpdateRecord/schema/person-with-address.avsc")));
|
||||||
|
|
||||||
|
runner.setProperty(jsonReader, SchemaAccessUtils.SCHEMA_ACCESS_STRATEGY, SchemaAccessUtils.SCHEMA_TEXT_PROPERTY);
|
||||||
|
runner.setProperty(jsonReader, SchemaAccessUtils.SCHEMA_TEXT, inputSchemaText);
|
||||||
|
runner.enableControllerService(jsonReader);
|
||||||
|
|
||||||
|
final JsonRecordSetWriter jsonWriter = new JsonRecordSetWriter();
|
||||||
|
runner.addControllerService("writer", jsonWriter);
|
||||||
|
runner.setProperty(jsonWriter, SchemaAccessUtils.SCHEMA_ACCESS_STRATEGY, SchemaAccessUtils.SCHEMA_TEXT_PROPERTY);
|
||||||
|
runner.setProperty(jsonWriter, SchemaAccessUtils.SCHEMA_TEXT, outputSchemaText);
|
||||||
|
runner.setProperty(jsonWriter, "Pretty Print JSON", "true");
|
||||||
|
runner.setProperty(jsonWriter, "Schema Write Strategy", "full-schema-attribute");
|
||||||
|
runner.enableControllerService(jsonWriter);
|
||||||
|
|
||||||
|
runner.enqueue(Paths.get("src/test/resources/TestUpdateRecord/input/person-with-null-array.json"));
|
||||||
|
runner.setProperty("/address[*]/city", "newCity");
|
||||||
|
runner.setProperty(UpdateRecord.REPLACEMENT_VALUE_STRATEGY, UpdateRecord.LITERAL_VALUES);
|
||||||
|
|
||||||
|
runner.run();
|
||||||
|
runner.assertAllFlowFilesTransferred(UpdateRecord.REL_SUCCESS, 1);
|
||||||
|
final String expectedOutput = new String(Files.readAllBytes(Paths.get("src/test/resources/TestUpdateRecord/output/person-with-null-array.json")));
|
||||||
|
runner.getFlowFilesForRelationship(UpdateRecord.REL_SUCCESS).get(0).assertContentEquals(expectedOutput);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAddFieldNotInInputRecord() throws InitializationException, IOException {
|
public void testAddFieldNotInInputRecord() throws InitializationException, IOException {
|
||||||
final JsonTreeReader jsonReader = new JsonTreeReader();
|
final JsonTreeReader jsonReader = new JsonTreeReader();
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"id": 485,
|
||||||
|
"name": {
|
||||||
|
"last": "Doe",
|
||||||
|
"first": "John"
|
||||||
|
},
|
||||||
|
"address": [
|
||||||
|
{
|
||||||
|
"street": "1 nifi stree",
|
||||||
|
"city": "nifi"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
[ {
|
||||||
|
"id" : 485,
|
||||||
|
"name" : {
|
||||||
|
"last" : "Doe",
|
||||||
|
"first" : "John"
|
||||||
|
},
|
||||||
|
"address" : [ null ]
|
||||||
|
} ]
|
|
@ -0,0 +1,11 @@
|
||||||
|
[ {
|
||||||
|
"id" : 485,
|
||||||
|
"name" : {
|
||||||
|
"last" : "Doe",
|
||||||
|
"first" : "John"
|
||||||
|
},
|
||||||
|
"address" : [ {
|
||||||
|
"street" : "1 nifi stree",
|
||||||
|
"city" : "newCity"
|
||||||
|
} ]
|
||||||
|
} ]
|
|
@ -0,0 +1,8 @@
|
||||||
|
[ {
|
||||||
|
"id" : 485,
|
||||||
|
"name" : {
|
||||||
|
"last" : "Doe",
|
||||||
|
"first" : "John"
|
||||||
|
},
|
||||||
|
"address" : [ null ]
|
||||||
|
} ]
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"name": "personWithNameRecord",
|
||||||
|
"namespace": "nifi",
|
||||||
|
"type": "record",
|
||||||
|
"fields": [
|
||||||
|
{ "name": "id", "type": "int" },
|
||||||
|
{ "name": "name", "type": {
|
||||||
|
"type": "record",
|
||||||
|
"name": "nameRecord",
|
||||||
|
"fields": [
|
||||||
|
{ "name": "last", "type": "string" },
|
||||||
|
{ "name": "first", "type": "string" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "name" : "address", "type": ["null",
|
||||||
|
{ "type" : "array", "items" : {
|
||||||
|
"type" : "record",
|
||||||
|
"name" : "Person",
|
||||||
|
"fields" : [
|
||||||
|
{ "name" : "street", "type": "string" },
|
||||||
|
{ "name" : "city", "type": "string" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in New Issue