X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;ds=inline;f=classes%2Fprofile.php;h=8eb66bbc6aa5e5b7cfbd8a88563b47f8c0294fb3;hb=b0ffc8817742b44a6cf0f02cdcd885ea7b154625;hp=21bf56d8fa82a937ea41f8ad622c0908c17a0811;hpb=5acd53a92dd25277adee3f8736d14c9ae4876ed1;p=platal.git diff --git a/classes/profile.php b/classes/profile.php index 21bf56d..8eb66bb 100644 --- a/classes/profile.php +++ b/classes/profile.php @@ -538,11 +538,15 @@ class Profile public function getMainAddress() { - $addr = $this->getAddresses(self::ADDRESS_PERSO | self::ADDRESS_MAIN); - if (count($addr) == 0) { - return null; + $main = $this->getAddresses(self::ADDRESS_MAIN); + $perso = $this->getAddresses(self::ADDRESS_PERSO); + + if (count($main)) { + return array_pop($main); + } else if (count($perso)) { + return array_pop($perso); } else { - return array_pop($addr); + return null; } } @@ -1012,29 +1016,41 @@ class Profile if (!is_array($pids)) { $pids = array($pids); } - $keys = XDB::iterator("SELECT n.pid, CONCAT(n.particle, n.name) AS name, e.score, - IF(FIND_IN_SET('public', e.flags), 'public', '') AS public - FROM profile_name AS n - INNER JOIN profile_name_enum AS e ON (n.typeid = e.id) - WHERE n.pid IN {?}", - $pids); - + $keys = XDB::iterator("(SELECT n.pid AS pid, n.name AS name, e.score AS score, + IF(FIND_IN_SET('public', e.flags), 'public', '') AS public + FROM profile_name AS n + INNER JOIN profile_name_enum AS e ON (n.typeid = e.id) + WHERE n.pid IN {?} AND NOT FIND_IN_SET('not_displayed', e.flags)) + UNION + (SELECT n.pid AS pid, n.particle AS name, 0 AS score, + IF(FIND_IN_SET('public', e.flags), 'public', '') AS public + FROM profile_name AS n + INNER JOIN profile_name_enum AS e ON (n.typeid = e.id) + WHERE n.pid IN {?} AND NOT FIND_IN_SET('not_displayed', e.flags)) + ", + $pids, $pids); $names = array(); while ($key = $keys->next()) { if ($key['name'] == '') { continue; } $pid = $key['pid']; - $toks = preg_split('/[ \'\-]+/', $key['name']); + $toks = preg_split('/[ \'\-]+/', strtolower(replace_accent($key['name'])), + -1, PREG_SPLIT_NO_EMPTY); + $toks = array_reverse($toks); + + /* Split the score between the tokens to avoid the user to be over-rated. + * Let says my user name is "Machin-Truc Bidule" and I also have a user named + * 'Machin Truc'. Distributing the score force "Machin Truc" to be displayed + * before "Machin-Truc" for both "Machin Truc" and "Machin" searches. + */ + $eltScore = ceil(((float)$key['score'])/((float)count($toks))); $token = ''; - $first = 5; - while ($toks) { - $token = strtolower(replace_accent(array_pop($toks) . $token)); - $score = ($toks ? 0 : 10 + $first) * ($key['score'] / 10); + foreach ($toks as $tok) { + $token = $tok . $token; $names["$pid-$token"] = XDB::format('({?}, {?}, {?}, {?}, {?})', $token, $pid, soundex_fr($token), - $score, $key['public']); - $first = 0; + $eltScore, $key['public']); } } XDB::startTransaction(); @@ -1042,8 +1058,8 @@ class Profile WHERE pid IN {?}', $pids); if (count($names) > 0) { - XDB::execute('INSERT INTO search_name (token, pid, soundex, score, flags) - VALUES ' . implode(', ', $names)); + XDB::rawExecute('INSERT INTO search_name (token, pid, soundex, score, flags) + VALUES ' . implode(', ', $names)); } XDB::commit(); }