X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fuserfilter.php;h=fa155f2c0ec639da3a373ed57c745a442c5a89cb;hb=161daeb9cd8ea080de6d49fff42902e1e0817bc0;hp=7df876265b3ab459d28719462a85784939a97f07;hpb=434570c4360c7f38088ce1e7b42cb9d3ed3a0507;p=platal.git diff --git a/classes/userfilter.php b/classes/userfilter.php index 7df8762..fa155f2 100644 --- a/classes/userfilter.php +++ b/classes/userfilter.php @@ -1,6 +1,6 @@ ip = $ip; + } + + public function buildCondition(PlFilter &$uf) + { + $sub = $uf->addLoggerFilter(); + $ip = ip_to_uint($this->ip); + return XDB::format($sub . '.ip = {?} OR ' . $sub . '.forward_ip = {?}', $ip, $ip); + } +} +// }}} + // {{{ class UFC_Comment class UFC_Comment implements UserFilterCondition { @@ -89,7 +111,7 @@ class UFC_Comment implements UserFilterCondition public function buildCondition(PlFilter &$uf) { $uf->requireProfiles(); - return 'p.freetext LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->text); + return 'p.freetext ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->text); } } // }}} @@ -205,11 +227,11 @@ class UFC_EducationField implements UserFilterCondition */ class UFC_Name implements UserFilterCondition { - const PREFIX = 1; - const SUFFIX = 2; - const PARTICLE = 7; - const VARIANTS = 8; - const CONTAINS = 3; + const PREFIX = XDB::WILDCARD_PREFIX; // 0x001 + const SUFFIX = XDB::WILDCARD_SUFFIX; // 0x002 + const CONTAINS = XDB::WILDCARD_CONTAINS; // 0x003 + const PARTICLE = 0x007; // self::CONTAINS | 0x004 + const VARIANTS = 0x008; private $type; private $text; @@ -231,24 +253,15 @@ class UFC_Name implements UserFilterCondition public function buildCondition(PlFilter &$uf) { $left = '$ME.name'; - $op = ' LIKE '; if (($this->mode & self::PARTICLE) == self::PARTICLE) { $left = 'CONCAT($ME.particle, \' \', $ME.name)'; } - if (($this->mode & self::CONTAINS) == 0) { - $right = XDB::format('{?}', $this->text); - $op = ' = '; - } else if (($this->mode & self::CONTAINS) == self::PREFIX) { - $right = XDB::format('CONCAT({?}, \'%\')', $this->text); - } else if (($this->mode & self::CONTAINS) == self::SUFFIX) { - $right = XDB::format('CONCAT(\'%\', {?})', $this->text); - } else { - $right = XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->text); - } - $cond = $left . $op . $right; + $right = XDB::formatWildcards($this->mode & self::CONTAINS, $this->text); + + $cond = $left . $right; $conds = array($this->buildNameQuery($this->type, null, $cond, $uf)); - if (($this->mode & self::VARIANTS) != 0 && isset(UserFilter::$name_variants[$this->type])) { - foreach (UserFilter::$name_variants[$this->type] as $var) { + if (($this->mode & self::VARIANTS) != 0 && isset(Profile::$name_variants[$this->type])) { + foreach (Profile::$name_variants[$this->type] as $var) { $conds[] = $this->buildNameQuery($this->type, $var, $cond, $uf); } } @@ -296,7 +309,7 @@ class UFC_NameTokens implements UserFilterCondition } else { $tokconds = array(); foreach ($this->tokens as $token) { - $tokconds[] = $sub . '.token LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $token); + $tokconds[] = $sub . '.token ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $token); } $conds[] = implode(' OR ', $tokconds); } @@ -696,7 +709,7 @@ abstract class UFC_Address implements UserFilterCondition // {{{ class UFC_AddressText /** Select users based on their address, using full text search * @param $text Text for filter in fulltext search - * @param $textSearchMode Mode for search (PREFIX, SUFFIX, ...) + * @param $textSearchMode Mode for search (one of XDB::WILDCARD_*) * @param $type Filter on address type * @param $flags Filter on address flags * @param $country Filter on address country @@ -704,16 +717,11 @@ abstract class UFC_Address implements UserFilterCondition */ class UFC_AddressText extends UFC_Address { - /** Flags for text search - */ - const PREFIX = 0x0001; - const SUFFIX = 0x0002; - const CONTAINS = 0x0003; private $text; private $textSearchMode; - public function __construct($text = null, $textSearchMode = self::CONTAINS, + public function __construct($text = null, $textSearchMode = XDB::WILDCARD_CONTAINS, $type = null, $flags = self::FLAG_ANY, $country = null, $locality = null) { parent::__construct($type, $flags); @@ -725,18 +733,7 @@ class UFC_AddressText extends UFC_Address private function mkMatch($txt) { - $op = ' LIKE '; - if (($this->textSearchMode & self::CONTAINS) == 0) { - $right = XDB::format('{?}', $this->text); - $op = ' = '; - } else if (($this->mode & self::CONTAINS) == self::PREFIX) { - $right = XDB::format('CONCAT({?}, \'%\')', $this->text); - } else if (($this->mode & self::CONTAINS) == self::SUFFIX) { - $right = XDB::format('CONCAT(\'%\', {?})', $this->text); - } else { - $right = XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->text); - } - return $op . $right; + return XDB::formatWildcards($this->textSearchMode, $txt); } public function buildCondition(PlFilter &$uf) @@ -978,25 +975,25 @@ class UFC_Job_Description implements UserFilterCondition $conds = array(); if ($this->fields & UserFilter::JOB_USERDEFINED) { $sub = $uf->addJobFilter(); - $conds[] = $sub . '.description LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description); + $conds[] = $sub . '.description ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description); } if ($this->fields & UserFilter::JOB_CV) { $uf->requireProfiles(); - $conds[] = 'p.cv LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description); + $conds[] = 'p.cv ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description); } if ($this->fields & UserFilter::JOB_SECTOR) { $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SECTOR); - $conds[] = $sub . '.name LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description); + $conds[] = $sub . '.name ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description); } if ($this->fields & UserFilter::JOB_SUBSECTOR) { $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SUBSECTOR); - $conds[] = $sub . '.name LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description); + $conds[] = $sub . '.name ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description); } if ($this->fields & UserFilter::JOB_SUBSUBSECTOR) { $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SUBSUBSECTOR); - $conds[] = $sub . '.name LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description); + $conds[] = $sub . '.name ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description); $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_ALTERNATES); - $conds[] = $sub . '.name LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description); + $conds[] = $sub . '.name ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description); } return implode(' OR ', $conds); } @@ -1023,7 +1020,7 @@ class UFC_Networking implements UserFilterCondition { $sub = $uf->addNetworkingFilter(); $conds = array(); - $conds[] = $sub . '.address = ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->value); + $conds[] = $sub . '.address ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->value); if ($this->type != -1) { $conds[] = $sub . '.network_type = ' . XDB::format('{?}', $this->type); } @@ -1123,7 +1120,7 @@ class UFC_Mentor_Expertise implements UserFilterCondition public function buildCondition(PlFilter &$uf) { $sub = $uf->addMentorFilter(UserFilter::MENTOR_EXPERTISE); - return $sub . '.expertise LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\'', $this->expertise); + return $sub . '.expertise ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->expertise); } } // }}} @@ -1342,7 +1339,7 @@ class UFO_Name extends UserFilterOrder protected function getSortTokens(PlFilter &$uf) { - if (UserFilter::isDisplayName($this->type)) { + if (Profile::isDisplayName($this->type)) { $sub = $uf->addDisplayFilter(); return 'pd' . $sub . '.' . $this->type; } else { @@ -1447,7 +1444,7 @@ class UFO_Death extends UserFilterOrder * in the final query. * * In the join_criter text, $ME is replaced with 'join_tablealias', $PID with - * profile.pid, and $UID with auth_user_md5.user_id. + * profile.pid, and $UID with accounts.uid. * * For each kind of "JOIN" needed, a function named addXXXFilter() should be defined; * its parameter will be used to set various private vars of the UserFilter describing @@ -1665,12 +1662,14 @@ class UserFilter extends PlFilter public function getUIDs($limit = null) { - return $this->getUIDList(null, self::defaultLimit($limit)); + $limit = self::defaultLimit($limit); + return $this->getUIDList(null, $limit); } public function getPIDs($limit = null) { - return $this->getPIDList(null, self::defaultLimit($limit)); + $limit = self::defaultLimit($limit); + return $this->getPIDList(null, $limit); } public function getUsers($limit = null) @@ -1678,11 +1677,21 @@ class UserFilter extends PlFilter return User::getBulkUsersWithUIDs($this->getUIDs($limit)); } + public function iterUsers($limit = null) + { + return User::iterOverUIDs($this->getUIDs($limit)); + } + public function getProfiles($limit = null) { return Profile::getBulkProfilesWithPIDs($this->getPIDs($limit)); } + public function iterProfiles($limit = null) + { + return Profile::iterOverPIDs($this->getPIDs($limit)); + } + public function get($limit = null) { return $this->getUsers($limit); @@ -1733,12 +1742,12 @@ class UserFilter extends PlFilter static public function sortByName() { - return array(new UFO_Name(self::LASTNAME), new UFO_Name(self::FIRSTNAME)); + return array(new UFO_Name(Profile::LASTNAME), new UFO_Name(Profile::FIRSTNAME)); } static public function sortByPromo() { - return array(new UFO_Promo(), new UFO_Name(self::LASTNAME), new UFO_Name(self::FIRSTNAME)); + return array(new UFO_Promo(), new UFO_Name(Profile::LASTNAME), new UFO_Name(Profile::FIRSTNAME)); } static private function getDBSuffix($string) @@ -1825,33 +1834,27 @@ class UserFilter extends PlFilter } } + /** LOGGER + */ + + private $with_logger = false; + public function addLoggerFilter() + { + $this->with_logger = true; + $this->requireAccounts(); + return 'ls'; + } + protected function loggerJoins() + { + $joins = array(); + if ($this->with_logger) { + $joins['ls'] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'log_sessions', '$ME.uid = $UID'); + } + return $joins; + } + /** NAMES */ - /* name tokens */ - const LASTNAME = 'lastname'; - const FIRSTNAME = 'firstname'; - const NICKNAME = 'nickname'; - const PSEUDONYM = 'pseudonym'; - const NAME = 'name'; - /* name variants */ - const VN_MARITAL = 'marital'; - const VN_ORDINARY = 'ordinary'; - const VN_OTHER = 'other'; - const VN_INI = 'ini'; - /* display names */ - const DN_FULL = 'directory_name'; - const DN_DISPLAY = 'yourself'; - const DN_YOURSELF = 'yourself'; - const DN_DIRECTORY = 'directory_name'; - const DN_PRIVATE = 'private_name'; - const DN_PUBLIC = 'public_name'; - const DN_SHORT = 'short_name'; - const DN_SORT = 'sort_name'; - - static public $name_variants = array( - self::LASTNAME => array(self::VN_MARITAL, self::VN_ORDINARY), - self::FIRSTNAME => array(self::VN_ORDINARY, self::VN_INI, self::VN_OTHER) - ); static public function assertName($name) { @@ -1860,14 +1863,6 @@ class UserFilter extends PlFilter } } - static public function isDisplayName($name) - { - return $name == self::DN_FULL || $name == self::DN_DISPLAY - || $name == self::DN_YOURSELF || $name == self::DN_DIRECTORY - || $name == self::DN_PRIVATE || $name == self::DN_PUBLIC - || $name == self::DN_SHORT || $name == self::DN_SORT; - } - private $pn = array(); public function addNameFilter($type, $variant = null) { @@ -2029,13 +2024,13 @@ class UserFilter extends PlFilter $joins = array(); foreach ($this->gpm as $sub => $key) { if (is_null($key)) { - $joins['gpa' . $sub] = new PlSqlJoin(PlSqlJoin::MODE_INNER, 'groupex.asso'); - $joins['gpm' . $sub] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'groupex.membres', '$ME.uid = $UID AND $ME.asso_id = gpa' . $sub . '.id'); + $joins['gpa' . $sub] = new PlSqlJoin(PlSqlJoin::MODE_INNER, 'groups'); + $joins['gpm' . $sub] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'group_members', '$ME.uid = $UID AND $ME.asso_id = gpa' . $sub . '.id'); } else if (ctype_digit($key)) { - $joins['gpm' . $sub] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'groupex.membres', '$ME.uid = $UID AND $ME.asso_id = ' . $key); + $joins['gpm' . $sub] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'group_members', '$ME.uid = $UID AND $ME.asso_id = ' . $key); } else { - $joins['gpa' . $sub] = new PlSqlJoin(PlSqlJoin::MODE_INNER, 'groupex.asso', XDB::format('$ME.diminutif = {?}', $key)); - $joins['gpm' . $sub] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'groupex.membres', '$ME.uid = $UID AND $ME.asso_id = gpa' . $sub . '.id'); + $joins['gpa' . $sub] = new PlSqlJoin(PlSqlJoin::MODE_INNER, 'groups', XDB::format('$ME.diminutif = {?}', $key)); + $joins['gpm' . $sub] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'group_members', '$ME.uid = $UID AND $ME.asso_id = gpa' . $sub . '.id'); } } return $joins;