July 1, 2016 \ Ananth TM Transformer Stage Looping Looping from V8.5 and up Aggregation operations make use of a cache that stores input rows. Two functions, SaveInputRecord() and GetSavedInputRecord(), are used to add input rows to the cache and retrieve them. SaveInputRecord() is called when a stage variable is evaluated, and returns the count of rows in the cache (starting at 1 when the first row is added). GetSavedInputRecord() is called when a loop variable is evaluated. In the Transformer Stage settings, these are the various inputs Stage variable Define the stage variables: can use functions such as SaveInputRecord() or use functions with link columns such as LastRowInGroup(inlink.Col1) can use IF THEN ELSE, such as IF IsBreak THEN 0 ELSE SummingPrice + inlink.Price Loop condition Enter the expression as the loop condition: @ITERATION <= NumRows The loop continues to iterate for the count specified in the NumRows variable. Loop variables Define the loop variable, for instance: SavedRowIndex GetSavedInputRecord() Output link metadata and derivations Define the output link columns and their derivations, example: Col1 – inlink.Col1 Price – inlink.Price Percentage – (inlink.Price * 100)/TotalPrice RUNTIME ERRORS The number of calls to SaveInputRecord() and GetSavedInputRecord() must match for each loop. You can call SaveInputRecord() multiple times to add to the cache, but once you call GetSavedInputRecord(), then you must call it enough times to empty the input cache before you can call SaveInputRecord() again. The examples described can generate runtime errors in the following circumstances by not observing this rule: If your Transformer stage calls GetSavedInputRecord before SaveInputRecord, then a fatal error similar to the following example is reported in the job log: APT_CombinedOperatorController,0: Fatal Error: get_record() called on record 1 but only 0 records saved by save_record() If your Transformer stage calls GetSavedInputRecord more times than SaveInputRecord is called, then a fatal error similar to the following example is reported in the job log: APT_CombinedOperatorController,0: Fatal Error: get_record() called on record 3 but only 2 records saved by save_record() If your Transformer stage calls SaveInputRecord but does not call GetSavedInputRecord, then a fatal error similar to the following example is reported in the job log: APT_CombinedOperatorController,0: Fatal Error: save_record() called on record 3, but only 0 records retrieved by get_record() If your Transformer stage does not call GetSavedInputRecord as many times as SaveInputRecord, then a fatal error similar to the following example is reported in the job log: APT_CombinedOperatorController,0: Fatal Error: save_record() called on record 3, but only 2 records retrieved by get_record()