/** * Common filters for all Actions API * * @param DataTable|DataTable\Simple|DataTable\Map $dataTable * @param bool $expanded */ protected function filterActionsDataTable($dataTable, $expanded = false) { // Must be applied before Sort in this case, since the DataTable can contain both int and strings indexes // (in the transition period between pre 1.2 and post 1.2 datatable structure) $dataTable->filter('ReplaceColumnNames'); $dataTable->filter('Sort', array('nb_visits', 'desc', $naturalSort = false, $expanded)); $dataTable->queueFilter('ReplaceSummaryRowLabel'); }
/** * Converts the given scalar to an data table * * @param mixed $scalar * @return string */ protected function handleScalar($scalar) { $dataTable = new Simple(); $dataTable->addRowsFromArray(array($scalar)); return $this->getRenderedDataTable($dataTable); }
public function test_renderDataTable_shouldRenderSimpleDataTable() { $dataTable = new DataTable\Simple(); $dataTable->addRowsFromArray(array('nb_visits' => 3, 'nb_random' => 6)); $response = $this->builder->renderDataTable($dataTable); $expected = array('nb_visits' => 3, 'nb_random' => 6); $this->assertEquals($expected, $response); }
/** * Converts the output of the given simple data table * * @param DataTable|Simple $table * @param array $allColumns * @return string */ protected function renderDataTable($table, &$allColumns = array()) { if ($table instanceof Simple) { $row = $table->getFirstRow(); if ($row !== false) { $columnNameToValue = $row->getColumns(); if (count($columnNameToValue) == 1) { // simple tables should only have one column, the value $allColumns['value'] = true; $value = array_values($columnNameToValue); $str = 'value' . $this->lineEnd . $this->formatValue($value[0]); return $str; } } } $csv = array(); foreach ($table->getRows() as $row) { $csvRow = $this->flattenColumnArray($row->getColumns()); if ($this->exportMetadata) { $metadata = $row->getMetadata(); foreach ($metadata as $name => $value) { if ($name == 'idsubdatatable_in_db') { continue; } //if a metadata and a column have the same name make sure they dont overwrite if ($this->translateColumnNames) { $name = Piwik::translate('General_Metadata') . ': ' . $name; } else { $name = 'metadata_' . $name; } $csvRow[$name] = $value; } } foreach ($csvRow as $name => $value) { $allColumns[$name] = true; } if ($this->exportIdSubtable) { $idsubdatatable = $row->getIdSubDataTable(); if ($idsubdatatable !== false && $this->hideIdSubDatatable === false) { $csvRow['idsubdatatable'] = $idsubdatatable; } } $csv[] = $csvRow; } // now we make sure that all the rows in the CSV array have all the columns foreach ($csv as &$row) { foreach ($allColumns as $columnName => $true) { if (!isset($row[$columnName])) { $row[$columnName] = ''; } } } $str = ''; // specific case, we have only one column and this column wasn't named properly (indexed by a number) // we don't print anything in the CSV file => an empty line if (sizeof($allColumns) == 1 && reset($allColumns) && !is_string(key($allColumns))) { $str .= ''; } else { // render row names $str .= $this->getHeaderLine(array_keys($allColumns)) . $this->lineEnd; } // we render the CSV foreach ($csv as $theRow) { $rowStr = ''; foreach ($allColumns as $columnName => $true) { $rowStr .= $this->formatValue($theRow[$columnName]) . $this->separator; } // remove the last separator $rowStr = substr_replace($rowStr, "", -strlen($this->separator)); $str .= $rowStr . $this->lineEnd; } $str = substr($str, 0, -strlen($this->lineEnd)); return $str; }
/** * Converts the simple data table to an array * * @param Simple $table * @return array */ protected function renderSimpleTable($table) { $array = array(); $row = $table->getFirstRow(); if ($row === false) { return $array; } foreach ($row->getColumns() as $columnName => $columnValue) { $array[$columnName] = $columnValue; } return $array; }
/** * Enhance $simpleDataTable using metadata : * * - remove metrics based on $reportMetadata['metrics'] * - add 0 valued metrics if $simpleDataTable doesn't provide all $reportMetadata['metrics'] * - format metric values to a 'human readable' format * - extract row metadata to a separate Simple $rowsMetadata * * @param int $idSite enables monetary value formatting based on site currency * @param Simple $simpleDataTable * @param array $metadataColumns * @param boolean $hasDimension * @param bool $returnRawMetrics If set to true, the original metrics will be returned * * @return array DataTable $enhancedDataTable filtered metrics with human readable format & Simple $rowsMetadata */ private function handleSimpleDataTable($idSite, $simpleDataTable, $metadataColumns, $hasDimension, $returnRawMetrics = false) { // new DataTable to store metadata $rowsMetadata = new DataTable(); // new DataTable to store 'human readable' values if ($hasDimension) { $enhancedDataTable = new DataTable(); } else { $enhancedDataTable = new Simple(); } foreach ($simpleDataTable->getRows() as $row) { $rowMetrics = $row->getColumns(); // add missing metrics foreach ($metadataColumns as $id => $name) { if (!isset($rowMetrics[$id])) { $row->setColumn($id, 0); $rowMetrics[$id] = 0; } } $enhancedRow = new Row(); $enhancedDataTable->addRow($enhancedRow); foreach ($rowMetrics as $columnName => $columnValue) { // filter metrics according to metadata definition if (isset($metadataColumns[$columnName])) { // generate 'human readable' metric values // if we handle MultiSites.getAll we do not always have the same idSite but different ones for // each site, see http://dev.piwik.org/trac/ticket/5006 $idSiteForRow = $idSite; if ($row->getMetadata('idsite') && is_numeric($row->getMetadata('idsite'))) { $idSiteForRow = (int) $row->getMetadata('idsite'); } $prettyValue = MetricsFormatter::getPrettyValue($idSiteForRow, $columnName, $columnValue, $htmlAllowed = false); $enhancedRow->addColumn($columnName, $prettyValue); } elseif ($returnRawMetrics) { if (!isset($columnValue)) { $columnValue = 0; } $enhancedRow->addColumn($columnName, $columnValue); } } // If report has a dimension, extract metadata into a distinct DataTable if ($hasDimension) { $rowMetadata = $row->getMetadata(); $idSubDataTable = $row->getIdSubDataTable(); // Create a row metadata only if there are metadata to insert if (count($rowMetadata) > 0 || !is_null($idSubDataTable)) { $metadataRow = new Row(); $rowsMetadata->addRow($metadataRow); foreach ($rowMetadata as $metadataKey => $metadataValue) { $metadataRow->addColumn($metadataKey, $metadataValue); } if (!is_null($idSubDataTable)) { $metadataRow->addColumn('idsubdatatable', $idSubDataTable); } } } } return array($enhancedDataTable, $rowsMetadata); }
public function renderScalar($scalar) { $dataTable = new DataTable\Simple(); $dataTable->addRowsFromArray(array($scalar)); return $this->renderDataTable($dataTable); }
protected function _getDataTableSimpleOneRowMapTest() { $array1 = array('nb_visits' => 14.0); $table1 = new Simple(); $table1->addRowsFromArray($array1); $array2 = array('nb_visits' => 15.0); $table2 = new Simple(); $table2->addRowsFromArray($array2); $table3 = new Simple(); $table = new DataTable\Map(); $table->setKeyName('testKey'); $table->addTable($table1, 'row1'); $table->addTable($table2, 'row2'); $table->addTable($table3, 'row3'); return $table; }
private function _getDataTableSimpleWithInvalidChars() { $table = new DataTable\Simple(); $table->addRowsFromSimpleArray(array("\$%@(%" => 1, "avbs\$" => 2, "b/" => 2)); return $table; }
/** * Converts the output of the given simple data table * * @param DataTable|Simple $table * @param array $allColumns * @return string */ protected function renderDataTable($table, &$allColumns = array()) { if ($table instanceof Simple) { $row = $table->getFirstRow(); if ($row !== false) { $columnNameToValue = $row->getColumns(); if (count($columnNameToValue) == 1) { // simple tables should only have one column, the value $allColumns['value'] = true; $value = array_values($columnNameToValue); $str = 'value' . $this->lineEnd . $this->formatValue($value[0]); return $str; } } } $csv = $this->makeArrayFromDataTable($table, $allColumns); // now we make sure that all the rows in the CSV array have all the columns foreach ($csv as &$row) { foreach ($allColumns as $columnName => $true) { if (!isset($row[$columnName])) { $row[$columnName] = ''; } } } $str = $this->buildCsvString($allColumns, $csv); return $str; }
/** * Enhance $simpleDataTable using metadata : * * - remove metrics based on $reportMetadata['metrics'] * - add 0 valued metrics if $simpleDataTable doesn't provide all $reportMetadata['metrics'] * - format metric values to a 'human readable' format * - extract row metadata to a separate Simple $rowsMetadata * * @param int $idSite enables monetary value formatting based on site currency * @param Simple $simpleDataTable * @param array $metadataColumns * @param boolean $hasDimension * @param bool $returnRawMetrics If set to true, the original metrics will be returned * * @return array DataTable $enhancedDataTable filtered metrics with human readable format & Simple $rowsMetadata */ private function handleSimpleDataTable($idSite, $simpleDataTable, $metadataColumns, $hasDimension, $returnRawMetrics = false) { // new DataTable to store metadata $rowsMetadata = new DataTable(); // new DataTable to store 'human readable' values if ($hasDimension) { $enhancedDataTable = new DataTable(); } else { $enhancedDataTable = new Simple(); } // add missing metrics foreach ($simpleDataTable->getRows() as $row) { $rowMetrics = $row->getColumns(); foreach ($metadataColumns as $id => $name) { if (!isset($rowMetrics[$id])) { $row->addColumn($id, 0); } } } foreach ($simpleDataTable->getRows() as $row) { $enhancedRow = new Row(); $enhancedDataTable->addRow($enhancedRow); $rowMetrics = $row->getColumns(); foreach ($rowMetrics as $columnName => $columnValue) { // filter metrics according to metadata definition if (isset($metadataColumns[$columnName])) { // generate 'human readable' metric values $prettyValue = MetricsFormatter::getPrettyValue($idSite, $columnName, $columnValue, $htmlAllowed = false); $enhancedRow->addColumn($columnName, $prettyValue); } elseif ($returnRawMetrics) { $enhancedRow->addColumn($columnName, $columnValue); } } // If report has a dimension, extract metadata into a distinct DataTable if ($hasDimension) { $rowMetadata = $row->getMetadata(); $idSubDataTable = $row->getIdSubDataTable(); // Create a row metadata only if there are metadata to insert if (count($rowMetadata) > 0 || !is_null($idSubDataTable)) { $metadataRow = new Row(); $rowsMetadata->addRow($metadataRow); foreach ($rowMetadata as $metadataKey => $metadataValue) { $metadataRow->addColumn($metadataKey, $metadataValue); } if (!is_null($idSubDataTable)) { $metadataRow->addColumn('idsubdatatable', $idSubDataTable); } } } } return array($enhancedDataTable, $rowsMetadata); }
public function test_renderDataTable_shouldRenderSimpleDataTable() { $dataTable = new DataTable\Simple(); $dataTable->addRowsFromArray(array('nb_visits' => 3, 'nb_random' => 6)); $response = $this->builder->renderDataTable($dataTable); $this->assertEquals('<table id="MultiSites_getAll" border="1"> <thead> <tr> <th>nb_visits</th> <th>nb_random</th> </tr> </thead> <tbody> <tr> <td>3</td> <td>6</td> </tr> </tbody> </table> ', $response); }
/** * Common filters for all Actions API * * @param DataTable|DataTable\Simple|DataTable\Map $dataTable */ private function filterActionsDataTable($dataTable) { // Must be applied before Sort in this case, since the DataTable can contain both int and strings indexes // (in the transition period between pre 1.2 and post 1.2 datatable structure) $dataTable->filter('Piwik\\Plugins\\Actions\\DataTable\\Filter\\Actions'); return $dataTable; }
/** * Filter a DataTable instance. See @filter for more info. * * @param DataTable\Simple|DataTable\Map $dataTable * @return mixed */ protected function manipulateDataTable($dataTable) { $result = $dataTable->getEmptyClone(); foreach ($this->labels as $labelIndex => $label) { $row = null; foreach ($this->getLabelVariations($label) as $labelVariation) { $labelVariation = explode(self::SEPARATOR_RECURSIVE_LABEL, $labelVariation); $row = $this->doFilterRecursiveDescend($labelVariation, $dataTable); if ($row) { if ($this->addLabelIndex) { $row->setMetadata(self::FLAG_IS_ROW_EVOLUTION, $labelIndex); } $result->addRow($row); break; } } } return $result; }
/** * Convert a dimension-less report to a multi-row two-column data table * * @static * @param $reportMetadata array * @param $report DataTable * @param $reportColumns array * @return array DataTable $report & array $columns */ protected static function processTableFormat($reportMetadata, $report, $reportColumns) { $finalReport = $report; if (empty($reportMetadata['dimension'])) { $simpleReportMetrics = $report->getFirstRow(); if ($simpleReportMetrics) { $finalReport = new Simple(); foreach ($simpleReportMetrics->getColumns() as $metricId => $metric) { $newRow = new Row(); $newRow->addColumn("label", $reportColumns[$metricId]); $newRow->addColumn("value", $metric); $finalReport->addRow($newRow); } } $reportColumns = array('label' => Piwik::translate('General_Name'), 'value' => Piwik::translate('General_Value')); } return array($finalReport, $reportColumns); }
/** * @param Simple $table */ protected function filterSimple(Simple $table) { foreach ($table->getRows() as $row) { $columns = array_keys($row->getColumns()); foreach ($columns as $column) { $newName = $this->getRenamedColumn($column); if ($newName) { $row->renameColumn($column, $newName); } } } }
/** * @param $data * @return DataTable\Simple */ private function makeFromMetricsArray($data) { $table = new DataTable\Simple(); if (!empty($data)) { $table->setAllTableMetadata(DataCollection::getDataRowMetadata($data)); DataCollection::removeMetadataFromDataRow($data); $table->addRow(new Row(array(Row::COLUMNS => $data))); } else { // if we're querying numeric data, we couldn't find any, and we're only // looking for one metric, add a row w/ one column w/ value 0. this is to // ensure that the PHP renderer outputs 0 when only one column is queried. // w/o this code, an empty array would be created, and other parts of Piwik // would break. if (count($this->dataNames) == 1 && $this->dataType == 'numeric') { $name = reset($this->dataNames); $table->addRow(new Row(array(Row::COLUMNS => array($name => 0)))); } } $result = $table; return $result; }
public function test_renderDataTable_shouldRenderSimpleDataTable() { $dataTable = new DataTable\Simple(); $dataTable->addRowsFromArray(array('nb_visits' => 3, 'nb_random' => 6)); $response = $this->builder->renderDataTable($dataTable); $this->assertEquals('<?xml version="1.0" encoding="utf-8" ?> <result> <nb_visits>3</nb_visits> <nb_random>6</nb_random> </result>', $response); }
/** * Enhance $simpleDataTable using metadata : * * - remove metrics based on $reportMetadata['metrics'] * - add 0 valued metrics if $simpleDataTable doesn't provide all $reportMetadata['metrics'] * - format metric values to a 'human readable' format * - extract row metadata to a separate Simple $rowsMetadata * * @param int $idSite enables monetary value formatting based on site currency * @param Simple $simpleDataTable * @param array $metadataColumns * @param boolean $hasDimension * @param bool $returnRawMetrics If set to true, the original metrics will be returned * @param bool|null $formatMetrics * @return array DataTable $enhancedDataTable filtered metrics with human readable format & Simple $rowsMetadata */ private function handleSimpleDataTable($idSite, $simpleDataTable, $metadataColumns, $hasDimension, $returnRawMetrics = false, $formatMetrics = null) { // new DataTable to store metadata $rowsMetadata = new DataTable(); // new DataTable to store 'human readable' values if ($hasDimension) { $enhancedDataTable = new DataTable(); } else { $enhancedDataTable = new Simple(); } $formatter = new Formatter(); foreach ($simpleDataTable->getRows() as $row) { $rowMetrics = $row->getColumns(); // add missing metrics foreach ($metadataColumns as $id => $name) { if (!isset($rowMetrics[$id])) { $row->setColumn($id, 0); $rowMetrics[$id] = 0; } } $enhancedRow = new Row(); $enhancedDataTable->addRow($enhancedRow); foreach ($rowMetrics as $columnName => $columnValue) { // filter metrics according to metadata definition if (isset($metadataColumns[$columnName])) { // generate 'human readable' metric values // if we handle MultiSites.getAll we do not always have the same idSite but different ones for // each site, see https://github.com/piwik/piwik/issues/5006 $idSiteForRow = $idSite; $idSiteMetadata = $row->getMetadata('idsite'); if ($idSiteMetadata && is_numeric($idSiteMetadata)) { $idSiteForRow = (int) $idSiteMetadata; } // format metrics manually here to maintain API.getProcessedReport BC if format_metrics query parameter is // not supplied. TODO: should be removed for 3.0. should only rely on format_metrics query parameter. if ($formatMetrics === null || $formatMetrics == 'bc') { $prettyValue = self::getPrettyValue($formatter, $idSiteForRow, $columnName, $columnValue, $htmlAllowed = false); } else { $prettyValue = $columnValue; } $enhancedRow->addColumn($columnName, $prettyValue); } else { if ($returnRawMetrics) { if (!isset($columnValue)) { $columnValue = 0; } $enhancedRow->addColumn($columnName, $columnValue); } } } // If report has a dimension, extract metadata into a distinct DataTable if ($hasDimension) { $rowMetadata = $row->getMetadata(); $idSubDataTable = $row->getIdSubDataTable(); // Create a row metadata only if there are metadata to insert if (count($rowMetadata) > 0 || !is_null($idSubDataTable)) { $metadataRow = new Row(); $rowsMetadata->addRow($metadataRow); foreach ($rowMetadata as $metadataKey => $metadataValue) { $metadataRow->addColumn($metadataKey, $metadataValue); } if (!is_null($idSubDataTable)) { $metadataRow->addColumn('idsubdatatable', $idSubDataTable); } } } } return array($enhancedDataTable, $rowsMetadata); }
/** * @expectedException \Exception * @expectedExceptionMessage RSS feeds can be generated for one specific website */ public function test_renderDataTable_shouldFailForSimpleDataTable() { $dataTable = new DataTable\Simple(); $dataTable->addRowsFromArray(array('nb_visits' => 3, 'nb_random' => 6)); $this->builder->renderDataTable($dataTable); }
public function test_renderDataTable_shouldRenderSimpleDataTable() { $dataTable = new DataTable\Simple(); $dataTable->addRowsFromArray(array('nb_visits' => 3, 'nb_random' => 6)); $response = $this->jsonBuilder->renderDataTable($dataTable); $this->assertEquals('{"nb_visits":3,"nb_random":6}', $response); $this->assertNoJsonError($response); }