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:
authorMatthieu Aubry <matt@piwik.org>2015-03-18 05:33:52 +0300
committerMatthieu Aubry <matt@piwik.org>2015-03-18 05:33:52 +0300
commitc3bc0113fe3043b53ff6a96e766c2fc8dc0f1229 (patch)
tree923a51de4569ddec60bd3e22133b03b9d4c47cd9 /core/ArchiveProcessor.php
parent7e0d617359f0baf167d3f053f3e99a60e3c09a86 (diff)
parent76f7d00e92caed107b00b5e4c68218ea6ed78fcb (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.php42
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();