This is an automated email from the ASF dual-hosted git repository.
pvillard 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 5c8753fe15 NIFI-13643 mapOf returns a FieldValue with a Map instead of
a Record
5c8753fe15 is described below
commit 5c8753fe15cffeca4d79ddf84d63791caee0582d
Author: EndzeitBegins <[email protected]>
AuthorDate: Wed Aug 7 20:58:05 2024 +0200
NIFI-13643 mapOf returns a FieldValue with a Map instead of a Record
Signed-off-by: Pierre Villard <[email protected]>
This closes #9163.
---
.../apache/nifi/record/path/functions/MapOf.java | 22 ++++++---------------
.../apache/nifi/record/path/TestRecordPath.java | 23 +++++++++++-----------
2 files changed, 18 insertions(+), 27 deletions(-)
diff --git
a/nifi-commons/nifi-record-path/src/main/java/org/apache/nifi/record/path/functions/MapOf.java
b/nifi-commons/nifi-record-path/src/main/java/org/apache/nifi/record/path/functions/MapOf.java
index 22f5611e42..32dd4d3e1c 100644
---
a/nifi-commons/nifi-record-path/src/main/java/org/apache/nifi/record/path/functions/MapOf.java
+++
b/nifi-commons/nifi-record-path/src/main/java/org/apache/nifi/record/path/functions/MapOf.java
@@ -17,21 +17,16 @@
package org.apache.nifi.record.path.functions;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.stream.Stream;
-
import org.apache.nifi.record.path.FieldValue;
import org.apache.nifi.record.path.RecordPathEvaluationContext;
import org.apache.nifi.record.path.StandardFieldValue;
import org.apache.nifi.record.path.paths.RecordPathSegment;
-import org.apache.nifi.serialization.SimpleRecordSchema;
-import org.apache.nifi.serialization.record.MapRecord;
-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.RecordSchema;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Stream;
public class MapOf extends RecordPathSegment {
private final RecordPathSegment[] valuePaths;
@@ -43,22 +38,17 @@ public class MapOf extends RecordPathSegment {
@Override
public Stream<FieldValue> evaluate(final RecordPathEvaluationContext
context) {
-
- final List<RecordField> fields = new ArrayList<>();
- final java.util.Map<String, Object> values = new HashMap<>();
+ final Map<String, Object> values = new HashMap<>();
for (int i = 0; i + 1 < valuePaths.length; i += 2) {
final String key =
valuePaths[i].evaluate(context).findFirst().get().toString();
final String value = valuePaths[i +
1].evaluate(context).findFirst().get().toString();
- fields.add(new RecordField(key,
RecordFieldType.STRING.getDataType()));
values.put(key, value);
}
- final RecordSchema schema = new SimpleRecordSchema(fields);
- final Record record = new MapRecord(schema, values);
final RecordField field = new RecordField("mapOf",
RecordFieldType.MAP.getMapDataType(RecordFieldType.STRING.getDataType()));
+ final FieldValue responseValue = new StandardFieldValue(values, field,
null);
- final FieldValue responseValue = new StandardFieldValue(record, field,
null);
return Stream.of(responseValue);
}
diff --git
a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java
b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java
index 389c2755c6..a94338aed6 100644
---
a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java
+++
b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java
@@ -1391,23 +1391,24 @@ public class TestRecordPath {
return new MapRecord(schema, values);
}
-
@Test
public void testMapOf() {
final List<RecordField> fields = new ArrayList<>();
- fields.add(new RecordField("fullName",
RecordFieldType.INT.getDataType()));
- fields.add(new RecordField("lastName",
RecordFieldType.STRING.getDataType()));
- fields.add(new RecordField("firstName",
RecordFieldType.LONG.getDataType()));
+ fields.add(new RecordField("id", RecordFieldType.INT.getDataType()));
+ fields.add(new RecordField("name",
RecordFieldType.STRING.getDataType()));
+ fields.add(new RecordField("balance",
RecordFieldType.DOUBLE.getDataType()));
+ fields.add(new RecordField("missing",
RecordFieldType.STRING.getDataType()));
final RecordSchema schema = new SimpleRecordSchema(fields);
final Map<String, Object> values = new HashMap<>();
- values.put("lastName", "Doe");
- values.put("firstName", "John");
+ values.put("id", 83);
+ values.put("name", "John Doe");
+ values.put("balance", 123.45);
final Record record = new MapRecord(schema, values);
- final FieldValue fv = RecordPath.compile("mapOf('firstName',
/firstName, 'lastName',
/lastName)").evaluate(record).getSelectedFields().findFirst().get();
-
assertTrue(fv.getField().getDataType().getFieldType().equals(RecordFieldType.MAP.getMapDataType(RecordFieldType.STRING.getDataType()).getFieldType()));
- assertEquals("MapRecord[{firstName=John, lastName=Doe}]",
fv.getValue().toString());
+ final FieldValue fv = RecordPath.compile("mapOf('id', /id, 'name',
/name, 'money', /balance, 'nullableString',
/missing)").evaluate(record).getSelectedFields().findFirst().get();
+ assertEquals(fv.getField().getDataType().getFieldType(),
RecordFieldType.MAP.getMapDataType(RecordFieldType.STRING.getDataType()).getFieldType());
+ assertEquals(Map.of("id", "83", "name", "John Doe", "money", "123.45",
"nullableString", "null"), fv.getValue());
assertThrows(RecordPathException.class, () ->
RecordPath.compile("mapOf('firstName', /firstName,
'lastName')").evaluate(record));
}
@@ -2294,8 +2295,8 @@ public class TestRecordPath {
final FieldValue singleArgumentFieldValue =
evaluateSingleFieldValue("escapeJson(/)", record);
assertEquals("{\"id\":48,\"name\":\"John Doe\",\"missing\":null}",
singleArgumentFieldValue.getValue());
final FieldValue multipleArgumentsFieldValue =
evaluateSingleFieldValue("mapOf(\"copy\",/)", record);
- assertInstanceOf(MapRecord.class,
multipleArgumentsFieldValue.getValue());
- assertEquals(record.toString(), ((MapRecord)
multipleArgumentsFieldValue.getValue()).getValue("copy"));
+ assertInstanceOf(Map.class, multipleArgumentsFieldValue.getValue());
+ assertEquals(record.toString(), ((Map<?, ?>)
multipleArgumentsFieldValue.getValue()).get("copy"));
}
private List<RecordField> getDefaultFields() {