This example shows how to use Map
process of KoolReport. 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 received $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.
<?php
require_once "MyReport.php";
$report = new MyReport;
$report->run()->render();
<?php
//Step 1: Load KoolReport
require_once "../../../load.koolreport.php";
use \koolreport\processes\ColumnMeta;
use \koolreport\processes\Limit;
use \koolreport\processes\Sort;
use \koolreport\processes\RemoveColumn;
use \koolreport\processes\OnlyColumn;
use \koolreport\processes\Map;
use \koolreport\cube\processes\Cube;
use \koolreport\core\Utility as Util;
//Step 2: Creating Report class
class MyReport extends \koolreport\KoolReport
{
function settings()
{
return array(
"dataSources" => array(
"dollarsales"=>array(
'filePath' => '../../../databases/customer_product_dollarsales2.csv',
'fieldSeparator' => ';',
'class' => "\koolreport\datasources\CSVDataSource"
),
)
);
}
function setup()
{
$node = $this->src('dollarsales')
->pipe(new OnlyColumn([
'productName', 'orderYear', 'orderQuarter', 'dollar_sales'
]))
->pipe(new Limit(array(
5, 0
)))
;
$node->pipe($this->dataStore('salesProduct'));
$node
->pipe(new Map(array(
'{value}' => function($row, $metaData) {
$row['orderQuarter'] = 'Q ' . $row['orderQuarter'];
return array($row);
},
'{meta}' => function($metaData) {
$metaData['columns']['productName'] = array(
'label' => 'Products',
);
$metaData['columns']['orderYear'] = array(
'label' => 'Year',
'type' => 'string',
);
$metaData['columns']['orderQuarter'] = array(
'label' => 'Quarter',
'type' => 'string',
);
$metaData['columns']['dollar_sales'] = array(
'label' => 'Sales',
'type' => 'number',
"prefix" => "$",
);
return $metaData;
},
)))
->saveTo($node2);
$node2->pipe($this->dataStore('salesProductMap'));
$node2->pipe(new RemoveColumn(array(
"orderYear", 'orderQuarter'
)))
->pipe($this->dataStore('salesProductChart'));
}
}
<?php
use \koolreport\datagrid\DataTables;
use \koolreport\morris_chart;
use \koolreport\sparklines;
use \koolreport\widgets\google;
use \koolreport\widgets\koolphp\Table;
?>
<div class="report-content">
<div class="text-center">
<h1>Map Process</h1>
<p class="lead">
Map data rows' value and metadata
</p>
</div>
<?php
$ds = $this->dataStore('salesProduct');
Table::create(array(
'name' => 'salesProduct',
"dataSource" => $ds,
));
?>
<i class="fa fa-arrow-down" style="font-size:24px;"></i>
<pre style="font-weight:bold"><code>
->pipe(new Map(array(
'{value}' => function($row, $metaData) {
$row['orderQuarter'] = 'Q ' . $row['orderQuarter'];
return array($row);
},
'{meta}' => function($metaData) {
$metaData['columns']['productName'] = array(
'label' => 'Products',
);
$metaData['columns']['orderYear'] = array(
'label' => 'Year',
'type' => 'string',
);
$metaData['columns']['orderQuarter'] = array(
'label' => 'Quarter',
'type' => 'string',
);
$metaData['columns']['dollar_sales'] = array(
'label' => 'Sales',
'type' => 'number',
"prefix" => "$",
);
return $metaData;
},
)))</code></pre>
<i class="fa fa-arrow-down" style="font-size:24px;"></i>
<div style="margin-top:20px;">
<?php
$ds = $this->dataStore('salesProductMap');
Table::create(array(
'name' => 'salesProductMap',
"dataSource" => $ds,
));
?>
<?php
google\ColumnChart::create(array(
"dataStore" => $this->dataStore('salesProductChart'),
"options" => array(
'title' => 'Products\' Sales',
'isStacked' => true,
),
"width" => '100%',
// 'height'=>'400px',
));
?>
</div>
customerName | productName | productLine | orderDate | orderDay | orderMonth | orderYear | orderQuarter | dollar_sales |
Vitachrome Inc. |
1937 Lincoln Berline |
Vintage Cars |
2003-01-10 00:00:00 |
10 |
1 |
2003 |
1 |
3726.45 |
Vitachrome Inc. |
1936 Mercedes-Benz 500K Special Roadster |
Vintage Cars |
2003-01-10 00:00:00 |
10 |
1 |
2003 |
1 |
1768.3300000000002 |
Baane Mini Imports |
1952 Alpine Renault 1300 |
Classic Cars |
2003-01-29 00:00:00 |
29 |
1 |
2003 |
1 |
5571.8 |
Baane Mini Imports |
1962 LanciaA Delta 16V |
Classic Cars |
2003-01-29 00:00:00 |
29 |
1 |
2003 |
1 |
5026.14 |
Baane Mini Imports |
1958 Setra Bus |
Trucks and Buses |
2003-01-29 00:00:00 |
29 |
1 |
2003 |
1 |
3284.28 |
Baane Mini Imports |
1940 Ford Pickup Truck |
Trucks and Buses |
2003-01-29 00:00:00 |
29 |
1 |
2003 |
1 |
3307.5 |
Baane Mini Imports |
1926 Ford Fire Engine |
Trucks and Buses |
2003-01-29 00:00:00 |
29 |
1 |
2003 |
1 |
1283.48 |
Baane Mini Imports |
1913 Ford Model T Speedster |
Vintage Cars |
2003-01-29 00:00:00 |
29 |
1 |
2003 |
1 |
2489.13 |
Baane Mini Imports |
1934 Ford V8 Coupe |
Vintage Cars |
2003-01-29 00:00:00 |
29 |
1 |
2003 |
1 |
2164.4 |
Baane Mini Imports |
18th Century Vintage Horse Carriage |
Vintage Cars |
2003-01-29 00:00:00 |
29 |
1 |
2003 |
1 |
2173 |