<?php
/***************************************************************************
- * Copyright (C) 2003-2009 Polytechnique.org *
+ * Copyright (C) 2003-2010 Polytechnique.org *
* http://opensource.polytechnique.org/ *
* *
* This program is free software; you can redistribute it and/or modify *
}
// }}}
+// {{{ class UFC_Ip
+/** Filters users based on one of their last IPs
+ * @param $ip IP from which connection are checked
+ */
+class UFC_Ip implements UserFilterCondition
+{
+ private $ip;
+
+ public function __construct($ip)
+ {
+ $this->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
{
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);
}
}
// }}}
}
// }}}
-// {{{ class UFC_Formation
+// {{{ class UFC_EducationSchool
/** Filters users by formation
* @param $val The formation to search (either ID or array of IDs)
*/
-class UFC_Formation implements UserFilterCondition
+class UFC_EducationSchool implements UserFilterCondition
{
private $val;
}
// }}}
-// {{{ class UFC_Diploma
-class UFC_Diploma implements UserFilterCondition
+// {{{ class UFC_EducationDegree
+class UFC_EducationDegree implements UserFilterCondition
{
private $diploma;
}
// }}}
-// {{{ class UFC_StudyField
-class UFC_StudyField implements UserFilterCondition
+// {{{ class UFC_EducationField
+class UFC_EducationField implements UserFilterCondition
{
private $val;
*/
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;
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);
}
}
} 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);
}
// {{{ 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
*/
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);
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)
$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);
}
{
$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);
}
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);
}
}
// }}}
protected function getSortTokens(PlFilter &$uf)
{
- if (UserFilter::isDisplayName($this->type)) {
+ if (Profile::isDisplayName($this->type)) {
$sub = $uf->addDisplayFilter();
return 'pd' . $sub . '.' . $this->type;
} else {
* 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
return $fetched;
}
+ private static function defaultLimit($limit) {
+ if ($limit == null) {
+ return new PlLimit();
+ } else {
+ return $limit;
+ }
+ }
+
/** Check that the user match the given rule.
*/
public function checkUser(PlUser &$user)
/** Default filter is on users
*/
- public function filter(array $users, PlLimit &$limit)
+ public function filter(array $users, $limit = null)
{
- return $this->filterUsers($users, $limit);
+ return $this->filterUsers($users, self::defaultLimit($limit));
}
/** Filter a list of users to extract the users matching the rule.
*/
- public function filterUsers(array $users, PlLimit &$limit)
+ public function filterUsers(array $users, $limit = null)
{
+ $limit = self::defaultLimit($limit);
$this->requireAccounts();
$this->buildQuery();
$table = array();
/** Filter a list of profiles to extract the users matching the rule.
*/
- public function filterProfiles(array $profiles, PlLimit &$limit)
+ public function filterProfiles(array $profiles, $limit = null)
{
+ $limit = self::defaultLimit($limit);
$this->requireProfiles();
$this->buildQuery();
$table = array();
return $output;
}
- public function getUIDs(PlLimit &$limit)
+ public function getUIDs($limit = null)
{
+ $limit = self::defaultLimit($limit);
return $this->getUIDList(null, $limit);
}
- public function getPIDs(PlLimit &$limit)
+ public function getPIDs($limit = null)
{
+ $limit = self::defaultLimit($limit);
return $this->getPIDList(null, $limit);
}
- public function getUsers(PlLimit &$limit)
+ public function getUsers($limit = null)
{
return User::getBulkUsersWithUIDs($this->getUIDs($limit));
}
- public function getProfiles(PlLimit &$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 get(PlLimit &$limit)
+ public function iterProfiles($limit = null)
+ {
+ return Profile::iterOverPIDs($this->getPIDs($limit));
+ }
+
+ public function get($limit = null)
{
return $this->getUsers($limit);
}
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)
}
}
+ /** 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)
{
}
}
- 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)
{
$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;
{
$this->requireAccounts();
switch($type) {
- case MENTOR_EXPERTISE:
- $pms['pme'] = 'profile_mentor';
+ case self::MENTOR_EXPERTISE:
+ $this->pms['pme'] = 'profile_mentor';
return 'pme';
- case MENTOR_COUNTRY:
- $pms['pmc'] = 'profile_mentor_country';
+ case self::MENTOR_COUNTRY:
+ $this->pms['pmc'] = 'profile_mentor_country';
return 'pmc';
- case MENTOR_SECTOR:
- $pms['pms'] = 'profile_mentor_sector';
+ case self::MENTOR_SECTOR:
+ $this->pms['pms'] = 'profile_mentor_sector';
return 'pms';
default:
Platal::page()->killError("Undefined mentor filter.");
// {{{ class ProfileFilter
class ProfileFilter extends UserFilter
{
- public function get(PlLimit &$limit)
+ public function get($limit = null)
{
return $this->getProfiles($limit);
}