From 639b4844714dd15c67bf6ca5cde85621f2dfbb98 Mon Sep 17 00:00:00 2001
From: ARNO* <arno@rezo.net>
Date: Thu, 29 Aug 2002 18:11:04 +0000
Subject: [PATCH] Retour du bousin stats (version corrigee). Plus un hack dans
 inc-calcul-squel pour avoir un critere "mode=image" dans les documents

---
 ecrire/inc_presentation.php3      |  3 +-
 ecrire/inc_statistiques.php3      | 95 +++++++++++++++++++++----------
 ecrire/statistiques_articles.php3 | 10 ++--
 inc-calcul-squel.php3             |  4 ++
 4 files changed, 77 insertions(+), 35 deletions(-)

diff --git a/ecrire/inc_presentation.php3 b/ecrire/inc_presentation.php3
index 8500f4db69..de6e03b6ee 100644
--- a/ecrire/inc_presentation.php3
+++ b/ecrire/inc_presentation.php3
@@ -413,7 +413,7 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a
 			$date = $row['date'];
 			$statut = $row['statut'];
 			$visites = $row['visites'];
-			$referers = $row['referers'];
+			$popularite = $row['popularite'];
 			$descriptif = $row['descriptif'];
 			if ($descriptif) $descriptif = ' title="'.attribut_html(typo($descriptif)).'"';
 
@@ -463,6 +463,7 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a
 			$s = affdate($date);
 			if ($connect_statut == "0minirezo" AND $activer_statistiques != "non" AND $afficher_visites AND $visites > 0) {
 				$s .= "<br><font size=\"1\"><a href='statistiques_visites.php3?id_article=$id_article'>$visites&nbsp;visites</a></font>";
+				if ($popularite > 0) $s .= "<br><font size=\"1\"><a href='statistiques_visites.php3?id_article=$id_article'>popularit&eacute;&nbsp;: $popularite%</a></font>";
 			}
 			$vals[] = $s;
 
diff --git a/ecrire/inc_statistiques.php3 b/ecrire/inc_statistiques.php3
index 81369ec963..b556f1969d 100644
--- a/ecrire/inc_statistiques.php3
+++ b/ecrire/inc_statistiques.php3
@@ -245,51 +245,88 @@ function supprimer_referers($type = "") {
 		$visites_min = $row['visites'];
 	}
 
-	$query = "DELETE FROM $table WHERE date < DATE_SUB(NOW(),INTERVAL 7 DAY) OR visites <= $visites_min";
+	$query = "DELETE FROM $table WHERE (date < DATE_SUB(NOW(),INTERVAL 7 DAY) AND visites <= $visites_min) OR (date < DATE_SUB(NOW(),INTERVAL 30 DAY)";
 	$result = spip_query($query);
 }
 
 
-function optimiser_referers() {
+function optimiser_referers($type = "") {
 	$popularite_update = "";
+	$diff = 7;
+	$coeff_referer = 2;
 
-	// Calcul des gains en popularite
-	$query = "SELECT id_article, COUNT(*) AS referers, SUM(visites) AS visites ".
-		"FROM spip_referers_articles GROUP BY id_article";
+
+	// Visites ponderees par age des derniers jours
+	$query = "SELECT id_article, visites, (TO_DAYS(now())-TO_DAYS(date)) AS age FROM spip_visites_articles WHERE date > DATE_SUB(NOW(), INTERVAL 30 DAY)";
 	$result = spip_query($query);
+
 	while ($row = mysql_fetch_array($result)) {
 		$id_article = $row['id_article'];
-		$referers = $row['referers'];
 		$visites = $row['visites'];
-
-		$popularite = intval(10 * sqrt(sqrt($referers + 1)) * $visites);
-		$popularite_update[$popularite][] = $id_article;
-		if ($max < $popularite) $max = $popularite;
+		$age = $row['age'];
+		
+		if ($age > $age_max) $age_max = $age;
+
+		$valeurs[$id_article]['valeur'] = $valeurs[$id_article]['valeur'] + ($visites/($age+$diff))*$diff;
+		$valeurs[$id_article]['visites'] = $valeurs[$id_article]['visites'] + $visites ;
+		
+		$tous_articles[$id_article] = $id_article;
 	}
+	
+	// Visites ponderees par age dans l'absolu
+	$col_age = "(LEAST((TO_DAYS(now())-TO_DAYS(date)),(DAYOFMONTH(now())-DAYOFMONTH(date))+30.4368*(MONTH(now())-MONTH(date))+365.2422*(YEAR(now())-YEAR(date))))";
+	$query = "SELECT id_article, visites, $col_age AS age FROM spip_articles WHERE statut = 'publie'";
+	$result = spip_query($query);
 
-	// Mise a jour des valeurs de referers et popularite
-	if (is_array($popularite_update)) {
-		// Normalisation avant (limiter l'influence des visites recentes)
-		if ($max < 100) $max = 100;
-
-		while (list($popularite, $articles) = each($popularite_update)) {
-			$query = "UPDATE spip_articles SET popularite = popularite + $popularite * 100 / $max ".
-				"WHERE id_article IN (".join(', ', $articles).")";
-			$result = spip_query($query);
-		}
-
-		// Normalisation apres
-		$query = "SELECT MAX(popularite) AS max FROM spip_articles";
+	while ($row = mysql_fetch_array($result)) {
+		$id_article = $row['id_article'];
+		$visites = $row['visites'] - $valeurs[$id_article]['visites'];
+		$age = intval($row['age']) + $diff;
+		$periode = $age - $age_max;
+		
+		if ($periode < 1) $periode = 1;
+		if ($age < 1) $age  = 1;
+		
+		$valeur = $visites / ($age * $periode) * $diff;
+		$valeurs[$id_article]['valeur'] = $valeurs[$id_article]['valeur'] + $valeur;
+				
+		$tous_articles[$id_article] = $id_article;
+	}
+	
+	if ($tous_articles) {	
+		$tous_articles = join(",", $tous_articles);
+	
+		// Visites surponderees des referers
+		$query = "SELECT id_article, SUM(visites) AS externes, MAX((TO_DAYS(now())-TO_DAYS(date))) AS age ".
+			"FROM spip_referers_articles WHERE date > DATE_SUB(NOW(), INTERVAL 15 DAY) GROUP BY id_article";
 		$result = spip_query($query);
-		if ($row = mysql_fetch_array($result)) {
-			$max = $row['max'];
-			if ($max > 100) {
-				$query = "UPDATE spip_articles SET popularite = popularite * 100 / $max";
+	
+		while ($row = mysql_fetch_array($result)) {
+			$id_article = $row['id_article'];
+			$age = $row['age'];
+			if ($age < 1) $age = 1;
+			$externes = ($row['externes']) * $coeff_referer;
+			$visites = $valeurs[$id_article]['valeur'];
+			$nouvelle_valeur = $externes + $visites;
+			if ($nouvelle_valeur > $max_valeur) $max_valeur = $nouvelle_valeur;
+			$valeurs[$id_article]['valeur'] = $nouvelle_valeur;
+		}
+		
+		while (list($id_article) = each ($valeurs) AND $max_valeur > 0) {
+			$valeur = $valeurs[$id_article]['valeur'];
+			$popularite = round(sqrt((($valeur) / $max_valeur)) * 100);
+			$popularite_update[$popularite][] = $id_article;
+		}
+		
+		if (is_array($popularite_update)) {
+			while (list($popularite, $articles) = each($popularite_update)) {
+				$articles = join(",",$articles);
+				$query = "UPDATE spip_articles SET popularite = $popularite ".
+					"WHERE id_article IN ($articles)";
 				$result = spip_query($query);
 			}
-		}
+		}		
 	}
-
 	supprimer_referers();
 	supprimer_referers("article");
 }
diff --git a/ecrire/statistiques_articles.php3 b/ecrire/statistiques_articles.php3
index c2e0a77441..550f60cc42 100644
--- a/ecrire/statistiques_articles.php3
+++ b/ecrire/statistiques_articles.php3
@@ -45,7 +45,7 @@ if ($activer_statistiques_ref == "oui"){
 if ($critere == "referers"){
 	echo propre("Les &laquo;acc&egrave;s directs sur la page&raquo; sont le nombre de visiteurs arriv&eacute;s directement {&agrave; l'int&eacute;rieur} du site depuis un lien ext&eacute;rieur, sans passer par la page d'accueil. Plus une page de votre site est r&eacute;f&eacute;renc&eacute;e sur des sites &agrave; fort traffic, plus le nombre d'arriv&eacute;es directes sur cette page sera important.")."<p>";
 	afficher_articles("Les articles r&eacute;cents (3 mois) les plus r&eacute;f&eacute;renc&eacute;s",
-"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, referers, id_rubrique, statut ".
+"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, popularite, id_rubrique, statut ".
 "FROM spip_articles WHERE visites > 0 AND date>DATE_SUB('$date',INTERVAL 90 DAY) ORDER BY referers DESC LIMIT 0,100", true);
 }
 else if ($critere == "popularite"){
@@ -54,18 +54,18 @@ else if ($critere == "popularite"){
 		"Un article devient donc &laquo;populaire&raquo; lorsqu'il fait l'objet d'un r&eacute;f&eacute;rencement ".
 		"sur d'autres sites et lorsqu'il est derni&egrave;rement tr&egrave;s visit&eacute;.")."<p>";
 	afficher_articles("Les articles r&eacute;cents (3 mois) les plus populaires",
-"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, referers, id_rubrique, statut ".
+"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, popularite, id_rubrique, statut ".
 "FROM spip_articles WHERE popularite > 0 AND date>DATE_SUB('$date',INTERVAL 90 DAY) ORDER BY popularite DESC LIMIT 0,100", true);
 	afficher_articles("Les articles les plus populaires depuis le d&eacute;but",
-"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, referers, id_rubrique, statut ".
+"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, popularite, id_rubrique, statut ".
 "FROM spip_articles WHERE popularite > 0 ORDER BY popularite DESC LIMIT 0,100", true);
 }
 else{
 	afficher_articles("Les articles r&eacute;cents (3 mois) les plus visit&eacute;s",
-"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, referers, id_rubrique, statut ".
+"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, popularite, id_rubrique, statut ".
 "FROM spip_articles WHERE visites > 0 AND date>DATE_SUB('$date',INTERVAL 90 DAY) ORDER BY visites DESC LIMIT 0,100", true);
 	afficher_articles("Les articles les plus visit&eacute;s depuis le d&eacute;but",
-"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, referers, id_rubrique, statut ".
+"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, popularite, id_rubrique, statut ".
 "FROM spip_articles WHERE visites > 0 ORDER BY visites DESC LIMIT 0,100", true);
 }
 
diff --git a/inc-calcul-squel.php3 b/inc-calcul-squel.php3
index bc8affc27a..6e12397e5e 100644
--- a/inc-calcul-squel.php3
+++ b/inc-calcul-squel.php3
@@ -367,6 +367,10 @@ function parser_boucle($texte, $id_parent) {
 						if ($type == 'documents' AND $col == 'extension') {
 							$col_table = 'types_d';
 						}
+						// HACK : selection des documents selon mode 'image' (a creer en dur dans la base)
+						else if ($type == 'documents' AND $col == 'mode' AND $val == 'image') {
+							$val = 'vignette';
+						}
 						// Cas particulier : lier les articles syndiques au site correspondant
 						else if ($type == 'syndic_articles')
 							$col_table = 'source';
-- 
GitLab