implemented search method in accounts sql backend, to no allways do a full query and limit in code

This commit is contained in:
Ralf Becker 2014-05-08 12:30:03 +00:00
parent 74d6ab3251
commit 7c9df2fe1e

View File

@ -363,21 +363,27 @@ class accounts_sql
} }
/** /**
* Searches users and/or groups * Searches / lists accounts: users and/or groups
* *
* ToDo: implement a search like accounts::search * @param array with the following keys:
* * @param $param['type'] string/int 'accounts', 'groups', 'owngroups' (groups the user is a member of), 'both',
* @param string $_type='both', 'accounts', 'groups' * 'groupmember' or 'groupmembers+memberships'
* @param int $start=null * or integer group-id for a list of members of that group
* @param string $sort='' ASC or DESC * @param $param['start'] int first account to return (returns offset or max_matches entries) or all if not set
* @param string $order='' * @param $param['order'] string column to sort after, default account_lid if unset
* @param string $query='' * @param $param['sort'] string 'ASC' or 'DESC', default 'DESC' if not set
* @param int $offset=null * @param $param['query'] string to search for, no search if unset or empty
* @param string $query_type='all' 'start', 'all' (default), 'exact' * @param $param['query_type'] string:
* @param boolean $active=false true: return only active accounts * 'all' - query all fields for containing $param[query]
* @return array * 'start' - query all fields starting with $param[query]
* 'exact' - query all fields for exact $param[query]
* 'lid','firstname','lastname','email' - query only the given field for containing $param[query]
* @param $param['offset'] int - number of matches to return if start given, default use the value in the prefs
* @param $param['objectclass'] boolean return objectclass(es) under key 'objectclass' in each account
* @return array with account_id => data pairs, data is an array with account_id, account_lid, account_firstname,
* account_lastname, person_id (id of the linked addressbook entry), account_status, account_expires, account_primary_group
*/ */
function get_list($_type='both', $start = null,$sort = '', $order = '', $query = '', $offset = null, $query_type='', $active=false) function search($param)
{ {
static $order2contact = array( static $order2contact = array(
'account_firstname' => 'n_given', 'account_firstname' => 'n_given',
@ -386,41 +392,62 @@ class accounts_sql
); );
// fetch order of account_fullname from common::display_fullname // fetch order of account_fullname from common::display_fullname
if (strpos($order,'account_fullname') !== false) if (strpos($param['order'],'account_fullname') !== false)
{ {
$order = str_replace('account_fullname',preg_replace('/[ ,]+/',',',str_replace(array('[',']'),'', $param['order'] = str_replace('account_fullname', preg_replace('/[ ,]+/',',',str_replace(array('[',']'),'',
common::display_fullname('account_lid','account_firstname','account_lastname'))),$order); common::display_fullname('account_lid','account_firstname','account_lastname'))), $param['order']);
} }
$order = str_replace(array_keys($order2contact),array_values($order2contact),$order); $order = str_replace(array_keys($order2contact),array_values($order2contact),$param['order']);
// allways add 'account_lid', as it is only valid one for groups // allways add 'account_lid', as it is only valid one for groups
if (strpos($order, 'account_lid') === false) if (strpos($order, 'account_lid') === false)
{ {
$order .= ($order?',':'').'account_lid'; $order .= ($order?',':'').'account_lid';
} }
if ($sort) $order = implode(' '.$sort.',', explode(',', $order)).' '.$sort; if ($param['sort']) $order = implode(' '.$param['sort'].',', explode(',', $order)).' '.$param['sort'];
switch($_type) $filter = array();
switch($param['type'])
{ {
case 'accounts': case 'accounts':
$filter = array('owner' => 0); $filter['owner'] = 0;
break; break;
case 'groups': case 'groups':
$filter = array("account_type = 'g'"); $filter['account_type'] = 'g';
break;
case 'owngroups':
$filter['account_id'] = array_map('abs', $this->frontend->memberships($GLOBALS['egw_info']['user']['account_id'], true));
$filter['account_type'] = 'g';
break;
case 'groupmembers':
case 'groupmembers+memberships':
$members = array();
foreach((array)$this->memberships($GLOBALS['egw_info']['user']['account_id'], true) as $grp)
{
$members = array_unique(array_merge($members, (array)$this->members($grp,true)));
if ($param['type'] == 'groupmembers+memberships') $members[] = abs($grp);
}
$filter['account_id'] = $members;
break; break;
default: default:
if (is_numeric($param['type']))
{
$filter['account_id'] = $this->frontend->memberships($param['type'], true);
break;
}
// fall-through
case 'both': case 'both':
$filter = array("(egw_addressbook.contact_owner=0 OR egw_addressbook.contact_owner IS NULL)"); $filter[] = "(egw_addressbook.contact_owner=0 OR egw_addressbook.contact_owner IS NULL)";
break; break;
} }
if ($active) if ($param['active'])
{ {
$filter[] = str_replace('UNIX_TIMESTAMP(NOW())',time(),addressbook_sql::ACOUNT_ACTIVE_FILTER); $filter[] = str_replace('UNIX_TIMESTAMP(NOW())',time(),addressbook_sql::ACOUNT_ACTIVE_FILTER);
} }
$criteria = array(); $criteria = array();
$wildcard = $query_type == 'start' || $query_type == 'exact' ? '' : '%'; $wildcard = $param['query_type'] == 'start' || $param['query_type'] == 'exact' ? '' : '%';
if ($query) if (($query = $param['query']))
{ {
switch($query_type) switch($param['query_type'])
{ {
case 'start': case 'start':
$query .= '*'; $query .= '*';
@ -454,15 +481,18 @@ class accounts_sql
if (!is_object($GLOBALS['egw']->contacts)) throw new exception('No $GLOBALS[egw]->contacts!'); if (!is_object($GLOBALS['egw']->contacts)) throw new exception('No $GLOBALS[egw]->contacts!');
$accounts = array(); $accounts = array();
foreach((array) $GLOBALS['egw']->contacts->search($criteria,"1,n_given,n_family,email,id,created,modified,$this->table.account_id AS account_id", foreach((array) $GLOBALS['egw']->contacts->search($criteria,
"1,n_given,n_family,email,id,created,modified,$this->table.account_id AS account_id",
$order,"account_lid,account_type,account_status,account_expires,account_primary_group", $order,"account_lid,account_type,account_status,account_expires,account_primary_group",
$wildcard,false,$query[0] == '!' ? 'AND' : 'OR',$offset ? array($start,$offset) : (is_null($start) ? false : $start), $wildcard,false,$query[0] == '!' ? 'AND' : 'OR',
$param['offset'] ? array($param['start'], $param['offset']) : (is_null($param['start']) ? false : $param['start']),
$filter,$this->contacts_join) as $contact) $filter,$this->contacts_join) as $contact)
{ {
if ($contact) if ($contact)
{ {
$accounts[] = array( $account_id = ($contact['account_type'] == 'g' ? -1 : 1) * $contact['account_id'];
'account_id' => ($contact['account_type'] == 'g' ? -1 : 1) * $contact['account_id'], $accounts[$account_id] = array(
'account_id' => $account_id,
'account_lid' => $contact['account_lid'], 'account_lid' => $contact['account_lid'],
'account_type' => $contact['account_type'], 'account_type' => $contact['account_type'],
'account_firstname' => $contact['n_given'], 'account_firstname' => $contact['n_given'],