Rev 1572 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?phpnamespace 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));}}