<?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_Hruid
+/** Filters users based on their hruid
+ * @param $val Either an hruid, or a list of those
+ */
+class UFC_Hruid implements UserFilterCondition
+{
+ private $hruids;
+
+ public function __construct($val)
+ {
+ if (!is_array($val)) {
+ $val = array($val);
+ }
+ $this->hruids = $val;
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $ufc->requireAccounts();
+
+ return 'a.hruid IN ' . XDB::formatArray($this->hruids);
+ }
+}
+// }}}
+
+// {{{ 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
+{
+ private $text;
+
+ public function __construct($text)
+ {
+ $this->text = $text;
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $uf->requireProfiles();
+ return 'p.freetext ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->text);
+ }
+}
+// }}}
+
// {{{ class UFC_Promo
/** Filters users based on promotion
* @param $comparison Comparison operator (>, =, ...)
}
// }}}
+// {{{ class UFC_EducationSchool
+/** Filters users by formation
+ * @param $val The formation to search (either ID or array of IDs)
+ */
+class UFC_EducationSchool implements UserFilterCondition
+{
+ private $val;
+
+ public function __construct($val)
+ {
+ if (!is_array($val)) {
+ $val = array($val);
+ }
+ $this->val = $val;
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $sub = $uf->addEducationFilter();
+ return 'pe' . $sub . '.eduid IN ' . XDB::formatArray($this->val);
+ }
+}
+// }}}
+
+// {{{ class UFC_EducationDegree
+class UFC_EducationDegree implements UserFilterCondition
+{
+ private $diploma;
+
+ public function __construct($diploma)
+ {
+ if (! is_array($diploma)) {
+ $diploma = array($diploma);
+ }
+ $this->diploma = $diploma;
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $sub = $uf->addEducationFilter();
+ return 'pee' . $sub . '.degreeid IN ' . XDB::formatArray($this->val);
+ }
+}
+// }}}
+
+// {{{ class UFC_EducationField
+class UFC_EducationField implements UserFilterCondition
+{
+ private $val;
+
+ public function __construct($val)
+ {
+ if (!is_array($val)) {
+ $val = array($val);
+ }
+ $this->val = $val;
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $sub = $uf->addEducationFilter();
+ return 'pee' . $sub . '.fieldid IN ' . XDB::formatArray($this->val);
+ }
+}
+// }}}
+
// {{{ class UFC_Name
/** Filters users based on name
* @param $type Type of name field on which filtering is done (firstname, lastname...)
*/
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_Nationality
+class UFC_Nationality implements UserFilterCondition
+{
+ private $val;
+
+ public function __construct($val)
+ {
+ if (!is_array($val)) {
+ $val = array($val);
+ }
+ $this->val = $val;
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $uf->requireProfiles();
+ $nat = XDB::formatArray($this->val);
+ $conds = array(
+ 'p.nationality1 IN ' . $nat,
+ 'p.nationality2 IN ' . $nat,
+ 'p.nationality3 IN ' . $nat,
+ );
+ return implode(' OR ', $conds);
+ }
+}
+// }}}
+
// {{{ class UFC_Dead
/** Filters users based on death date
* @param $comparison Comparison operator
public function buildCondition(PlFilter &$uf)
{
+ $uf->requireProfiles();
$str = 'p.deathdate IS NOT NULL';
if (!is_null($this->comparison)) {
$str .= ' AND p.deathdate ' . $this->comparison . ' ' . XDB::format('{?}', date('Y-m-d', $this->date));
public function buildCondition(PlFilter &$uf)
{
+ $uf->requireAccounts();
if ($this->active) {
$date = 'a.uid IS NOT NULL AND a.state = \'active\'';
} else {
public function buildCondition(PlFilter &$uf)
{
+ $uf->requireProfiles();
return 'p.last_change ' . $this->comparison . XDB::format(' {?}', date('Y-m-d H:i:s', $this->date));
}
}
public function buildCondition(PlFilter &$uf)
{
+ $uf->requireProfiles();
return 'p.next_birthday ' . $this->comparison . XDB::format(' {?}', date('Y-m-d', $this->date));
}
}
if ($this->sex != User::GENDER_MALE && $this->sex != User::GENDER_FEMALE) {
return self::COND_FALSE;
} else {
+ $uf->requireProfiles();
return XDB::format('p.sex = {?}', $this->sex == User::GENDER_FEMALE ? 'female' : 'male');
}
}
}
// }}}
+// {{{ class UFC_Binet
+/** Selects users based on their belonging to a given (list of) binet
+ * @param $binet either a binet_id or an array of binet_ids
+ */
+class UFC_Binet implements UserFilterCondition
+{
+ private $val;
+
+ public function __construct($val)
+ {
+ if (!is_array($val)) {
+ $val = array($val);
+ }
+ $this->val = $val;
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $sub = $uf->addBinetsFilter();
+ return $sub . '.binet_id IN ' . XDB::formatArray($this->val);
+ }
+}
+// }}}
+
+// {{{ class UFC_Section
+/** Selects users based on section
+ * @param $section ID of the section
+ */
+class UFC_Section implements UserFilterCondition
+{
+ private $section;
+
+ public function __construct($section)
+ {
+ $this->section = $section;
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $uf->requireProfiles();
+ return 'p.section = ' . XDB::format('{?}', $this->section);
+ }
+}
+// }}}
+
// {{{ class UFC_Email
/** Filters users based on email address
* @param $email Email whose owner we are looking for
// {{{ 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)
}
// }}}
-// {{{ class UFC_AddressFields
+// {{{ class UFC_AddressField
/** Filters users based on their address,
+ * @param $val Either a code for one of the fields, or an array of such codes
+ * @param $fieldtype The type of field to look for
* @param $type Filter on address type
* @param $flags Filter on address flags
- * @param $countryId Filter on address countryId
- * @param $administrativeAreaId Filter on address administrativeAreaId
- * @param $subAdministrativeAreaId Filter on address subAdministrativeAreaId
- * @param $localityId Filter on address localityId
- * @param $postalCode Filter on address postalCode
*/
-class UFC_AddressFields extends UFC_Address
+class UFC_AddressField extends UFC_Address
{
+ const FIELD_COUNTRY = 1;
+ const FIELD_ADMAREA = 2;
+ const FIELD_SUBADMAREA = 3;
+ const FIELD_LOCALITY = 4;
+ const FIELD_ZIPCODE = 5;
+
/** Data of the filter
*/
- private $countryId;
- private $administrativeAreaId;
- private $subAdministrativeAreaId;
- private $localityId;
- private $postalCode;
+ private $val;
+ private $fieldtype;
- public function __construct($type = null, $flags = self::FLAG_ANY, $countryId = null, $administrativeAreaId = null,
- $subAdministrativeAreaId = null, $localityId = null, $postalCode = null)
+ public function __construct($val, $fieldtype, $type = null, $flags = self::FLAG_ANY)
{
parent::__construct($type, $flags);
- $this->countryId = $countryId;
- $this->administrativeAreaId = $administrativeAreaId;
- $this->subAdministrativeAreaId = $subAdministrativeAreaId;
- $this->localityId = $localityId;
- $this->postalCode = $postalCode;
+
+ if (!is_array($val)) {
+ $val = array($val);
+ }
+ $this->val = $val;
+ $this->fieldtype = $fieldtype;
}
public function buildCondition(PlFilter &$uf)
{
$sub = $uf->addAddressFilter();
- $conds = $this->initConds();
+ $conds = $this->initConds($sub);
- if ($this->countryId != null) {
- $conds[] = $sub . '.countryId = ' . XDB::format('{?}', $this->countryId);
- }
- if ($this->administrativeAreaId != null) {
- $conds[] = $sub . '.administrativeAreaId = ' . XDB::format('{?}', $this->administrativeAreaId);
- }
- if ($this->subAdministrativeAreaId != null) {
- $conds[] = $sub . '.subAdministrativeAreaId = ' . XDB::format('{?}', $this->subAdministrativeAreaId);
- }
- if ($this->localityId != null) {
- $conds[] = $sub . '.localityId = ' . XDB::format('{?}', $this->localityId);
- }
- if ($this->postalCode != null) {
- $conds[] = $sub . '.postalCode = ' . XDB::format('{?}', $this->postalCode);
+ switch ($this->fieldtype) {
+ case self::FIELD_COUNTRY:
+ $field = 'countryId';
+ break;
+ case self::FIELD_ADMAREA:
+ $field = 'administrativeAreaId';
+ break;
+ case self::FIELD_SUBADMAREA:
+ $field = 'subAdministrativeAreaId';
+ break;
+ case self::FIELD_LOCALITY:
+ $field = 'localityId';
+ break;
+ case self::FIELD_ZIPCODE:
+ $field = 'postalCode';
+ break;
+ default:
+ Platal::page()->killError('Invalid address field type: ' . $this->fieldtype);
}
+ $conds[] = $sub . '.' . $field . ' IN ' . XDB::formatArray($this->val);
return implode(' AND ', $conds);
}
// {{{ class UFC_Job_Sectorization
/** Filters users based on the ((sub)sub)sector they work in
- * @param $sector The sector searched
- * @param $subsector The subsector
- * @param $subsubsector The subsubsector
+ * @param $val The ID of the sector, or an array of such IDs
+ * @param $type The kind of search (subsubsector/subsector/sector)
*/
class UFC_Job_Sectorization implements UserFilterCondition
{
+ private $val;
+ private $type;
- private $sector;
- private $subsector;
- private $subsubsector;
+ public function __construct($val, $type = UserFilter::JOB_SECTOR)
+ {
+ self::assertType($type);
+ if (!is_array($val)) {
+ $val = array($val);
+ }
+ $this->val = $val;
+ $this->type = $type;
+ }
- public function __construct($sector = null, $subsector = null, $subsubsector = null)
+ private static function assertType($type)
{
- $this->sector = $sector;
- $this->subsector = $subsector;
- $this->subsubsector = $subsubsector;
+ if ($type != UserFilter::JOB_SECTOR && $type != UserFilter::JOB_SUBSECTOR && $type != UserFilter::JOB_SUBSUBSECTOR) {
+ Platal::page()->killError("Type de secteur non valide.");
+ }
}
public function buildCondition(PlFilter &$uf)
{
- // No need to add the JobFilter, it will be done by addJobSectorizationFilter
- $conds = array();
- if ($this->sector !== null) {
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SECTOR);
- $conds[] = $sub . '.id = ' . XDB::format('{?}', $this->sector);
- }
- if ($this->subsector !== null) {
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SUBSECTOR);
- $conds[] = $sub . '.id = ' . XDB::format('{?}', $this->subsector);
- }
- if ($this->subsubsector !== null) {
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SUBSUBSECTOR);
- $conds[] = $sub . '.id = ' . XDB::format('{?}', $this->subsubsector);
- }
- return implode(' AND ', $conds);
+ $sub = $uf->addJobSectorizationFilter($this->type);
+ return $sub . '.id = ' . XDB::format('{?}', $this->val);
}
}
// }}}
class UFC_Job_Description implements UserFilterCondition
{
- /** Meta-filters
- * Built with binary OR on UserFilter::JOB_*
- */
- const ANY = 63;
- const SECTORIZATION = 15;
-
private $description;
private $fields;
$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);
}
}
// }}}
// {{{ class UFC_Mentor_Sectorization
/** Filters users based on mentoring (sub|)sector
- * @param $sector ID of sector
- * @param $subsector Subsector (null for any)
+ * @param $sector ID of (sub)sector
+ * @param $type Whether we are looking for a sector or a subsector
*/
class UFC_Mentor_Sectorization implements UserFilterCondition
{
+ const SECTOR = 1;
+ const SUBSECTOR = 2;
private $sector;
- private $subsector;
+ private $type;
- public function __construct($sector, $subsector = null)
+ public function __construct($sector, $type = self::SECTOR)
{
$this->sector = $sector;
- $this->subsubsector = $subsector;
+ $this->type = $type;
}
public function buildCondition(PlFilter &$uf)
{
$sub = $uf->addMentorFilter(UserFilter::MENTOR_SECTOR);
- $conds = array();
- $conds[] = $sub . '.sectorid = ' . XDB::format('{?}', $this->sector);
- if ($this->subsector != null) {
- $conds[] = $sub . '.subsectorid = ' . XDB::format('{?}', $this->subsector);
+ if ($this->type == self::SECTOR) {
+ $field = 'sectorid';
+ } else {
+ $field = 'subsectorid';
}
- return implode(' AND ', $conds);
+ return $sub . '.' . $field . ' = ' . XDB::format('{?}', $this->sector);
}
}
// }}}
* @param &$uf The UserFilter whose results must be ordered
* @return The name of the field to use for ordering results
*/
- abstract protected function getSortTokens(UserFilter &$uf);
+// abstract protected function getSortTokens(UserFilter &$uf);
}
// }}}
$this->grade = $grade;
}
- protected function getSortTokens(UserFilter &$uf)
+ protected function getSortTokens(PlFilter &$uf)
{
if (UserFilter::isGrade($this->grade)) {
$sub = $uf->addEducationFilter($this->grade);
$this->particle = $particle;
}
- protected function getSortTokens(UserFilter &$uf)
+ protected function getSortTokens(PlFilter &$uf)
{
- if (UserFilter::isDisplayName($this->type)) {
+ if (Profile::isDisplayName($this->type)) {
$sub = $uf->addDisplayFilter();
return 'pd' . $sub . '.' . $this->type;
} else {
// {{{ class UFO_Score
class UFO_Score extends UserFilterOrder
{
- protected function getSortTokens(UserFilter &$uf)
+ protected function getSortTokens(PlFilter &$uf)
{
$sub = $uf->addNameTokensFilter();
return 'SUM(' . $sub . '.score)';
*/
class UFO_Registration extends UserFilterOrder
{
- protected function getSortTokens(UserFilter &$uf)
+ protected function getSortTokens(PlFilter &$uf)
{
return 'a.registration_date';
}
*/
class UFO_Birthday extends UserFilterOrder
{
- protected function getSortTokens(UserFilter &$uf)
+ protected function getSortTokens(PlFilter &$uf)
{
return 'p.next_birthday';
}
*/
class UFO_ProfileUpdate extends UserFilterOrder
{
- protected function getSortTokens(UserFilter &$uf)
+ protected function getSortTokens(PlFilter &$uf)
{
return 'p.last_change';
}
*/
class UFO_Death extends UserFilterOrder
{
- protected function getSortTokens(UserFilter &$uf)
+ protected function getSortTokens(PlFilter &$uf)
{
return 'p.deathdate';
}
* 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
{
protected $joinMethods = array();
- protected $joinMetas = array('$PID' => 'p.pid',
- '$UID' => 'a.uid',
+ protected $joinMetas = array(
+ '$PID' => 'p.pid',
+ '$UID' => 'a.uid',
);
private $root;
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)
{
}
}
+ /** NATIONALITY
+ */
+
+ private $with_nat = false;
+ public function addNationalityFilter()
+ {
+ $this->with_nat = true;
+ return 'ngc';
+ }
+
+ protected function nationalityJoins()
+ {
+ $joins = array();
+ if ($this->with_nat) {
+ $joins['ngc'] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'geoloc_countries', '$ME.iso_3166_1_a2 = p.nationality1 OR $ME.iso_3166_1_a2 = p.nationality2 OR $ME.iso_3166_1_a2 = p.nationality3');
+ }
+ return $joins;
+ }
+
/** EDUCATION
*/
const GRADE_ING = 'Ing.';
$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;
}
+ /** BINETS
+ */
+
+ private $with_bi = false;
+ private $with_bd = false;
+ public function addBinetsFilter($with_enum = false)
+ {
+ $this->requireProfiles();
+ $this->with_bi = true;
+ if ($with_enum) {
+ $this->with_bd = true;
+ return 'bd';
+ } else {
+ return 'bi';
+ }
+ }
+
+ protected function binetsJoins()
+ {
+ $joins = array();
+ if ($this->with_bi) {
+ $joins['bi'] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'binets_ins', '$ME.user_id = $PID');
+ }
+ if ($this->with_bd) {
+ $joins['bd'] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'binets_def', '$ME.id = bi.binet_id');
+ }
+ return $joins;
+ }
+
/** EMAILS
*/
private $e = array();
return 'gc';
}
- private $with_pal = true;
+ private $with_pal = false;
public function addAddressLocalityFilter()
{
$this->requireProfiles();
{
$joins = array();
if ($this->with_pa) {
- $joins['pa'] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'profile_address', '$ME.pid = $PID');
+ $joins['pa'] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'profile_addresses', '$ME.pid = $PID');
}
if ($this->with_pac) {
$joins['gc'] = new PlSqlJoin(PlSqlJoin::MODE_LEFT, 'geoloc_countries', '$ME.iso_3166_1_a2 = pa.countryID');
/** JOBS
*/
- const JOB_SECTOR = 1;
- const JOB_SUBSECTOR = 2;
- const JOB_SUBSUBSECTOR = 4;
- const JOB_ALTERNATES = 8;
- const JOB_USERDEFINED = 16;
- const JOB_CV = 32;
+ const JOB_SECTOR = 0x0001;
+ const JOB_SUBSECTOR = 0x0002;
+ const JOB_SUBSUBSECTOR = 0x0004;
+ const JOB_ALTERNATES = 0x0008;
+ const JOB_USERDEFINED = 0x0010;
+ const JOB_CV = 0x0020;
+
+ const JOB_SECTORIZATION = 0x000F;
+ const JOB_ANY = 0x003F;
/** Joins :
* pj => profile_job
{
$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($limit = null)
+ {
+ return $this->getProfiles($limit);
+ }
+}
+// }}}
+
// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
?>