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:
Diffstat (limited to 'core/CronArchive.php')
-rw-r--r--core/CronArchive.php88
1 files changed, 63 insertions, 25 deletions
diff --git a/core/CronArchive.php b/core/CronArchive.php
index 99bd257c43..9d8801fcbd 100644
--- a/core/CronArchive.php
+++ b/core/CronArchive.php
@@ -898,6 +898,8 @@ class CronArchive
$visitsLastDays = 0;
+ $this->invalidateArchivedReportsForSitesThatNeedToBeArchivedAgain();
+
list($isThereArchive, $newDate) = $this->isThereAValidArchiveForPeriod($idSite, 'day', $date, $segment = '');
if ($isThereArchive) {
$visitsToday = Archive::build($idSite, 'day', $date)->getNumeric('nb_visits');
@@ -972,7 +974,8 @@ class CronArchive
return $dayArchiveWasSuccessful;
}
- private function isThereAValidArchiveForPeriod($idSite, $period, $date, $segment = '')
+ // public for tests
+ public function isThereAValidArchiveForPeriod($idSite, $period, $date, $segment = '')
{
if (Range::isMultiplePeriod($date, $period)) {
$rangePeriod = Factory::build($period, $date, Site::getTimezoneFor($idSite));
@@ -981,9 +984,17 @@ class CronArchive
$periodsToCheck = [Factory::build($period, $date, Site::getTimezoneFor($idSite))];
}
- $periodsToCheckRanges = array_map(function (Period $p) { return $p->getRangeString(); }, $periodsToCheck);
+ $isTodayIncluded = $this->isTodayIncludedInPeriod($idSite, $periodsToCheck);
+ $isLast = preg_match('/^last([0-9]+)/', $date, $matches);
- $this->invalidateArchivedReportsForSitesThatNeedToBeArchivedAgain();
+ // don't do this check for a single period that includes today
+ if ($isTodayIncluded
+ && !$isLast
+ ) {
+ return [false, null];
+ }
+
+ $periodsToCheckRanges = array_map(function (Period $p) { return $p->getRangeString(); }, $periodsToCheck);
$archiveIds = ArchiveSelector::getArchiveIds(
[$idSite], $periodsToCheck, new Segment($segment, [$idSite]), $plugins = [], // empty plugins param since we only check for an 'all' archive
@@ -1003,37 +1014,60 @@ class CronArchive
// if there is an invalidated archive within the range, find out the oldest one and how far it is from today,
// and change the lastN $date to be value so it is correctly re-processed.
$newDate = $date;
- if (!$isThereArchiveForAllPeriods
- && preg_match('/^last([0-9]+)/', $date, $matches)
- ) {
- $lastNValue = (int) $matches[1];
-
- usort($diff, function ($lhs, $rhs) {
- $lhsDate = explode(',', $lhs)[0];
- $rhsDate = explode(',', $rhs)[0];
-
- if ($lhsDate == $rhsDate) {
- return 1;
- } else if (Date::factory($lhsDate)->isEarlier(Date::factory($rhsDate))) {
- return -1;
- } else {
- return 1;
- }
- });
+ if ($isLast) {
+ if (!$isThereArchiveForAllPeriods) {
+ $lastNValue = (int)$matches[1];
+
+ usort($diff, function ($lhs, $rhs) {
+ $lhsDate = explode(',', $lhs)[0];
+ $rhsDate = explode(',', $rhs)[0];
+
+ if ($lhsDate == $rhsDate) {
+ return 1;
+ } else if (Date::factory($lhsDate)->isEarlier(Date::factory($rhsDate))) {
+ return -1;
+ } else {
+ return 1;
+ }
+ });
- $oldestDateWithoutArchive = explode(',', reset($diff))[0];
- $todayInTimezone = Date::factoryInTimezone('today', Site::getTimezoneFor($idSite));
+ $oldestDateWithoutArchive = explode(',', reset($diff))[0];
+ $todayInTimezone = Date::factoryInTimezone('today', Site::getTimezoneFor($idSite));
- /** @var Range $newRangePeriod */
- $newRangePeriod = PeriodFactory::build($period, $oldestDateWithoutArchive . ',' . $todayInTimezone);
+ /** @var Range $newRangePeriod */
+ $newRangePeriod = PeriodFactory::build($period, $oldestDateWithoutArchive . ',' . $todayInTimezone);
- $newDate = 'last' . min($lastNValue, $newRangePeriod->getNumberOfSubperiods());
+ $newDate = 'last' . max(min($lastNValue, $newRangePeriod->getNumberOfSubperiods()), 2);
+ } else if ($isTodayIncluded) {
+ $isThereArchiveForAllPeriods = false;
+ $newDate = 'last2';
+ }
}
return [$isThereArchiveForAllPeriods, $newDate];
}
/**
+ * @param int $idSite
+ * @param Period[] $periods
+ * @return bool
+ * @throws Exception
+ */
+ private function isTodayIncludedInPeriod($idSite, $periods)
+ {
+ $timezone = Site::getTimezoneFor($idSite);
+ $today = Date::factoryInTimezone('today', $timezone);
+
+ foreach ($periods as $period) {
+ if ($period->isDateInPeriod($today)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
* @param $idSite
* @return array
*/
@@ -1102,6 +1136,8 @@ class CronArchive
return Request::ABORT;
}
+ $this->invalidateArchivedReportsForSitesThatNeedToBeArchivedAgain();
+
list($isThereArchive, $newDate) = $this->isThereAValidArchiveForPeriod($idSite, $period, $date, $segment);
if ($isThereArchive) {
$this->logArchiveWebsiteSkippedValidArchiveExists($idSite, $period, $date);
@@ -1979,6 +2015,8 @@ class CronArchive
return Request::ABORT;
}
+ $this->invalidateArchivedReportsForSitesThatNeedToBeArchivedAgain();
+
list($isThereArchive, $newDate) = $this->isThereAValidArchiveForPeriod($idSite, $period, $date, $segment);
if ($isThereArchive) {
$this->logArchiveWebsiteSkippedValidArchiveExists($idSite, $period, $date, $segment);