PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / trunk
Matomo Analytics – Powerful, Privacy-First Insights for WordPress vtrunk
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 1 month ago ArchivePurger.php 1 month ago ArchiveQuery.php 1 year ago ArchiveQueryFactory.php 1 year ago ArchiveState.php 1 year ago Chunk.php 1 year ago DataCollection.php 1 month ago DataTableFactory.php 1 month 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