[CORE] Another inboxnoticestream improvement

This commit is contained in:
Alexei Sorokin 2019-09-10 22:25:45 +03:00
parent b0104d9992
commit b89f1ad7d8

View File

@ -1,51 +1,40 @@
<?php <?php
// This file is part of GNU social - https://www.gnu.org/software/social
//
// GNU social is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// GNU social is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
/** /**
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2011, StatusNet, Inc.
*
* Stream of notices for a profile's "all" feed * Stream of notices for a profile's "all" feed
* *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category NoticeStream * @category NoticeStream
* @package StatusNet * @package GNUsocial
* @author Evan Prodromou <evan@status.net> * @author Evan Prodromou <evan@status.net>
* @author Mikael Nordfeldth <mmn@hethane.se> * @author Mikael Nordfeldth <mmn@hethane.se>
* @author Alexei Sorokin <sor.alexei@meowr.ru> * @author Alexei Sorokin <sor.alexei@meowr.ru>
* @author Stephane Berube <chimo@chromic.org>
* @copyright 2011 StatusNet, Inc. * @copyright 2011 StatusNet, Inc.
* @copyright 2014 Free Software Foundation, Inc. * @copyright 2014 Free Software Foundation, Inc http://www.fsf.org
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later
* @link http://status.net/
*/ */
if (!defined('GNUSOCIAL')) { defined('GNUSOCIAL') || die();
exit(1);
}
/** /**
* Stream of notices for a profile's "all" feed
*
* @category General * @category General
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @author Mikael Nordfeldth <mmn@hethane.se>
* @author Alexei Sorokin <sor.alexei@meowr.ru>
* @author chimo <chimo@chromic.org>
* @copyright 2011 StatusNet, Inc. * @copyright 2011 StatusNet, Inc.
* @copyright 2014 Free Software Foundation, Inc. * @copyright 2014 Free Software Foundation, Inc http://www.fsf.org
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later
* @link http://status.net/
*/ */
class InboxNoticeStream extends ScopingNoticeStream class InboxNoticeStream extends ScopingNoticeStream
{ {
@ -65,13 +54,9 @@ class InboxNoticeStream extends ScopingNoticeStream
* Raw stream of notices for the target's inbox * Raw stream of notices for the target's inbox
* *
* @category General * @category General
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @author Mikael Nordfeldth <mmn@hethane.se>
* @author Alexei Sorokin <sor.alexei@meowr.ru>
* @copyright 2011 StatusNet, Inc. * @copyright 2011 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @copyright 2014 Free Software Foundation, Inc http://www.fsf.org
* @link http://status.net/ * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later
*/ */
class RawInboxNoticeStream extends FullNoticeStream class RawInboxNoticeStream extends FullNoticeStream
{ {
@ -104,33 +89,39 @@ class RawInboxNoticeStream extends FullNoticeStream
$notice = new Notice(); $notice = new Notice();
$notice->selectAdd(); $notice->selectAdd();
$notice->selectAdd('id'); $notice->selectAdd('id');
$notice->whereAdd(sprintf('notice.created > "%s"', $notice->escape($this->target->created)));
// Reply:: is a table of mentions // Reply:: is a table of mentions
// Subscription:: is a table of subscriptions (every user is subscribed to themselves) // Subscription:: is a table of subscriptions (every user is subscribed to themselves)
// Sort in descending order as id will give us even really old posts, $notice->_join .= sprintf(
// which were recently imported. For example, if a remote instance had "\n" . 'NATURAL INNER JOIN (' .
// problems and just managed to post here. '(SELECT id FROM notice WHERE profile_id IN (SELECT subscribed FROM subscription WHERE subscriber = %1$d)) ' .
$notice->whereAdd( 'UNION (SELECT notice_id AS id FROM reply WHERE profile_id = %1$d) ' .
sprintf('id IN (SELECT DISTINCT id FROM (' . 'UNION (SELECT notice_id AS id FROM attention WHERE profile_id = %1$d) ' .
'(SELECT id FROM notice WHERE profile_id IN (SELECT subscribed FROM subscription WHERE subscriber = %1$d)) UNION ' . 'UNION (SELECT notice_id AS id FROM group_inbox WHERE group_id IN (SELECT group_id FROM group_member WHERE profile_id = %1$d))' .
'(SELECT notice_id AS id FROM reply WHERE profile_id = %1$d) UNION ' . ') AS t1',
'(SELECT notice_id AS id FROM attention WHERE profile_id = %1$d) UNION ' . $this->target->getID()
'(SELECT notice_id AS id FROM group_inbox WHERE group_id IN (SELECT group_id FROM group_member WHERE profile_id = %1$d)) ' .
'ORDER BY id DESC) AS T)',
$this->target->getID())
); );
$notice->whereAdd(sprintf(
"notice.created > TIMESTAMP '%s'",
$notice->escape($this->target->created)
));
if (!empty($since_id)) { if (!empty($since_id)) {
$notice->whereAdd(sprintf('notice.id > %d', $since_id)); $notice->whereAdd('id > ' . $since_id);
} }
if (!empty($max_id)) { if (!empty($max_id)) {
$notice->whereAdd(sprintf('notice.id <= %d', $max_id)); $notice->whereAdd('id <= ' . $max_id);
} }
$notice->whereAdd('scope != ' . Notice::MESSAGE_SCOPE); $notice->whereAdd('scope <> ' . Notice::MESSAGE_SCOPE);
self::filterVerbs($notice, $this->selectVerbs); self::filterVerbs($notice, $this->selectVerbs);
// notice.id will give us even really old posts, which were recently
// imported. For example if a remote instance had problems and just
// managed to post here.
$notice->orderBy('id DESC');
$notice->limit($offset, $limit); $notice->limit($offset, $limit);
if (!$notice->find()) { if (!$notice->find()) {