true, 'toutvoir' => true, 'jointures' => true ), $serveur); // pas de résultat, pas de point $points = isset($points[$x]) ? $points[$x] : array(); // permettre aux plugins de modifier le resultat $points = pipeline('prepare_recherche', array( 'args' => array( 'type' => $x, 'recherche' => $recherche, 'serveur' => $serveur, 'modificateurs' => $modificateurs ), 'data' => $points )); // supprimer les anciens resultats de cette recherche // et les resultats trop vieux avec une marge // pas de AS resultats dans un delete (mysql) $whered = str_replace(array("resultats.recherche", "resultats.table_objet", "resultats.serveur"), array("recherche", "table_objet", "serveur"), $where); sql_delete('spip_resultats', "NOT($where_resultat_recent) OR ($whered)"); // inserer les resultats dans la table de cache des resultats if (count($points)) { $tab_couples = array(); foreach ($points as $id => $p) { $tab_couples[] = array( 'recherche' => $hash, 'id' => $id, 'points' => $p['score'], 'table_objet' => $table, 'serveur' => $hash_serv, ); } sql_insertq_multi('spip_resultats', $tab_couples, array()); } } if (!isset($cache[$serveur][$table][$recherche])) { if (!$serveur) { $cache[$serveur][$table][$recherche] = array("resultats.points AS points", $where); } else { if (sql_countsel('spip_resultats as resultats', $where)) { $rows = sql_allfetsel('resultats.id,resultats.points', 'spip_resultats as resultats', $where); } $cache[$serveur][$table][$recherche] = generer_select_where_explicites($table, $primary, $rows, $serveur); } } return $cache[$serveur][$table][$recherche]; } /** * Generer le select et where qui contiennent explicitement * les id et points (ie comme dans SPIP 1.9.x) * quand on fait une recherche sur une table externe * * @param string $table * @param string $primary * @param array $rows * @param string $serveur * @return array */ function generer_select_where_explicites($table, $primary, $rows, $serveur) { # calculer le {id_article IN()} et le {... as points} if (!count($rows)) { return array("''", "0=1"); } else { $listes_ids = array(); $select = '0'; foreach ($rows as $r) { $listes_ids[$r['points']][] = $r['id']; } foreach ($listes_ids as $p => $ids) { $select .= "+$p*(" . sql_in("$table.$primary", $ids, '', $serveur) . ") "; } return array("$select AS points ", sql_in("$table.$primary", array_map('reset', $rows), '', $serveur)); } }