Better user group member queries

This commit is contained in:
Evan Prodromou 2012-07-04 14:11:42 -04:00
parent 24ecb42f0e
commit 642b1044cc
2 changed files with 58 additions and 22 deletions

View File

@ -595,6 +595,8 @@ class Profile extends Managed_DataObject
if (Event::handle('StartJoinGroup', array($group, $this))) {
$join = Group_member::join($group->id, $this->id);
self::blow('profile:groups:%d', $this->id);
self::blow('group:members:%d', $group->id);
self::blow('group:member_count:%d', $group->id);
Event::handle('EndJoinGroup', array($group, $this));
}
}
@ -615,6 +617,8 @@ class Profile extends Managed_DataObject
if (Event::handle('StartLeaveGroup', array($group, $this))) {
Group_member::leave($group->id, $this->id);
self::blow('profile:groups:%d', $this->id);
self::blow('group:members:%d', $group->id);
self::blow('group:member_count:%d', $group->id);
Event::handle('EndLeaveGroup', array($group, $this));
}
}

View File

@ -7,6 +7,7 @@ class User_group extends Managed_DataObject
{
const JOIN_POLICY_OPEN = 0;
const JOIN_POLICY_MODERATE = 1;
const CACHE_WINDOW = 201;
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
@ -141,26 +142,50 @@ class User_group extends Managed_DataObject
return !in_array($nickname, $blacklist);
}
function getMembers($offset=0, $limit=null)
{
$qry =
'SELECT profile.* ' .
'FROM profile JOIN group_member '.
'ON profile.id = group_member.profile_id ' .
'WHERE group_member.group_id = %d ' .
'ORDER BY group_member.created DESC ';
function getMembers($offset=0, $limit=null) {
if (is_null($limit) || $offset + $limit > User_group::CACHE_WINDOW) {
return $this->realGetMembers($offset,
$limit);
} else {
$key = sprintf('group:members:%d', $this->id);
$window = self::cacheGet($key);
if ($window === false) {
$members = $this->realGetMembers(0,
User_group::CACHE_WINDOW);
$window = $members->fetchAll();
self::cacheSet($key, $window);
}
return new ArrayWrapper(array_slice($window,
$offset,
$limit));
}
}
if ($limit != null) {
if (common_config('db','type') == 'pgsql') {
$qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
} else {
$qry .= ' LIMIT ' . $offset . ', ' . $limit;
function realGetMembers($offset=0, $limit=null)
{
$gm = new Group_member();
$gm->selectAdd();
$gm->selectAdd('profile_id');
$gm->group_id = $this->id;
$gm->orderBy('created DESC');
if (!is_null($limit)) {
$gm->limit($offset, $limit);
}
$ids = array();
if ($gm->find()) {
while ($gm->fetch()) {
$ids[] = $gm->profile_id;
}
}
$members = new Profile();
$members = Profile::multiGet('id', $ids);
$members->query(sprintf($qry, $this->id));
return $members;
}
@ -196,17 +221,24 @@ class User_group extends Managed_DataObject
function getMemberCount()
{
// XXX: WORM cache this
$key = sprintf("group:member_count:%d", $this->id);
$members = $this->getMembers();
$member_count = 0;
$cnt = self::cacheGet($key);
/** $member->count() doesn't work. */
while ($members->fetch()) {
$member_count++;
if (is_integer($cnt)) {
return (int) $cnt;
}
return $member_count;
$mem = new Group_member();
$mem->group_id = $this->id;
// XXX: why 'distinct'?
$cnt = (int) $mem->count('distinct profile_id');
self::cacheSet($key, $cnt);
return $cnt;
}
function getBlockedCount()