Ver código fonte

Fix statistics repartition averages (#8996)

* Fix statistics repartition averages

* Minor code preference

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Jam Balaya 11 horas atrás
pai
commit
271257be42

+ 9 - 3
app/Controllers/statsController.php

@@ -231,13 +231,19 @@ class FreshRSS_stats_Controller extends FreshRSS_ActionController {
 		$this->view->repartition 			= $statsDAO->calculateEntryRepartitionPerFeed($id);
 
 		$this->view->repartitionHour 		= $statsDAO->calculateEntryRepartitionPerFeedPerHour($id);
-		$this->view->averageHour 			= $statsDAO->calculateEntryAveragePerFeedPerHour($id);
+		$this->view->averageHour 			= FreshRSS_StatsDAO::calculateEntryAverageFromRepartition(
+			$this->view->repartitionHour
+		);
 
 		$this->view->repartitionDayOfWeek 	= $statsDAO->calculateEntryRepartitionPerFeedPerDayOfWeek($id);
-		$this->view->averageDayOfWeek 		= $statsDAO->calculateEntryAveragePerFeedPerDayOfWeek($id);
+		$this->view->averageDayOfWeek 		= FreshRSS_StatsDAO::calculateEntryAverageFromRepartition(
+			$this->view->repartitionDayOfWeek
+		);
 
 		$this->view->repartitionMonth 		= $statsDAO->calculateEntryRepartitionPerFeedPerMonth($id);
-		$this->view->averageMonth 			= $statsDAO->calculateEntryAveragePerFeedPerMonth($id);
+		$this->view->averageMonth 			= FreshRSS_StatsDAO::calculateEntryAverageFromRepartition(
+			$this->view->repartitionMonth
+		);
 
 		$hours24Labels = [];
 		for ($i = 0; $i < 24; $i++) {

+ 8 - 0
app/Models/StatsDAO.php

@@ -205,6 +205,14 @@ class FreshRSS_StatsDAO extends Minz_ModelPdo {
 		return $this->calculateEntryAveragePerFeedPerPeriod(30, $feed);
 	}
 
+	/**
+	 * Calculates the average number of articles from an entry repartition.
+	 * @param array<int,int> $repartition
+	 */
+	public static function calculateEntryAverageFromRepartition(array $repartition): float {
+		return empty($repartition) ? 0.0 : array_sum($repartition) / count($repartition);
+	}
+
 	/**
 	 * Calculates the average number of article per feed
 	 * @param float $period number used to divide the number of day in the period

+ 18 - 0
tests/app/Models/StatsDAOTest.php

@@ -0,0 +1,18 @@
+<?php
+declare(strict_types=1);
+use PHPUnit\Framework\TestCase;
+
+final class StatsDAOTest extends TestCase {
+
+	public static function testCalculateEntryAverageFromRepartition(): void {
+		self::assertSame(2.0, FreshRSS_StatsDAO::calculateEntryAverageFromRepartition([0, 2, 4]));
+	}
+
+	public static function testCalculateEntryAverageFromEmptyRepartition(): void {
+		self::assertSame(0.0, FreshRSS_StatsDAO::calculateEntryAverageFromRepartition([]));
+	}
+
+	public static function testCalculateEntryAverageFromZeroRepartition(): void {
+		self::assertSame(0.0, FreshRSS_StatsDAO::calculateEntryAverageFromRepartition(array_fill(0, 24, 0)));
+	}
+}