From 64ed01f0aff569da2fd4ed589df9ed4ee9852cb7 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 22 Jul 2008 12:02:13 -0400 Subject: [PATCH] centralize and optimize with-friends query darcs-hash:20080722160213-84dde-2e466b9cc4601a8cb7237770a7df17a2f9dcadb9.gz --- actions/all.php | 28 ++++++++++++---------------- actions/allrss.php | 12 ++++-------- actions/twitapistatuses.php | 12 +----------- classes/User.php | 19 +++++++++++++++++++ classes/stoica.links.ini | 3 +++ lib/common.php | 2 ++ lib/stream.php | 2 -- 7 files changed, 41 insertions(+), 37 deletions(-) diff --git a/actions/all.php b/actions/all.php index 20aea76686..3d3d1c3563 100644 --- a/actions/all.php +++ b/actions/all.php @@ -48,7 +48,7 @@ class AllAction extends StreamAction { array($this, 'show_header'), $user, array($this, 'show_top')); - $this->show_notices($profile); + $this->show_notices($user); common_show_footer(); } @@ -71,23 +71,19 @@ class AllAction extends StreamAction { $this->views_menu(); } - function show_notices($profile) { - - $notice = DB_DataObject::factory('notice'); - - # XXX: chokety and bad - - $notice->whereAdd('EXISTS (SELECT subscribed from subscription where subscriber = '.$profile->id.' and subscribed = notice.profile_id)', 'OR'); - $notice->whereAdd('profile_id = ' . $profile->id, 'OR'); - - $notice->orderBy('created DESC, notice.id DESC'); - - $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; + function show_notices($user) { + $page = $this->trimmed('page'); + if (!$page) { + $page = 1; + } + + $notice = $user->noticesWithFriends($page); + # XXX: revisit constant scope + $notice->limit((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1); - - $cnt = $notice->find(); - + + if ($cnt > 0) { common_element_start('ul', array('id' => 'notices')); for ($i = 0; $i < min($cnt, NOTICES_PER_PAGE); $i++) { diff --git a/actions/allrss.php b/actions/allrss.php index 26e3f5241e..a64b476414 100644 --- a/actions/allrss.php +++ b/actions/allrss.php @@ -42,17 +42,13 @@ class AllrssAction extends Rss10Action { function get_notices($limit=0) { $user = $this->user; - $notices = array(); - - $notice = DB_DataObject::factory('notice'); - - $notice->whereAdd('EXISTS (SELECT subscribed from subscription where subscriber = '.$user->id.' and subscribed = notice.profile_id)', 'OR'); - $notice->whereAdd('profile_id = ' . $user->id, 'OR'); - - $notice->orderBy('created DESC, notice.id DESC'); + + $notice = $user->noticesWithFriends(); + if ($limit != 0) { $notice->limit(0, $limit); } + $notice->find(); while ($notice->fetch()) { diff --git a/actions/twitapistatuses.php b/actions/twitapistatuses.php index 47e3ffcd97..749f2f0849 100644 --- a/actions/twitapistatuses.php +++ b/actions/twitapistatuses.php @@ -223,18 +223,8 @@ class TwitapistatusesAction extends TwitterapiAction { $link = common_local_url('all', array('nickname' => $user->nickname)); $subtitle = sprintf(_("Updates from %s and friends on %s!"), $user->nickname, $sitename); - $notice = new Notice(); - - # XXX: chokety and bad - - $notice->whereAdd('EXISTS (SELECT subscribed from subscription where subscriber = '.$profile->id.' and subscribed = notice.profile_id)', 'OR'); - $notice->whereAdd('profile_id = ' . $profile->id, 'OR'); - - # XXX: since - # XXX: since_id + $notice->$user->noticesWithFriends(); - $notice->orderBy('created DESC, notice.id DESC'); - $notice->limit((($page-1)*20), $count); $cnt = $notice->find(); diff --git a/classes/User.php b/classes/User.php index e4928eb34a..1772b82e0e 100644 --- a/classes/User.php +++ b/classes/User.php @@ -128,4 +128,23 @@ class User extends DB_DataObject return true; } + + function noticesWithFriends() { + + $notice = new Notice(); + + $notice->selectAs(); + + $subscription = new Subscription(); + + $subscription->subscriber = $this->id; + + $notice->joinAdd($subscription); + $notice->whereAdd('notice.profile_id = subscription.subscribed'); + $notice->selectAs($subscription, 'sub_%'); + + $notice->orderBy('created DESC, notice.id DESC'); + + return $notice; + } } diff --git a/classes/stoica.links.ini b/classes/stoica.links.ini index 7e4e3613cd..bb849cbf2f 100644 --- a/classes/stoica.links.ini +++ b/classes/stoica.links.ini @@ -34,3 +34,6 @@ user_id = user:id [queue_item] notice_id = notice:id +[subscription] +subscriber = profile:id +subscribed = profile:id diff --git a/lib/common.php b/lib/common.php index e7d69303c8..ca668d8c28 100644 --- a/lib/common.php +++ b/lib/common.php @@ -26,6 +26,8 @@ define('AVATAR_STREAM_SIZE', 48); define('AVATAR_MINI_SIZE', 24); define('MAX_AVATAR_SIZE', 256 * 1024); +define('NOTICES_PER_PAGE', 20); + define_syslog_variables(); # global configuration object diff --git a/lib/stream.php b/lib/stream.php index ad65e2d2a2..a595958e44 100644 --- a/lib/stream.php +++ b/lib/stream.php @@ -19,8 +19,6 @@ if (!defined('LACONICA')) { exit(1); } -define('NOTICES_PER_PAGE', 20); - class StreamAction extends Action { function handle($args) {