/** * Method for the recursive descend * * @param array $labelParts * @param DataTable $dataTable * @return Row|bool */ private function doFilterRecursiveDescend($labelParts, $dataTable) { // we need to make sure to rebuild the index as some filters change the label column directly via // $row->setColumn('label', '') which would not be noticed in the label index otherwise. $dataTable->rebuildIndex(); // search for the first part of the tree search $labelPart = array_shift($labelParts); $row = false; foreach ($this->getLabelVariations($labelPart) as $labelPart) { $row = $dataTable->getRowFromLabel($labelPart); if ($row !== false) { break; } } if ($row === false) { // not found return false; } // end of tree search reached if (count($labelParts) == 0) { return $row; } $subTable = $this->loadSubtable($dataTable, $row); if ($subTable === null) { // no more subtables but label parts left => no match found return false; } return $this->doFilterRecursiveDescend($labelParts, $subTable); }
/** * Returns true if both DataTable instances are exactly the same. * * DataTables are equal if they have the same number of rows, if * each row has a label that exists in the other table, and if each row * is equal to the row in the other table with the same label. The order * of rows is not important. * * @param \Piwik\DataTable $table1 * @param \Piwik\DataTable $table2 * @return bool */ public static function isEqual(DataTable $table1, DataTable $table2) { $table1->rebuildIndex(); $table2->rebuildIndex(); if ($table1->getRowsCount() != $table2->getRowsCount()) { return false; } $rows1 = $table1->getRows(); foreach ($rows1 as $row1) { $row2 = $table2->getRowFromLabel($row1->getColumn('label')); if ($row2 === false || !Row::isEqual($row1, $row2)) { return false; } } return true; }