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));
}
}
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));
}
}
{
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 */
return !in_array($nickname, $blacklist);
}
- function getMembers($offset=0, $limit=null)
+ 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));
+ }
+ }
+
+ function realGetMembers($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 ';
+ $gm = new Group_member();
- if ($limit != null) {
- if (common_config('db','type') == 'pgsql') {
- $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
- } else {
- $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+ $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;
}
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()