From efd2c68de961551659a7cb48fffd34a24394c01c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 5 Apr 2011 17:20:17 -0400 Subject: [PATCH] cache groups per user --- classes/Profile.php | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/classes/Profile.php b/classes/Profile.php index 73a98d4ff5..f7a94413b2 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -245,30 +245,37 @@ class Profile extends Memcached_DataObject return !empty($request); } - function getGroups($offset=0, $limit=null) + function getGroups($offset=0, $limit=PROFILES_PER_PAGE) { - $qry = - 'SELECT user_group.* ' . - 'FROM user_group JOIN group_member '. - 'ON user_group.id = group_member.group_id ' . - 'WHERE group_member.profile_id = %d ' . - 'ORDER BY group_member.created DESC '; - - if ($offset>0 && !is_null($limit)) { - if ($offset) { - if (common_config('db','type') == 'pgsql') { - $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; - } else { - $qry .= ' LIMIT ' . $offset . ', ' . $limit; + $ids = array(); + + $keypart = sprintf('profile:groups:%d', $this->id); + + $idstring = self::cacheGet($keypart); + + if ($idstring !== false) { + $ids = explode(',', $idstring); + } else { + $gm = new Group_member(); + + $gm->profile_id = $this->id; + + if ($gm->find()) { + while ($gm->fetch()) { + $ids[] = $gm->group_id; } } + + self::cacheSet($keypart, implode(',', $ids)); } - $groups = new User_group(); + $groups = array(); - $cnt = $groups->query(sprintf($qry, $this->id)); + foreach ($ids as $id) { + $groups[] = User_group::staticGet('id', $id); + } - return $groups; + return new ArrayWrapper($groups); } /** @@ -286,6 +293,7 @@ class Profile extends Memcached_DataObject } else { if (Event::handle('StartJoinGroup', array($group, $this))) { $join = Group_member::join($group->id, $this->id); + self::blow('profile:groups:%d', $this->id); Event::handle('EndJoinGroup', array($group, $this)); } } @@ -305,6 +313,7 @@ class Profile extends Memcached_DataObject { if (Event::handle('StartLeaveGroup', array($group, $this))) { Group_member::leave($group->id, $this->id); + self::blow('profile:groups:%d', $this->id); Event::handle('EndLeaveGroup', array($group, $this)); } } -- 2.39.5