From 9b9db3b28aa117085385baa264ba6d8bb928cfac Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 16 Nov 2010 11:10:32 -0800 Subject: Prep for ticket #2895: consolidate common code from PopularNoticeList and FavoritedAction for fetching popular notice lists --- lib/popularity.php | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 lib/popularity.php (limited to 'lib/popularity.php') diff --git a/lib/popularity.php b/lib/popularity.php new file mode 100644 index 000000000..c5b795b8d --- /dev/null +++ b/lib/popularity.php @@ -0,0 +1,91 @@ +. + * + * @category Widget + * @package StatusNet + * @author Evan Prodromou + * @author Brion Vibber + * @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 .= ' 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 -- cgit v1.2.3-54-g00ecf