. /** * Stream of notices sorted by popularity * * @category Popular * @package GNUsocial * @author Evan Prodromou * @copyright 2011 StatusNet, Inc. * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ defined('GNUSOCIAL') || die(); /** * Stream of notices sorted by popularity * * @category Popular * @package GNUsocial * @author Evan Prodromou * @copyright 2011 StatusNet, Inc. * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class PopularNoticeStream extends ScopingNoticeStream { public function __construct(Profile $scoped=null) { parent::__construct( new CachingNoticeStream( new RawPopularNoticeStream(), 'popular', false ), $scoped ); } } class RawPopularNoticeStream extends NoticeStream { public function getNoticeIds($offset, $limit, $since_id, $max_id) { $weightexpr = common_sql_weight( 'modified', common_config('popular', 'dropoff') ); $cutoff = sprintf( "modified > CURRENT_TIMESTAMP - INTERVAL '%d' SECOND", common_config('popular', 'cutoff') ); $fave = new Fave(); $fave->selectAdd(); $fave->selectAdd('notice_id'); $fave->selectAdd("{$weightexpr} AS weight"); $fave->whereAdd($cutoff); $fave->groupBy('notice_id'); $fave->orderBy('weight DESC'); if (!is_null($offset)) { $fave->limit($offset, $limit); } // FIXME: $since_id, $max_id are ignored $ids = array(); if ($fave->find()) { while ($fave->fetch()) { $ids[] = $fave->notice_id; } } return $ids; } }