Subversion Repositories eFlore/Applications.del

Rev

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));

        }
}