Subversion Repositories eFlore/Applications.del

Rev

Rev 1572 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1567 mathias 1
<?php
2
 
3
namespace TelaBotanica\Del\Commun;
4
 
5
class Stats {
6
 
7
	static function updateStats($db, $id_image, $id_proto) {
8
		// @TODO Attention aux situations de concurrence possible - nécessite une
9
		// transaction mais la flemme de tout mettre en InnoDB
10
		$id_image = intval($id_image);
11
		$id_proto = intval($id_proto);
12
		if(!$id_image || !$id_proto) throw new Exception("Ne peut mettre à jour les statistiques de vote",
13
				RestServeur::HTTP_CODE_ERREUR);
14
 
15
		// 1) choper tous les votes pour le protocole choisi
16
		$votes = $db->requeter(sprintf(
17
				' SELECT ce_image, ce_protocole, valeur'.
18
				' FROM del_image_vote'.
19
				' WHERE ce_image = %d AND ce_protocole = %d',
20
				$id_image, $id_proto));
21
 
22
		// 2) calculer la moyenne pondérée, le nombre de points
23
		// @ACHTUNG_ALARM attention à ce que cette méthode corresponde avec les
24
		// calculs dans GWT, notamment l'échelle de points !!
25
		$nbPoints = 0;
26
		$nbVotes = 0;
27
		$echelle = array(-1, 0, 1, 4, 20);
28
		$notesParOccurrences = array();
29
		foreach ($votes as $vote) {
30
			$note = $vote['valeur'];
31
			$nbPoints += $echelle[$note - 1];
32
			if (array_key_exists($note, $notesParOccurrences)) {
33
				$notesParOccurrences[$note]++;
34
			} else {
35
				$notesParOccurrences[$note] = 1;
36
			}
37
			$nbVotes++;
38
		}
39
		$moyennePonderee = 0;
40
		$diviseur = 0;
41
		foreach ($notesParOccurrences as $n => $o) {
42
			$moyennePonderee += ($n * $o * $o);
43
			$diviseur += ($o * $o);
44
		}
45
		if ($diviseur > 0) {
46
			$moyennePonderee = $moyennePonderee / $diviseur;
47
		}
48
 
49
		// 3) mise à jour de la table stats
50
		$db->requeter(sprintf(
51
				' INSERT INTO del_image_stat (ce_image, ce_protocole, moyenne, nb_votes, nb_points)'.
52
				' VALUES (%d, %d, %s, %d, %d)'.
53
				' ON DUPLICATE KEY UPDATE moyenne = %s, nb_votes = %d, nb_points = %d',
54
				$id_image, $id_proto, number_format($moyennePonderee, 3, '.', ''), $nbVotes, $nbPoints, number_format($moyennePonderee, 3, '.', ''), $nbVotes, $nbPoints));
55
 
56
	}
57
}