| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| declare(strict_types=1); |
|
|
| namespace Piwik\Archive; |
|
|
| use Piwik\DataAccess\ArchiveWriter; |
| use Piwik\DataTable; |
| use Piwik\Date; |
| use Piwik\Site; |
|
|
| class ArchiveState |
| { |
| public const COMPLETE = 'complete'; |
| public const INCOMPLETE = 'incomplete'; |
| public const INVALIDATED = 'invalidated'; |
|
|
| |
| |
| |
| |
| |
| public function addMetadataToResultCollection( |
| DataCollection $collection, |
| array $archiveData, |
| array $archiveIds, |
| array $archiveStates |
| ): void { |
| $periodsEndDays = []; |
| $periodsTsArchived = []; |
| $archiveIdsFlipped = []; |
|
|
| foreach ($archiveData as $archive) { |
| $idSite = (int) $archive['idsite']; |
| $period = $archive['date1'] . ',' . $archive['date2']; |
|
|
| $periodsEndDays[$idSite][$period] = $archive['date2']; |
| $periodsTsArchived[$idSite][$period] = $archive['ts_archived']; |
| } |
|
|
| foreach ($archiveIds as $period => $periodArchiveIds) { |
| $archiveIdsFlipped[$period] = array_flip($periodArchiveIds); |
| } |
|
|
| foreach ($periodsTsArchived as $idSite => $periods) { |
| $siteTimezone = Site::getTimezoneFor($idSite); |
|
|
| foreach ($periods as $period => $tsArchived) { |
| $periodEndDay = $periodsEndDays[$idSite][$period]; |
|
|
| $state = $this->checkArchiveStates($idSite, $period, $archiveIdsFlipped, $archiveStates); |
| $state = $this->checkTsArchived($state, $siteTimezone, $periodEndDay, $tsArchived); |
|
|
| if (null === $state) { |
| |
| |
| continue; |
| } |
|
|
| $collection->addMetadata( |
| $idSite, |
| $period, |
| DataTable::ARCHIVE_STATE_METADATA_NAME, |
| $state |
| ); |
| } |
| } |
| } |
|
|
| |
| |
| |
| |
| private function checkArchiveStates( |
| int $idSite, |
| string $period, |
| array $archiveIdsFlipped, |
| array $archiveStates |
| ): ?string { |
| if (!isset($archiveStates[$idSite][$period]) || !isset($archiveIdsFlipped[$period])) { |
| |
| return null; |
| } |
|
|
| $availableStates = array_intersect_key( |
| $archiveStates[$idSite][$period], |
| $archiveIdsFlipped[$period] |
| ); |
|
|
| if ([] === $availableStates) { |
| |
| return null; |
| } |
|
|
| if (in_array(ArchiveWriter::DONE_INVALIDATED, $availableStates)) { |
| |
| return self::INVALIDATED; |
| } |
|
|
| |
| |
| return self::COMPLETE; |
| } |
|
|
| private function checkTsArchived( |
| ?string $state, |
| string $siteTimezone, |
| string $periodEndDay, |
| string $tsArchived |
| ): ?string { |
| if (self::COMPLETE !== $state) { |
| |
| return $state; |
| } |
|
|
| $datePeriodEnd = Date::factory($periodEndDay . ' 23:59:59')->setTimezone($siteTimezone); |
| $dateArchived = Date::factory($tsArchived); |
|
|
| if (!$datePeriodEnd->isEarlier($dateArchived)) { |
| return self::INCOMPLETE; |
| } |
|
|
| return $state; |
| } |
| } |
|
|