diff options
author | diosmosis <benaka@piwik.pro> | 2015-03-17 04:44:25 +0300 |
---|---|---|
committer | diosmosis <benaka@piwik.pro> | 2015-03-18 08:30:28 +0300 |
commit | acd924de32bb40be3305027b812f83ba7310bf6f (patch) | |
tree | ddf6a1bfcd4a7a8b81d06fc37741e01fc2ec1324 /core/CronArchive | |
parent | 42807de32ab64bef2c18eb1f6a6d0a0358f8c57f (diff) |
Fixes #7223, add new INI option [General] process_new_segments_from that controls the start date of archiving for segments that have not been archived before. If a creation date cannot be found, now is used.
Diffstat (limited to 'core/CronArchive')
-rw-r--r-- | core/CronArchive/SegmentArchivingRequestUrlProvider.php | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/core/CronArchive/SegmentArchivingRequestUrlProvider.php b/core/CronArchive/SegmentArchivingRequestUrlProvider.php new file mode 100644 index 0000000000..6b3828af06 --- /dev/null +++ b/core/CronArchive/SegmentArchivingRequestUrlProvider.php @@ -0,0 +1,143 @@ +<?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\CronArchive; + +use Piwik\Cache\Cache; +use Piwik\Cache\Transient; +use Piwik\Date; +use Piwik\Period\Factory as PeriodFactory; +use Piwik\Period\Range; +use Piwik\Plugins\SegmentEditor\Model; + +/** + * Provides URLs that initiate archiving during cron archiving for segments. + * + * Handles the `[General] process_new_segments_from` INI option. + */ +class SegmentArchivingRequestUrlProvider +{ + const BEGINNING_OF_TIME = 'beginning_of_time'; + const CREATION_TIME = 'creation_time'; + + /** + * @var Model + */ + private $segmentEditorModel; + + /** + * @var Cache + */ + private $segmentListCache; + + /** + * @var Date + */ + private $now; + + private $baseUrl; + private $tokenAuth; + private $processNewSegmentsFrom; + + public function __construct($baseUrl, $tokenAuth, $processNewSegmentsFrom, Model $segmentEditorModel = null, Cache $segmentListCache = null, Date $now = null) + { + $this->baseUrl = $baseUrl; + $this->tokenAuth = $tokenAuth; + $this->processNewSegmentsFrom = $processNewSegmentsFrom; + $this->segmentEditorModel = $segmentEditorModel ?: new Model(); + $this->segmentListCache = $segmentListCache ?: new Transient(); + $this->now = $now ?: Date::factory('now'); + } + + public function getUrlToArchiveSegment($idSite, $period, $date, $segment) + { + $date = $this->getModifiedSegmentArchvingDateRange($idSite, $period, $date, $segment); + + return $this->baseUrl + . "?module=API&method=API.get&idSite=$idSite&period=$period&date=" . $date . "&format=php&token_auth=" . $this->tokenAuth + . '&segment=' . urlencode($segment); + } + + private function getModifiedSegmentArchvingDateRange($idSite, $period, $date, $segment) + { + $segmentCreatedTime = $this->getCreatedTimeOfSegment($idSite, $segment); + if (empty($segmentCreatedTime)) { + return $date; + } + + $oldestDateToProcessForNewSegment = $this->getOldestDateToProcessForNewSegment($segmentCreatedTime); + if (empty($oldestDateToProcessForNewSegment)) { + return $date; + } + + // if the start date for the archiving request is before the minimum date allowed for processing this segment, + // use the minimum allowed date as the start date + $periodObj = PeriodFactory::build($period, $date); + if ($periodObj->getDateStart()->getTimestamp() < $oldestDateToProcessForNewSegment->getTimestamp()) { + $date = $oldestDateToProcessForNewSegment->toString().','.$periodObj->getDateEnd(); + } + + return $date; + } + + private function getOldestDateToProcessForNewSegment(Date $segmentCreatedTime) + { + if ($this->processNewSegmentsFrom == self::CREATION_TIME) { + return $segmentCreatedTime; + } else if (preg_match("/^last([0-9]+)$/", $this->processNewSegmentsFrom, $matches)) { + $lastN = $matches[1]; + + list($lastDate, $lastPeriod) = Range::getDateXPeriodsAgo($lastN, $segmentCreatedTime, 'day'); + + return Date::factory($lastDate); + } else { + return null; + } + } + + private function getCreatedTimeOfSegment($idSite, $segmentDefinition) + { + $segments = $this->getAllSegments(); + + $earliestCreatedTime = $this->now; + foreach ($segments as $segment) { + if (empty($segment['ts_created']) + || empty($segment['definition']) + || !isset($segment['enable_only_idsite']) + ) { + continue; + } + + if ($this->isSegmentForSite($segment, $idSite) + && $segment['definition'] == $segmentDefinition + ) { + $createdTime = Date::factory($segment['ts_created']); + if ($createdTime->getTimestamp() < $earliestCreatedTime->getTimestamp()) { + $earliestCreatedTime = $createdTime; + } + } + } + return $earliestCreatedTime; + } + + private function getAllSegments() + { + if (!$this->segmentListCache->contains('all')) { + $segments = $this->segmentEditorModel->getAllSegmentsAndIgnoreVisibility(); + + $this->segmentListCache->save('all', $segments); + } + + return $this->segmentListCache->fetch('all'); + } + + private function isSegmentForSite($segment, $idSite) + { + return $segment['enable_only_idsite'] == 0 + || $segment['enable_only_idsite'] == $idSite; + } +}
\ No newline at end of file |