[ 
https://issues.apache.org/jira/browse/NIFI-7572?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17146392#comment-17146392
 ] 

Mark Payne commented on NIFI-7572:
----------------------------------

[~otto] I considered that. But from the processor's perspective, all it's going 
to do is read a Record in, have the script transform it in some way, and then 
write the Record out. If the script were to return a new record, then it would 
be more expensive/more garbage collection to create that record. Plus it may 
not be a straight-forward. A simple "record.setValue()" call be made more 
difficult.

Then again, if the Record itself is mutable, the script could just return the 
Record. This would mean that the script has the option of returning `null` to 
basically drop the Record. I.e., the following would be a pass-through that 
doesn't change the Record at all:
{code:java}
Record transform(Record input) {
  return input;
} {code}
While the following script would drop all records:
{code:java}
Record transform(Record input) {
  return null;
} {code}
I can definitely see value in having the ability to drop a Record. So yes, it 
probably makes sense to have a signature like:
{code:java}
Record transform(Record input) throws Exception; {code}
instead of:
{code:java}
void transform(Record record) throws Exception;{code}
I will update the description, so I'm documenting what it looked like before & 
after here so that it makes sense when someone looks at it later :)

> Add a ScriptedTransformRecord processor
> ---------------------------------------
>
>                 Key: NIFI-7572
>                 URL: https://issues.apache.org/jira/browse/NIFI-7572
>             Project: Apache NiFi
>          Issue Type: New Feature
>          Components: Extensions
>            Reporter: Mark Payne
>            Priority: Major
>
> NiFi has started to put a heavier emphasis on Record-oriented processors, as 
> they provide many benefits including better performance and a better UX over 
> their purely byte-oriented counterparts. It is common to see users wanting to 
> transform a Record in some very specific way, but NiFi doesn't make this as 
> easy as it should. There are methods using ExecuteScript, 
> InvokedScriptedProcessor, ScriptedRecordWriter, and ScriptedRecordReader for 
> instance.
> But each of these requires that the Script writer understand a lot about NiFi 
> and how to expose properties, create Property Descriptors, etc. and for 
> fairly simple transformation we end up with scripts where the logic takes 
> fewer lines of code than the boilerplate.
> We should expose a Processor that allows a user to write a script that takes 
> a Record and transforms that Record in some way. The processor should be 
> configured with the following:
>  * Record Reader (required)
>  * Record Writer (required)
>  * Script Language (required)
>  * Script Body or Script File (one and only one of these required)
> The script should implement a single method along the lines of:
> {code:java}
> void transform(Record record) throws Exception; {code}
> The processor should have two relationships: "success" and "failure."
> The script should not be allowed to expose any properties or define any 
> relationships. The point is to keep the script focused purely on processing 
> the record itself.
> It's not entirely clear to me how easy the Record API works with some of the 
> scripting languages. The Record object does expose a method named toMap() 
> that returns a Map<String, Object> containing the underlying key/value pairs. 
> However, the values in that Map may themselves be Records. It might make 
> sense to expose a new method toNormalizedMap() or something along those lines 
> that would return a Map<String, Object> where the values have been 
> recursively normalized, in much the same way that we do for 
> JoltTransformRecord. This would perhaps allow for cleaner syntax, but I'm not 
> a scripting expert so I can't say for sure whether such a method is necessary.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to