getTimezoneOffset(); return match ($granularity) { 'day' => "strftime('%Y-%m-%d', ($field / $precision) + $offset, 'unixepoch')", 'month' => "strftime('%Y-%m', ($field / $precision) + $offset, 'unixepoch')", 'year' => "strftime('%Y', ($field / $precision) + $offset, 'unixepoch')", default => throw new InvalidArgumentException('Invalid date granularity'), }; } #[\Override] protected function sqlFloor(string $s): string { return "CAST(($s) AS INT)"; } /** * @return array */ #[\Override] protected function calculateEntryRepartitionPerFeedPerPeriod(string $period, ?int $feed = null): array { if ($feed) { $restrict = "WHERE e.id_feed = {$feed}"; } else { $restrict = ''; } $offset = $this->getTimezoneOffset(); $sql = <<fetchAssoc($sql); if ($res == null) { return []; } $periodMax = match ($period) { '%H' => 24, '%w' => 7, '%m' => 12, default => 30, }; $repartition = array_fill(0, $periodMax, 0); foreach ($res as $value) { $repartition[(int)$value['period']] = (int)$value['count']; } return $repartition; } }