use of org.apache.nifi.serialization.record.type.ArrayDataType in project nifi by apache.
the class WildcardIndexPath method evaluate.
@Override
@SuppressWarnings("unchecked")
public Stream<FieldValue> evaluate(final RecordPathEvaluationContext context) {
final Stream<FieldValue> parentResult = getParentPath().evaluate(context);
return parentResult.filter(Filters.fieldTypeFilter(RecordFieldType.MAP, RecordFieldType.ARRAY)).flatMap(fieldValue -> {
final RecordFieldType fieldType = fieldValue.getField().getDataType().getFieldType();
final Object value = fieldValue.getValue();
if (value == null) {
return Stream.empty();
}
if (fieldType == RecordFieldType.MAP) {
final Map<String, ?> map = (Map<String, ?>) value;
return map.entrySet().stream().map(entry -> {
final DataType valueType = ((MapDataType) fieldValue.getField().getDataType()).getValueType();
final RecordField elementField = new RecordField(fieldValue.getField().getFieldName(), valueType);
return new MapEntryFieldValue(entry.getValue(), elementField, fieldValue, entry.getKey());
});
} else {
final Object[] array = (Object[]) value;
return IntStream.range(0, array.length).mapToObj(index -> {
final DataType elementDataType = ((ArrayDataType) fieldValue.getField().getDataType()).getElementType();
final RecordField elementField = new RecordField(fieldValue.getField().getFieldName(), elementDataType);
return new ArrayIndexFieldValue(array[index], elementField, fieldValue, index);
});
}
});
}
use of org.apache.nifi.serialization.record.type.ArrayDataType in project nifi by apache.
the class MapRecord method setArrayValue.
@Override
public void setArrayValue(final String fieldName, final int arrayIndex, final Object value) {
final Optional<RecordField> field = getSchema().getField(fieldName);
if (!field.isPresent()) {
return;
}
final RecordField recordField = field.get();
final DataType dataType = recordField.getDataType();
if (dataType.getFieldType() != RecordFieldType.ARRAY) {
throw new IllegalTypeConversionException("Cannot set the value of an array index on Record because the field '" + fieldName + "' is of type '" + dataType + "' and cannot be coerced into an ARRAY type");
}
final Object arrayObject = values.get(recordField.getFieldName());
if (arrayObject == null) {
return;
}
if (!(arrayObject instanceof Object[])) {
return;
}
final Object[] array = (Object[]) arrayObject;
if (arrayIndex >= array.length) {
return;
}
final ArrayDataType arrayDataType = (ArrayDataType) dataType;
final DataType elementType = arrayDataType.getElementType();
final Object coerced = DataTypeUtils.convertType(value, elementType, fieldName);
final boolean update = !Objects.equals(coerced, array[arrayIndex]);
if (update) {
array[arrayIndex] = coerced;
serializedForm = Optional.empty();
}
}
use of org.apache.nifi.serialization.record.type.ArrayDataType in project nifi by apache.
the class JsonPathRowRecordReader method convert.
@SuppressWarnings("unchecked")
protected Object convert(final Object value, final DataType dataType, final String fieldName, final Object defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof List) {
if (dataType.getFieldType() != RecordFieldType.ARRAY) {
throw new IllegalTypeConversionException("Cannot convert value [" + value + "] of type Array to " + dataType);
}
final ArrayDataType arrayType = (ArrayDataType) dataType;
final List<?> list = (List<?>) value;
final Object[] coercedValues = new Object[list.size()];
int i = 0;
for (final Object rawValue : list) {
coercedValues[i++] = convert(rawValue, arrayType.getElementType(), fieldName, null);
}
return coercedValues;
}
if (dataType.getFieldType() == RecordFieldType.RECORD && value instanceof Map) {
final RecordDataType recordDataType = (RecordDataType) dataType;
final RecordSchema childSchema = recordDataType.getChildSchema();
final Map<String, Object> rawValues = (Map<String, Object>) value;
final Map<String, Object> coercedValues = new HashMap<>();
for (final Map.Entry<String, Object> entry : rawValues.entrySet()) {
final String key = entry.getKey();
final Optional<DataType> desiredTypeOption = childSchema.getDataType(key);
if (desiredTypeOption.isPresent()) {
final Optional<RecordField> field = childSchema.getField(key);
final Object defaultFieldValue = field.isPresent() ? field.get().getDefaultValue() : null;
final Object coercedValue = convert(entry.getValue(), desiredTypeOption.get(), fieldName + "." + key, defaultFieldValue);
coercedValues.put(key, coercedValue);
}
}
return new MapRecord(childSchema, coercedValues);
} else {
return DataTypeUtils.convertType(value, dataType, LAZY_DATE_FORMAT, LAZY_TIME_FORMAT, LAZY_TIMESTAMP_FORMAT, fieldName);
}
}
Aggregations