diff options
author | Matthieu Aubry <matt@piwik.org> | 2015-03-18 05:33:52 +0300 |
---|---|---|
committer | Matthieu Aubry <matt@piwik.org> | 2015-03-18 05:33:52 +0300 |
commit | c3bc0113fe3043b53ff6a96e766c2fc8dc0f1229 (patch) | |
tree | 923a51de4569ddec60bd3e22133b03b9d4c47cd9 /core/ArchiveProcessor.php | |
parent | 7e0d617359f0baf167d3f053f3e99a60e3c09a86 (diff) | |
parent | 76f7d00e92caed107b00b5e4c68218ea6ed78fcb (diff) |
Merge pull request #7465 from piwik/datatable_tweaks
Various performance improvements and bugfixes.
Diffstat (limited to 'core/ArchiveProcessor.php')
-rw-r--r-- | core/ArchiveProcessor.php | 42 |
1 files changed, 37 insertions, 5 deletions
diff --git a/core/ArchiveProcessor.php b/core/ArchiveProcessor.php index cb24d83367..81ac213344 100644 --- a/core/ArchiveProcessor.php +++ b/core/ArchiveProcessor.php @@ -9,6 +9,7 @@ namespace Piwik; use Exception; +use Piwik\Archive\DataTableFactory; use Piwik\ArchiveProcessor\Parameters; use Piwik\ArchiveProcessor\Rules; use Piwik\DataAccess\ArchiveWriter; @@ -351,7 +352,18 @@ class ArchiveProcessor // see https://github.com/piwik/piwik/issues/4377 $self = $this; $dataTable->filter(function ($table) use ($self, $columnsToRenameAfterAggregation) { - $self->renameColumnsAfterAggregation($table, $columnsToRenameAfterAggregation); + + if ($self->areColumnsNotAlreadyRenamed($table)) { + /** + * This makes archiving and range dates a lot faster. Imagine we archive a week, then we will + * rename all columns of each 7 day archives. Afterwards we know the columns will be replaced in a + * week archive. When generating month archives, which uses mostly week archives, we do not have + * to replace those columns for the week archives again since we can be sure they were already + * replaced. Same when aggregating year and range archives. This can save up 10% or more when + * aggregating Month, Year and Range archives. + */ + $self->renameColumnsAfterAggregation($table, $columnsToRenameAfterAggregation); + } }); } @@ -360,10 +372,23 @@ class ArchiveProcessor if (!$columnsRenamed) { $this->renameColumnsAfterAggregation($dataTable, $columnsToRenameAfterAggregation); } - + return $dataTable; } + /** + * Note: public only for use in closure in PHP 5.3. + * + * @param $table + * @return \Piwik\Period + */ + public function areColumnsNotAlreadyRenamed($table) + { + $period = $table->getMetadata(DataTableFactory::TABLE_METADATA_PERIOD_INDEX); + + return !$period || $period->getLabel() === 'day'; + } + protected function getOperationForColumns($columns, $defaultOperation) { $operationForColumn = array(); @@ -499,8 +524,15 @@ class ArchiveProcessor $columnsToRenameAfterAggregation = self::$columnsToRenameAfterAggregation; } - foreach ($columnsToRenameAfterAggregation as $oldName => $newName) { - $table->renameColumn($oldName, $newName); + foreach ($table->getRows() as $row) { + foreach ($columnsToRenameAfterAggregation as $oldName => $newName) { + $row->renameColumn($oldName, $newName); + } + + $subTable = $row->getSubtable(); + if ($subTable) { + $this->renameColumnsAfterAggregation($subTable, $columnsToRenameAfterAggregation); + } } } @@ -524,7 +556,7 @@ class ArchiveProcessor $rowMetrics = new Row; } $this->enrichWithUniqueVisitorsMetric($rowMetrics); - $this->renameColumnsAfterAggregation($results); + $this->renameColumnsAfterAggregation($results, self::$columnsToRenameAfterAggregation); $metrics = $rowMetrics->getColumns(); |