PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.8.2
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.8.2
5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / Archive / ArchiveState.php
matomo / app / core / Archive Last commit date
ArchiveInvalidator 1 year ago ArchiveInvalidator.php 3 months ago ArchivePurger.php 3 months ago ArchiveQuery.php 1 year ago ArchiveQueryFactory.php 1 year ago ArchiveState.php 1 year ago Chunk.php 1 year ago DataCollection.php 6 months ago DataTableFactory.php 3 months ago Parameters.php 2 years ago
ArchiveState.php
92 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 */
9 declare (strict_types=1);
10 namespace Piwik\Archive;
11
12 use Piwik\DataAccess\ArchiveWriter;
13 use Piwik\DataTable;
14 use Piwik\Date;
15 use Piwik\Site;
16 class ArchiveState
17 {
18 public const COMPLETE = 'complete';
19 public const INCOMPLETE = 'incomplete';
20 public const INVALIDATED = 'invalidated';
21 /**
22 * @param array{date1: string, date2: string, idsite: string, ts_archived: string} $archiveData
23 * @param array<string, array<int>> $archiveIds archives ids indexed by period
24 * @param array<int, array<string, array<int, int>>> $archiveStates archive states indexed by site and period
25 */
26 public function addMetadataToResultCollection(\Piwik\Archive\DataCollection $collection, array $archiveData, array $archiveIds, array $archiveStates) : void
27 {
28 $periodsEndDays = [];
29 $periodsTsArchived = [];
30 $archiveIdsFlipped = [];
31 foreach ($archiveData as $archive) {
32 $idSite = (int) $archive['idsite'];
33 $period = $archive['date1'] . ',' . $archive['date2'];
34 $periodsEndDays[$idSite][$period] = $archive['date2'];
35 $periodsTsArchived[$idSite][$period] = $archive['ts_archived'];
36 }
37 foreach ($archiveIds as $period => $periodArchiveIds) {
38 $archiveIdsFlipped[$period] = array_flip($periodArchiveIds);
39 }
40 foreach ($periodsTsArchived as $idSite => $periods) {
41 $siteTimezone = Site::getTimezoneFor($idSite);
42 foreach ($periods as $period => $tsArchived) {
43 $periodEndDay = $periodsEndDays[$idSite][$period];
44 $state = $this->checkArchiveStates($idSite, $period, $archiveIdsFlipped, $archiveStates);
45 $state = $this->checkTsArchived($state, $siteTimezone, $periodEndDay, $tsArchived);
46 if (null === $state) {
47 // do not set metadata, if no state was determined,
48 // to avoid generating unexpected default rows
49 continue;
50 }
51 $collection->addMetadata($idSite, $period, DataTable::ARCHIVE_STATE_METADATA_NAME, $state);
52 }
53 }
54 }
55 /**
56 * @param array<string, array<int, bool>> $archiveIdsFlipped
57 * @param array<int, array<string, array<int, int>>> $archiveStates
58 */
59 private function checkArchiveStates(int $idSite, string $period, array $archiveIdsFlipped, array $archiveStates) : ?string
60 {
61 if (!isset($archiveStates[$idSite][$period]) || !isset($archiveIdsFlipped[$period])) {
62 // do not determine state if no archives were used
63 return null;
64 }
65 $availableStates = array_intersect_key($archiveStates[$idSite][$period], $archiveIdsFlipped[$period]);
66 if ([] === $availableStates) {
67 // do not determine state if no archives were used
68 return null;
69 }
70 if (in_array(ArchiveWriter::DONE_INVALIDATED, $availableStates)) {
71 // archive has been invalidated
72 return self::INVALIDATED;
73 }
74 // all archives not invalidated should be complete
75 // includes DONE_OK, DONE_OK_TEMPORARY and DONE_PARTIAL
76 return self::COMPLETE;
77 }
78 private function checkTsArchived(?string $state, string $siteTimezone, string $periodEndDay, string $tsArchived) : ?string
79 {
80 if (self::COMPLETE !== $state) {
81 // only archives detected as complete can be archived before range end
82 return $state;
83 }
84 $datePeriodEnd = Date::factory($periodEndDay . ' 23:59:59')->setTimezone($siteTimezone);
85 $dateArchived = Date::factory($tsArchived);
86 if (!$datePeriodEnd->isEarlier($dateArchived)) {
87 return self::INCOMPLETE;
88 }
89 return $state;
90 }
91 }
92