diff options
-rw-r--r-- | core/ArchiveProcessor.php | 38 | ||||
-rw-r--r-- | core/Plugin/Archiver.php | 21 | ||||
-rw-r--r-- | tests/PHPUnit/Core/ArchiveProcessingTest.php | 31 |
3 files changed, 40 insertions, 50 deletions
diff --git a/core/ArchiveProcessor.php b/core/ArchiveProcessor.php index 7b1ca233f3..212f1c06ef 100644 --- a/core/ArchiveProcessor.php +++ b/core/ArchiveProcessor.php @@ -157,11 +157,22 @@ class ArchiveProcessor */ private $segment = null; + /** + * @var Archive + */ + protected $archive = null; + public function __construct(Period $period, Site $site, Segment $segment) { $this->period = $period; $this->site = $site; $this->segment = $segment; + + // If we are aggregating multiple reports: prepare the Archive object needed for aggregate* methods + if(!$this->isDayArchive()) { + $subPeriods = $this->getPeriod()->getSubperiods(); + $this->archive = Archive::factory($this->getSegment(), $subPeriods, array($this->getSite()->getId())); + } } /** @@ -401,7 +412,7 @@ class ArchiveProcessor * * @return int|bool Datetime timestamp, or false if must look at any archive available */ - public function getMinTimeArchiveProcessed() + protected function getMinTimeArchiveProcessed() { $endDateTimestamp = self::determineIfArchivePermanent($this->getDateEnd()); $isArchiveTemporary = ($endDateTimestamp === false); @@ -486,11 +497,11 @@ class ArchiveProcessor { $archivers = $this->getPluginArchivers(); - foreach($archivers as $archiverClass) { + foreach($archivers as $pluginName => $archiverClass) { /** @var Archiver $archiver */ $archiver = new $archiverClass( $this ); - if($archiver->shouldArchive()) { + if($this->shouldProcessReportsForPlugin($pluginName)) { if($this->isDayArchive()) { $archiver->aggregateDayReport(); } else { @@ -578,7 +589,7 @@ class ArchiveProcessor * @param string $pluginName * @return bool */ - public function shouldProcessReportsForPlugin($pluginName) + protected function shouldProcessReportsForPlugin($pluginName) { if (Rules::shouldProcessReportsAllPlugins($this->getSegment(), $this->getPeriod()->getLabel())) { return true; @@ -647,11 +658,6 @@ class ArchiveProcessor ); /** - * @var Archive - */ - protected $archive = null; - - /** * Sums records for every subperiod of the current period and inserts the result as the record * for this period. * @@ -688,10 +694,9 @@ class ArchiveProcessor if (!is_array($recordNames)) { $recordNames = array($recordNames); } - $this->initArchive(); $nameToCount = array(); foreach ($recordNames as $recordName) { - $table = $this->getRecordDataTableSum($recordName, $invalidSummedColumnNameToRenamedName, $columnAggregationOperations); + $table = $this->aggregateDataTableRecord($recordName, $invalidSummedColumnNameToRenamedName, $columnAggregationOperations); $nameToCount[$recordName]['level0'] = $table->getRowsCount(); $nameToCount[$recordName]['recursive'] = $table->getRowsCountRecursive(); @@ -727,7 +732,6 @@ class ArchiveProcessor if (!is_array($columns)) { $columns = array($columns); } - $this->initArchive(); $data = $this->archive->getNumeric($columns); $operationForColumn = $this->getOperationForColumns($columns, $operationToApply); $results = $this->aggregateDataArray($data, $operationForColumn); @@ -747,14 +751,6 @@ class ArchiveProcessor return $results; } - protected function initArchive() - { - if (empty($this->archive)) { - $subPeriods = $this->getPeriod()->getSubperiods(); - $this->archive = Archive::factory($this->getSegment(), $subPeriods, array($this->getSite()->getId())); - } - } - /** * This method selects all DataTables that have the name $name over the period. * All these DataTables are then added together, and the resulting DataTable is returned. @@ -764,7 +760,7 @@ class ArchiveProcessor * @param array $columnAggregationOperations Operations for aggregating columns, @see Row::sumRow() * @return DataTable */ - protected function getRecordDataTableSum($name, $invalidSummedColumnNameToRenamedName, $columnAggregationOperations = null) + protected function aggregateDataTableRecord($name, $invalidSummedColumnNameToRenamedName, $columnAggregationOperations = null) { $table = new DataTable(); if (!empty($columnAggregationOperations)) { diff --git a/core/Plugin/Archiver.php b/core/Plugin/Archiver.php index 21ab1fed4d..1e603127a5 100644 --- a/core/Plugin/Archiver.php +++ b/core/Plugin/Archiver.php @@ -48,6 +48,9 @@ use Piwik\Config as PiwikConfig; */ abstract class Archiver { + /** + * @var \Piwik\ArchiveProcessor + */ protected $processor; /** @@ -74,28 +77,12 @@ abstract class Archiver */ abstract public function aggregateMultipleReports(); - // todo: review this concept, each plugin should somehow maintain the list of report names they generate - /** - * Returns true if the current plugin should be archived or not. - * - * @return bool - */ - public function shouldArchive() - { - $className = get_class($this); - $pluginName = str_replace(array("Piwik\\Plugins\\", "\\Archiver"), "", $className); - if (strpos($pluginName, "\\") !== false) { - throw new \Exception("unexpected plugin name $pluginName in shouldArchive()"); - } - return $this->getProcessor()->shouldProcessReportsForPlugin($pluginName); - } - /** * @return \Piwik\ArchiveProcessor */ protected function getProcessor() { - return $this->processor; + return $this->processor->getDateEnd(); } /** diff --git a/tests/PHPUnit/Core/ArchiveProcessingTest.php b/tests/PHPUnit/Core/ArchiveProcessingTest.php index e1bb90adb0..9124981b0f 100644 --- a/tests/PHPUnit/Core/ArchiveProcessingTest.php +++ b/tests/PHPUnit/Core/ArchiveProcessingTest.php @@ -22,6 +22,13 @@ use Piwik\Segment; use Piwik\SettingsServer; use Piwik\Site; +class ArchiveProcessorTest extends ArchiveProcessor { + public function public_getMinTimeArchiveProcessed() + { + return $this->getMinTimeArchiveProcessed(); + } +} + class ArchiveProcessingTest extends DatabaseTestCase { public function setUp() @@ -61,7 +68,7 @@ class ArchiveProcessingTest extends DatabaseTestCase * @param string $periodLabel * @param string $dateLabel * @param string $siteTimezone - * @return ArchiveProcessor + * @return ArchiveProcessorTest */ private function _createArchiveProcessor($periodLabel, $dateLabel, $siteTimezone) { @@ -70,7 +77,7 @@ class ArchiveProcessingTest extends DatabaseTestCase $period = Period::factory($periodLabel, $date); $segment = new Segment('', $site->getId()); - return new ArchiveProcessor($period, $site, $segment); + return new \ArchiveProcessorTest($period, $site, $segment); } /** @@ -94,7 +101,7 @@ class ArchiveProcessingTest extends DatabaseTestCase $timeout = Rules::getTodayArchiveTimeToLive(); $this->assertTrue($timeout >= 10); $dateMinArchived = $now - $timeout; - $this->compareTimestamps($dateMinArchived, $archiveProcessor->getMinTimeArchiveProcessed()); + $this->compareTimestamps($dateMinArchived, $archiveProcessor->public_getMinTimeArchiveProcessed()); $this->assertTrue($archiveProcessor->isArchiveTemporary()); } @@ -116,7 +123,7 @@ class ArchiveProcessingTest extends DatabaseTestCase // min finished timestamp considered when looking at archive timestamp $dateMinArchived = Date::factory('2010-01-02')->getTimestamp(); - $this->assertEquals($archiveProcessor->getMinTimeArchiveProcessed() + 1, $dateMinArchived); + $this->assertEquals($archiveProcessor->public_getMinTimeArchiveProcessed() + 1, $dateMinArchived); $this->assertEquals('2010-01-01 00:00:00', $archiveProcessor->getDateStart()->getDateStartUTC()); $this->assertEquals('2010-01-01 23:59:59', $archiveProcessor->getDateEnd()->getDateEndUTC()); @@ -133,7 +140,7 @@ class ArchiveProcessingTest extends DatabaseTestCase $archiveProcessor = $this->_createArchiveProcessor('day', '2010-01-01', $timezone); // min finished timestamp considered when looking at archive timestamp $dateMinArchived = Date::factory('2010-01-01 18:30:00'); - $this->assertEquals($archiveProcessor->getMinTimeArchiveProcessed() + 1, $dateMinArchived->getTimestamp()); + $this->assertEquals($archiveProcessor->public_getMinTimeArchiveProcessed() + 1, $dateMinArchived->getTimestamp()); $this->assertEquals('2009-12-31 18:30:00', $archiveProcessor->getDateStart()->getDateStartUTC()); $this->assertEquals('2010-01-01 18:29:59', $archiveProcessor->getDateEnd()->getDateEndUTC()); @@ -150,7 +157,7 @@ class ArchiveProcessingTest extends DatabaseTestCase $archiveProcessor = $this->_createArchiveProcessor('month', '2010-01-02', $timezone); // min finished timestamp considered when looking at archive timestamp $dateMinArchived = Date::factory('2010-02-01 05:30:00'); - $this->assertEquals($archiveProcessor->getMinTimeArchiveProcessed() + 1, $dateMinArchived->getTimestamp()); + $this->assertEquals($archiveProcessor->public_getMinTimeArchiveProcessed() + 1, $dateMinArchived->getTimestamp()); $this->assertEquals('2010-01-01 05:30:00', $archiveProcessor->getDateStart()->getDateStartUTC()); $this->assertEquals('2010-02-01 05:29:59', $archiveProcessor->getDateEnd()->getDateEndUTC()); @@ -175,7 +182,7 @@ class ArchiveProcessingTest extends DatabaseTestCase // we look at anything processed within the time to live range $dateMinArchived = $now - Rules::getTodayArchiveTimeToLive(); - $this->compareTimestamps($dateMinArchived, $archiveProcessor->getMinTimeArchiveProcessed() ); + $this->compareTimestamps($dateMinArchived, $archiveProcessor->public_getMinTimeArchiveProcessed() ); $this->assertTrue($archiveProcessor->isArchiveTemporary()); // when browsers don't trigger archives, we force ArchiveProcessor @@ -187,7 +194,7 @@ class ArchiveProcessingTest extends DatabaseTestCase if (!Common::isPhpCliMode()) { $dateMinArchived = 0; } - $this->compareTimestamps($archiveProcessor->getMinTimeArchiveProcessed(), $dateMinArchived); + $this->compareTimestamps($archiveProcessor->public_getMinTimeArchiveProcessed(), $dateMinArchived); $this->assertEquals(date('Y-m-d', $timestamp) . ' 01:00:00', $archiveProcessor->getDateStart()->getDateStartUTC()); $this->assertEquals(date('Y-m-d', $timestamp + 86400) . ' 00:59:59', $archiveProcessor->getDateEnd()->getDateEndUTC()); @@ -216,7 +223,7 @@ class ArchiveProcessingTest extends DatabaseTestCase // we look at anything processed within the time to live range $dateMinArchived = $now - Rules::getTodayArchiveTimeToLive(); - $minTimeArchivedProcessed = $archiveProcessor->getMinTimeArchiveProcessed(); + $minTimeArchivedProcessed = $archiveProcessor->public_getMinTimeArchiveProcessed(); $this->compareTimestamps($dateMinArchived, $minTimeArchivedProcessed); $this->assertTrue($archiveProcessor->isArchiveTemporary()); @@ -229,7 +236,7 @@ class ArchiveProcessingTest extends DatabaseTestCase if (!Common::isPhpCliMode()) { $dateMinArchived = 0; } - $this->compareTimestamps($dateMinArchived, $archiveProcessor->getMinTimeArchiveProcessed()); + $this->compareTimestamps($dateMinArchived, $archiveProcessor->public_getMinTimeArchiveProcessed()); // this test varies with DST $this->assertTrue($archiveProcessor->getDateStart()->getDateStartUTC() == date('Y-m-d', $timestamp - 86400) . ' 22:00:00' || @@ -262,7 +269,7 @@ class ArchiveProcessingTest extends DatabaseTestCase // we look at anything processed within the time to live range $dateMinArchived = $now - Rules::getTodayArchiveTimeToLive(); - $this->compareTimestamps($dateMinArchived, $archiveProcessor->getMinTimeArchiveProcessed() ); + $this->compareTimestamps($dateMinArchived, $archiveProcessor->public_getMinTimeArchiveProcessed() ); $this->assertTrue($archiveProcessor->isArchiveTemporary()); // when browsers don't trigger archives, we force ArchiveProcessor @@ -274,7 +281,7 @@ class ArchiveProcessingTest extends DatabaseTestCase if (!Common::isPhpCliMode()) { $dateMinArchived = 0; } - $this->compareTimestamps($dateMinArchived, $archiveProcessor->getMinTimeArchiveProcessed()); + $this->compareTimestamps($dateMinArchived, $archiveProcessor->public_getMinTimeArchiveProcessed()); // this test varies with DST $this->assertTrue($archiveProcessor->getDateStart()->getDateStartUTC() == date('Y-m-d', $timestamp) . ' 04:00:00' || |