From 0c2c73659c611ff04be75f686500dbc3adf35223 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 17 Mar 2011 17:06:04 -0700 Subject: [PATCH] Use cached sources for favorites & repeats info on threaded notice lists --- classes/Fave.php | 29 +++++++++++++++++++++++++++++ classes/Notice.php | 2 ++ lib/threadednoticelist.php | 11 ++--------- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/classes/Fave.php b/classes/Fave.php index 4a9cfaae06..e4e00d27ca 100644 --- a/classes/Fave.php +++ b/classes/Fave.php @@ -44,6 +44,7 @@ class Fave extends Memcached_DataObject common_log_db_error($fave, 'INSERT', __FILE__); return false; } + self::blow('fave:by_notice', $fave->notice_id); Event::handle('EndFavorNotice', array($profile, $notice)); } @@ -61,6 +62,7 @@ class Fave extends Memcached_DataObject if (Event::handle('StartDisfavorNotice', array($profile, $notice, &$result))) { $result = parent::delete(); + self::blow('fave:by_notice', $this->notice_id); if ($result) { Event::handle('EndDisfavorNotice', array($profile, $notice)); @@ -208,4 +210,31 @@ class Fave extends Memcached_DataObject return $fav; } + + /** + * Grab a list of profile who have favored this notice. + * + * @return ArrayWrapper masquerading as a Fave + */ + static function byNotice($noticeId) + { + $c = self::memcache(); + $key = Cache::key('fave:by_notice', $noticeId); + + $wrapper = $c->get($key); + if (!$wrapper) { + // @fixme caching & scalability! + $fave = new Fave(); + $fave->notice_id = $noticeId; + $fave->find(); + + $profiles = array(); + while ($fave->fetch()) { + $list[] = clone($fave); + } + $wrapper = new ArrayWrapper($list); + $c->set($key, $wrapper); + } + return $wrapper; + } } diff --git a/classes/Notice.php b/classes/Notice.php index 664e5dab9f..560d45a640 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -496,6 +496,8 @@ class Notice extends Memcached_DataObject if ($this->isPublic()) { self::blow('public;last'); } + + self::blow('fave:by_notice', $this->id); } /** save all urls in the notice to the db diff --git a/lib/threadednoticelist.php b/lib/threadednoticelist.php index f1f4083ed6..c6fe77ddb4 100644 --- a/lib/threadednoticelist.php +++ b/lib/threadednoticelist.php @@ -414,11 +414,7 @@ class ThreadedNoticeListFavesItem extends NoticeListActorsItem { function getProfiles() { - // @fixme caching & scalability! - $fave = new Fave(); - $fave->notice_id = $this->notice->id; - $fave->find(); - + $fave = Fave::byNotice($this->notice->id); $profiles = array(); while ($fave->fetch()) { $profiles[] = $fave->user_id; @@ -469,10 +465,7 @@ class ThreadedNoticeListRepeatsItem extends NoticeListActorsItem { function getProfiles() { - // @fixme caching & scalability! - $rep = new Notice(); - $rep->repeat_of = $this->notice->id; - $rep->find(); + $rep = $this->notice->repeatStream(); $profiles = array(); while ($rep->fetch()) {