New file |
0,0 → 1,64 |
<?php |
namespace TelaBotanica\Del\Commun; |
|
class Stats { |
|
static function updateStats($db, $id_image, $id_proto) { |
// @TODO Attention aux situations de concurrence possible - nécessite une |
// transaction mais la flemme de tout mettre en InnoDB |
$id_image = intval($id_image); |
$id_proto = intval($id_proto); |
if (!$id_image || !$id_proto) throw new Exception("Ne peut mettre à jour les statistiques de vote", |
RestServeur::HTTP_CODE_ERREUR); |
|
// 1) choper tous les votes pour le protocole choisi |
$votes = $db->requeter(sprintf( |
' SELECT ce_image, ce_protocole, valeur, ce_utilisateur'. |
' FROM del_image_vote'. |
' WHERE ce_image = %d AND ce_protocole = %d', |
$id_image, $id_proto)); |
|
// 2) calculer la moyenne pondérée, le nombre de points |
// @ACHTUNG_ALARM attention à ce que cette méthode corresponde avec les |
// calculs dans GWT, notamment l'échelle de points !! |
$nbPoints = 0; |
$nbVotes = 0; |
//$echelle = array(-1, 0, 1, 4, 20); |
$echelle = array(1, 10, 100, 1000, 10000); |
$notesParOccurrences = array(); |
$utilisateurs = array(); |
foreach ($votes as $vote) { |
if (! in_array($vote['ce_utilisateur'], $utilisateurs)) { |
// un seul vote par utilisateur sur un protocole donné !! |
$utilisateurs[] = $vote['ce_utilisateur']; |
$note = $vote['valeur']; |
$nbPoints += $echelle[$note - 1]; |
if (array_key_exists($note, $notesParOccurrences)) { |
$notesParOccurrences[$note]++; |
} else { |
$notesParOccurrences[$note] = 1; |
} |
$nbVotes++; |
} |
} |
$moyennePonderee = 0; |
$diviseur = 0; |
foreach ($notesParOccurrences as $n => $o) { |
$moyennePonderee += ($n * $o * $o); |
$diviseur += ($o * $o); |
} |
if ($diviseur > 0) { |
$moyennePonderee = $moyennePonderee / $diviseur; |
} |
|
// 3) mise à jour de la table stats |
$db->requeter(sprintf( |
' INSERT INTO del_image_stat (ce_image, ce_protocole, moyenne, nb_votes, nb_points)'. |
' VALUES (%d, %d, %s, %d, %d)'. |
' ON DUPLICATE KEY UPDATE moyenne = %s, nb_votes = %d, nb_points = %d', |
$id_image, $id_proto, number_format($moyennePonderee, 3, '.', ''), $nbVotes, $nbPoints, |
number_format($moyennePonderee, 3, '.', ''), $nbVotes, $nbPoints)); |
|
} |
} |
?> |