[SPIP] +2.1.12
[velocampus/web/www.git] / www / ecrire / inc / prepare_recherche.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2011 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13
14 if (!defined('_ECRIRE_INC_VERSION')) return;
15
16 include_spip('inc/rechercher');
17 if (!defined('_DELAI_CACHE_resultats')) define('_DELAI_CACHE_resultats', 600);
18
19 // Preparer les listes id_article IN (...) pour les parties WHERE
20 // et points = des requetes du moteur de recherche
21 // http://doc.spip.org/@inc_prepare_recherche_dist
22 function inc_prepare_recherche_dist($recherche, $table='articles', $cond=false, $serveur='',$plat=false) {
23 static $cache = array();
24 $delai_fraicheur = min(_DELAI_CACHE_resultats,time()-$GLOBALS['meta']['derniere_modif']);
25
26 // si recherche n'est pas dans le contexte, on va prendre en globals
27 // ca permet de faire des inclure simple.
28 if (!isset($recherche) AND isset($GLOBALS['recherche']))
29 $recherche = $GLOBALS['recherche'];
30
31 // traiter le cas {recherche?}
32 if ($cond AND !strlen($recherche))
33 return array("0 as points" /* as points */, /* where */ '');
34
35
36 $rechercher = false;
37
38 if (!isset($cache[$recherche][$table])){
39 $hash = substr(md5($recherche . $table),0,16);
40 $row = sql_fetsel('UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(maj) AS fraicheur','spip_resultats',"recherche='$hash'",'','fraicheur DESC','0,1','',$serveur);
41 if (!$row OR ($row['fraicheur']>$delai_fraicheur)){
42 $rechercher = true;
43 }
44 $cache[$recherche][$table] = array("resultats.points AS points","recherche='$hash'");
45 }
46
47 // si on n'a pas encore traite les donnees dans une boucle precedente
48 if ($rechercher) {
49 //$tables = liste_des_champs();
50 $x = preg_replace(',s$,', '', $table); // eurk
51 if ($x == 'syndic') $x = 'site';
52 $points = recherche_en_base($recherche,
53 $x,
54 array(
55 'score' => true,
56 'toutvoir' => true,
57 'jointures' => true
58 ),
59 $serveur);
60 $points = $points[$x];
61
62 # Pour les forums, unifier par id_thread et forcer statut='publie', sauf si le crière {plat} ou {tout} est présent
63 if ($x == 'forum' AND $points AND $plat != "true") {
64 $p2 = array();
65 $s = sql_select("id_thread, id_forum, statut", "spip_forum", sql_in('id_forum', array_keys($points)), '','','','', $serveur);
66 while ($t = sql_fetch($s, $serveur)){
67 $id_thread = intval($t['id_thread']);
68 $id_forum = intval($t['id_forum']);
69 if ($id_thread){
70 if ($t['statut'] == 'publie')
71 $p2[$id_thread]['score']
72 += $points[$id_forum]['score'];
73 }
74 else{
75 $p2[$id_forum]['score'] = $points[$id_forum]['score'];
76 }
77 }
78 $points = $p2;
79 }
80
81 // supprimer les anciens resultats de cette recherche
82 // et les resultats trop vieux avec une marge
83 sql_delete('spip_resultats','(maj<DATE_SUB(NOW(), INTERVAL '.($delai_fraicheur+100)." SECOND)) OR (recherche='$hash')",$serveur);
84
85 // inserer les resultats dans la table de cache des resultats
86 if (count($points)){
87 $tab_couples = array();
88 foreach ($points as $id => $p){
89 $tab_couples[] = array(
90 'recherche' => $hash,
91 'id' => $id,
92 'points' => $p['score']
93 );
94 }
95 sql_insertq_multi('spip_resultats',$tab_couples,array(),$serveur);
96 }
97 }
98
99 return $cache[$recherche][$table];
100 }
101
102
103
104 ?>