/** * This method can be used by subclasses to iterate over data tables that might be * data table arrays. It calls back the template method self::doManipulate for each table. * This way, data table arrays can be handled in a transparent fashion. * * @param Piwik_DataTable_Array|Piwik_DataTable $dataTable * @throws Exception * @return Piwik_DataTable_Array|Piwik_DataTable */ protected function manipulate($dataTable) { if ($dataTable instanceof Piwik_DataTable_Array) { $newTableArray = new Piwik_DataTable_Array(); $newTableArray->metadata = $dataTable->metadata; $newTableArray->setKeyName($dataTable->getKeyName()); foreach ($dataTable->getArray() as $date => $subTable) { // for period=week, the label is "2011-08-15 to 2011-08-21", which is // an invalid date parameter => only use the first date // in other languages the whole string does not start with the date so // we need to preg match it. if (!preg_match('/[0-9]{4}(-[0-9]{2})?(-[0-9]{2})?/', $date, $match)) { throw new Exception("Could not recognize date: {$date}"); } $dateForApiRequest = $match[0]; $subTable = $this->doManipulate($subTable, $dateForApiRequest); $newTableArray->addTable($subTable, $date); } return $newTableArray; } if ($dataTable instanceof Piwik_DataTable) { return $this->doManipulate($dataTable); } return $dataTable; }
/** * Computes the output for the given data table * * @param Piwik_DataTable $table * @return string * @throws Exception */ protected function renderTable($table) { if (!$table instanceof Piwik_DataTable_Array || $table->getKeyName() != 'date') { throw new Exception("RSS feeds can be generated for one specific website &idSite=X." . "\nPlease specify only one idSite or consider using &format=XML instead."); } $idSite = Piwik_Common::getRequestVar('idSite', 1, 'int'); $period = Piwik_Common::getRequestVar('period'); $piwikUrl = Piwik_Url::getCurrentUrlWithoutFileName() . "?module=CoreHome&action=index&idSite=" . $idSite . "&period=" . $period; $out = ""; $moreRecentFirst = array_reverse($table->getArray(), true); foreach ($moreRecentFirst as $date => $subtable) { $timestamp = $table->metadata[$date]['timestamp']; $site = $table->metadata[$date]['site']; $pudDate = date('r', $timestamp); $dateInSiteTimezone = Piwik_Date::factory($timestamp)->setTimezone($site->getTimezone())->toString('Y-m-d'); $thisPiwikUrl = Piwik_Common::sanitizeInputValue($piwikUrl . "&date={$dateInSiteTimezone}"); $siteName = $site->getName(); $title = $siteName . " on " . $date; $out .= "\t<item>\n\t\t<pubDate>{$pudDate}</pubDate>\n\t\t<guid>{$thisPiwikUrl}</guid>\n\t\t<link>{$thisPiwikUrl}</link>\n\t\t<title>{$title}</title>\n\t\t<author>http://piwik.org</author>\n\t\t<description>"; $out .= Piwik_Common::sanitizeInputValue($this->renderDataTable($subtable)); $out .= "</description>\n\t</item>\n"; } $header = $this->getRssHeader(); $footer = $this->getRssFooter(); return $header . $out . $footer; }
/** * @param Piwik_DataTable $subTable */ function __construct($subTable) { parent::__construct(); foreach ($subTable->getRows() as $row) { $this->sumRow($row); } }
/** * Filters the given DataTable. Removes columns that are not desired from * each DataTable row. * * @param Piwik_DataTable $table */ public function filter($table) { $recurse = false; // only recurse if there are columns to remove/keep // remove columns specified in $this->columnsToRemove if (!empty($this->columnsToRemove)) { foreach ($table->getRows() as $row) { foreach ($this->columnsToRemove as $column) { $row->deleteColumn($column); } } $recurse = true; } // remove columns not specified in $columnsToKeep if (!empty($this->columnsToKeep)) { foreach ($table->getRows() as $row) { foreach ($row->getColumns() as $name => $value) { // label cannot be removed via whitelisting if ($name != 'label' && !isset($this->columnsToKeep[$name])) { $row->deleteColumn($name); } } } $recurse = true; } // recurse if ($recurse) { foreach ($table->getRows() as $row) { $this->filterSubTable($row); } } }
/** * @param Piwik_DataTable $table * @return int */ public function filter($table) { $rows = $table->getRows(); foreach ($rows as $key => $row) { // A row is deleted if // 1 - its label doesnt contain the pattern // AND 2 - the label is not found in the children $patternNotFoundInChildren = false; try { $idSubTable = $row->getIdSubDataTable(); $subTable = Piwik_DataTable_Manager::getInstance()->getTable($idSubTable); // we delete the row if we couldn't find the pattern in any row in the // children hierarchy if ($this->filter($subTable) == 0) { $patternNotFoundInChildren = true; } } catch (Exception $e) { // there is no subtable loaded for example $patternNotFoundInChildren = true; } if ($patternNotFoundInChildren && !Piwik_DataTable_Filter_Pattern::match($this->patternToSearch, $this->patternToSearchQuoted, $row->getColumn($this->columnToFilter), $invertedMatch = false)) { $table->deleteRow($key); } } return $table->getRowsCount(); }
/** * Applies the reduce function to each row and merges rows w/ the same reduce result. * * @param Piwik_DataTable $table */ public function filter($table) { $groupByRows = array(); $nonGroupByRowIds = array(); foreach ($table->getRows() as $rowId => $row) { // skip the summary row if ($rowId == Piwik_DataTable::ID_SUMMARY_ROW) { continue; } // reduce the group by column of this row $groupByColumnValue = $row->getColumn($this->groupByColumn); $parameters = array_merge(array($groupByColumnValue), $this->parameters); $groupByValue = call_user_func_array($this->reduceFunction, $parameters); if (!isset($groupByRows[$groupByValue])) { // if we haven't encountered this group by value before, we mark this row as a // row to keep, and change the group by column to the reduced value. $groupByRows[$groupByValue] = $row; $row->setColumn($this->groupByColumn, $groupByValue); } else { // if we have already encountered this group by value, we add this row to the // row that will be kept, and mark this one for deletion $groupByRows[$groupByValue]->sumRow($row); $nonGroupByRowIds[] = $rowId; } } // delete the unneeded rows. $table->deleteRows($nonGroupByRowIds); }
public function getPlanetRatios() { $planetRatios = array('Mercury' => 0.382, 'Venus' => 0.949, 'Earth' => 1.0, 'Mars' => 0.532, 'Jupiter' => 11.209, 'Saturn' => 9.449, 'Uranus' => 4.007, 'Neptune' => 3.883); // convert this array to a DataTable object $dataTable = new Piwik_DataTable(); $dataTable->addRowsFromArrayWithIndexLabel($planetRatios); return $dataTable; }
/** * @param Piwik_DataTable $table */ public function filter($table) { foreach ($table->getRows() as $key => $row) { $oldValue = $row->getMetadata($this->metadataToRead); $newValue = call_user_func($this->functionToApply, $oldValue); $row->addMetadata($this->metadataToAdd, $newValue); } }
/** * Executes the filter and renames the defined columns * * @param Piwik_DataTable $table */ public function filter($table) { foreach ($table->getRows() as $key => $row) { $oldColumns = $row->getColumns(); $newColumns = $this->getRenamedColumns($oldColumns); $row->setColumns($newColumns); $this->filterSubTable($row); } }
public function getCompetitionDatatable() { $dataTable = new Piwik_DataTable(); $row1 = new Piwik_DataTable_Row(); $row1->setColumns(array('name' => 'piwik', 'license' => 'GPL')); $dataTable->addRow($row1); $dataTable->addRowFromSimpleArray(array('name' => 'google analytics', 'license' => 'commercial')); return $dataTable; }
/** * * @group Core * @group DataTable * @group DataTable_Filter * @group DataTable_Filter_RangeCheck */ public function testRangeCheckNormalDataTableNonIntegerValues() { $table = new Piwik_DataTable(); $table->addRowsFromArray(array(array(Piwik_DataTable_Row::COLUMNS => array('label' => 'ask', 'count' => '3')), array(Piwik_DataTable_Row::COLUMNS => array('label' => 'nintendo', 'count' => 'test')), array(Piwik_DataTable_Row::COLUMNS => array('label' => 'test', 'count' => 0x1232)), array(Piwik_DataTable_Row::COLUMNS => array('label' => 'piwik', 'count' => 0x5)), array(Piwik_DataTable_Row::COLUMNS => array('label' => 'google', 'count' => '9test')), array(Piwik_DataTable_Row::COLUMNS => array('label' => 'yahoo', 'count' => 'test4')))); $filter = new Piwik_DataTable_Filter_RangeCheck($table, 'count', 3.97, 10); $filter->filter($table); $expectedOrder = array(3.97, 3.97, 10, 5, '9test', 3.97); $this->assertEquals($expectedOrder, $table->getColumn('count')); }
/** * Get rank * * @param string $url URL to request Ranks for * @return Piwik_DataTable */ public function getRank($url) { Piwik::checkUserHasSomeViewAccess(); $rank = new Piwik_SEO_RankChecker($url); $data = array('Google PageRank' => array('rank' => $rank->getPageRank(), 'logo' => Piwik_getSearchEngineLogoFromUrl('http://google.com'), 'id' => 'pagerank'), Piwik_Translate('SEO_AlexaRank') => array('rank' => $rank->getAlexaRank(), 'logo' => Piwik_getSearchEngineLogoFromUrl('http://alexa.com'), 'id' => 'alexa'), Piwik_Translate('SEO_DomainAge') => array('rank' => $rank->getAge(), 'logo' => 'plugins/SEO/images/whois.png', 'id' => 'domain-age')); $dataTable = new Piwik_DataTable(); $dataTable->addRowsFromArrayWithIndexLabel($data); return $dataTable; }
/** * test with a row without child * * @group Core * @group DataTable * @group DataTable_Renderer * @group DataTable_Renderer_Console */ public function testConsoleSimple() { $table = new Piwik_DataTable(); $table->addRowFromArray(array(Piwik_DataTable_Row::COLUMNS => array('visits' => 245, 'visitors' => 245), Piwik_DataTable_Row::METADATA => array('logo' => 'test.png'))); $expected = "- 1 ['visits' => 245, 'visitors' => 245] ['logo' => 'test.png'] [idsubtable = ]<br />\n"; $render = new Piwik_DataTable_Renderer_Console(); $render->setTable($table); $rendered = $render->render(); $this->assertEquals($expected, $rendered); }
/** Build DataTable from array and archive it */ private function archiveDataArray($keyword, &$data) { $dataTable = new Piwik_DataTable(); foreach ($data as &$row) { $dataTable->addRow(new Piwik_SiteUsers_ExtendedDataTableRow(array(Piwik_DataTable_Row::COLUMNS => $row))); } $name = 'SiteUsers_' . $keyword; $this->archiveProcessing->insertBlobRecord($name, $dataTable->getSerialized()); destroy($dataTable); }
/** * Filters the given data table * * @param Piwik_DataTable $table */ public function filter($table) { foreach ($table->getRows() as $key => $row) { $columnValue = $row->getColumn($this->columnToFilter); if (!call_user_func($this->function, $columnValue)) { $table->deleteRow($key); } $this->filterSubTable($row); } }
/** * Filters the given data table * * @param Piwik_DataTable $table */ public function filter($table) { foreach ($table->getRows() as $key => $row) { $columnValue = $row->getColumn($this->columnToFilter); if (!call_user_func_array($this->function, array_merge(array($columnValue), $this->functionParams))) { $table->deleteRow($key); } $this->filterSubTable($row); } }
protected function getTable() { $subtableAskPath1 = new Piwik_DataTable(); $subtableAskPath1->addRowsFromArray(array(array(Piwik_DataTable_Row::COLUMNS => array('label' => 'path1-index-page.html')), array(Piwik_DataTable_Row::COLUMNS => array('label' => 'another-page')))); $subtableAsk = new Piwik_DataTable(); $subtableAsk->addRowsFromArray(array(array(Piwik_DataTable_Row::COLUMNS => array('label' => 'path1'), Piwik_DataTable_Row::DATATABLE_ASSOCIATED => $subtableAskPath1), array(Piwik_DataTable_Row::COLUMNS => array('label' => 'index.html')))); $table = new Piwik_DataTable(); $rows = array(array(Piwik_DataTable_Row::COLUMNS => array('label' => 'http://www.ask.com'), Piwik_DataTable_Row::DATATABLE_ASSOCIATED => $subtableAsk), array(Piwik_DataTable_Row::COLUMNS => array('label' => 'yahoo'))); $table->addRowsFromArray($rows); return $table; }
/** * Filtert Kollektionsdaten nach Strings. -> z.B. Unterscheidung Standard <-> Projekt * @param Piwik_DataTable $dataTable * @param String $filter * @param boolean $bool */ private static function filterCollectionTableContent($dataTable, $filter, $bool) { $rows = $dataTable->getRows(); Piwik_cdebug::clog('filterCollectionTableContent: rows: ' . count($rows)); foreach ($rows as $i => $row) { $label = $row->getColumn('label'); if (strpos($label, $filter) !== false xor $bool) { $dataTable->deleteRow($i); } } }
/** * Decodes all columns of the given data table * * @param Piwik_DataTable $table */ public function filter($table) { foreach ($table->getRows() as $row) { $value = $row->getColumn($this->columnToDecode); if ($value !== false) { $value = self::filterValue($value); $row->setColumn($this->columnToDecode, $value); $this->filterSubTable($row); } } }
/** * Test to exclude low population filter */ function test_filter_Lowpop1() { $idcol = Piwik_DataTable_Row::COLUMNS; $table = new Piwik_DataTable(); $rows = array(array($idcol => array('label' => 'google', 'nb_visits' => 897)), array($idcol => array('label' => 'ask', 'nb_visits' => -152)), array($idcol => array('label' => 'piwik', 'nb_visits' => 1.5)), array($idcol => array('label' => 'piwik2', 'nb_visits' => 1.4)), array($idcol => array('label' => 'yahoo', 'nb_visits' => 154)), array($idcol => array('label' => 'amazon', 'nb_visits' => 30)), array($idcol => array('label' => '238949', 'nb_visits' => 0)), array($idcol => array('label' => 'Q*(%&*', 'nb_visits' => 1)), array($idcol => array('label' => 'Q*(%&*2', 'nb_visits' => -1.5))); $table->addRowsFromArray($rows); $expectedtable = new Piwik_DataTable(); $rows = array(array($idcol => array('label' => 'google', 'nb_visits' => 897)), array($idcol => array('label' => 'piwik', 'nb_visits' => 1.5)), array($idcol => array('label' => 'piwik2', 'nb_visits' => 1.4)), array($idcol => array('label' => 'yahoo', 'nb_visits' => 154)), array($idcol => array('label' => 'amazon', 'nb_visits' => 30))); $expectedtable->addRowsFromArray($rows); $filter = new Piwik_DataTable_Filter_ExcludeLowPopulation($table, 'nb_visits', 1.4); $this->assertTrue(Piwik_DataTable::isEqual($table, $expectedtable)); }
/** * @param Piwik_DataTable $table */ public function filter($table) { foreach ($table->getRows() as $key => $row) { //instead search must handle // - negative search with -piwik // - exact match with "" // see (?!pattern) A subexpression that performs a negative lookahead search, which matches the search string at any point where a string not matching pattern begins. if (!self::match($this->patternToSearch, $this->patternToSearchQuoted, $row->getColumn($this->columnToFilter), $this->invertedMatch)) { $table->deleteRow($key); } } }
/** * Truncates the table after X rows and adds a summary row * * @param Piwik_DataTable $table */ public function filter($table) { $table->filter('AddSummaryRow', array($this->truncateAfter)); $table->filter('ReplaceSummaryRowLabel'); foreach ($table->getRows() as $row) { if ($row->isSubtableLoaded()) { $idSubTable = $row->getIdSubDataTable(); $subTable = Piwik_DataTable_Manager::getInstance()->getTable($idSubTable); $subTable->filter('Truncate', array($this->truncateAfter)); } } }
/** * Executes a callback on every row of the supplied table and adds the result of * the callback as a new column to each row. * * @param Piwik_DataTable $table The table to filter. */ public function filter($table) { foreach ($table->getRows() as $row) { $columnValues = array(); foreach ($this->columns as $column) { $columnValues[] = $row->getColumn($column); } $parameters = array_merge($columnValues, $this->functionParameters); $value = call_user_func_array($this->functionToApply, $parameters); $row->setColumn($this->columnToAdd, $value); $this->filterSubTable($row); } }
/** * Executes the filter an adjusts all columns to fit the defined range * * @param Piwik_DataTable $table */ public function filter($table) { foreach ($table->getRows() as $row) { $value = $row->getColumn($this->columnToFilter); if ($value !== false) { if ($value < self::$minimumValue) { $row->setColumn($this->columnToFilter, self::$minimumValue); } elseif ($value > self::$maximumValue) { $row->setColumn($this->columnToFilter, self::$maximumValue); } } } }
/** * Get rank * * @param string $url URL to request Ranks for * @return Piwik_DataTable */ public function getRank($url) { Piwik::checkUserHasSomeViewAccess(); $rank = new Piwik_SEO_RankChecker($url); $data = array('Google PageRank' => array('rank' => $rank->getPageRank(), 'logo' => Piwik_getSearchEngineLogoFromUrl('http://google.com'), 'id' => 'pagerank'), Piwik_Translate('SEO_Google_IndexedPages') => array('rank' => $rank->getIndexedPagesGoogle(), 'logo' => Piwik_getSearchEngineLogoFromUrl('http://google.com'), 'id' => 'google-index'), Piwik_Translate('SEO_Bing_IndexedPages') => array('rank' => $rank->getIndexedPagesBing(), 'logo' => Piwik_getSearchEngineLogoFromUrl('http://bing.com'), 'id' => 'bing-index'), Piwik_Translate('SEO_AlexaRank') => array('rank' => $rank->getAlexaRank(), 'logo' => Piwik_getSearchEngineLogoFromUrl('http://alexa.com'), 'id' => 'alexa'), Piwik_Translate('SEO_DomainAge') => array('rank' => $rank->getAge(), 'logo' => 'plugins/SEO/images/whois.png', 'id' => 'domain-age')); // Add DMOZ only if > 0 entries found $dmozRank = array('rank' => $rank->getDmoz(), 'logo' => Piwik_getSearchEngineLogoFromUrl('http://dmoz.org'), 'id' => 'dmoz'); if ($dmozRank['rank'] > 0) { $data[Piwik_Translate('SEO_Dmoz')] = $dmozRank; } $dataTable = new Piwik_DataTable(); $dataTable->addRowsFromArrayWithIndexLabel($data); return $dataTable; }
/** * @param Piwik_DataTable $table */ public function filter($table) { foreach ($table->getRows() as $key => $row) { if (!$this->applyToSummaryRow && $key == Piwik_DataTable::ID_SUMMARY_ROW) { continue; } $params = array(); foreach ($this->metadataToRead as $name) { $params[] = $row->getMetadata($name); } $newValue = call_user_func_array($this->functionToApply, $params); $row->addMetadata($this->metadataToAdd, $newValue); } }
/** * Adds a summary row to the given data table * * @param Piwik_DataTable $table */ public function filter($table) { if ($table->getRowsCount() <= $this->startRowToSummarize + 1) { return; } $table->filter('Sort', array($this->columnToSortByBeforeTruncating, 'desc')); $rows = $table->getRows(); $count = $table->getRowsCount(); $newRow = new Piwik_DataTable_Row(); for ($i = $this->startRowToSummarize; $i < $count; $i++) { if (!isset($rows[$i])) { // case when the last row is a summary row, it is not indexed by $cout but by Piwik_DataTable::ID_SUMMARY_ROW $summaryRow = $table->getRowFromId(Piwik_DataTable::ID_SUMMARY_ROW); //FIXME: I'm not sure why it could return false, but it was reported in: http://forum.piwik.org/read.php?2,89324,page=1#msg-89442 if ($summaryRow) { $newRow->sumRow($summaryRow, $enableCopyMetadata = false); } } else { $newRow->sumRow($rows[$i], $enableCopyMetadata = false); } } $newRow->setColumns(array('label' => $this->labelSummaryRow) + $newRow->getColumns()); if ($this->deleteRows) { $table->filter('Limit', array(0, $this->startRowToSummarize)); } $table->addSummaryRow($newRow); unset($rows); }
private static function getCleanedVisitorsFromDetails($visitorDetails) { $table = new Piwik_DataTable(); foreach ($visitorDetails as $visitorDetail) { self::cleanVisitorDetails($visitorDetail); $visitor = new Piwik_Live_Visitor($visitorDetail); $visitorDetailsArray = $visitor->getAllVisitorDetails(); $dateTimeVisit = Piwik_Date::factory($visitorDetailsArray['firstActionTimestamp']); //TODO TO FIX $visitorDetailsArray['serverDatePretty'] = $dateTimeVisit->getLocalized('%shortDay% %day% %shortMonth%'); $visitorDetailsArray['serverTimePretty'] = $dateTimeVisit->getLocalized('%time%'); $table->addRowFromArray(array(Piwik_DataTable_Row::COLUMNS => $visitorDetailsArray)); } return $table; }
/** * Returns true if it is likely that the data for this report has been purged and if the * user should be told about that. * * In order for this function to return true, the following must also be true: * - The data table for this report must either be empty or not have been fetched. * - The period of this report is not a multiple period. * - The date of this report must be older than the delete_reports_older_than config option. * @return bool */ public function hasReportBeenPurged() { $strPeriod = Piwik_Common::getRequestVar('period', false); $strDate = Piwik_Common::getRequestVar('date', false); if ($strPeriod !== false && $strDate !== false && (is_null($this->dataTable) || $this->dataTable->getRowsCount() == 0)) { // if range, only look at the first date if ($strPeriod == 'range') { $idSite = Piwik_Common::getRequestVar('idSite', ''); if (intval($idSite) != 0) { $site = new Piwik_Site($idSite); $timezone = $site->getTimezone(); } else { $timezone = 'UTC'; } $period = new Piwik_Period_Range('range', $strDate, $timezone); $reportDate = $period->getDateStart(); } else { if (Piwik_Archive::isMultiplePeriod($strDate, $strPeriod)) { return false; } else { $reportDate = Piwik_Date::factory($strDate); } } $reportYear = $reportDate->toString('Y'); $reportMonth = $reportDate->toString('m'); if (class_exists('Piwik_PrivacyManager') && Piwik_PrivacyManager::shouldReportBePurged($reportYear, $reportMonth)) { return true; } } return false; }
/** * Gets a DataTable displaying number of visits by device type (mobile vs. desktop). */ public function getMobileVsDesktop($idSite, $period, $date, $segment = false) { $dataTable = $this->getOS($idSite, $period, $date, $segment, $addShortLabel = false); $dataTable->filter('GroupBy', array('label', 'Piwik_UserSettings_getDeviceTypeFromOS')); // make sure the datatable has a row for mobile & desktop (if it has rows) $empty = new Piwik_DataTable(); $empty->addRowsFromSimpleArray(array(array('label' => 'General_Desktop', Piwik_Archive::INDEX_NB_VISITS => 0), array('label' => 'General_Mobile', Piwik_Archive::INDEX_NB_VISITS => 0))); if ($dataTable->getRowsCount() > 0) { $dataTable->addDataTable($empty); } // set the logo metadata $dataTable->queueFilter('MetadataCallbackReplace', array('logo', 'Piwik_UserSettings_getDeviceTypeImg', null, array('label'))); // translate the labels $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_Translate')); return $dataTable; }