public function buildCondition(PlFilter &$uf)
{
$uf->requireProfiles();
- return 'p.pid IS NOT NULL';
+ return '$PID IS NOT NULL';
}
}
// }}}
if ($this->grade != UserFilter::DISPLAY) {
UserFilter::assertGrade($this->grade);
}
+ if ($this->grade == UserFilter::DISPLAY && $this->comparison != '=') {
+ // XXX: we might try to guess the grade from the first char of the promo and forbid only '<= 2004', but allow '<= X2004'
+ Platal::page()->killError("Il n'est pas possible d'appliquer la comparaison '" . $this->comparison . "' aux promotions sans spécifier de formation (X/M/D)");
+ }
}
public function buildCondition(PlFilter &$uf)
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);
public function __construct($comparison = null, $date = null)
{
$this->comparison = $comparison;
- if ($date instanceof DateTime) {
- $this->date = $date;
- } else if (is_int($date)) {
- $this->date = new DateTime("@$date");
- } else {
- $this->date = new DateTime($date);
- }
+ $this->date = make_datetime($date);
}
public function buildCondition(PlFilter &$uf)
{
$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;
}
$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);
}
{
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 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
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 {
*/
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
$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) {