diff options
-rw-r--r-- | actions/favorited.php | 37 | ||||
-rw-r--r-- | config.php.sample | 4 | ||||
-rw-r--r-- | lib/common.php | 2 |
3 files changed, 26 insertions, 17 deletions
diff --git a/actions/favorited.php b/actions/favorited.php index 5f6c19c16..dc8070d06 100644 --- a/actions/favorited.php +++ b/actions/favorited.php @@ -56,12 +56,10 @@ class FavoritedAction extends StreamAction { function show_notices($page) { - // XXX: Make dropoff configurable like tags? - - $qry = - 'SELECT notice_id, sum(exp(-(now() - modified)/864000)) as weight ' . - 'FROM fave GROUP BY notice_id ' . - 'ORDER BY weight DESC'; + $qry = 'SELECT notice.*, sum(exp(-(now() - fave.modified) / %s)) as weight ' . + 'FROM notice JOIN fave ON notice.id = fave.notice_id ' . + 'GROUP BY fave.notice_id ' . + 'ORDER BY weight DESC'; $offset = ($page - 1) * NOTICES_PER_PAGE; $limit = NOTICES_PER_PAGE + 1; @@ -72,25 +70,30 @@ class FavoritedAction extends StreamAction { $qry .= ' LIMIT ' . $offset . ', ' . $limit; } - // XXX: Figure out how to cache these queries. + # Figure out how to cache this query - $fave = new Fave; - $fave->query($qry); + $notice = new Notice; + $notice->query(sprintf($qry, common_config('popular', 'dropoff'))); - $notice_list = array(); + common_element_start('ul', array('id' => 'notices')); - while ($fave->fetch()) { - array_push($notice_list, $fave->notice_id); - } + $cnt = 0; - $notice = new Notice(); + while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) { + $cnt++; - $notice->query(sprintf('SELECT * FROM notice WHERE id in (%s)', - implode(',', $notice_list))); + if ($cnt > NOTICES_PER_PAGE) { + break; + } - $cnt = $this->show_notice_list($notice); + $item = new NoticeListItem($notice); + $item->show(); + } + + common_element_end('ul'); common_pagination($page > 1, $cnt > NOTICES_PER_PAGE, $page, 'favorited'); } + } diff --git a/config.php.sample b/config.php.sample index 5f7a44c63..db1a21663 100644 --- a/config.php.sample +++ b/config.php.sample @@ -96,6 +96,10 @@ $config['sphinx']['port'] = 3312; #raise this if traffic is slow, lower it if it's fast #$config['tag']['dropoff'] = 86400.0 * 10; +#exponential decay factor for popular (most favorited notices) +#default 10 days -- similar to tag dropoff +#$config['popular']['dropoff'] = 86400.0 * 10; + #optionally show non-local messages in public timeline #$config['public']['localonly'] = false; diff --git a/lib/common.php b/lib/common.php index f727a1cc1..b8ecbe151 100644 --- a/lib/common.php +++ b/lib/common.php @@ -116,6 +116,8 @@ $config = 'port' => 3312), 'tag' => array('dropoff' => 864000.0), + 'popular' => + array('dropoff' => 864000.0), 'daemon' => array('piddir' => '/var/run', 'user' => false, |