From c862589dcfafac57213f72dfdad5d56c896946b0 Mon Sep 17 00:00:00 2001 From: Alexei Sorokin Date: Wed, 1 Jul 2020 18:20:44 +0300 Subject: [PATCH] [CORE] Avoid materialisation in the TagNoticeStream query The notice.created sort forced the notice_tag by notice join plain to employ materialisation, which can have a serious performance penalty depending on the size of the database. Sort by notice_tag.created instead, which should be exactly the same. --- lib/notices/tagnoticestream.php | 72 ++++++++++++++++----------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/lib/notices/tagnoticestream.php b/lib/notices/tagnoticestream.php index 5a99a1aa68..26857f6d21 100644 --- a/lib/notices/tagnoticestream.php +++ b/lib/notices/tagnoticestream.php @@ -1,53 +1,52 @@ . + /** - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2011, StatusNet, Inc. - * * Stream of notices with a given tag - * - * PHP version 5 - * - * 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 . * * @category Stream - * @package StatusNet + * @package GNUsocial * @author Evan Prodromou * @copyright 2011 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('GNUSOCIAL')) { exit(1); } +defined('GNUSOCIAL') || die(); /** * Stream of notices with a given tag * * @category Stream - * @package StatusNet + * @package GNUsocial * @author Evan Prodromou * @copyright 2011 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class TagNoticeStream extends ScopingNoticeStream { - function __construct($tag, Profile $scoped=null) + public function __construct($tag, Profile $scoped=null) { - parent::__construct(new CachingNoticeStream(new RawTagNoticeStream($tag), - 'notice_tag:notice_ids:' . Cache::keyize($tag)), - $scoped); + parent::__construct( + new CachingNoticeStream( + new RawTagNoticeStream($tag), + 'notice_tag:notice_ids:' . Cache::keyize($tag) + ), + $scoped + ); } } @@ -55,23 +54,22 @@ class TagNoticeStream extends ScopingNoticeStream * Raw stream of notices with a given tag * * @category Stream - * @package StatusNet + * @package GNUsocial * @author Evan Prodromou * @copyright 2011 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class RawTagNoticeStream extends NoticeStream { protected $tag; - function __construct($tag) + public function __construct($tag) { $this->tag = $tag; } - function getNoticeIds($offset, $limit, $since_id, $max_id) + public function getNoticeIds($offset, $limit, $since_id, $max_id) { $nt = new Notice_tag(); @@ -92,14 +90,16 @@ class RawTagNoticeStream extends NoticeStream $nt->whereAddIn('notice.verb', $filter, 'string'); } - $filter = array_keys(array_filter($this->selectVerbs, function ($v) { return !$v; })); + $filter = array_keys(array_filter($this->selectVerbs, function ($v) { + return !$v; + })); if (!empty($filter)) { // exclude verbs in selectVerbs with values that equate to false $nt->whereAddIn('!notice.verb', $filter, 'string'); } } - $nt->orderBy('notice.created DESC, notice_id DESC'); + $nt->orderBy('notice_tag.created DESC, notice_id DESC'); if (!is_null($offset)) { $nt->limit($offset, $limit);