+ // Autocompletion : according to type required, return
+ // a list of results matching with the number of matches.
+ // The output format is :
+ // result1|nb1
+ // result2|nb2
+ // ...
+ header('Content-Type: text/plain; charset="UTF-8"');
+ $q = preg_replace(array('/\*+$/', // always look for $q*
+ '/([\^\$\[\]])/', // escape special regexp char
+ '/\*/'), // replace joker by regexp joker
+ array('',
+ '\\\\\1',
+ '.*'),
+ $_REQUEST['q']);
+ if (!$q) exit();
+
+ // try to look in cached results
+ $cache = XDB::query('SELECT `result`
+ FROM `search_autocomplete`
+ WHERE `name` = {?} AND
+ `query` = {?} AND
+ `generated` > NOW() - INTERVAL 1 DAY',
+ $type, $q);
+ if ($res = $cache->fetchOneCell()) {
+ echo $res;
+ die();
+ }
+
+ // default search
+ $unique = '`user_id`';
+ $db = '`auth_user_md5`';
+ $realid = false;
+ $beginwith = true;
+ $field2 = false;
+ $qsearch = str_replace(array('%', '_'), '', $q);
+
+ switch ($type) {
+ case 'binetTxt':
+ $db = '`binets_def` INNER JOIN
+ `binets_ins` ON(`binets_def`.`id` = `binets_ins`.`binet_id`)';
+ $field='`binets_def`.`text`';
+ if (strlen($q) > 2)
+ $beginwith = false;
+ $realid = '`binets_def`.`id`';
+ break;
+ case 'networking_typeTxt':
+ $db = '`profile_networking_enum` INNER JOIN
+ `profile_networking` ON(`profile_networking`.`network_type` = `profile_networking_enum`.`network_type`)';
+ $field = '`profile_networking_enum`.`name`';
+ $unique = 'uid';
+ $realid = '`profile_networking_enum`.`network_type`';
+ break;
+ case 'city':
+ $db = '`geoloc_city` INNER JOIN
+ `adresses` ON(`geoloc_city`.`id` = `adresses`.`cityid`)';
+ $unique='`uid`';
+ $field='`geoloc_city`.`name`';
+ break;
+ case 'countryTxt':
+ $db = '`geoloc_pays` INNER JOIN
+ `adresses` ON(`geoloc_pays`.`a2` = `adresses`.`country`)';
+ $unique='`uid`';
+ $field = '`geoloc_pays`.`pays`';
+ $field2 = '`geoloc_pays`.`country`';
+ $realid='`geoloc_pays`.`a2`';
+ break;
+ case 'entreprise':
+ $db = '`entreprises`';
+ $field = '`entreprise`';
+ $unique='`uid`';
+ break;
+ case 'firstname':
+ $field = '`prenom`';
+ $beginwith = false;
+ break;
+ case 'fonctionTxt':
+ $db = '`fonctions_def` INNER JOIN
+ `entreprises` ON(`entreprises`.`fonction` = `fonctions_def`.`id`)';
+ $field = '`fonction_fr`';
+ $unique = '`uid`';
+ $realid = '`fonctions_def`.`id`';
+ $beginwith = false;
+ break;
+ case 'groupexTxt':
+ $db = "groupex.asso AS a INNER JOIN
+ groupex.membres AS m ON(a.id = m.asso_id
+ AND (a.cat = 'GroupesX' OR a.cat = 'Institutions')
+ AND a.pub = 'public')";
+ $field='a.nom';
+ $field2 = 'a.diminutif';
+ if (strlen($q) > 2)
+ $beginwith = false;
+ $realid = 'a.id';
+ $unique = 'm.uid';
+ break;
+ case 'name':
+ $field = '`nom`';
+ $field2 = '`nom_usage`';
+ $beginwith = false;
+ break;
+ case 'nationaliteTxt':
+ $db = '`geoloc_pays` INNER JOIN
+ `auth_user_md5` ON(`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite`)';
+ $field = 'IF(`geoloc_pays`.`nat`=\'\',
+ `geoloc_pays`.`pays`,
+ `geoloc_pays`.`nat`)';
+ $realid = '`geoloc_pays`.`a2`';
+ break;
+ case 'nickname':
+ $field = '`profile_nick`';
+ $db = '`auth_user_quick`';
+ $beginwith = false;
+ break;
+ case 'poste':
+ $db = '`entreprises`';
+ $field = '`poste`';
+ $unique='`uid`';
+ break;
+ case 'schoolTxt':
+ $db = '`applis_def` INNER JOIN
+ `applis_ins` ON(`applis_def`.`id` = `applis_ins`.`aid`)';
+ $field='`applis_def`.`text`';
+ $unique = '`uid`';
+ $realid = '`applis_def`.`id`';
+ if (strlen($q) > 2)
+ $beginwith = false;
+ break;
+ case 'secteurTxt':
+ $db = '`emploi_secteur` INNER JOIN
+ `entreprises` ON(`entreprises`.`secteur` = `emploi_secteur`.`id`)';
+ $field = '`emploi_secteur`.`label`';
+ $realid = '`emploi_secteur`.`id`';
+ $unique = '`uid`';
+ $beginwith = false;
+ break;
+ case 'sectionTxt':
+ $db = '`sections` INNER JOIN
+ `auth_user_md5` ON(`auth_user_md5`.`section` = `sections`.`id`)';
+ $field = '`sections`.`text`';
+ $realid = '`sections`.`id`';
+ $beginwith = false;
+ break;
+ default: exit();
+ }
+
+ function make_field_test($fields, $beginwith) {
+ $tests = array();
+ $tests[] = $fields . ' LIKE CONCAT({?}, \'%\')';
+ if (!$beginwith) {
+ $tests[] = $fields . ' LIKE CONCAT(\'% \', {?}, \'%\')';
+ $tests[] = $fields . ' LIKE CONCAT(\'%-\', {?}, \'%\')';
+ }
+ return '(' . implode(' OR ', $tests) . ')';
+ }
+ $field_select = $field;
+ $field_t = make_field_test($field, $beginwith);
+ if ($field2) {
+ $field2_t = make_field_test($field2, $beginwith);
+ $field_select = 'IF(' . $field_t . ', ' . $field . ', ' . $field2. ')';
+ }
+ $list = XDB::iterator('SELECT ' . $field_select . ' AS field,
+ COUNT(DISTINCT ' . $unique . ') AS nb
+ ' . ($realid ? (', ' . $realid . ' AS id') : '') . '
+ FROM ' . $db . '
+ WHERE ' . $field_t .
+ ($field2 ? (' OR ' . $field2_t) : '') . '
+ GROUP BY ' . $field_select . '
+ ORDER BY nb DESC
+ LIMIT 11',
+ $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch,
+ $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch);
+ $nbResults = 0;
+ $res = "";
+ while ($result = $list->next()) {
+ $nbResults++;
+ if ($nbResults == 11) {
+ $res .= $q."|-1\n";
+ } else {
+ $res .= $result['field'].'|';
+ $res .= $result['nb'];
+ if (isset($result['id'])) {
+ $res .= '|'.$result['id'];
+ }
+ $res .= "\n";
+ }
+ }
+ XDB::query('REPLACE INTO `search_autocomplete`
+ VALUES ({?}, {?}, {?}, NOW())',
+ $type, $q, $res);
+ echo $res;
+ exit();