Blame | Last modification | View Log | RSS feed
<?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));
}
}