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:
authordiosmosis <benaka@piwik.pro>2015-03-17 04:44:25 +0300
committerdiosmosis <benaka@piwik.pro>2015-03-18 08:30:28 +0300
commitacd924de32bb40be3305027b812f83ba7310bf6f (patch)
treeddf6a1bfcd4a7a8b81d06fc37741e01fc2ec1324 /core/CronArchive
parent42807de32ab64bef2c18eb1f6a6d0a0358f8c57f (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.php143
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