New mechanism for "all" feed (InboxNoticeStream)

Also cleaned up and made typing stricter for the stream, so only
profiles can be submitted. This reasonably also means we can create
"inbox" or "all" streams for foreign profiles as well using the same
stream handler (but of course only for messages we already know about).

To avoid looking up posts for a long time in a large notice database,
the lookback period for the inbox is no longer than the profile creation
date. (this matches the behaviour of Inbox)

Inbox class can probably be removed now.
This commit is contained in:
Mikael Nordfeldth 2014-03-06 03:43:48 +01:00
parent c812e7c0d6
commit 4b2a66ed29
8 changed files with 24 additions and 21 deletions

View File

@ -213,7 +213,7 @@ class AllAction extends ProfileAction
// XXX: make this a little more convenient // XXX: make this a little more convenient
if (!common_config('performance', 'high')) { if (!common_config('performance', 'high')) {
$pop = new PopularNoticeSection($this, Profile::current()); $pop = new PopularNoticeSection($this, $this->scoped);
$pop->show(); $pop->show();
$pop = new InboxTagCloudSection($this, $this->target); $pop = new InboxTagCloudSection($this, $this->target);
$pop->show(); $pop->show();
@ -223,8 +223,8 @@ class AllAction extends ProfileAction
class ThreadingInboxNoticeStream extends ThreadingNoticeStream class ThreadingInboxNoticeStream extends ThreadingNoticeStream
{ {
function __construct($user, $profile) function __construct(Profile $target, Profile $scoped=null)
{ {
parent::__construct(new InboxNoticeStream($user, $profile)); parent::__construct(new InboxNoticeStream($target, $scoped));
} }
} }

View File

@ -83,7 +83,7 @@ class AllrssAction extends Rss10Action
*/ */
function getNotices($limit=0) function getNotices($limit=0)
{ {
$stream = new InboxNoticeStream($this->user); $stream = new InboxNoticeStream($this->user->getProfile());
$notice = $stream->getNotices(0, $limit, null, null); $notice = $stream->getNotices(0, $limit, null, null);
$notices = array(); $notices = array();

View File

@ -274,7 +274,7 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
{ {
$notices = array(); $notices = array();
$stream = new InboxNoticeStream($this->target->getUser(), $this->scoped); $stream = new InboxNoticeStream($this->target, $this->scoped);
$notice = $stream->getNotices(($this->page-1) * $this->count, $notice = $stream->getNotices(($this->page-1) * $this->count,
$this->count, $this->count,

View File

@ -102,19 +102,22 @@ class RawInboxNoticeStream extends NoticeStream
{ {
$notice = new Notice(); $notice = new Notice();
$notice->selectAdd(); $notice->selectAdd();
$notice->selectAdd('notice_id'); $notice->selectAdd('id');
// Reply is a class for mentions $notice->whereAdd(sprintf('notice.created > "%s"', $notice->escape($this->target->created)));
$notice->joinAdd(array('id', 'reply:notice_id')); // Reply:: is a table of mentions
// Subscription:: is a table of subscriptions (every user is subscribed to themselves)
$notice->profile_id = $this->target->id; $notice->whereAdd(
sprintf('notice.id IN (SELECT notice_id FROM reply WHERE profile_id=%1$d) ' .
'OR notice.profile_id IN (SELECT subscribed FROM subscription WHERE subscriber=%d)', $this->target->id)
);
$notice->limit($offset, $limit); $notice->limit($offset, $limit);
$notice->orderBy('created DESC'); $notice->orderBy('notice.created DESC');
if (!$notice->find()) { if (!$notice->find()) {
return array(); return array();
} }
$ids = $notice->fetchAll('notice_id'); $ids = $notice->fetchAll('id');
return $ids; return $ids;
} }

View File

@ -42,12 +42,12 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
*/ */
class InboxTagCloudSection extends TagCloudSection class InboxTagCloudSection extends TagCloudSection
{ {
var $user = null; protected $target = null;
function __construct($out=null, $user=null) function __construct($out=null, Profile $target)
{ {
parent::__construct($out); parent::__construct($out);
$this->user = $user; $this->target = $target;
} }
function title() function title()
@ -60,14 +60,14 @@ class InboxTagCloudSection extends TagCloudSection
{ {
$profile = Profile::current(); $profile = Profile::current();
$keypart = sprintf('Inbox:notice_tag:%d:%d', $this->user->id, $keypart = sprintf('Inbox:notice_tag:%d:%d', $this->target,
$profile instanceof Profile ? $profile->id : 0); $profile instanceof Profile ? $profile->id : 0);
$tag = Memcached_DataObject::cacheGet($keypart); $tag = Memcached_DataObject::cacheGet($keypart);
if ($tag === false) { if ($tag === false) {
$stream = new InboxNoticeStream($this->user, $profile); $stream = new InboxNoticeStream($this->target, $profile);
$ids = $stream->getNoticeIds(0, Inbox::MAX_NOTICES, null, null); $ids = $stream->getNoticeIds(0, Inbox::MAX_NOTICES, null, null);

View File

@ -102,7 +102,8 @@ class UserEmailSummaryHandler extends QueueHandler
return true; return true;
} }
$stream = new InboxNoticeStream($user, $user->getProfile()); // An InboxNoticeStream for a certain user, scoped to its own view
$stream = new InboxNoticeStream($profile, $profile);
$notice = $stream->getNotices(0, self::MAX_NOTICES, $since_id); $notice = $stream->getNotices(0, self::MAX_NOTICES, $since_id);

View File

@ -47,8 +47,7 @@ class AllmapAction extends MapAction
function prepare($args) function prepare($args)
{ {
if (parent::prepare($args)) { if (parent::prepare($args)) {
$cur = common_current_user(); $stream = new InboxNoticeStream($this->user->getProfile(), $this->scoped);
$stream = new InboxNoticeStream($this->user, $cur->getProfile());
$this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, $this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE,
NOTICES_PER_PAGE + 1, NOTICES_PER_PAGE + 1,
null, null,

View File

@ -95,7 +95,7 @@ function newNotice($i, $tagmax)
$content = testNoticeContent(); $content = testNoticeContent();
if ($is_reply == 0) { if ($is_reply == 0) {
$stream = new InboxNoticeStream($user, $user->getProfile()); $stream = new InboxNoticeStream($user->getProfile(), $user->getProfile());
$notices = $stream->getNotices(0, 20); $notices = $stream->getNotices(0, 20);
if ($notices->N > 0) { if ($notices->N > 0) {
$nval = rand(0, $notices->N - 1); $nval = rand(0, $notices->N - 1);