X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fuserfilter.php;h=2a9d077a9f6640d61165c4fe820918c080026d22;hb=ccc951d9ef4b747cf4c5b08d52e6f8938338f6de;hp=2931a0505b6626208cd0170332e5f210ea397b2c;hpb=958def0836ec2f1edc1b2b0c75d64c8fb1c151df;p=platal.git diff --git a/classes/userfilter.php b/classes/userfilter.php index 2931a05..2a9d077 100644 --- a/classes/userfilter.php +++ b/classes/userfilter.php @@ -47,7 +47,7 @@ class UFC_HasProfile implements UserFilterCondition public function buildCondition(PlFilter &$uf) { $uf->requireProfiles(); - return 'p.pid IS NOT NULL'; + return '$PID IS NOT NULL'; } } // }}} @@ -156,7 +156,8 @@ class UFC_Promo implements UserFilterCondition UserFilter::assertGrade($this->grade); } if ($this->grade == UserFilter::DISPLAY && $this->comparison != '=') { - Platal::page()->killError('Comparison ' . $this->comparison . ' not allowed on displaid promo'); + // 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)"); } } @@ -455,9 +456,9 @@ class UFC_Registered implements UserFilterCondition { $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 != \'0000-00-00 00:00:00\' AND a.registration_date ' . $this->comparison . ' ' . XDB::format('{?}', $this->date->format('Y-m-d')); @@ -938,7 +939,7 @@ class UFC_Job_Company implements UserFilterCondition public function buildCondition(PlFilter &$uf) { $sub = $uf->addJobCompanyFilter(); - $cond = $sub . '.' . $this->type . ' = ' . XDB::format('{?}', $this->value); + $cond = $sub . '.' . $this->type . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->value); return $cond; } } @@ -1048,7 +1049,7 @@ class UFC_Networking implements UserFilterCondition $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); } @@ -1079,10 +1080,11 @@ class UFC_Phone implements UserFilterCondition public function __construct($number, $num_type = self::NUM_ANY, $phone_type = self::PHONE_ANY) { - require_once('profil.func.inc.php'); - $this->number = $number; + $phone = new Phone(array('display' => $number)); + $phone->format(); + $this->number = $phone->search(); $this->num_type = $num_type; - $this->phone_type = format_phone_number($phone_type); + $this->phone_type = $phone_type; } public function buildCondition(PlFilter &$uf) @@ -1257,7 +1259,7 @@ class UFC_WatchRegistration extends UFC_UserRelated if (count($uids) == 0) { return PlFilterCondition::COND_FALSE; } else { - return XDB::format('a.uid IN {?}', $uids); + return XDB::format('$UID IN {?}', $uids); } } } @@ -1331,28 +1333,12 @@ class UFC_MarketingHash implements UserFilterCondition * ORDERS ******************/ -// {{{ class UserFilterOrder -/** Base class for ordering results of a query. - * Parameters for the ordering must be given to the constructor ($desc for a - * descending order). - * The getSortTokens function is used to get actual ordering part of the query. - */ -abstract class UserFilterOrder extends PlFilterOrder -{ - /** This function must return the tokens to use for ordering - * @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); -} -// }}} - // {{{ class UFO_Promo /** Orders users by promotion * @param $grade Formation whose promotion users should be sorted by (restricts results to users of that formation) * @param $desc Whether sort is descending */ -class UFO_Promo extends UserFilterOrder +class UFO_Promo extends PlFilterGroupableOrder { private $grade; @@ -1382,7 +1368,7 @@ class UFO_Promo extends UserFilterOrder * @param $particle Set to true if particles should be included in the sorting order * @param $desc If sort order should be descending */ -class UFO_Name extends UserFilterOrder +class UFO_Name extends PlFilterOrder { private $type; private $variant; @@ -1400,7 +1386,13 @@ class UFO_Name extends UserFilterOrder { if (Profile::isDisplayName($this->type)) { $sub = $uf->addDisplayFilter(); - return 'pd' . $sub . '.' . $this->type; + $token = 'pd' . $sub . '.' . $this->type; + if ($uf->accountsRequired()) { + $account_token = Profile::getAccountEquivalentName($this->type); + return 'IFNULL(' . $token . ', a.' . $account_token . ')'; + } else { + return $token; + } } else { $sub = $uf->addNameFilter($this->type, $this->variant); if ($this->particle) { @@ -1414,12 +1406,18 @@ class UFO_Name extends UserFilterOrder // }}} // {{{ class UFO_Score -class UFO_Score extends UserFilterOrder +class UFO_Score extends PlFilterOrder { protected function getSortTokens(PlFilter &$uf) { $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); } @@ -1431,7 +1429,7 @@ class UFO_Score extends UserFilterOrder // {{{ class UFO_Registration /** Sorts users based on registration date */ -class UFO_Registration extends UserFilterOrder +class UFO_Registration extends PlFilterOrder { protected function getSortTokens(PlFilter &$uf) { @@ -1444,7 +1442,7 @@ class UFO_Registration extends UserFilterOrder // {{{ class UFO_Birthday /** Sorts users based on next birthday date */ -class UFO_Birthday extends UserFilterOrder +class UFO_Birthday extends PlFilterOrder { protected function getSortTokens(PlFilter &$uf) { @@ -1457,7 +1455,7 @@ class UFO_Birthday extends UserFilterOrder // {{{ class UFO_ProfileUpdate /** Sorts users based on last profile update */ -class UFO_ProfileUpdate extends UserFilterOrder +class UFO_ProfileUpdate extends PlFilterOrder { protected function getSortTokens(PlFilter &$uf) { @@ -1470,7 +1468,7 @@ class UFO_ProfileUpdate extends UserFilterOrder // {{{ class UFO_Death /** Sorts users based on death date */ -class UFO_Death extends UserFilterOrder +class UFO_Death extends PlFilterOrder { protected function getSortTokens(PlFilter &$uf) { @@ -1483,12 +1481,12 @@ class UFO_Death extends UserFilterOrder // {{{ class UFO_Uid /** Sorts users based on their uid */ -class UFO_Uid extends UserFilterOrder +class UFO_Uid extends PlFilterOrder { protected function getSortTokens(PlFilter &$uf) { $uf->requireAccounts(); - return 'a.uid'; + return '$UID'; } } // }}} @@ -1496,7 +1494,7 @@ class UFO_Uid extends UserFilterOrder // {{{ class UFO_Hruid /** Sorts users based on their hruid */ -class UFO_Hruid extends UserFilterOrder +class UFO_Hruid extends PlFilterOrder { protected function getSortTokens(PlFilter &$uf) { @@ -1509,12 +1507,12 @@ class UFO_Hruid extends UserFilterOrder // {{{ class UFO_Pid /** Sorts users based on their pid */ -class UFO_Pid extends UserFilterOrder +class UFO_Pid extends PlFilterOrder { protected function getSortTokens(PlFilter &$uf) { $uf->requireProfiles(); - return 'p.pid'; + return '$PID'; } } // }}} @@ -1522,7 +1520,7 @@ class UFO_Pid extends UserFilterOrder // {{{ class UFO_Hrpid /** Sorts users based on their hrpid */ -class UFO_Hrpid extends UserFilterOrder +class UFO_Hrpid extends PlFilterOrder { protected function getSortTokens(PlFilter &$uf) { @@ -1571,7 +1569,7 @@ class UFO_Hrpid extends UserFilterOrder * when referring to the joined table. * * For example, if data from profile_job must be available to filter results, - * the UFC object will call $uf-addJobFilter(), which will set the 'with_pj' var and + * the UFC object will call $uf-addJobFilter(), which will set the 'with_pj' var and * return 'pj', the short name to use when referring to profile_job; when building * the query, calling the jobJoins function will return an array containing a single * row: @@ -1591,6 +1589,7 @@ class UserFilter extends PlFilter private $root; private $sort = array(); + private $grouper = null; private $query = null; private $orderby = null; @@ -1614,7 +1613,7 @@ class UserFilter extends PlFilter } } if (!is_null($sort)) { - if ($sort instanceof UserFilterOrder) { + if ($sort instanceof PlFilterOrder) { $this->addSort($sort); } else if (is_array($sort)) { foreach ($sort as $s) { @@ -1630,6 +1629,9 @@ class UserFilter extends PlFilter // 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(); @@ -1641,6 +1643,9 @@ class UserFilter extends PlFilter } else { $this->orderby = 'ORDER BY ' . implode(', ', $orders); } + $this->orderby = str_replace(array_keys($this->joinMetas), + $this->joinMetas, + $this->orderby); } if (is_null($this->query)) { if ($this->with_accounts) { @@ -1656,13 +1661,49 @@ class UserFilter extends PlFilter } } + public function hasGroups() + { + return $this->grouper != null; + } + + public function getGroups() + { + return $this->getUIDGroups(); + } + + public function getUIDGroups() + { + $this->requireAccounts(); + $this->buildQuery(); + $token = $this->grouper->getGroupToken($this); + + $groups = XDB::fetchAllRow('SELECT ' . $token . ', COUNT(a.uid) + ' . $this->query . ' + GROUP BY ' . $token, + 0); + return $groups; + } + + public function getPIDGroups() + { + $this->requireProfiles(); + $this->buildQuery(); + $token = $this->grouper->getGroupToken($this); + + $groups = XDB::fetchAllRow('SELECT ' . $token . ', COUNT(p.pid) + ' . $this->query . ' + GROUP BY ' . $token, + 0); + return $groups; + } + private function getUIDList($uids = null, PlLimit &$limit) { $this->requireAccounts(); $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 @@ -1789,7 +1830,7 @@ class UserFilter extends PlFilter 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 { @@ -1805,7 +1846,7 @@ class UserFilter extends PlFilter 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 { @@ -1896,6 +1937,10 @@ class UserFilter extends PlFilter public function addSort(PlFilterOrder &$sort) { + if (count($this->sort) == 0 && $sort instanceof PlFilterGroupableOrder) + { + $this->grouper = $sort; + } $this->sort[] = $sort; $this->orderby = null; } @@ -1967,11 +2012,21 @@ class UserFilter extends PlFilter $this->with_accounts = true; } + public function accountsRequired() + { + return $this->with_accounts; + } + public function requireProfiles() { $this->with_profiles = true; } + public function profilesRequired() + { + return $this->with_profiles; + } + protected function accountJoins() { $joins = array(); @@ -2273,8 +2328,8 @@ class UserFilter extends PlFilter if (!is_array($key)) { $key = array($key); } - $joins['e' . $sub] = PlSqlJoin::left('emails', '$ME.uid = $UID AND $ME.flags != \'filter\' - AND $ME.email IN {?}' . $key); + $joins['e' . $sub] = PlSqlJoin::left('emails', '$ME.uid = $UID AND $ME.flags != \'filter\' + AND $ME.email IN {?}', $key); } } foreach ($this->al as $sub=>$key) { @@ -2288,7 +2343,7 @@ class UserFilter extends PlFilter if (!is_array($key)) { $key = array($key); } - $joins['al' . $sub] = PlSqlJoin::left('aliases', '$ME.uid = $UID AND $ME.type IN (\'alias\', \'a_vie\') + $joins['al' . $sub] = PlSqlJoin::left('aliases', '$ME.uid = $UID AND $ME.type IN (\'alias\', \'a_vie\') AND $ME.alias IN {?}', $key); } } @@ -2715,6 +2770,11 @@ class ProfileFilter extends UserFilter { return $this->getTotalProfileCount(); } + + public function getGroups() + { + return $this->getPIDGroups(); + } } // }}}