pre-fill the addressees of notices in a list

This commit is contained in:
Evan Prodromou 2011-08-03 00:59:09 -04:00
parent ba6235a446
commit 16042387a0
2 changed files with 35 additions and 21 deletions

View File

@ -1303,6 +1303,8 @@ class Notice extends Memcached_DataObject
return $reply;
}
protected $_replies = -1;
/**
* Pull the complete list of @-reply targets for this notice.
*
@ -1310,31 +1312,28 @@ class Notice extends Memcached_DataObject
*/
function getReplies()
{
$keypart = sprintf('notice:reply_ids:%d', $this->id);
$idstr = self::cacheGet($keypart);
if ($idstr !== false) {
$ids = explode(',', $idstr);
} else {
$ids = array();
$reply = new Reply();
$reply->selectAdd();
$reply->selectAdd('profile_id');
$reply->notice_id = $this->id;
if ($reply->find()) {
while($reply->fetch()) {
$ids[] = $reply->profile_id;
}
}
self::cacheSet($keypart, implode(',', $ids));
if ($this->_replies != -1) {
return $this->_replies;
}
$replyMap = Memcached_DataObject::listGet('Reply', 'notice_id', array($this->id));
$ids = array();
foreach ($replyMap[$this->id] as $reply) {
$ids[] = $reply->profile_id;
}
$this->_replies = $ids;
return $ids;
}
function _setReplies($replies)
{
$this->_replies = $replies;
}
/**
* Pull the complete list of @-reply targets for this notice.
*
@ -2436,7 +2435,7 @@ class Notice extends Memcached_DataObject
function __sleep()
{
$vars = parent::__sleep();
$skip = array('_original', '_profile', '_groups', '_attachments', '_faves');
$skip = array('_original', '_profile', '_groups', '_attachments', '_faves', '_replies');
return array_diff($vars, $skip);
}
@ -2579,4 +2578,18 @@ class Notice extends Memcached_DataObject
$notice->_setFaves($faveMap[$notice->id]);
}
}
static function fillReplies(&$notices)
{
$ids = self::_idsOf($notices);
$replyMap = Memcached_DataObject::listGet('Reply', 'notice_id', $ids);
foreach ($notices as $notice) {
$replies = $replyMap[$notice->id];
$ids = array();
foreach ($replies as $reply) {
$ids[] = $reply->profile_id;
}
$notice->_setReplies($ids);
}
}
}

View File

@ -86,6 +86,7 @@ abstract class FilteringNoticeStream extends NoticeStream
// XXX: this should probably only be in the scoping one.
Notice::fillGroups($notices);
Notice::fillReplies($notices);
foreach ($notices as $notice) {
if ($this->filter($notice)) {