Map Process with State
Sum data rows' value with map's state.
productName | dollar_sales |
1937 Lincoln Berline |
3,726 |
1936 Mercedes-Benz 500K Special Roadster |
1,768 |
1952 Alpine Renault 1300 |
5,572 |
1962 LanciaA Delta 16V |
5,026 |
1958 Setra Bus |
3,284 |
1940 Ford Pickup Truck |
3,308 |
1926 Ford Fire Engine |
1,283 |
1913 Ford Model T Speedster |
2,489 |
1934 Ford V8 Coupe |
2,164 |
18th Century Vintage Horse Carriage |
2,173 |
->pipe(new Map([
'{value}' => function($row, $meta, $index, $mapState) {
$numTopRows = 2;
//If a row is among the first 2 rows
if ($index < $numTopRows) {
$mappedRows = [$row];
//return it to send to next process or datastore
return ['{rows}' => $mappedRows];
}
//Otherwise,
//initialise a key of this Map's state to use for sum
$sum = Util::init($mapState, 'sumOthers', []);
foreach ($row as $columnName => $value) {
Util::init($sum, $columnName, 0);
//if column name = 'dollar_sales', sum it
$sum[$columnName] = $columnName === 'dollar_sales' ?
$sum[$columnName] + $value : 'Other Customers';
}
//Save the sum to this Map's state
$mapState['sumOthers'] = $sum;
$mappedRows = [];
//Skip rows after the first 2 rows (they won't be sent to next process or datastore)
//return this Map's state to save it
return ['{rows}' => $mappedRows, '{state}' => $mapState];
},
'{end}' => function($count, $mapState) {
//After all rows had been sent
//retrieve this Map's state and send it at the end of Map process
$rowsToSend = [$mapState['sumOthers']];
return $rowsToSend;
},
]))
productName | dollar_sales |
1937 Lincoln Berline |
3,726 |
1936 Mercedes-Benz 500K Special Roadster |
1,768 |
Other Customers |
25,300 |
This example shows how to use mapstate of `Map` process KoolReport. The mapstate will let you remember state of your calculation. The mapState will be extremely useful when you use `Map` process to calculate aggregated values.
This process is advanced way to transform your data. Using `Map` process, you can controls both meta data of data flow as well as the values. Virtually you can do all most everything with this process. So instead of driving your data through various processes, you may just use `Map` with custom code to reach same result. Of course, since it is more powerful and flexible, it is a little more difficult to use in comparing to other processes. In return, it will make your code shorter and faster and do exactly what you want to do.
In the `"{value}"` property, you define a custom function which recieved `$row` as parameters. Each row of data will be sent to your function before it comes back to the mainstream. Note that the function return an array of rows. If you want to add more rows to data stream, you can do so.
The `"{meta}"` is property which is basically a function that received old meta data. You may process meta data then return a new meta data. Or if there is no change in meta data, you will return exactly the old meta there.