Get conversation root visible to this user in threadednoticelist

This commit is contained in:
Evan Prodromou 2011-04-11 11:19:11 -04:00
parent 19bd6fded4
commit 61f62241da
2 changed files with 74 additions and 22 deletions

View File

@ -802,30 +802,65 @@ class Notice extends Memcached_DataObject
* *
* @return Notice or null * @return Notice or null
*/ */
function conversationRoot() function conversationRoot($profile=-1)
{ {
if (!empty($this->conversation)) { // XXX: can this happen?
$c = self::memcache();
$key = Cache::key('notice:conversation_root:' . $this->conversation); if (empty($this->conversation)) {
$notice = $c->get($key); return null;
if ($notice) {
return $notice;
}
$notice = new Notice();
$notice->conversation = $this->conversation;
$notice->orderBy('CREATED');
$notice->limit(1);
$notice->find(true);
if ($notice->N) {
$c->set($key, $notice);
return $notice;
}
} }
return null;
// Get the current profile if not specified
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
// If this notice is out of scope, no root for you!
if (!$this->inScope($profile)) {
return null;
}
// If this isn't a reply to anything, then it's its own
// root.
if (empty($this->reply_to)) {
return $this;
}
if (is_null($profile)) {
$keypart = sprintf('notice:conversation_root:%d:null', $this->id);
} else {
$keypart = sprintf('notice:conversation_root:%d:%d',
$this->id,
$profile->id);
}
$root = self::cacheGet($keypart);
if ($root !== false && $root->inScope($profile)) {
return $root;
} else {
$last = $this;
do {
$parent = $last->getOriginal();
if (!empty($parent) && $parent->inScope($profile)) {
$last = $parent;
continue;
} else {
$root = $last;
break;
}
} while (!empty($parent));
self::cacheSet($keypart, $root);
}
return $root;
} }
/** /**
* Pull up a full list of local recipients who will be getting * Pull up a full list of local recipients who will be getting
* this notice in their inbox. Results will be cached, so don't * this notice in their inbox. Results will be cached, so don't
@ -2420,4 +2455,18 @@ class Notice extends Memcached_DataObject
return $groups; return $groups;
} }
protected $_original = -1;
function getOriginal()
{
if (is_int($this->_original) && $this->_original == -1) {
if (empty($this->reply_to)) {
$this->_original = null;
} else {
$this->_original = Notice::staticGet('id', $this->reply_to);
}
}
return $this->_original;
}
} }

View File

@ -52,9 +52,12 @@ class ThreadedNoticeList extends NoticeList
{ {
protected $userProfile; protected $userProfile;
function __construct($notice, $out=null, $profile=null) function __construct($notice, $out=null, $profile=-1)
{ {
parent::__construct($notice, $out); parent::__construct($notice, $out);
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
$this->userProfile = $profile; $this->userProfile = $profile;
} }
@ -98,7 +101,7 @@ class ThreadedNoticeList extends NoticeList
$conversations[$convo] = true; $conversations[$convo] = true;
// Get the convo's root notice // Get the convo's root notice
$root = $notice->conversationRoot(); $root = $notice->conversationRoot($this->userProfile);
if ($root) { if ($root) {
$notice = $root; $notice = $root;
} }