Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Steur <thomas.steur@gmail.com>2015-02-26 05:23:28 +0300
committerThomas Steur <thomas.steur@gmail.com>2015-03-05 05:31:18 +0300
commit287aad82841f0f0e85406192b2f1f865bc0be67d (patch)
treed9c035a484c3f2727d7fa1cdf14ccd213c308508
parenta1cb3695319b321f92bb0a4fd31892a9bc1bdf38 (diff)
Faster flattening for many reports
-rw-r--r--core/API/DataTableManipulator.php8
-rw-r--r--core/API/DataTableManipulator/Flattener.php41
-rw-r--r--core/API/DataTableManipulator/ReportTotalsCalculator.php27
-rw-r--r--core/API/DataTablePostProcessor.php10
-rw-r--r--core/Archive.php33
-rw-r--r--core/DataTable.php69
-rw-r--r--core/DataTable/Filter/Sort.php101
-rw-r--r--core/DataTable/Filter/Truncate.php2
-rw-r--r--core/DataTable/Map.php33
-rw-r--r--core/DataTable/Row.php44
-rw-r--r--core/Plugin/API.php2
-rw-r--r--core/Plugin/Metric.php45
-rw-r--r--core/Plugin/Report.php16
-rw-r--r--core/UrlHelper.php5
-rw-r--r--plugins/Actions/API.php70
-rw-r--r--plugins/Actions/DataTable/Filter/Actions.php53
-rw-r--r--plugins/Actions/Reports/Base.php1
-rw-r--r--plugins/Events/API.php40
-rw-r--r--plugins/Events/DataTable/Filter/ReplaceEventNameNotSet.php39
-rw-r--r--plugins/Referrers/API.php21
-rw-r--r--plugins/Referrers/DataTable/Filter/UrlsFromWebsiteId.php46
-rw-r--r--plugins/Referrers/Reports/GetWebsites.php1
-rwxr-xr-xtests/PHPUnit/System/BlobReportLimitingTest.php17
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_FlattenReports__Actions.getPageUrls_week.xml5
-rw-r--r--tests/PHPUnit/System/expected/test_FlattenReports_withAggregate__Actions.getPageUrls_week.xml29
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getDownloads_day.xml92
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getOutlinks_day.xml92
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getPageTitles_day.xml82
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getPageUrls_day.xml116
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__CustomVariables.getCustomVariables_day.xml27
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__DevicesDetection.getBrowserVersions_day.xml41
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__DevicesDetection.getOsVersions_day.xml41
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsCategory_day.xml21
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsName_day.xml21
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsSku_day.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getAll_day.xml62
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getKeywords_day.xml58
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getReferrerType_day.xml80
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getSearchEngines_day.xml64
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getWebsites_day.xml62
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Resolution.getConfiguration_day.xml36
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__Resolution.getResolution_day.xml38
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getCity_day.xml51
-rw-r--r--tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getRegion_day.xml49
-rw-r--r--tests/PHPUnit/Unit/DataTable/RowTest.php72
-rw-r--r--tests/PHPUnit/Unit/DeprecatedMethodsTest.php1
-rw-r--r--tests/PHPUnit/Unit/UrlHelperTest.php8
48 files changed, 1584 insertions, 300 deletions
diff --git a/core/API/DataTableManipulator.php b/core/API/DataTableManipulator.php
index 23036c8e82..862f2db087 100644
--- a/core/API/DataTableManipulator.php
+++ b/core/API/DataTableManipulator.php
@@ -114,14 +114,6 @@ abstract class DataTableManipulator
return null;
}
- if ($row->getMetadata('idsubdatatable_in_db')) {
- $manager = DataTable\Manager::getInstance();
- $table = $manager->getTable($idSubTable);
- if ($table) {
- return $table;
- }
- }
-
$request['idSubtable'] = $idSubTable;
if ($dataTable) {
$period = $dataTable->getMetadata(DataTableFactory::TABLE_METADATA_PERIOD_INDEX);
diff --git a/core/API/DataTableManipulator/Flattener.php b/core/API/DataTableManipulator/Flattener.php
index cfee16e6ba..a976b7a62e 100644
--- a/core/API/DataTableManipulator/Flattener.php
+++ b/core/API/DataTableManipulator/Flattener.php
@@ -38,17 +38,16 @@ class Flattener extends DataTableManipulator
* Separator for building recursive labels (or paths)
* @var string
*/
- public $recursiveLabelSeparator = ' - ';
+ public $recursiveLabelSeparator = '';
/**
* @param DataTable $dataTable
+ * @param string $recursiveLabelSeparator
* @return DataTable|DataTable\Map
*/
- public function flatten($dataTable)
+ public function flatten($dataTable, $recursiveLabelSeparator)
{
- if ($this->apiModule == 'Actions' || $this->apiMethod == 'getWebsites') {
- $this->recursiveLabelSeparator = '/';
- }
+ $this->recursiveLabelSeparator = $recursiveLabelSeparator;
return $this->manipulate($dataTable);
}
@@ -72,9 +71,10 @@ class Flattener extends DataTableManipulator
}
$newDataTable = $dataTable->getEmptyClone($keepFilters);
- foreach ($dataTable->getRows() as $row) {
- $this->flattenRow($row, $newDataTable);
+ foreach ($dataTable->getRows() as $rowId => $row) {
+ $this->flattenRow($row, $rowId, $newDataTable);
}
+
return $newDataTable;
}
@@ -84,15 +84,21 @@ class Flattener extends DataTableManipulator
* @param string $labelPrefix
* @param bool $parentLogo
*/
- private function flattenRow(Row $row, DataTable $dataTable,
+ private function flattenRow(Row $row, $rowId, DataTable $dataTable,
$labelPrefix = '', $parentLogo = false)
{
$label = $row->getColumn('label');
if ($label !== false) {
$label = trim($label);
- if (substr($label, 0, 1) == '/' && $this->recursiveLabelSeparator == '/') {
- $label = substr($label, 1);
+
+ if ($this->recursiveLabelSeparator == '/') {
+ if (substr($label, 0, 1) == '/') {
+ $label = substr($label, 1);
+ } elseif ($rowId === DataTable::ID_SUMMARY_ROW && $labelPrefix && $label != DataTable::LABEL_SUMMARY_ROW) {
+ $label = ' - ' . $label;
+ }
}
+
$label = $labelPrefix . $label;
$row->setColumn('label', $label);
}
@@ -103,7 +109,16 @@ class Flattener extends DataTableManipulator
$row->setMetadata('logo', $logo);
}
- $subTable = $this->loadSubtable($dataTable, $row);
+ /** @var DataTable $subTable */
+ $subTable = $row->getSubtable();
+
+ if ($subTable) {
+ $subTable->applyQueuedFilters();
+ $row->deleteMetadata('idsubdatatable_in_db');
+ } else {
+ $subTable = $this->loadSubtable($dataTable, $row);
+ }
+
$row->removeSubtable();
if ($subTable === null) {
@@ -117,8 +132,8 @@ class Flattener extends DataTableManipulator
$dataTable->addRow($row);
}
$prefix = $label . $this->recursiveLabelSeparator;
- foreach ($subTable->getRows() as $row) {
- $this->flattenRow($row, $dataTable, $prefix, $logo);
+ foreach ($subTable->getRows() as $rowId => $row) {
+ $this->flattenRow($row, $rowId, $dataTable, $prefix, $logo);
}
}
}
diff --git a/core/API/DataTableManipulator/ReportTotalsCalculator.php b/core/API/DataTableManipulator/ReportTotalsCalculator.php
index b6b82effad..4703c36c7d 100644
--- a/core/API/DataTableManipulator/ReportTotalsCalculator.php
+++ b/core/API/DataTableManipulator/ReportTotalsCalculator.php
@@ -66,14 +66,19 @@ class ReportTotalsCalculator extends DataTableManipulator
$firstLevelTable = $this->makeSureToWorkOnFirstLevelDataTable($dataTable);
$metricsToCalculate = Metrics::getMetricIdsToProcessReportTotal();
+ $realMetricNames = array();
foreach ($metricsToCalculate as $metricId) {
- $realMetricName = $this->hasDataTableMetric($firstLevelTable, $metricId);
- if (empty($realMetricName)) {
- continue;
+ $metricName = Metrics::getReadableColumnName($metricId);
+ $realMetricName = $this->hasDataTableMetric($firstLevelTable, $metricId, $metricName);
+ if (!empty($realMetricName)) {
+ $realMetricNames[$metricName] = $realMetricName;
}
+ }
- foreach ($firstLevelTable->getRows() as $row) {
- $totalValues = $this->sumColumnValueToTotal($row, $metricId, $realMetricName, $totalValues);
+ foreach ($firstLevelTable->getRows() as $row) {
+ $columns = $row->getColumns();
+ foreach ($realMetricNames as $metricName => $realMetricName) {
+ $totalValues = $this->sumColumnValueToTotal($columns, $metricName, $realMetricName, $totalValues);
}
}
@@ -82,7 +87,7 @@ class ReportTotalsCalculator extends DataTableManipulator
return $dataTable;
}
- private function hasDataTableMetric(DataTable $dataTable, $metricId)
+ private function hasDataTableMetric(DataTable $dataTable, $metricId, $readableColumnName)
{
$firstRow = $dataTable->getFirstRow();
@@ -90,7 +95,6 @@ class ReportTotalsCalculator extends DataTableManipulator
return false;
}
- $readableColumnName = Metrics::getReadableColumnName($metricId);
$columnAlternatives = array(
$metricId,
$readableColumnName,
@@ -151,17 +155,18 @@ class ReportTotalsCalculator extends DataTableManipulator
return $table;
}
- private function sumColumnValueToTotal(Row $row, $metricId, $realMetricId, $totalValues)
+ private function sumColumnValueToTotal($columns, $metricName, $realMetricId, $totalValues)
{
- $value = $row->getColumn($realMetricId);
+ $value = false;
+ if (array_key_exists($realMetricId, $columns)) {
+ $value = $columns[$realMetricId];
+ }
if (false === $value) {
return $totalValues;
}
- $metricName = Metrics::getReadableColumnName($metricId);
-
if (array_key_exists($metricName, $totalValues)) {
$totalValues[$metricName] += $value;
} else {
diff --git a/core/API/DataTablePostProcessor.php b/core/API/DataTablePostProcessor.php
index 999b3fe339..b13fff1439 100644
--- a/core/API/DataTablePostProcessor.php
+++ b/core/API/DataTablePostProcessor.php
@@ -85,8 +85,8 @@ class DataTablePostProcessor
// this is non-trivial since it will require, eg, to make sure processed metrics aren't added
// after pivotBy is handled.
$dataTable = $this->applyPivotByFilter($dataTable);
- $dataTable = $this->applyFlattener($dataTable);
$dataTable = $this->applyTotalsCalculator($dataTable);
+ $dataTable = $this->applyFlattener($dataTable);
$dataTable = $this->applyGenericFilters($dataTable);
@@ -145,7 +145,13 @@ class DataTablePostProcessor
if (Common::getRequestVar('include_aggregate_rows', '0', 'string', $this->request) == '1') {
$flattener->includeAggregateRows();
}
- $dataTable = $flattener->flatten($dataTable);
+
+ $recursiveLabelSeparator = ' - ';
+ if ($this->report) {
+ $recursiveLabelSeparator = $this->report->getRecursiveLabelSeparator();
+ }
+
+ $dataTable = $flattener->flatten($dataTable, $recursiveLabelSeparator);
}
return $dataTable;
}
diff --git a/core/Archive.php b/core/Archive.php
index 1931b6a343..c7eb6e3106 100644
--- a/core/Archive.php
+++ b/core/Archive.php
@@ -452,6 +452,7 @@ class Archive
* @return DataTable|DataTable\Map See {@link getDataTable()} and
* {@link getDataTableExpanded()} for more
* information
+ * @deprecated Since Piwik 2.12.0 Use Archive::createDataTableFromArchive() instead
*/
public static function getDataTableFromArchive($name, $idSite, $period, $date, $segment, $expanded,
$idSubtable = null, $depth = null)
@@ -474,6 +475,38 @@ class Archive
return $dataTable;
}
+ /**
+ * Helper function that creates an Archive instance and queries for report data using
+ * query parameter data. API methods can use this method to reduce code redundancy.
+ *
+ * @param string $recordName The name of the report to return.
+ * @param int|string|array $idSite @see {@link build()}
+ * @param string $period @see {@link build()}
+ * @param string $date @see {@link build()}
+ * @param string $segment @see {@link build()}
+ * @param bool $expanded If true, loads all subtables. See {@link getDataTableExpanded()}
+ * @param bool $flat If true, loads all subtables and disabled all recursive filters.
+ * @param int|null $idSubtable See {@link getDataTableExpanded()}
+ * @param int|null $depth See {@link getDataTableExpanded()}
+ * @return DataTable|DataTable\Map
+ */
+ public static function createDataTableFromArchive($recordName, $idSite, $period, $date, $segment, $expanded = false, $flat = false, $idSubtable = null, $depth = null)
+ {
+ if ($flat && !$idSubtable) {
+ $expanded = true;
+ }
+
+ $dataTable = self::getDataTableFromArchive($recordName, $idSite, $period, $date, $segment, $expanded, $idSubtable, $depth);
+
+ $dataTable->filter('ReplaceColumnNames');
+
+ if ($flat) {
+ $dataTable->disableRecursiveFilters();
+ }
+
+ return $dataTable;
+ }
+
private function appendIdSubtable($recordName, $id)
{
return $recordName . "_" . $id;
diff --git a/core/DataTable.php b/core/DataTable.php
index b060a87245..0b0d9845f0 100644
--- a/core/DataTable.php
+++ b/core/DataTable.php
@@ -342,6 +342,17 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
}
/**
+ * @ignore
+ * does not update the summary row!
+ */
+ public function setRows($rows)
+ {
+ unset($this->rows);
+ $this->rows = $rows;
+ $this->indexNotUpToDate = true;
+ }
+
+ /**
* Sorts the DataTable rows using the supplied callback function.
*
* @param string $functionCallback A comparison callback compatible with {@link usort}.
@@ -350,11 +361,11 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
*/
public function sort($functionCallback, $columnSortedBy)
{
- $this->indexNotUpToDate = true;
- $this->tableSortedBy = $columnSortedBy;
+ $this->setTableSortedBy($columnSortedBy);
+
usort($this->rows, $functionCallback);
- if ($this->enableRecursiveSort === true) {
+ if ($this->isSortRecursiveEnabled()) {
foreach ($this->getRows() as $row) {
$subTable = $row->getSubtable();
@@ -388,6 +399,23 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
}
/**
+ * @ignore
+ */
+ public function isSortRecursiveEnabled()
+ {
+ return $this->enableRecursiveSort === true;
+ }
+
+ /**
+ * @ignore
+ */
+ public function setTableSortedBy($column)
+ {
+ $this->indexNotUpToDate = true;
+ $this->tableSortedBy = $column;
+ }
+
+ /**
* Enables recursive filtering. If this method is called then the {@link filter()} method
* will apply filters to every subtable in addition to this instance.
*/
@@ -397,6 +425,14 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
}
/**
+ * @ignore
+ */
+ public function disableRecursiveFilters()
+ {
+ $this->enableRecursiveFilters = false;
+ }
+
+ /**
* Applies a filter to this datatable.
*
* If {@link enableRecursiveFilters()} was called, the filter will be applied
@@ -434,6 +470,25 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
}
/**
+ * Applies a filter to all subtables but not to this datatable.
+ *
+ * @param string|Closure $className Class name, eg. `"Sort"` or "Piwik\DataTable\Filters\Sort"`. If no
+ * namespace is supplied, `Piwik\DataTable\BaseFilter` is assumed. This parameter
+ * can also be a closure that takes a DataTable as its first parameter.
+ * @param array $parameters Array of extra parameters to pass to the filter.
+ */
+ public function filterSubtables($className, $parameters = array())
+ {
+ foreach ($this->getRows() as $row) {
+ $subtable = $row->getSubtable();
+ if ($subtable) {
+ $subtable->filter($className, $parameters);
+ $subtable->filterSubtables($className, $parameters);
+ }
+ }
+ }
+
+ /**
* Adds a filter and a list of parameters to the list of queued filters. These filters will be
* executed when {@link applyQueuedFilters()} is called.
*
@@ -730,6 +785,14 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
}
/**
+ * @ignore
+ */
+ public function getRowsWithoutSummaryRow()
+ {
+ return $this->rows;
+ }
+
+ /**
* Returns an array containing all column values for the requested column.
*
* @param string $name The column name.
diff --git a/core/DataTable/Filter/Sort.php b/core/DataTable/Filter/Sort.php
index 42441c8e30..632da35dc8 100644
--- a/core/DataTable/Filter/Sort.php
+++ b/core/DataTable/Filter/Sort.php
@@ -21,7 +21,8 @@ use Piwik\Metrics;
*
* @api
*/
-class Sort extends BaseFilter
+class
+Sort extends BaseFilter
{
protected $columnToSort;
protected $order;
@@ -71,34 +72,21 @@ class Sort extends BaseFilter
* @param Row $b
* @return int
*/
- public function numberSort($a, $b)
+ public function numberSort($rowA, $rowB)
{
- $valA = $this->getColumnValue($a);
- $valB = $this->getColumnValue($b);
+ if (isset($rowA[0]) && isset($rowB[0])) {
+ if ($rowA[0] != $rowB[0] || !isset($rowA[1])) {
+ return $this->sign * ($rowA[0] < $rowB[0] ? -1 : 1);
+ } else {
+ return -1 * $this->sign * strnatcasecmp($rowA[1], $rowB[1]);
+ }
+ } elseif (!isset($rowB[0])) {
+ return -1;
+ } elseif (!isset($rowA[0])) {
+ return 1;
+ }
- return !isset($valA)
- && !isset($valB)
- ? 0
- : (
- !isset($valA)
- ? 1
- : (
- !isset($valB)
- ? -1
- : (($valA != $valB
- || !isset($a->c[Row::COLUMNS]['label']))
- ? ($this->sign * (
- $valA
- < $valB
- ? -1
- : 1)
- )
- : -1 * $this->sign * strnatcasecmp(
- $a->c[Row::COLUMNS]['label'],
- $b->c[Row::COLUMNS]['label'])
- )
- )
- );
+ return 0;
}
/**
@@ -108,10 +96,10 @@ class Sort extends BaseFilter
* @param mixed $b
* @return int
*/
- function naturalSort($a, $b)
+ function naturalSort($rowA, $rowB)
{
- $valA = $this->getColumnValue($a);
- $valB = $this->getColumnValue($b);
+ $valA = $rowA[0];
+ $valB = $rowB[0];
return !isset($valA)
&& !isset($valB)
@@ -135,10 +123,10 @@ class Sort extends BaseFilter
* @param mixed $b
* @return int
*/
- function sortString($a, $b)
+ function sortString($rowA, $rowB)
{
- $valA = $this->getColumnValue($a);
- $valB = $this->getColumnValue($b);
+ $valA = $rowA[0];
+ $valB = $rowB[0];
return !isset($valA)
&& !isset($valB)
@@ -243,6 +231,51 @@ class Sort extends BaseFilter
}
}
- $table->sort(array($this, $methodToUse), $this->columnToSort);
+ $this->sort($table, $methodToUse);
}
+
+ /**
+ * Sorts the DataTable rows using the supplied callback function.
+ *
+ * @param string $functionCallback A comparison callback compatible with {@link usort}.
+ * @param string $columnSortedBy The column name `$functionCallback` sorts by. This is stored
+ * so we can determine how the DataTable was sorted in the future.
+ */
+ private function sort(DataTable $table, $functionCallback)
+ {
+ $table->setTableSortedBy($this->columnToSort);
+
+ $rows = $table->getRowsWithoutSummaryRow();
+
+ // get column value and label only once for performance tweak
+ $values = array();
+ foreach ($rows as $key => $row) {
+ $values[$key] = array($this->getColumnValue($row), $row->getColumn('label'));
+ }
+
+ uasort($values, array($this, $functionCallback));
+
+ $sortedRows = array();
+ foreach ($values as $key => $value) {
+ $sortedRows[$key] = $rows[$key];
+ }
+
+ $table->setRows(array_values($sortedRows));
+
+ unset($rows);
+ unset($sortedRows);
+
+ if ($table->isSortRecursiveEnabled()) {
+ foreach ($table->getRows() as $row) {
+
+ $subTable = $row->getSubtable();
+ if ($subTable) {
+ $subTable->enableRecursiveSort();
+ $this->sort($subTable, $functionCallback);
+ }
+ }
+ }
+
+ }
+
}
diff --git a/core/DataTable/Filter/Truncate.php b/core/DataTable/Filter/Truncate.php
index 632eb2755e..a8fa0bd08f 100644
--- a/core/DataTable/Filter/Truncate.php
+++ b/core/DataTable/Filter/Truncate.php
@@ -96,7 +96,7 @@ class Truncate extends BaseFilter
return;
}
- $rows = $table->getRows();
+ $rows = array_values($table->getRows());
$count = $table->getRowsCount();
$newRow = new Row(array(Row::COLUMNS => array('label' => DataTable::LABEL_SUMMARY_ROW)));
diff --git a/core/DataTable/Map.php b/core/DataTable/Map.php
index 8795eac134..8787b06404 100644
--- a/core/DataTable/Map.php
+++ b/core/DataTable/Map.php
@@ -110,6 +110,19 @@ class Map implements DataTableInterface
}
/**
+ * Apply a filter to all subtables contained by this instance.
+ *
+ * @param string|Closure $className Name of filter class or a Closure.
+ * @param array $parameters Parameters to pass to the filter.
+ */
+ public function filterSubtables($className, $parameters = array())
+ {
+ foreach ($this->getDataTables() as $table) {
+ $table->filterSubtables($className, $parameters);
+ }
+ }
+
+ /**
* Returns the array of DataTables contained by this class.
*
* @return DataTable[]|Map[]
@@ -185,6 +198,26 @@ class Map implements DataTableInterface
}
/**
+ * @ignore
+ */
+ public function disableRecursiveFilters()
+ {
+ foreach ($this->getDataTables() as $table) {
+ $table->disableRecursiveFilters();
+ }
+ }
+
+ /**
+ * @ignore
+ */
+ public function enableRecursiveFilters()
+ {
+ foreach ($this->getDataTables() as $table) {
+ $table->enableRecursiveFilters();
+ }
+ }
+
+ /**
* Renames the given column in each contained {@link DataTable}.
*
* See {@link DataTable::renameColumn()}.
diff --git a/core/DataTable/Row.php b/core/DataTable/Row.php
index 5f21f3fdec..71dde68031 100644
--- a/core/DataTable/Row.php
+++ b/core/DataTable/Row.php
@@ -209,37 +209,9 @@ class Row implements \ArrayAccess, \IteratorAggregate
return false;
}
- if ($this->isColumnValueCallable($this->c[self::COLUMNS][$name])) {
- $value = $this->resolveCallableColumn($name);
-
- if (!isset($value)) {
- return false;
- }
-
- return $value;
- }
-
return $this->c[self::COLUMNS][$name];
}
- private function isColumnValueCallable($name)
- {
- if (! is_callable($name)) {
- return false;
- }
-
- if (is_object($name) && ($name instanceof \Closure)) {
- return true;
- }
-
- return is_array($name) && isset($name[0]) && is_object($name[0]);
- }
-
- private function resolveCallableColumn($columnName)
- {
- return call_user_func($this->c[self::COLUMNS][$columnName], $this);
- }
-
/**
* Returns the array of all metadata, or one requested metadata value.
*
@@ -287,16 +259,7 @@ class Row implements \ArrayAccess, \IteratorAggregate
*/
public function getColumns()
{
- $values = array();
- foreach ($this->c[self::COLUMNS] as $columnName => $val) {
- if ($this->isColumnValueCallable($val)) {
- $values[$columnName] = $this->resolveCallableColumn($columnName);
- } else {
- $values[$columnName] = $val;
- }
- }
-
- return $values;
+ return $this->c[self::COLUMNS];
}
/**
@@ -517,11 +480,6 @@ class Row implements \ArrayAccess, \IteratorAggregate
continue;
}
- if ($this->isColumnValueCallable($columnToSumValue)) {
- $this->setColumn($columnToSumName, $columnToSumValue);
- continue;
- }
-
$thisColumnValue = $this->getColumn($columnToSumName);
$operation = 'sum';
diff --git a/core/Plugin/API.php b/core/Plugin/API.php
index cc16cfb64c..4e5095a3aa 100644
--- a/core/Plugin/API.php
+++ b/core/Plugin/API.php
@@ -41,5 +41,5 @@ use Piwik\Singleton;
*/
abstract class API extends Singleton
{
-
+
}
diff --git a/core/Plugin/Metric.php b/core/Plugin/Metric.php
index e475eb837f..6d69350d92 100644
--- a/core/Plugin/Metric.php
+++ b/core/Plugin/Metric.php
@@ -108,26 +108,41 @@ abstract class Metric
*/
public static function getMetric($row, $columnName, $mappingNameToId = null)
{
- if (empty($mappingNameToId)) {
- $mappingNameToId = Metrics::getMappingFromNameToId();
- }
-
if ($row instanceof Row) {
$value = $row->getColumn($columnName);
- if ($value === false
- && isset($mappingNameToId[$columnName])
- ) {
- $value = $row->getColumn($mappingNameToId[$columnName]);
+
+ if ($value === false) {
+
+ if (empty($mappingNameToId)) {
+ $mappingNameToId = Metrics::getMappingFromNameToId();
+ }
+
+ if (isset($mappingNameToId[$columnName])) {
+ return $row->getColumn($mappingNameToId[$columnName]);
+ }
}
+
+ return $value;
+
} else {
- $value = @$row[$columnName];
- if ($value === null
- && isset($mappingNameToId[$columnName])
- ) {
- $columnName = $mappingNameToId[$columnName];
- $value = @$row[$columnName];
+ $value = null;
+ if (array_key_exists($columnName, $row)) {
+ $value = $row[$columnName];
+ } else {
+
+ if (empty($mappingNameToId)) {
+ $mappingNameToId = Metrics::getMappingFromNameToId();
+ }
+
+ if (isset($mappingNameToId[$columnName])) {
+ $columnName = $mappingNameToId[$columnName];
+
+ if (array_key_exists($columnName, $row)) {
+ return $row[$columnName];
+ }
+ }
}
- return $value;
+
}
return $value;
diff --git a/core/Plugin/Report.php b/core/Plugin/Report.php
index 62ed594f8c..b9c407e10e 100644
--- a/core/Plugin/Report.php
+++ b/core/Plugin/Report.php
@@ -182,6 +182,13 @@ class Report
protected $order = 1;
/**
+ * Separator for building recursive labels (or paths)
+ * @var string
+ * @api
+ */
+ protected $recursiveLabelSeparator = ' - ';
+
+ /**
* @var array
* @ignore
*/
@@ -357,6 +364,15 @@ class Report
}
/**
+ * @ignore
+ * @see $recursiveLabelSeparator
+ */
+ public function getRecursiveLabelSeparator()
+ {
+ return $this->recursiveLabelSeparator;
+ }
+
+ /**
* Returns an array of supported metrics and their corresponding translations. Eg `array('nb_visits' => 'Visits')`.
* By default the given {@link $metrics} are used and their corresponding translations are looked up automatically.
* If a metric is not translated, you should add the default metric translation for this metric using
diff --git a/core/UrlHelper.php b/core/UrlHelper.php
index a0bc340bbd..78682acbfc 100644
--- a/core/UrlHelper.php
+++ b/core/UrlHelper.php
@@ -231,7 +231,10 @@ class UrlHelper
$parsedUrl = parse_url($url);
$result = '';
if (isset($parsedUrl['path'])) {
- $result .= substr($parsedUrl['path'], 1);
+ if (substr($parsedUrl['path'], 0, 1) == '/') {
+ $parsedUrl['path'] = substr($parsedUrl['path'], 1);
+ }
+ $result .= $parsedUrl['path'];
}
if (isset($parsedUrl['query'])) {
$result .= '?' . $parsedUrl['query'];
diff --git a/plugins/Actions/API.php b/plugins/Actions/API.php
index 0ec50bceea..7204ddfa50 100644
--- a/plugins/Actions/API.php
+++ b/plugins/Actions/API.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\Actions;
use Exception;
-use Piwik\API\Request;
use Piwik\Archive;
use Piwik\Common;
use Piwik\DataTable;
@@ -84,18 +83,16 @@ class API extends \Piwik\Plugin\API
* @param bool $expanded
* @param bool|int $idSubtable
* @param bool|int $depth
+ * @param bool|int $flat
*
* @return DataTable|DataTable\Map
*/
public function getPageUrls($idSite, $period, $date, $segment = false, $expanded = false, $idSubtable = false,
- $depth = false, $flat= false)
+ $depth = false, $flat = false)
{
- if ($flat && !$idSubtable) {
- $expanded = true;
- }
+ $dataTable = Archive::createDataTableFromArchive('Actions_actions_url', $idSite, $period, $date, $segment, $expanded, $flat, $idSubtable, $depth);
- $dataTable = $this->getDataTableFromArchive('Actions_actions_url', $idSite, $period, $date, $segment, $expanded, $idSubtable, $depth);
- $this->filterActionsDataTable($dataTable, $expanded);
+ $this->filterActionsDataTable($dataTable);
return $dataTable;
}
@@ -172,17 +169,19 @@ class API extends \Piwik\Plugin\API
public function getPageUrl($pageUrl, $idSite, $period, $date, $segment = false)
{
- $callBackParameters = array('Actions_actions_url', $idSite, $period, $date, $segment, $expanded = false, $idSubtable = false);
+ $callBackParameters = array('Actions_actions_url', $idSite, $period, $date, $segment, $expanded = false, $flat = false, $idSubtable = null);
$dataTable = $this->getFilterPageDatatableSearch($callBackParameters, $pageUrl, Action::TYPE_PAGE_URL);
$this->addPageProcessedMetrics($dataTable);
$this->filterActionsDataTable($dataTable);
return $dataTable;
}
- public function getPageTitles($idSite, $period, $date, $segment = false, $expanded = false, $idSubtable = false)
+ public function getPageTitles($idSite, $period, $date, $segment = false, $expanded = false, $idSubtable = false, $flat = false)
{
- $dataTable = $this->getDataTableFromArchive('Actions_actions', $idSite, $period, $date, $segment, $expanded, $idSubtable);
- $this->filterActionsDataTable($dataTable, $expanded);
+ $dataTable = Archive::createDataTableFromArchive('Actions_actions', $idSite, $period, $date, $segment, $expanded, $flat, $idSubtable);
+
+ $this->filterActionsDataTable($dataTable);
+
return $dataTable;
}
@@ -212,38 +211,38 @@ class API extends \Piwik\Plugin\API
public function getPageTitle($pageName, $idSite, $period, $date, $segment = false)
{
- $callBackParameters = array('Actions_actions', $idSite, $period, $date, $segment, $expanded = false, $idSubtable = false);
+ $callBackParameters = array('Actions_actions', $idSite, $period, $date, $segment, $expanded = false, $flat = false, $idSubtable = null);
$dataTable = $this->getFilterPageDatatableSearch($callBackParameters, $pageName, Action::TYPE_PAGE_TITLE);
$this->addPageProcessedMetrics($dataTable);
$this->filterActionsDataTable($dataTable);
return $dataTable;
}
- public function getDownloads($idSite, $period, $date, $segment = false, $expanded = false, $idSubtable = false)
+ public function getDownloads($idSite, $period, $date, $segment = false, $expanded = false, $idSubtable = false, $flat = false)
{
- $dataTable = $this->getDataTableFromArchive('Actions_downloads', $idSite, $period, $date, $segment, $expanded, $idSubtable);
+ $dataTable = Archive::createDataTableFromArchive('Actions_downloads', $idSite, $period, $date, $segment, $expanded, $flat, $idSubtable);
$this->filterActionsDataTable($dataTable, $expanded);
return $dataTable;
}
public function getDownload($downloadUrl, $idSite, $period, $date, $segment = false)
{
- $callBackParameters = array('Actions_downloads', $idSite, $period, $date, $segment, $expanded = false, $idSubtable = false);
+ $callBackParameters = array('Actions_downloads', $idSite, $period, $date, $segment, $expanded = false, $flat = false, $idSubtable = null);
$dataTable = $this->getFilterPageDatatableSearch($callBackParameters, $downloadUrl, Action::TYPE_DOWNLOAD);
$this->filterActionsDataTable($dataTable);
return $dataTable;
}
- public function getOutlinks($idSite, $period, $date, $segment = false, $expanded = false, $idSubtable = false)
+ public function getOutlinks($idSite, $period, $date, $segment = false, $expanded = false, $idSubtable = false, $flat = false)
{
- $dataTable = $this->getDataTableFromArchive('Actions_outlink', $idSite, $period, $date, $segment, $expanded, $idSubtable);
+ $dataTable = Archive::createDataTableFromArchive('Actions_outlink', $idSite, $period, $date, $segment, $expanded, $flat, $idSubtable);
$this->filterActionsDataTable($dataTable, $expanded);
return $dataTable;
}
public function getOutlink($outlinkUrl, $idSite, $period, $date, $segment = false)
{
- $callBackParameters = array('Actions_outlink', $idSite, $period, $date, $segment, $expanded = false, $idSubtable = false);
+ $callBackParameters = array('Actions_outlink', $idSite, $period, $date, $segment, $expanded = false, $flat = false, $idSubtable = null);
$dataTable = $this->getFilterPageDatatableSearch($callBackParameters, $outlinkUrl, Action::TYPE_OUTLINK);
$this->filterActionsDataTable($dataTable);
return $dataTable;
@@ -254,6 +253,7 @@ class API extends \Piwik\Plugin\API
$dataTable = $this->getSiteSearchKeywordsRaw($idSite, $period, $date, $segment);
$dataTable->deleteColumn(PiwikMetrics::INDEX_SITE_SEARCH_HAS_NO_RESULT);
$this->filterActionsDataTable($dataTable);
+ $dataTable->filter('ReplaceColumnNames');
$this->addPagesPerSearchColumn($dataTable);
return $dataTable;
}
@@ -271,7 +271,7 @@ class API extends \Piwik\Plugin\API
protected function getSiteSearchKeywordsRaw($idSite, $period, $date, $segment)
{
- $dataTable = $this->getDataTableFromArchive('Actions_sitesearch', $idSite, $period, $date, $segment, $expanded = false);
+ $dataTable = Archive::createDataTableFromArchive('Actions_sitesearch', $idSite, $period, $date, $segment, $expanded = false);
return $dataTable;
}
@@ -289,6 +289,7 @@ class API extends \Piwik\Plugin\API
$dataTable->deleteRow(DataTable::ID_SUMMARY_ROW);
$dataTable->deleteColumn(PiwikMetrics::INDEX_SITE_SEARCH_HAS_NO_RESULT);
$this->filterActionsDataTable($dataTable);
+ $dataTable->filter('ReplaceColumnNames');
$this->addPagesPerSearchColumn($dataTable);
return $dataTable;
}
@@ -337,6 +338,7 @@ class API extends \Piwik\Plugin\API
}
}
$this->filterActionsDataTable($dataTable);
+ $dataTable->filter('ReplaceColumnNames');
$this->addPagesPerSearchColumn($dataTable, $columnToRead = 'nb_actions');
return $dataTable;
}
@@ -366,7 +368,7 @@ class API extends \Piwik\Plugin\API
if ($table === false) {
// fetch the data table
- $table = call_user_func_array(array($this, 'getDataTableFromArchive'), $callBackParameters);
+ $table = call_user_func_array('\Piwik\Archive::createDataTableFromArchive', $callBackParameters);
if ($table instanceof DataTable\Map) {
// search an array of tables, e.g. when using date=last30
@@ -429,7 +431,7 @@ class API extends \Piwik\Plugin\API
// match found on this level and more levels remaining: go deeper
$idSubTable = $row->getIdSubDataTable();
- $callBackParameters[6] = $idSubTable;
+ $callBackParameters[7] = $idSubTable;
/**
* @var \Piwik\Period $period
@@ -439,7 +441,7 @@ class API extends \Piwik\Plugin\API
$callBackParameters[3] = $period->getDateStart() . ',' . $period->getDateEnd();
}
- $table = call_user_func_array(array($this, 'getDataTableFromArchive'), $callBackParameters);
+ $table = call_user_func_array('\Piwik\Archive::createDataTableFromArchive', $callBackParameters);
return $this->doFilterPageDatatableSearch($callBackParameters, $table, $searchTree);
}
@@ -450,28 +452,15 @@ class API extends \Piwik\Plugin\API
* Common filters for all Actions API
*
* @param DataTable|DataTable\Simple|DataTable\Map $dataTable
- * @param bool $expanded
*/
- protected function filterActionsDataTable($dataTable, $expanded = false)
+ 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('ReplaceColumnNames');
- $dataTable->filter('Sort', array('nb_visits', 'desc', $naturalSort = false, $expanded));
- $dataTable->filter(function (DataTable $dataTable) {
- foreach ($dataTable->getRows() as $row) {
- $url = $row->getMetadata('url');
- if ($url) {
- $row->setMetadata('segmentValue', urldecode($url));
- }
- }
- });
- $dataTable->filter('GroupBy', array('label', function ($label) {
- return urldecode($label);
- }));
+ $dataTable->filter('Piwik\Plugins\Actions\DataTable\Filter\Actions');
- $dataTable->queueFilter('ReplaceSummaryRowLabel');
+ return $dataTable;
}
/**
@@ -505,11 +494,6 @@ class API extends \Piwik\Plugin\API
);
}
- protected function getDataTableFromArchive($name, $idSite, $period, $date, $segment, $expanded = false, $idSubtable = null, $depth = null)
- {
- return Archive::getDataTableFromArchive($name, $idSite, $period, $date, $segment, $expanded, $idSubtable, $depth);
- }
-
private function addPageProcessedMetrics(DataTable\DataTableInterface $dataTable)
{
$dataTable->filter(function (DataTable $table) {
diff --git a/plugins/Actions/DataTable/Filter/Actions.php b/plugins/Actions/DataTable/Filter/Actions.php
new file mode 100644
index 0000000000..71abe4190b
--- /dev/null
+++ b/plugins/Actions/DataTable/Filter/Actions.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\Actions\DataTable\Filter;
+
+use Piwik\DataTable\BaseFilter;
+use Piwik\DataTable\Row;
+use Piwik\DataTable;
+
+class Actions extends BaseFilter
+{
+ /**
+ * Constructor.
+ *
+ * @param DataTable $table The table to eventually filter.
+ */
+ public function __construct($table)
+ {
+ parent::__construct($table);
+ }
+
+ /**
+ * @param DataTable $table
+ */
+ public function filter($table)
+ {
+ $table->filter(function (DataTable $dataTable) {
+ foreach ($dataTable->getRows() as $row) {
+ $url = $row->getMetadata('url');
+ if ($url) {
+ $row->setMetadata('segmentValue', urldecode($url));
+ }
+ }
+ });
+
+ // TODO can we remove this one again?
+ $table->queueFilter('GroupBy', array('label', function ($label) {
+ return urldecode($label);
+ }));
+
+ foreach ($table->getRows() as $row) {
+ $subtable = $row->getSubtable();
+ if ($subtable) {
+ $this->filter($subtable);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/plugins/Actions/Reports/Base.php b/plugins/Actions/Reports/Base.php
index 68bca741a3..6d7146ae73 100644
--- a/plugins/Actions/Reports/Base.php
+++ b/plugins/Actions/Reports/Base.php
@@ -22,6 +22,7 @@ abstract class Base extends \Piwik\Plugin\Report
{
$this->category = 'General_Actions';
$this->processedMetrics = false;
+ $this->recursiveLabelSeparator = '/';
}
protected function addBaseDisplayProperties(ViewDataTable $view)
diff --git a/plugins/Events/API.php b/plugins/Events/API.php
index bb6584b777..7950cd2637 100644
--- a/plugins/Events/API.php
+++ b/plugins/Events/API.php
@@ -148,14 +148,17 @@ class API extends \Piwik\Plugin\API
}
}
- protected function getDataTable($name, $idSite, $period, $date, $segment, $expanded = false, $idSubtable = null, $secondaryDimension = false)
+ protected function getDataTable($name, $idSite, $period, $date, $segment, $expanded = false, $idSubtable = null, $secondaryDimension = false, $flat = false)
{
Piwik::checkUserHasViewAccess($idSite);
$this->checkSecondaryDimension($name, $secondaryDimension);
$recordName = $this->getRecordNameForAction($name, $secondaryDimension);
- $dataTable = Archive::getDataTableFromArchive($recordName, $idSite, $period, $date, $segment, $expanded, $idSubtable);
- if (empty($idSubtable)) {
+ $dataTable = Archive::createDataTableFromArchive($recordName, $idSite, $period, $date, $segment, $expanded, $flat, $idSubtable);
+
+ if ($flat) {
+ $dataTable->filterSubtables('Piwik\Plugins\Events\DataTable\Filter\ReplaceEventNameNotSet');
+ } else {
$dataTable->filter('AddSegmentValue', array(function ($label) {
if ($label === Archiver::EVENT_NAME_NOT_SET) {
return false;
@@ -165,23 +168,24 @@ class API extends \Piwik\Plugin\API
}));
}
- $this->filterDataTable($dataTable);
+ $dataTable->filter('Piwik\Plugins\Events\DataTable\Filter\ReplaceEventNameNotSet');
+
return $dataTable;
}
- public function getCategory($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false)
+ public function getCategory($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false, $flat = false)
{
- return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension);
+ return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension, $flat);
}
- public function getAction($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false)
+ public function getAction($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false, $flat = false)
{
- return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension);
+ return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension, $flat);
}
- public function getName($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false)
+ public function getName($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false, $flat = false)
{
- return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension);
+ return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension, $flat);
}
public function getActionFromCategoryId($idSite, $period, $date, $idSubtable, $segment = false)
@@ -213,20 +217,4 @@ class API extends \Piwik\Plugin\API
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
-
- /**
- * @param DataTable $dataTable
- */
- protected function filterDataTable($dataTable)
- {
- $dataTable->filter('Sort', array(Metrics::INDEX_NB_VISITS));
- $dataTable->queueFilter('ReplaceColumnNames');
- $dataTable->queueFilter('ReplaceSummaryRowLabel');
- $dataTable->filter(function (DataTable $table) {
- $row = $table->getRowFromLabel(Archiver::EVENT_NAME_NOT_SET);
- if ($row) {
- $row->setColumn('label', Piwik::translate('General_NotDefined', Piwik::translate('Events_EventName')));
- }
- });
- }
} \ No newline at end of file
diff --git a/plugins/Events/DataTable/Filter/ReplaceEventNameNotSet.php b/plugins/Events/DataTable/Filter/ReplaceEventNameNotSet.php
new file mode 100644
index 0000000000..a07695b5f8
--- /dev/null
+++ b/plugins/Events/DataTable/Filter/ReplaceEventNameNotSet.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\Events\DataTable\Filter;
+
+use Piwik\DataTable\BaseFilter;
+use Piwik\DataTable\Row;
+use Piwik\DataTable;
+use Piwik\Piwik;
+use Piwik\Plugins\Events\Archiver;
+
+class ReplaceEventNameNotSet extends BaseFilter
+{
+ /**
+ * Constructor.
+ *
+ * @param DataTable $table The table to eventually filter.
+ */
+ public function __construct($table)
+ {
+ parent::__construct($table);
+ }
+
+ /**
+ * @param DataTable $table
+ */
+ public function filter($table)
+ {
+ $row = $table->getRowFromLabel(Archiver::EVENT_NAME_NOT_SET);
+ if ($row) {
+ $row->setColumn('label', Piwik::translate('General_NotDefined', Piwik::translate('Events_EventName')));
+ }
+ }
+} \ No newline at end of file
diff --git a/plugins/Referrers/API.php b/plugins/Referrers/API.php
index 4ac28978e3..aa1a3e0419 100644
--- a/plugins/Referrers/API.php
+++ b/plugins/Referrers/API.php
@@ -43,7 +43,6 @@ class API extends \Piwik\Plugin\API
protected function getDataTable($name, $idSite, $period, $date, $segment, $expanded = false, $idSubtable = null)
{
$dataTable = Archive::getDataTableFromArchive($name, $idSite, $period, $date, $segment, $expanded, $idSubtable);
- $dataTable->filter('Sort', array(Metrics::INDEX_NB_VISITS, 'desc', $naturalSort = false, $expanded));
$dataTable->queueFilter('ReplaceColumnNames');
return $dataTable;
}
@@ -296,22 +295,24 @@ class API extends \Piwik\Plugin\API
return $dataTable;
}
- public function getWebsites($idSite, $period, $date, $segment = false, $expanded = false)
+ public function getWebsites($idSite, $period, $date, $segment = false, $expanded = false, $flat = false)
{
- $dataTable = $this->getDataTable(Archiver::WEBSITES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded);
- $dataTable->filter('AddSegmentByLabel', array('referrerName'));
+ $dataTable = Archive::createDataTableFromArchive(Archiver::WEBSITES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded, $flat, $idSubtable = null);
+
+ if ($flat) {
+ $dataTable->filterSubtables('Piwik\Plugins\Referrers\DataTable\Filter\UrlsFromWebsiteId');
+ } else {
+ $dataTable->filter('AddSegmentByLabel', array('referrerName'));
+ }
+
return $dataTable;
}
public function getUrlsFromWebsiteId($idSite, $period, $date, $idSubtable, $segment = false)
{
$dataTable = $this->getDataTable(Archiver::WEBSITES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
- // the htmlspecialchars_decode call is for BC for before 1.1
- // as the Referrer URL was previously encoded in the log tables, but is now recorded raw
- $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', function ($label) {
- return htmlspecialchars_decode($label);
- }));
- $dataTable->queueFilter('ColumnCallbackReplace', array('label', __NAMESPACE__ . '\getPathFromUrl'));
+ $dataTable->filter('Piwik\Plugins\Referrers\DataTable\Filter\UrlsFromWebsiteId');
+
return $dataTable;
}
diff --git a/plugins/Referrers/DataTable/Filter/UrlsFromWebsiteId.php b/plugins/Referrers/DataTable/Filter/UrlsFromWebsiteId.php
new file mode 100644
index 0000000000..c35d60b463
--- /dev/null
+++ b/plugins/Referrers/DataTable/Filter/UrlsFromWebsiteId.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\Referrers\DataTable\Filter;
+
+use Piwik\DataTable\BaseFilter;
+use Piwik\DataTable\Row;
+use Piwik\DataTable;
+
+class UrlsFromWebsiteId extends BaseFilter
+{
+ /**
+ * Constructor.
+ *
+ * @param DataTable $table The table to eventually filter.
+ */
+ public function __construct($table)
+ {
+ parent::__construct($table);
+ }
+
+ /**
+ * @param DataTable $table
+ */
+ public function filter($table)
+ {
+ // the htmlspecialchars_decode call is for BC for before 1.1
+ // as the Referrer URL was previously encoded in the log tables, but is now recorded raw
+ $table->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', function ($label) {
+ return htmlspecialchars_decode($label);
+ }));
+ $table->queueFilter('ColumnCallbackReplace', array('label', 'Piwik\Plugins\Referrers\getPathFromUrl'));
+
+ foreach ($table->getRows() as $row) {
+ $subtable = $row->getSubtable();
+ if ($subtable) {
+ $this->filter($subtable);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/plugins/Referrers/Reports/GetWebsites.php b/plugins/Referrers/Reports/GetWebsites.php
index e394eb43d9..18f9336a63 100644
--- a/plugins/Referrers/Reports/GetWebsites.php
+++ b/plugins/Referrers/Reports/GetWebsites.php
@@ -21,6 +21,7 @@ class GetWebsites extends Base
$this->dimension = new Website();
$this->name = Piwik::translate('CorePluginsAdmin_Websites');
$this->documentation = Piwik::translate('Referrers_WebsitesReportDocumentation', '<br />');
+ $this->recursiveLabelSeparator = '/';
$this->actionToLoadSubTables = 'getUrlsFromWebsiteId';
$this->hasGoalMetrics = true;
$this->order = 5;
diff --git a/tests/PHPUnit/System/BlobReportLimitingTest.php b/tests/PHPUnit/System/BlobReportLimitingTest.php
index f40305d1ad..84734b7b80 100755
--- a/tests/PHPUnit/System/BlobReportLimitingTest.php
+++ b/tests/PHPUnit/System/BlobReportLimitingTest.php
@@ -94,6 +94,23 @@ class BlobReportLimitingTest extends SystemTestCase
$this->runApiTests($api, $params);
}
+ /**
+ * @dataProvider getApiForTesting
+ */
+ public function testApiWithFlattening($apiToCall, $params)
+ {
+ if (empty($params['testSuffix'])) {
+ $params['testSuffix'] = '';
+ }
+ $params['testSuffix'] .= '_flattened';
+ if (empty($params['otherRequestParameters'])) {
+ $params['otherRequestParameters'] = array();
+ }
+ $params['otherRequestParameters']['flat'] = '1';
+
+ $this->runApiTests($apiToCall, $params);
+ }
+
public function testApiWithRankingQuery()
{
// custom setup
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
index ee9ccea1e0..acf2eb6cf2 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
@@ -222,11 +222,7 @@
<result prettyDate="Saturday 9 January 2010" />
</reportData>
<reportMetadata>
- <result prettyDate="Sunday 3 January 2010">
- <row>
- <segment>eventAction==Purchase</segment>
- </row>
- </result>
+ <result prettyDate="Sunday 3 January 2010" />
<result prettyDate="Monday 4 January 2010" />
<result prettyDate="Tuesday 5 January 2010" />
<result prettyDate="Wednesday 6 January 2010" />
@@ -235,7 +231,7 @@
<result prettyDate="Saturday 9 January 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>38</nb_visits>
- <nb_uniq_visitors>38</nb_uniq_visitors>
+ <nb_visits>42</nb_visits>
+ <nb_uniq_visitors>40</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_FlattenReports__Actions.getPageUrls_week.xml b/tests/PHPUnit/System/expected/test_FlattenReports__Actions.getPageUrls_week.xml
index 59b45f61fe..1f0e32ad7d 100644
--- a/tests/PHPUnit/System/expected/test_FlattenReports__Actions.getPageUrls_week.xml
+++ b/tests/PHPUnit/System/expected/test_FlattenReports__Actions.getPageUrls_week.xml
@@ -179,6 +179,7 @@
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>100%</exit_rate>
+ <avg_time_generation>0</avg_time_generation>
<url>http://example.org/page1.html</url>
<segment>pageUrl==http%3A%2F%2Fexample.org%2Fpage1.html</segment>
</row>
@@ -187,6 +188,9 @@
<nb_visits>1</nb_visits>
<nb_hits>1</nb_hits>
<sum_time_spent>0</sum_time_spent>
+ <nb_hits_with_time_generation>0</nb_hits_with_time_generation>
+ <min_time_generation />
+ <max_time_generation />
<entry_nb_visits>1</entry_nb_visits>
<entry_nb_actions>2</entry_nb_actions>
<entry_sum_visit_length>1</entry_sum_visit_length>
@@ -196,6 +200,7 @@
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>0%</exit_rate>
+ <avg_time_generation>0</avg_time_generation>
<url>http://example.org/sub/dir/dir1/page1.html</url>
<segment>pageUrl==http%3A%2F%2Fexample.org%2Fsub%2Fdir%2Fdir1%2Fpage1.html</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_FlattenReports_withAggregate__Actions.getPageUrls_week.xml b/tests/PHPUnit/System/expected/test_FlattenReports_withAggregate__Actions.getPageUrls_week.xml
index d02a61ce87..f5a617dfd0 100644
--- a/tests/PHPUnit/System/expected/test_FlattenReports_withAggregate__Actions.getPageUrls_week.xml
+++ b/tests/PHPUnit/System/expected/test_FlattenReports_withAggregate__Actions.getPageUrls_week.xml
@@ -76,8 +76,8 @@
<exit_rate>0%</exit_rate>
<avg_time_generation>0.15</avg_time_generation>
<url>http://example.org/dir1/sub/dir/page0.html</url>
- <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir1%2Fsub%2Fdir%2Fpage0.html</segment>
<is_aggregate>0</is_aggregate>
+ <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir1%2Fsub%2Fdir%2Fpage0.html</segment>
</row>
<row>
<label>dir1/sub/dir/page1.html</label>
@@ -93,8 +93,8 @@
<exit_rate>0%</exit_rate>
<avg_time_generation>0.3</avg_time_generation>
<url>http://example.org/dir1/sub/dir/page1.html</url>
- <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir1%2Fsub%2Fdir%2Fpage1.html</segment>
<is_aggregate>0</is_aggregate>
+ <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir1%2Fsub%2Fdir%2Fpage1.html</segment>
</row>
<row>
<label>dir1/sub/dir/page2.html</label>
@@ -112,8 +112,8 @@
<exit_rate>100%</exit_rate>
<avg_time_generation>0.45</avg_time_generation>
<url>http://example.org/dir1/sub/dir/page2.html</url>
- <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir1%2Fsub%2Fdir%2Fpage2.html</segment>
<is_aggregate>0</is_aggregate>
+ <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir1%2Fsub%2Fdir%2Fpage2.html</segment>
</row>
<row>
<label>dir2</label>
@@ -191,8 +191,8 @@
<exit_rate>0%</exit_rate>
<avg_time_generation>0.3</avg_time_generation>
<url>http://example.org/dir2/sub/dir/page0.html</url>
- <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir2%2Fsub%2Fdir%2Fpage0.html</segment>
<is_aggregate>0</is_aggregate>
+ <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir2%2Fsub%2Fdir%2Fpage0.html</segment>
</row>
<row>
<label>dir2/sub/dir/page1.html</label>
@@ -208,8 +208,8 @@
<exit_rate>0%</exit_rate>
<avg_time_generation>0.6</avg_time_generation>
<url>http://example.org/dir2/sub/dir/page1.html</url>
- <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir2%2Fsub%2Fdir%2Fpage1.html</segment>
<is_aggregate>0</is_aggregate>
+ <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir2%2Fsub%2Fdir%2Fpage1.html</segment>
</row>
<row>
<label>dir2/sub/dir/page2.html</label>
@@ -227,8 +227,8 @@
<exit_rate>100%</exit_rate>
<avg_time_generation>0.9</avg_time_generation>
<url>http://example.org/dir2/sub/dir/page2.html</url>
- <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir2%2Fsub%2Fdir%2Fpage2.html</segment>
<is_aggregate>0</is_aggregate>
+ <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir2%2Fsub%2Fdir%2Fpage2.html</segment>
</row>
<row>
<label>dir3</label>
@@ -306,8 +306,8 @@
<exit_rate>0%</exit_rate>
<avg_time_generation>0.45</avg_time_generation>
<url>http://example.org/dir3/sub/dir/page0.html</url>
- <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir3%2Fsub%2Fdir%2Fpage0.html</segment>
<is_aggregate>0</is_aggregate>
+ <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir3%2Fsub%2Fdir%2Fpage0.html</segment>
</row>
<row>
<label>dir3/sub/dir/page1.html</label>
@@ -323,8 +323,8 @@
<exit_rate>0%</exit_rate>
<avg_time_generation>0.9</avg_time_generation>
<url>http://example.org/dir3/sub/dir/page1.html</url>
- <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir3%2Fsub%2Fdir%2Fpage1.html</segment>
<is_aggregate>0</is_aggregate>
+ <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir3%2Fsub%2Fdir%2Fpage1.html</segment>
</row>
<row>
<label>dir3/sub/dir/page2.html</label>
@@ -342,8 +342,8 @@
<exit_rate>100%</exit_rate>
<avg_time_generation>1.35</avg_time_generation>
<url>http://example.org/dir3/sub/dir/page2.html</url>
- <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir3%2Fsub%2Fdir%2Fpage2.html</segment>
<is_aggregate>0</is_aggregate>
+ <segment>pageUrl==http%3A%2F%2Fexample.org%2Fdir3%2Fsub%2Fdir%2Fpage2.html</segment>
</row>
<row>
<label>page1.html</label>
@@ -387,6 +387,9 @@
<nb_visits>1</nb_visits>
<nb_hits>1</nb_hits>
<sum_time_spent>0</sum_time_spent>
+ <nb_hits_with_time_generation>0</nb_hits_with_time_generation>
+ <min_time_generation />
+ <max_time_generation>0</max_time_generation>
<entry_nb_visits>1</entry_nb_visits>
<entry_nb_actions>2</entry_nb_actions>
<entry_sum_visit_length>1</entry_sum_visit_length>
@@ -402,6 +405,9 @@
<nb_visits>1</nb_visits>
<nb_hits>1</nb_hits>
<sum_time_spent>0</sum_time_spent>
+ <nb_hits_with_time_generation>0</nb_hits_with_time_generation>
+ <min_time_generation />
+ <max_time_generation>0</max_time_generation>
<entry_nb_visits>1</entry_nb_visits>
<entry_nb_actions>2</entry_nb_actions>
<entry_sum_visit_length>1</entry_sum_visit_length>
@@ -417,6 +423,9 @@
<nb_visits>1</nb_visits>
<nb_hits>1</nb_hits>
<sum_time_spent>0</sum_time_spent>
+ <nb_hits_with_time_generation>0</nb_hits_with_time_generation>
+ <min_time_generation />
+ <max_time_generation />
<entry_nb_visits>1</entry_nb_visits>
<entry_nb_actions>2</entry_nb_actions>
<entry_sum_visit_length>1</entry_sum_visit_length>
@@ -428,7 +437,7 @@
<exit_rate>0%</exit_rate>
<avg_time_generation>0</avg_time_generation>
<url>http://example.org/sub/dir/dir1/page1.html</url>
- <segment>pageUrl==http%3A%2F%2Fexample.org%2Fsub%2Fdir%2Fdir1%2Fpage1.html</segment>
<is_aggregate>0</is_aggregate>
+ <segment>pageUrl==http%3A%2F%2Fexample.org%2Fsub%2Fdir%2Fdir1%2Fpage1.html</segment>
</row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getDownloads_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getDownloads_day.xml
new file mode 100644
index 0000000000..72511ca5a3
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getDownloads_day.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>cloudsite5.com/20/download</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <url>http://cloudsite5.com/20/download</url>
+ </row>
+ <row>
+ <label>cloudsite5.com/ - Others</label>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ </row>
+ <row>
+ <label>cloudsite6.com/24/download</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <url>http://cloudsite6.com/24/download</url>
+ </row>
+ <row>
+ <label>cloudsite6.com/ - Others</label>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ </row>
+ <row>
+ <label>cloudsite7.com/28/download</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <url>http://cloudsite7.com/28/download</url>
+ </row>
+ <row>
+ <label>cloudsite7.com/ - Others</label>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_visits>10</nb_visits>
+ <nb_hits>10</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>10</entry_nb_visits>
+ <entry_nb_actions>10</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>10</entry_bounce_count>
+ <exit_nb_visits>10</exit_nb_visits>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getOutlinks_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getOutlinks_day.xml
new file mode 100644
index 0000000000..b64d792953
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getOutlinks_day.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>othersite10.com/</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <url>http://othersite10.com/</url>
+ </row>
+ <row>
+ <label>othersite10.com/ - Others</label>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ </row>
+ <row>
+ <label>othersite11.com/</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <url>http://othersite11.com/</url>
+ </row>
+ <row>
+ <label>othersite11.com/ - Others</label>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ </row>
+ <row>
+ <label>othersite12.com/</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <url>http://othersite12.com/</url>
+ </row>
+ <row>
+ <label>othersite12.com/ - Others</label>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_visits>10</nb_visits>
+ <nb_hits>10</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>10</entry_nb_visits>
+ <entry_nb_actions>10</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>10</entry_bounce_count>
+ <exit_nb_visits>10</exit_nb_visits>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getPageTitles_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getPageTitles_day.xml
new file mode 100644
index 0000000000..cad09e34a6
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getPageTitles_day.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>title_0/title_0</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ </row>
+ <row>
+ <label>title_0/ - Others</label>
+ <nb_visits>3</nb_visits>
+ <nb_hits>3</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>3</entry_nb_visits>
+ <entry_nb_actions>3</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>3</entry_bounce_count>
+ <exit_nb_visits>3</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ </row>
+ <row>
+ <label>title_0</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ </row>
+ <row>
+ <label>title_1</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_visits>19</nb_visits>
+ <nb_hits>19</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>19</entry_nb_visits>
+ <entry_nb_actions>19</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>19</entry_bounce_count>
+ <exit_nb_visits>19</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getPageUrls_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getPageUrls_day.xml
new file mode 100644
index 0000000000..d040324503
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Actions.getPageUrls_day.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>0/index</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ <url>http://piwik.net/0/</url>
+ <segment>pageUrl==http%3A%2F%2Fpiwik.net%2F0%2F</segment>
+ </row>
+ <row>
+ <label>0/ - Others</label>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ </row>
+ <row>
+ <label>1/index</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ <url>http://piwik.net/1/</url>
+ <segment>pageUrl==http%3A%2F%2Fpiwik.net%2F1%2F</segment>
+ </row>
+ <row>
+ <label>1/ - Others</label>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ </row>
+ <row>
+ <label>2/index</label>
+ <nb_visits>1</nb_visits>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_hits>1</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
+ <entry_nb_visits>1</entry_nb_visits>
+ <entry_nb_actions>1</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>1</entry_bounce_count>
+ <exit_nb_uniq_visitors>1</exit_nb_uniq_visitors>
+ <exit_nb_visits>1</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ <url>http://piwik.net/2/</url>
+ <segment>pageUrl==http%3A%2F%2Fpiwik.net%2F2%2F</segment>
+ </row>
+ <row>
+ <label>2/ - Others</label>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_visits>10</nb_visits>
+ <nb_hits>10</nb_hits>
+ <sum_time_spent>0</sum_time_spent>
+ <entry_nb_visits>10</entry_nb_visits>
+ <entry_nb_actions>10</entry_nb_actions>
+ <entry_sum_visit_length>0</entry_sum_visit_length>
+ <entry_bounce_count>10</entry_bounce_count>
+ <exit_nb_visits>10</exit_nb_visits>
+ <avg_time_on_page>0</avg_time_on_page>
+ <bounce_rate>100%</bounce_rate>
+ <exit_rate>100%</exit_rate>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__CustomVariables.getCustomVariables_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__CustomVariables.getCustomVariables_day.xml
new file mode 100644
index 0000000000..174bde9a67
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__CustomVariables.getCustomVariables_day.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>liked - y</label>
+ <nb_visits>16</nb_visits>
+ <nb_actions>16</nb_actions>
+ </row>
+ <row>
+ <label>liked - Others</label>
+ <nb_visits>4</nb_visits>
+ <nb_actions>4</nb_actions>
+ </row>
+ <row>
+ <label>tweeted - n</label>
+ <nb_visits>10</nb_visits>
+ <nb_actions>10</nb_actions>
+ </row>
+ <row>
+ <label>tweeted - Others</label>
+ <nb_visits>10</nb_visits>
+ <nb_actions>10</nb_actions>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_actions>60</nb_actions>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__DevicesDetection.getBrowserVersions_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__DevicesDetection.getBrowserVersions_day.xml
new file mode 100644
index 0000000000..23bcf1329b
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__DevicesDetection.getBrowserVersions_day.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Firefox 6.0</label>
+ <nb_uniq_visitors>3</nb_uniq_visitors>
+ <nb_visits>15</nb_visits>
+ <nb_actions>15</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>15</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <segment>browserCode==FF;browserVersion==6.0</segment>
+ <logo>plugins/DevicesDetection/images/browsers/FF.gif</logo>
+ </row>
+ <row>
+ <label>Internet Explorer 9.0</label>
+ <nb_uniq_visitors>3</nb_uniq_visitors>
+ <nb_visits>15</nb_visits>
+ <nb_actions>15</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>15</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <segment>browserCode==IE;browserVersion==9.0</segment>
+ <logo>plugins/DevicesDetection/images/browsers/IE.gif</logo>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>9</nb_uniq_visitors>
+ <nb_visits>45</nb_visits>
+ <nb_actions>45</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>45</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <logo>plugins/DevicesDetection/images/browsers/UNK.gif</logo>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__DevicesDetection.getOsVersions_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__DevicesDetection.getOsVersions_day.xml
new file mode 100644
index 0000000000..99b2ce1993
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__DevicesDetection.getOsVersions_day.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>GNU/Linux</label>
+ <nb_uniq_visitors>4</nb_uniq_visitors>
+ <nb_visits>20</nb_visits>
+ <nb_actions>20</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>20</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <segment>operatingSystemCode==LIN;operatingSystemVersion==</segment>
+ <logo>plugins/DevicesDetection/images/os/LIN.gif</logo>
+ </row>
+ <row>
+ <label>Android 4.0</label>
+ <nb_uniq_visitors>3</nb_uniq_visitors>
+ <nb_visits>15</nb_visits>
+ <nb_actions>15</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>15</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <segment>operatingSystemCode==AND;operatingSystemVersion==4.0</segment>
+ <logo>plugins/DevicesDetection/images/os/AND.gif</logo>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>8</nb_uniq_visitors>
+ <nb_visits>40</nb_visits>
+ <nb_actions>40</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>40</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <logo>plugins/DevicesDetection/images/os/UNK.gif</logo>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsCategory_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsCategory_day.xml
new file mode 100644
index 0000000000..a8d3e17e53
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsCategory_day.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Books Cat #0</label>
+ <nb_uniq_visitors>5</nb_uniq_visitors>
+ <nb_visits>5</nb_visits>
+ <nb_actions>5</nb_actions>
+ <avg_price>7.5</avg_price>
+ <avg_quantity>0</avg_quantity>
+ <conversion_rate>0%</conversion_rate>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>20</nb_uniq_visitors>
+ <nb_visits>20</nb_visits>
+ <nb_actions>20</nb_actions>
+ <avg_price>30</avg_price>
+ <avg_quantity>0</avg_quantity>
+ <conversion_rate>0%</conversion_rate>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsName_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsName_day.xml
new file mode 100644
index 0000000000..95cb364b56
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsName_day.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Book0</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <avg_price>7.5</avg_price>
+ <avg_quantity>0</avg_quantity>
+ <conversion_rate>0%</conversion_rate>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>24</nb_uniq_visitors>
+ <nb_visits>24</nb_visits>
+ <nb_actions>24</nb_actions>
+ <avg_price>180</avg_price>
+ <avg_quantity>0</avg_quantity>
+ <conversion_rate>0%</conversion_rate>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsSku_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsSku_day.xml
new file mode 100644
index 0000000000..c234bed59e
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Goals.getItemsSku_day.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result /> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getAll_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getAll_day.xml
new file mode 100644
index 0000000000..8202c35460
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getAll_day.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>whatever1.com</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <referer_type>3</referer_type>
+ </row>
+ <row>
+ <label>whatever0.com</label>
+ <nb_uniq_visitors>3</nb_uniq_visitors>
+ <nb_visits>4</nb_visits>
+ <nb_actions>4</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>4</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <referer_type>3</referer_type>
+ </row>
+ <row>
+ <label>search term 2</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <referer_type>2</referer_type>
+ </row>
+ <row>
+ <label>this search term</label>
+ <nb_uniq_visitors>3</nb_uniq_visitors>
+ <nb_visits>3</nb_visits>
+ <nb_actions>3</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>3</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <referer_type>2</referer_type>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>9</nb_uniq_visitors>
+ <nb_visits>9</nb_visits>
+ <nb_actions>9</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>2</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>9</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getKeywords_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getKeywords_day.xml
new file mode 100644
index 0000000000..d093798ebf
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getKeywords_day.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>this search term - Ask</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>this search term - Others</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>search term 2 - Alexa</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>search term 2 - Babylon</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>7</nb_uniq_visitors>
+ <nb_visits>7</nb_visits>
+ <nb_actions>7</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>7</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getReferrerType_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getReferrerType_day.xml
new file mode 100644
index 0000000000..f07a335d7a
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getReferrerType_day.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Direct Entry</label>
+ <nb_uniq_visitors>15</nb_uniq_visitors>
+ <nb_visits>55</nb_visits>
+ <nb_actions>55</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>55</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>Search Engines - this search term</label>
+ <nb_uniq_visitors>3</nb_uniq_visitors>
+ <nb_visits>3</nb_visits>
+ <nb_actions>3</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>3</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>Search Engines - search term 2</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>Search Engines - Others</label>
+ <nb_uniq_visitors>7</nb_uniq_visitors>
+ <nb_visits>7</nb_visits>
+ <nb_actions>7</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>7</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>Websites - whatever0.com</label>
+ <nb_uniq_visitors>3</nb_uniq_visitors>
+ <nb_visits>4</nb_visits>
+ <nb_actions>4</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>4</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>Websites - whatever1.com</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>Websites - Others</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getSearchEngines_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getSearchEngines_day.xml
new file mode 100644
index 0000000000..cb1d70e35b
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getSearchEngines_day.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Google - search term 3</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <logo>plugins/Referrers/images/searchEngines/google.com.png</logo>
+ </row>
+ <row>
+ <label>Google - Others</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <logo>plugins/Referrers/images/searchEngines/google.com.png</logo>
+ </row>
+ <row>
+ <label>Yahoo! - search term 4</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <logo>plugins/Referrers/images/searchEngines/search.yahoo.com.png</logo>
+ </row>
+ <row>
+ <label>Yahoo! - Others</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <logo>plugins/Referrers/images/searchEngines/search.yahoo.com.png</logo>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>6</nb_uniq_visitors>
+ <nb_visits>6</nb_visits>
+ <nb_actions>6</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>6</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <url>URL unknown!</url>
+ <logo>plugins/Referrers/images/searchEngines/xx.png</logo>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getWebsites_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getWebsites_day.xml
new file mode 100644
index 0000000000..3691c0259b
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getWebsites_day.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>whatever0.com/index</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <url>http://whatever0.com/0</url>
+ </row>
+ <row>
+ <label>whatever0.com/ - Others</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <url>Others</url>
+ </row>
+ <row>
+ <label>whatever1.com/index</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <url>http://whatever1.com/0</url>
+ </row>
+ <row>
+ <label>whatever1.com/2</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <url>http://whatever1.com/2</url>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>2</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>2</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Resolution.getConfiguration_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Resolution.getConfiguration_day.xml
new file mode 100644
index 0000000000..b90214c2e9
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Resolution.getConfiguration_day.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>GNU/Linux / Firefox / 1920x1080</label>
+ <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_visits>10</nb_visits>
+ <nb_actions>10</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>10</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>Android / Chrome / 1280x1024</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>5</nb_visits>
+ <nb_actions>5</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>5</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>12</nb_uniq_visitors>
+ <nb_visits>60</nb_visits>
+ <nb_actions>60</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>60</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Resolution.getResolution_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Resolution.getResolution_day.xml
new file mode 100644
index 0000000000..70e4bab0ff
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Resolution.getResolution_day.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>1920x1080</label>
+ <nb_uniq_visitors>4</nb_uniq_visitors>
+ <nb_visits>20</nb_visits>
+ <nb_actions>20</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>20</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <segment>resolution==1920x1080</segment>
+ </row>
+ <row>
+ <label>1280x1024</label>
+ <nb_uniq_visitors>3</nb_uniq_visitors>
+ <nb_visits>15</nb_visits>
+ <nb_actions>15</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>15</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <segment>resolution==1280x1024</segment>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>8</nb_uniq_visitors>
+ <nb_visits>40</nb_visits>
+ <nb_actions>40</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>40</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getCity_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getCity_day.xml
new file mode 100644
index 0000000000..b9c8e33524
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getCity_day.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Melbourne, Victoria, Australia</label>
+ <nb_uniq_visitors>4</nb_uniq_visitors>
+ <nb_visits>20</nb_visits>
+ <nb_actions>20</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>20</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <segment>city==Melbourne;regionCode==07;countryCode==au</segment>
+ <city_name>Melbourne</city_name>
+ <region>07</region>
+ <country>au</country>
+ <country_name>Australia</country_name>
+ <region_name>Victoria</region_name>
+ <logo>plugins/UserCountry/images/flags/au.png</logo>
+ </row>
+ <row>
+ <label>Nice, Provence-Alpes-Cote d&amp;#039;Azur, France</label>
+ <nb_uniq_visitors>4</nb_uniq_visitors>
+ <nb_visits>20</nb_visits>
+ <nb_actions>20</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>20</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <segment>city==Nice;regionCode==B8;countryCode==fr</segment>
+ <city_name>Nice</city_name>
+ <region>B8</region>
+ <country>fr</country>
+ <country_name>France</country_name>
+ <region_name>Provence-Alpes-Cote d'Azur</region_name>
+ <logo>plugins/UserCountry/images/flags/fr.png</logo>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>7</nb_uniq_visitors>
+ <nb_visits>35</nb_visits>
+ <nb_actions>35</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>35</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <logo>plugins/UserCountry/images/flags/xx.png</logo>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getRegion_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getRegion_day.xml
new file mode 100644
index 0000000000..e1782dfd61
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getRegion_day.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Victoria, Australia</label>
+ <nb_uniq_visitors>4</nb_uniq_visitors>
+ <nb_visits>20</nb_visits>
+ <nb_actions>20</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>20</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <segment>regionCode==07;countryCode==au</segment>
+ <region>07</region>
+ <country>au</country>
+ <country_name>Australia</country_name>
+ <region_name>Victoria</region_name>
+ <logo>plugins/UserCountry/images/flags/au.png</logo>
+ </row>
+ <row>
+ <label>Provence-Alpes-Cote d&amp;#039;Azur, France</label>
+ <nb_uniq_visitors>4</nb_uniq_visitors>
+ <nb_visits>20</nb_visits>
+ <nb_actions>20</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>20</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <segment>regionCode==B8;countryCode==fr</segment>
+ <region>B8</region>
+ <country>fr</country>
+ <country_name>France</country_name>
+ <region_name>Provence-Alpes-Cote d'Azur</region_name>
+ <logo>plugins/UserCountry/images/flags/fr.png</logo>
+ </row>
+ <row>
+ <label>Others</label>
+ <nb_uniq_visitors>7</nb_uniq_visitors>
+ <nb_visits>35</nb_visits>
+ <nb_actions>35</nb_actions>
+ <nb_users>0</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>35</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <logo>plugins/UserCountry/images/flags/xx.png</logo>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/Unit/DataTable/RowTest.php b/tests/PHPUnit/Unit/DataTable/RowTest.php
index 7033299df5..ae8bf699ef 100644
--- a/tests/PHPUnit/Unit/DataTable/RowTest.php
+++ b/tests/PHPUnit/Unit/DataTable/RowTest.php
@@ -89,35 +89,9 @@ class RowTest extends \PHPUnit_Framework_TestCase
$this->assertColumnSavesValue(array(array(1 => '5')), 'testArray', array(array(1 => '5')));
}
- public function test_getColumn_shouldResolveACallable()
- {
- $this->assertColumnSavesValue(6, 'testClosure', function () {
- return 6;
- });
-
- $this->assertColumnSavesValue(7, 'testCallable', array($this, 'callbackReturnScalar'));
- }
-
- public function test_getColumn_shouldPassRowToCallable()
- {
- $callbackRow = null;
-
- $this->row->addColumn('testClosure', function (Row $row) use (&$callbackRow) {
- $callbackRow = $row;
- return $row;
- });
-
- $returnedRow = $this->row->getColumn('testClosure');
- $this->assertNotEmpty($callbackRow);
- $this->assertSame($returnedRow, $callbackRow);
- }
-
public function test_getColumn_shouldReturnFalseIfValueIsNull()
{
$this->assertColumnSavesValue(false, 'testScalar', null);
- $this->assertColumnSavesValue(false, 'testClosure', function () {
- return null;
- });
}
public function test_getColumns_shouldNotCallAnyCallableForSecurity()
@@ -136,64 +110,18 @@ class RowTest extends \PHPUnit_Framework_TestCase
$this->row->setColumns(array(
'nb_visits' => 4,
'label' => 'Test',
- 'closure' => function () { return 5; },
- 'callable' => array($this, 'callbackReturnScalar'),
'goals' => array(1 => array())
));
$expected = array(
'nb_visits' => 4,
'label' => 'Test',
- 'closure' => 5,
- 'callable' => 7,
'goals' => array(1 => array())
);
$this->assertEquals($expected, $this->row->getColumns());
}
- public function test_getColumns_shouldNotConvertNullValuesToFalse()
- {
- $this->row->setColumns(array(
- 'nb_visits' => null,
- 'label' => 'Test',
- 'closure' => function () { return null; },
- 'boolean' => false
- ));
-
- $expected = array(
- 'nb_visits' => null,
- 'label' => 'Test',
- 'closure' => null,
- 'boolean' => false
- );
-
- $this->assertSame($expected, $this->row->getColumns());
- }
-
- public function callbackReturnScalar(Row $row)
- {
- return 7;
- }
-
- public function test_SumRow_shouldIgnoreCallableValues_AndNotRaiseAnyException()
- {
- $columns = array(
- 'nb_visits' => 5,
- 'label' => 'Test',
- 'closure' => function () { return 7; },
- );
-
- $this->row->setColumns($columns);
-
- $secondRow = new Row(array(Row::COLUMNS => $columns));
-
- $this->row->sumRow($secondRow);
-
- $this->assertEquals(10, $this->row->getColumn('nb_visits'));
- $this->assertEquals(7, $this->row->getColumn('closure'));
- }
-
public function test_sumSubTable_whenSubTableAlreadyExists_overwriteExistingSubtable()
{
$testRow = $this->getTestRowWithSubDataTableNotLoaded();
diff --git a/tests/PHPUnit/Unit/DeprecatedMethodsTest.php b/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
index 8336c73c4e..f1a03890c8 100644
--- a/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
+++ b/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
@@ -61,6 +61,7 @@ class DeprecatedMethodsTest extends \PHPUnit_Framework_TestCase
$this->assertDeprecatedMethodIsRemoved('Piwik\Plugins\UserSettings\UserSettings', 'renameDeprecatedModuleAndAction', $validTill);
$this->assertDeprecatedMethodIsRemovedInPiwik3('\Piwik\Menu\MenuAbstract', 'add');
+ $this->assertDeprecatedMethodIsRemovedInPiwik3('\Piwik\Archive', 'getDataTableFromArchive');
}
private function assertDeprecatedMethodIsRemoved($className, $method, $removalDate)
diff --git a/tests/PHPUnit/Unit/UrlHelperTest.php b/tests/PHPUnit/Unit/UrlHelperTest.php
index 189b026828..8ae396d7df 100644
--- a/tests/PHPUnit/Unit/UrlHelperTest.php
+++ b/tests/PHPUnit/Unit/UrlHelperTest.php
@@ -122,6 +122,14 @@ class UrlHelperTest extends \PHPUnit_Framework_TestCase
/**
* @group Core
*/
+ public function testGetPathAndQueryFromNonUrl()
+ {
+ $this->assertEquals('Others', UrlHelper::getPathAndQueryFromUrl('Others'));
+ }
+
+ /**
+ * @group Core
+ */
public function testGetArrayFromQueryString()
{
$expected = array(