diff options
author | Brion Vibber <brion@pobox.com> | 2010-11-16 11:17:29 -0800 |
---|---|---|
committer | Brion Vibber <brion@pobox.com> | 2010-11-16 11:17:29 -0800 |
commit | fa6c6077d6e49d03b10da4339e3c97e0734897de (patch) | |
tree | 6d0b8cae0a1331a12cef1f54544b6641a214a59d /lib | |
parent | eb0495d10719f2be86f8f97e82aaa1b8bf923c7d (diff) | |
parent | 0265cdc1c982ca2bd33ceee7d9d956eda91e9d37 (diff) |
Merge branch 'master' into 0.9.x
Diffstat (limited to 'lib')
-rw-r--r-- | lib/popularity.php | 92 | ||||
-rw-r--r-- | lib/popularnoticesection.php | 41 |
2 files changed, 98 insertions, 35 deletions
diff --git a/lib/popularity.php b/lib/popularity.php new file mode 100644 index 000000000..b6987138b --- /dev/null +++ b/lib/popularity.php @@ -0,0 +1,92 @@ +<?php +/** + * StatusNet, the distributed open-source microblogging tool + * + * Wrapper for fetching lists of popular notices. + * + * PHP version 5 + * + * LICENCE: 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 Widget + * @package StatusNet + * @author Evan Prodromou <evan@status.net> + * @author Brion Vibber <brion@status.net> + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +/** + * Wrapper for fetching notices ranked according to popularity, + * broken out so it can be called from multiple actions with + * less code duplication. + */ +class Popularity +{ + public $limit = NOTICES_PER_PAGE; + public $offset = 0; + public $tag = false; + public $expiry = 600; + + /** + * Run a cached query to fetch notices, whee! + * + * @return Notice + */ + function getNotices() + { + // @fixme there should be a common func for this + if (common_config('db', 'type') == 'pgsql') { + if (!empty($this->out->tag)) { + $tag = pg_escape_string($this->out->tag); + } + } else { + if (!empty($this->out->tag)) { + $tag = mysql_escape_string($this->out->tag); + } + } + $weightexpr = common_sql_weight('fave.modified', common_config('popular', 'dropoff')); + $cutoff = sprintf("fave.modified > '%s'", + common_sql_date(time() - common_config('popular', 'cutoff'))); + $qry = "SELECT notice.*, $weightexpr as weight "; + if(isset($tag)) { + $qry .= 'FROM notice_tag, notice JOIN fave ON notice.id = fave.notice_id ' . + "WHERE $cutoff and notice.id = notice_tag.notice_id and '$tag' = notice_tag.tag"; + } else { + $qry .= 'FROM notice JOIN fave ON notice.id = fave.notice_id ' . + "WHERE $cutoff"; + } + $qry .= ' GROUP BY notice.id,notice.profile_id,notice.content,notice.uri,' . + 'notice.rendered,notice.url,notice.created,notice.modified,' . + 'notice.reply_to,notice.is_local,notice.source,notice.conversation, ' . + 'notice.lat,notice.lon,location_id,location_ns,notice.repeat_of'; + $qry .= ' HAVING \'silenced\' NOT IN (SELECT role FROM profile_role WHERE profile_id=notice.profile_id)'; + $qry .= ' ORDER BY weight DESC'; + + $offset = $this->offset; + $limit = $this->limit + 1; + + $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; + + $notice = Memcached_DataObject::cachedQuery('Notice', + $qry, + 1200); + return $notice; + } +}
\ No newline at end of file diff --git a/lib/popularnoticesection.php b/lib/popularnoticesection.php index f70a972ef..a4f038b24 100644 --- a/lib/popularnoticesection.php +++ b/lib/popularnoticesection.php @@ -48,42 +48,13 @@ class PopularNoticeSection extends NoticeSection { function getNotices() { - // @fixme there should be a common func for this - if (common_config('db', 'type') == 'pgsql') { - if (!empty($this->out->tag)) { - $tag = pg_escape_string($this->out->tag); - } - } else { - if (!empty($this->out->tag)) { - $tag = mysql_escape_string($this->out->tag); - } + $pop = new Popularity(); + if (!empty($this->out->tag)) { + $pop->tag = $this->out->tag; } - $weightexpr = common_sql_weight('fave.modified', common_config('popular', 'dropoff')); - $cutoff = sprintf("fave.modified > '%s'", - common_sql_date(time() - common_config('popular', 'cutoff'))); - $qry = "SELECT notice.*, $weightexpr as weight "; - if(isset($tag)) { - $qry .= 'FROM notice_tag, notice JOIN fave ON notice.id = fave.notice_id ' . - "WHERE $cutoff and notice.id = notice_tag.notice_id and '$tag' = notice_tag.tag"; - } else { - $qry .= 'FROM notice JOIN fave ON notice.id = fave.notice_id ' . - "WHERE $cutoff"; - } - $qry .= ' GROUP BY notice.id,notice.profile_id,notice.content,notice.uri,' . - 'notice.rendered,notice.url,notice.created,notice.modified,' . - 'notice.reply_to,notice.is_local,notice.source,notice.conversation, ' . - 'notice.lat,notice.lon,location_id,location_ns,notice.repeat_of' . - ' ORDER BY weight DESC'; - - $offset = 0; - $limit = NOTICES_PER_SECTION + 1; - - $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; - - $notice = Memcached_DataObject::cachedQuery('Notice', - $qry, - 1200); - return $notice; + $pop->limit = NOTICES_PER_SECTION; + $pop->expiry = 1200; + return $pop->getNotices(); } function title() |