1<?php 2/** 3 * Matomo - free/libre analytics platform 4 * 5 * @link https://matomo.org 6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later 7 * 8 */ 9namespace Piwik\Plugins\API\DataTable; 10 11use Piwik\DataTable\Row; 12use Piwik\DataTable; 13 14class MergeDataTables 15{ 16 /** 17 * Merge the columns of two data tables. Only takes into consideration the first row of each table. 18 * Manipulates the first table. 19 * 20 * @param DataTable|DataTable\Map $table1 The table to eventually filter. 21 * @param DataTable|DataTable\Map $table2 Whether to delete rows with no visits or not. 22 */ 23 public function mergeDataTables($table1, $table2) 24 { 25 // handle table arrays 26 if ($table1 instanceof DataTable\Map && $table2 instanceof DataTable\Map) { 27 $subTables1 = $table1->getDataTables(); 28 foreach ($table2->getDataTables() as $index => $subTable2) { 29 if (!array_key_exists($index, $subTables1)) { 30 $subTable1 = $this->makeNewDataTable($subTable2); 31 $table1->addTable($subTable1, $index); 32 } else { 33 $subTable1 = $subTables1[$index]; 34 } 35 $this->mergeDataTables($subTable1, $subTable2); 36 } 37 return; 38 } 39 40 $firstRow2 = $table2->getFirstRow(); 41 if (!($firstRow2 instanceof Row)) { 42 return; 43 } 44 45 $firstRow1 = $table1->getFirstRow(); 46 if (empty($firstRow1)) { 47 $firstRow1 = $table1->addRow(new Row()); 48 } 49 50 foreach ($firstRow2->getColumns() as $metric => $value) { 51 $firstRow1->setColumn($metric, $value); 52 } 53 } 54 55 private function makeNewDataTable(DataTable\DataTableInterface $subTable2) 56 { 57 if ($subTable2 instanceof DataTable\Map) { 58 $result = new DataTable\Map(); 59 $result->setKeyName($subTable2->getKeyName()); 60 return $result; 61 } else if ($subTable2 instanceof DataTable\Simple) { 62 $result = new DataTable\Simple(); 63 $result->setAllTableMetadata($subTable2->getAllTableMetadata()); 64 return $result; 65 } else if ($subTable2 instanceof DataTable) { 66 $result = new DataTable(); 67 $result->setAllTableMetadata($subTable2->getAllTableMetadata()); 68 return $result; 69 } else { 70 throw new \Exception("Unknown datatable type: " . get_class($subTable2)); 71 } 72 } 73 74}