const FETCH_JOBS = 0x000008;
const FETCH_MEDALS = 0x000010;
const FETCH_NETWORKING = 0x000020;
- const FETCH_MENTOR_SECTOR = 0x000040;
const FETCH_MENTOR_COUNTRY = 0x000080;
const FETCH_PHONES = 0x000100;
const FETCH_JOB_TERMS = 0x000200;
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;
}
}
$this->consolidateFields();
}
- /* Mentoring
- */
- private $mentor_sectors = null;
- public function setMentoringSectors(ProfileMentoringSectors $sectors)
- {
- $this->mentor_sectors = $sectors;
- }
-
- public function getMentoringSectors()
- {
- if ($this->mentor_sectors == null && !$this->fetched(self::FETCH_MENTOR_SECTOR)) {
- $this->setMentoringSectors($this->getProfileField(self::FETCH_MENTOR_SECTOR));
- }
-
- if ($this->mentor_sectors == null) {
- return array();
- } else {
- return $this->mentor_sectors->sectors;
- }
- }
-
private $mentor_countries = null;
public function setMentoringCountries(ProfileMentoringCountries $countries)
{
}
}
- public static function rebuildSearchTokens($pid)
+ public static function rebuildSearchTokens($pids)
{
- XDB::execute('DELETE FROM search_name
- WHERE pid = {?}',
- $pid);
- $keys = XDB::iterator("SELECT CONCAT(n.particle, n.name) AS name, e.score,
- FIND_IN_SET('public', e.flags) AS public
- FROM profile_name AS n
- INNER JOIN profile_name_enum AS e ON (n.typeid = e.id)
- WHERE n.pid = {?}",
- $pid);
-
+ if (!is_array($pids)) {
+ $pids = array($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;
}
- $toks = preg_split('/[ \'\-]+/', $key['name']);
+ $pid = $key['pid'];
+ $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);
- XDB::execute('REPLACE INTO search_name (token, pid, soundex, score, flags)
- VALUES ({?}, {?}, {?}, {?}, {?})',
- $token, $pid, soundex_fr($token), $score, $key['public']);
- $first = 0;
+ foreach ($toks as $tok) {
+ $token = $tok . $token;
+ $names["$pid-$token"] = XDB::format('({?}, {?}, {?}, {?}, {?})',
+ $token, $pid, soundex_fr($token),
+ $eltScore, $key['public']);
}
}
+ XDB::startTransaction();
+ XDB::execute('DELETE FROM search_name
+ WHERE pid IN {?}',
+ $pids);
+ if (count($names) > 0) {
+ XDB::rawExecute('INSERT INTO search_name (token, pid, soundex, score, flags)
+ VALUES ' . implode(', ', $names));
+ }
+ XDB::commit();
}
/** The school identifier consists of 6 digits. The first 3 represent the