{
public function buildCondition(PlFilter &$uf)
{
+ $uf->requireProfiles();
return '$PID IS NOT NULL';
}
}
{
private $hruids;
- public function __construct($val)
+ public function __construct()
{
- if (!is_array($val)) {
- $val = array($val);
- }
- $this->hruids = $val;
+ $this->hruids = pl_flatten(func_get_args());
}
public function buildCondition(PlFilter &$uf)
{
- $ufc->requireAccounts();
+ $uf->requireAccounts();
return XDB::format('a.hruid IN {?}', $this->hruids);
}
}
{
private $hrpids;
- public function __construct($val)
+ public function __construct()
{
- if (!is_array($val)) {
- $val = array($val);
- }
- $this->hrpids = $val;
+ $this->hrpids = pl_flatten(func_get_args());
}
public function buildCondition(PlFilter &$uf)
if ($this->grade != UserFilter::DISPLAY) {
UserFilter::assertGrade($this->grade);
}
+ if ($this->grade == UserFilter::DISPLAY && $this->comparison != '=') {
+ Platal::page()->killError('Comparison ' . $this->comparison . ' not allowed on displaid promo');
+ }
}
public function buildCondition(PlFilter &$uf)
* @param type Parameter type (Xorg, AX, School)
* @param value School id value
*/
-class UFC_SchooldId implements UserFilterCondition
+class UFC_SchoolId implements UserFilterCondition
{
const AX = 'ax';
const Xorg = 'xorg';
{
private $val;
- public function __construct($val)
+ public function __construct()
{
- if (!is_array($val)) {
- $val = array($val);
- }
- $this->val = $val;
+ $this->val = pl_flatten(func_get_args());
}
public function buildCondition(PlFilter &$uf)
{
private $diploma;
- public function __construct($diploma)
+ public function __construct()
{
- if (! is_array($diploma)) {
- $diploma = array($diploma);
- }
- $this->diploma = $diploma;
+ $this->diploma = pl_flatten(func_get_args());
}
public function buildCondition(PlFilter &$uf)
{
$sub = $uf->addEducationFilter();
- return XDB::format('pee' . $sub . '.degreeid IN {?}', $this->val);
+ return XDB::format('pe' . $sub . '.degreeid IN {?}', $this->diploma);
}
}
// }}}
{
private $val;
- public function __construct($val)
+ public function __construct()
{
- if (!is_array($val)) {
- $val = array($val);
- }
- $this->val = $val;
+ $this->val = pl_flatten(func_get_args());
}
public function buildCondition(PlFilter &$uf)
{
$sub = $uf->addEducationFilter();
- return XDB::format('pee' . $sub . '.fieldid IN {?}', $this->val);
+ return XDB::format('pe' . $sub . '.fieldid IN {?}', $this->val);
}
}
// }}}
*/
class UFC_Name implements UserFilterCondition
{
- const PREFIX = XDB::WILDCARD_PREFIX; // 0x001
- const SUFFIX = XDB::WILDCARD_SUFFIX; // 0x002
+ const EXACT = XDB::WILDCARD_EXACT; // 0x000
+ 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 PARTICLE = 0x004;
const VARIANTS = 0x008;
private $type;
public function __construct($tokens, $flags = array(), $soundex = false, $exact = false)
{
- $this->tokens = $tokens;
+ if (is_array($tokens)) {
+ $this->tokens = $tokens;
+ } else {
+ $this->tokens = array($tokens);
+ }
if (is_array($flags)) {
$this->flags = $flags;
} else {
public function buildCondition(PlFilter &$uf)
{
- $sub = $uf->addNameTokensFilter(!($this->exact || $this->soundex));
$conds = array();
- if ($this->soundex) {
- $conds[] = XDB::format($sub . '.soundex IN {?}', $this->tokens);
- } else if ($this->exact) {
- $conds[] = XDB::format($sub . '.token IN {?}', $this->tokens);
- } else {
- $tokconds = array();
- foreach ($this->tokens as $token) {
- $tokconds[] = $sub . '.token ' . XDB::formatWildcards(XDB::WILDCARD_PREFIX, $token);
+ foreach ($this->tokens as $i => $token) {
+ $sub = $uf->addNameTokensFilter($token);
+ if ($this->soundex) {
+ $c = XDB::format($sub . '.soundex = {?}', $token);
+ } else if ($this->exact) {
+ $c = XDB::format($sub . '.token = {?}', $token);
+ } else {
+ $c = $sub . '.token ' . XDB::formatWildcards(XDB::WILDCARD_PREFIX, $token);
}
- $conds[] = implode(' OR ', $tokconds);
- }
-
- if ($this->flags != null) {
- $conds[] = XDB::format($sub . '.flags IN {?}', $this->flags);
+ if ($this->flags != null) {
+ $c .= XDB::format(' AND ' . $sub . '.flags IN {?}', $this->flags);
+ }
+ $conds[] = $c;
}
return implode(' AND ', $conds);
{
private $val;
- public function __construct($val)
+ public function __construct()
{
- if (!is_array($val)) {
- $val = array($val);
- }
- $this->val = $val;
+ $this->val = pl_flatten(func_get_args());
}
public function buildCondition(PlFilter &$uf)
// {{{ class UFC_Dead
/** Filters users based on death date
* @param $comparison Comparison operator
- * @param $date Date to which death date should be compared
+ * @param $date Date to which death date should be compared (DateTime object, string or timestamp)
*/
class UFC_Dead implements UserFilterCondition
{
public function __construct($comparison = null, $date = null)
{
$this->comparison = $comparison;
- $this->date = $date;
+ $this->date = make_datetime($date);
}
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));
+ $str .= ' AND p.deathdate ' . $this->comparison . ' ' . XDB::format('{?}', $this->date->format('Y-m-d'));
}
return $str;
}
{
$this->active = $active;
$this->comparison = $comparison;
- $this->date = $date;
+ $this->date = make_datetime($date);
}
public function buildCondition(PlFilter &$uf)
{
$uf->requireAccounts();
if ($this->active) {
- $date = 'a.uid IS NOT NULL AND a.state = \'active\'';
+ $date = '$UID IS NOT NULL AND a.state = \'active\'';
} else {
- $date = 'a.uid IS NOT NULL AND a.state != \'pending\'';
+ $date = '$UID IS NOT NULL AND a.state != \'pending\'';
}
if (!is_null($this->comparison)) {
- $date .= ' AND a.registration_date ' . $this->comparison . ' ' . XDB::format('{?}', date('Y-m-d', $this->date));
+ $date .= ' AND a.registration_date != \'0000-00-00 00:00:00\' AND a.registration_date ' . $this->comparison . ' ' . XDB::format('{?}', $this->date->format('Y-m-d'));
}
return $date;
}
{
private $val;
- public function __construct($val)
+ public function __construct()
{
- if (!is_array($val)) {
- $val = array($val);
- }
- $this->val = $val;
+ $this->val = pl_flatten(func_get_args());
}
public function buildCondition(PlFilter &$uf)
{
private $section;
- public function __construct($section)
+ public function __construct()
{
- $this->section = $section;
+ $this->section = pl_flatten(func_get_args());
}
public function buildCondition(PlFilter &$uf)
{
$uf->requireProfiles();
- return 'p.section = ' . XDB::format('{?}', $this->section);
+ return XDB::format('p.section IN {?}', $this->section);
}
}
// }}}
private $emails;
public function __construct()
{
- $this->emails = func_get_args();
+ $this->emails = pl_flatten(func_get_args());
}
public function buildCondition(PlFilter &$uf)
}
}
if (count($types)) {
- $conds[] = XDB::foramt($sub . '.type IN {?}', $types);
+ $conds[] = XDB::format($sub . '.type IN {?}', $types);
}
if ($this->flags != self::FLAG_ANY) {
$conds = array();
$conds[] = $sub . '.address ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->value);
if ($this->type != -1) {
- $conds[] = $sub . '.network_type = ' . XDB::format('{?}', $this->type);
+ $conds[] = $sub . '.nwid = ' . XDB::format('{?}', $this->type);
}
return implode(' AND ', $conds);
}
}
// }}}
+// {{{ class UFC_Photo
+/** Filters profiles with photo
+ */
+class UFC_Photo implements UserFilterCondition
+{
+ public function buildCondition(PlFilter &$uf)
+ {
+ $uf->addPhotoFilter();
+ return 'photo.attach IS NOT NULL';
+ }
+}
+// }}}
+
// {{{ class UFC_Mentor_Expertise
/** Filters users by mentoring expertise
* @param $expertise Domain of expertise
{
private $country;
- public function __construct($country)
+ public function __construct()
{
- $this->country = $country;
+ $this->country = pl_flatten(func_get_args());
}
public function buildCondition(PlFilter &$uf)
{
$sub = $uf->addMentorFilter(UserFilter::MENTOR_COUNTRY);
- return $sub . '.country = ' . XDB::format('{?}', $this->country);
+ return $sub . '.country IN ' . XDB::format('{?}', $this->country);
}
}
// }}}
{
protected function getSortTokens(PlFilter &$uf)
{
- $sub = $uf->addNameTokensFilter();
- return 'SUM(' . $sub . '.score)';
+ $toks = $uf->getNameTokens();
+ $scores = array();
+
+ // If there weren't any sort tokens, we shouldn't sort by score, sort by NULL instead
+ if (count($toks) == 0) {
+ return 'NULL';
+ }
+
+ foreach ($toks as $sub => $token) {
+ $scores[] = XDB::format('SUM(' . $sub . '.score + IF (' . $sub . '.token = {?}, 5, 0) )', $token);
+ }
+ return implode(' + ', $scores);
}
}
// }}}
{
protected function getSortTokens(PlFilter &$uf)
{
+ $uf->requireAccounts();
return 'a.registration_date';
}
}
{
protected function getSortTokens(PlFilter &$uf)
{
+ $uf->requireProfiles();
return 'p.next_birthday';
}
}
{
protected function getSortTokens(PlFilter &$uf)
{
+ $uf->requireProfiles();
return 'p.last_change';
}
}
{
protected function getSortTokens(PlFilter &$uf)
{
+ $uf->requireProfiles();
return 'p.deathdate';
}
}
// }}}
+// {{{ class UFO_Uid
+/** Sorts users based on their uid
+ */
+class UFO_Uid extends UserFilterOrder
+{
+ protected function getSortTokens(PlFilter &$uf)
+ {
+ $uf->requireAccounts();
+ return '$UID';
+ }
+}
+// }}}
+
+// {{{ class UFO_Hruid
+/** Sorts users based on their hruid
+ */
+class UFO_Hruid extends UserFilterOrder
+{
+ protected function getSortTokens(PlFilter &$uf)
+ {
+ $uf->requireAccounts();
+ return 'a.hruid';
+ }
+}
+// }}}
+
+// {{{ class UFO_Pid
+/** Sorts users based on their pid
+ */
+class UFO_Pid extends UserFilterOrder
+{
+ protected function getSortTokens(PlFilter &$uf)
+ {
+ $uf->requireProfiles();
+ return '$PID';
+ }
+}
+// }}}
+
+// {{{ class UFO_Hrpid
+/** Sorts users based on their hrpid
+ */
+class UFO_Hrpid extends UserFilterOrder
+{
+ protected function getSortTokens(PlFilter &$uf)
+ {
+ $uf->requireProfiles();
+ return 'p.hrpid';
+ }
+}
+// }}}
+
/***********************************
*********************************
private $query = null;
private $orderby = null;
- private $lastcount = null;
+ private $lastusercount = null;
+ private $lastprofilecount = null;
public function __construct($cond = null, $sort = null)
{
private function buildQuery()
{
+ // The root condition is built first because some orders need info
+ // available only once all UFC have set their conditions (UFO_Score)
+ if (is_null($this->query)) {
+ $where = $this->root->buildCondition($this);
+ $where = str_replace(array_keys($this->joinMetas),
+ $this->joinMetas,
+ $where);
+ }
if (is_null($this->orderby)) {
$orders = array();
foreach ($this->sort as $sort) {
} else {
$this->orderby = 'ORDER BY ' . implode(', ', $orders);
}
+ $this->orderby = str_replace(array_keys($this->joinMetas),
+ $this->joinMetas,
+ $this->orderby);
}
if (is_null($this->query)) {
- $where = $this->root->buildCondition($this);
- if ($this->with_forced_sn) {
- $this->requireProfiles();
- $from = 'search_name AS sn';
- } else if ($this->with_accounts) {
+ if ($this->with_accounts) {
$from = 'accounts AS a';
} else {
$this->requireProfiles();
$this->buildQuery();
$lim = $limit->getSql();
$cond = '';
- if (!is_null($uids)) {
+ if (!empty($uids)) {
$cond = XDB::format(' AND a.uid IN {?}', $uids);
}
$fetched = XDB::fetchColumn('SELECT SQL_CALC_FOUND_ROWS a.uid
GROUP BY a.uid
' . $this->orderby . '
' . $lim);
- $this->lastcount = (int)XDB::fetchOneCell('SELECT FOUND_ROWS()');
+ $this->lastusercount = (int)XDB::fetchOneCell('SELECT FOUND_ROWS()');
return $fetched;
}
GROUP BY p.pid
' . $this->orderby . '
' . $lim);
- $this->lastcount = (int)XDB::fetchOneCell('SELECT FOUND_ROWS()');
+ $this->lastprofilecount = (int)XDB::fetchOneCell('SELECT FOUND_ROWS()');
return $fetched;
}
public function getUID($pos = 0)
{
- $uids =$this->getUIDList(null, new PlFilter(1, $pos));
+ $uids =$this->getUIDList(null, new PlLimit(1, $pos));
if (count($uids) == 0) {
return null;
} else {
public function getPID($pos = 0)
{
- $pids =$this->getPIDList(null, new PlFilter(1, $pos));
+ $pids =$this->getPIDList(null, new PlLimit(1, $pos));
if (count($pids) == 0) {
return null;
} else {
return User::iterOverUIDs($this->getUIDs($limit));
}
- public function getProfiles($limit = null)
+ public function getProfiles($limit = null, $fields = 0x0000, $visibility = null)
{
- return Profile::getBulkProfilesWithPIDs($this->getPIDs($limit));
+ return Profile::getBulkProfilesWithPIDs($this->getPIDs($limit), $fields, $visibility);
}
- public function getProfile($pos = 0)
+ public function getProfile($pos = 0, $fields = 0x0000, $visibility = null)
{
$pid = $this->getPID($pos);
if ($pid == null) {
return null;
} else {
- return Profile::get($pid);
+ return Profile::get($pid, $fields, $visibility);
}
}
- public function iterProfiles($limit = null)
+ public function iterProfiles($limit = null, $fields = 0x0000, $visibility = null)
{
- return Profile::iterOverPIDs($this->getPIDs($limit));
+ return Profile::iterOverPIDs($this->getPIDs($limit), true, $fields, $visibility);
}
public function get($limit = null)
return $this->getUsers($limit);
}
+
public function getTotalCount()
{
- if (is_null($this->lastcount)) {
+ return $this->getTotalUserCount();
+ }
+
+ public function getTotalUserCount()
+ {
+ if (is_null($this->lastusercount)) {
+ $this->requireAccounts();
$this->buildQuery();
- if ($this->with_accounts) {
- $field = 'a.uid';
- } else {
- $field = 'p.pid';
- }
- return (int)XDB::fetchOneCell('SELECT COUNT(DISTINCT ' . $field . ')
+ return (int)XDB::fetchOneCell('SELECT COUNT(DISTINCT a.uid)
+ ' . $this->query);
+ } else {
+ return $this->lastusercount;
+ }
+ }
+
+ public function getTotalProfileCount()
+ {
+ if (is_null($this->lastprofilecount)) {
+ $this->requireProfiles();
+ $this->buildQuery();
+ return (int)XDB::fetchOneCell('SELECT COUNT(DISTINCT p.pid)
' . $this->query);
} else {
- return $this->lastcount;
+ return $this->lastprofilecount;
}
}
*/
private $with_profiles = false;
private $with_accounts = false;
- private $with_forced_sn = false;
public function requireAccounts()
{
$this->with_accounts = true;
$this->with_profiles = true;
}
- /** Forces the "FROM" to use search_name instead of accounts or profiles */
- public function forceSearchName()
- {
- $this->with_forced_sn = true;
- }
-
protected function accountJoins()
{
$joins = array();
- /** Quick search is much more efficient with sn first and PID second */
- if ($this->with_forced_sn) {
- $joins['p'] = PlSqlJoin::left('profiles', '$PID = sn.pid');
- if ($this->with_accounts) {
- $joins['ap'] = PlSqlJoin::left('account_profiles', '$ME.pid = $PID');
- $joins['a'] = PlSqlJoin::left('accounts', '$UID = ap.uid');
- }
- } else if ($this->with_profiles && $this->with_accounts) {
+ if ($this->with_profiles && $this->with_accounts) {
$joins['ap'] = PlSqlJoin::left('account_profiles', '$ME.uid = $UID AND FIND_IN_SET(\'owner\', ap.perms)');
$joins['p'] = PlSqlJoin::left('profiles', '$PID = ap.pid');
}
/** NAMETOKENS
*/
- private $with_sn = false;
- // Set $doingQuickSearch to true if you wish to optimize the query
- public function addNameTokensFilter($doingQuickSearch = false)
+ private $name_tokens = array();
+ private $nb_tokens = 0;
+
+ public function addNameTokensFilter($token)
{
$this->requireProfiles();
- $this->with_forced_sn = ($this->with_forced_sn || $doingQuickSearch);
- $this->with_sn = true;
- return 'sn';
+ $sub = 'sn' . (1 + $this->nb_tokens);
+ $this->nb_tokens++;
+ $this->name_tokens[$sub] = $token;
+ return $sub;
}
protected function nameTokensJoins()
{
/* We don't return joins, since with_sn forces the SELECT to run on search_name first */
- if ($this->with_sn && !$this->with_forced_sn) {
- return array(
- 'sn' => PlSqlJoin::left('search_name', '$ME.pid = $PID')
- );
- } else {
- return array();
+ $joins = array();
+ foreach ($this->name_tokens as $sub => $token) {
+ $joins[$sub] = PlSqlJoin::left('search_name', '$ME.pid = $PID');
}
+ return $joins;
+ }
+
+ public function getNameTokens()
+ {
+ return $this->name_tokens;
}
/** NATIONALITY
const GRADE_MST = 'M%';
static public function isGrade($grade)
{
- return $grade == self::GRADE_ING || $grade == self::GRADE_PHD || $grade == self::GRADE_MST;
+ return ($grade !== 0) && ($grade == self::GRADE_ING || $grade == self::GRADE_PHD || $grade == self::GRADE_MST);
}
static public function assertGrade($grade)
$key = array($key);
}
$joins['e' . $sub] = PlSqlJoin::left('emails', '$ME.uid = $UID AND $ME.flags != \'filter\'
- AND $ME.email IN {?}' . $key);
+ AND $ME.email IN {?}', $key);
}
}
foreach ($this->al as $sub=>$key) {
}
+ /** PHOTOS
+ */
+ private $with_photo;
+ public function addPhotoFilter()
+ {
+ $this->requireProfiles();
+ $this->with_photo = true;
+ }
+
+ protected function photoJoins()
+ {
+ if ($this->with_photo) {
+ return array('photo' => PlSqlJoin::left('profile_photos', '$ME.pid = $PID'));
+ } else {
+ return array();
+ }
+ }
+
+
/** MARKETING
*/
private $with_rm;
{
return $this->getProfiles($limit);
}
+
+ public function filter(array $profiles, $limit = null)
+ {
+ return $this->filterProfiles($profiles, self::defaultLimit($limit));
+ }
+
+ public function getTotalCount()
+ {
+ return $this->getTotalProfileCount();
+ }
}
// }}}