Subscription "get by" functions now don't use ArrayWrappers

They were getting in the way of some strict-typing stuff.
This commit is contained in:
Mikael Nordfeldth 2013-09-21 18:26:58 +02:00
parent 39f21d63af
commit 63306081bc
9 changed files with 85 additions and 124 deletions

View File

@ -65,7 +65,7 @@ class ApiUserFriendsAction extends ApiSubscriptionsAction
$this->tag, $offset, $limit $this->tag, $offset, $limit
); );
} else { } else {
$subs = $this->user->getSubscriptions( $subs = $this->user->getSubscribed(
$offset, $offset,
$limit $limit
); );

View File

@ -95,7 +95,7 @@ class SubscriptionsAction extends GalleryAction
if ($this->tag) { if ($this->tag) {
$subscriptions = $this->user->getTaggedSubscriptions($this->tag, $offset, $limit); $subscriptions = $this->user->getTaggedSubscriptions($this->tag, $offset, $limit);
} else { } else {
$subscriptions = $this->user->getSubscriptions($offset, $limit); $subscriptions = $this->user->getSubscribed($offset, $limit);
} }
if ($subscriptions) { if ($subscriptions) {

View File

@ -646,40 +646,18 @@ class Profile extends Managed_DataObject
} }
} }
function getSubscriptions($offset=0, $limit=null) function getSubscribed($offset=0, $limit=null)
{ {
$subs = Subscription::bySubscriber($this->id, $subs = Subscription::getSubscribedIDs($this->id, $offset, $limit);
$offset, $profiles = Profile::listFind('id', $subs);
$limit); return $profiles;
$profiles = array();
while ($subs->fetch()) {
$profile = Profile::getKV($subs->subscribed);
if ($profile) {
$profiles[] = $profile;
}
}
return new ArrayWrapper($profiles);
} }
function getSubscribers($offset=0, $limit=null) function getSubscribers($offset=0, $limit=null)
{ {
$subs = Subscription::bySubscribed($this->id, $subs = Subscription::getSubscriberIDs($this->id, $offset, $limit);
$offset, $profiles = Profile::listFind('id', $subs);
$limit); return $profiles;
$profiles = array();
while ($subs->fetch()) {
$profile = Profile::getKV($subs->subscriber);
if ($profile) {
$profiles[] = $profile;
}
}
return new ArrayWrapper($profiles);
} }
function getTaggedSubscribers($tag) function getTaggedSubscribers($tag)

View File

@ -287,117 +287,100 @@ class Subscription extends Managed_DataObject
* chronological order. Has offset & limit to make paging * chronological order. Has offset & limit to make paging
* easy. * easy.
* *
* @param integer $subscriberId Profile ID of the subscriber * @param integer $profile_id ID of the subscriber profile
* @param integer $offset Offset from latest * @param integer $offset Offset from latest
* @param integer $limit Maximum number to fetch * @param integer $limit Maximum number to fetch
* *
* @return Subscription stream of subscriptions; use fetch() to iterate * @return Subscription stream of subscriptions; use fetch() to iterate
*/ */
static function bySubscriber($subscriberId, public static function bySubscriber($profile_id, $offset = 0, $limit = PROFILES_PER_PAGE)
$offset = 0,
$limit = PROFILES_PER_PAGE)
{ {
if ($offset + $limit > self::CACHE_WINDOW) { // "by subscriber" means it is the list of subscribed users we want
return new ArrayWrapper(self::realBySubscriber($subscriberId, $ids = self::getSubscribedIDs($profile_id, $offset, $limit);
$offset, return Subscription::listFind('subscribed', $ids);
$limit));
} else {
$key = 'subscription:by-subscriber:'.$subscriberId;
$window = self::cacheGet($key);
if ($window === false) {
$window = self::realBySubscriber($subscriberId,
0,
self::CACHE_WINDOW);
self::cacheSet($key, $window);
}
return new ArrayWrapper(array_slice($window,
$offset,
$limit));
}
}
private static function realBySubscriber($subscriberId,
$offset,
$limit)
{
$sub = new Subscription();
$sub->subscriber = $subscriberId;
$sub->whereAdd('subscribed != ' . $subscriberId);
$sub->orderBy('created DESC');
$sub->limit($offset, $limit);
$sub->find();
$subs = array();
while ($sub->fetch()) {
$subs[] = clone($sub);
}
return $subs;
} }
/** /**
* Stream of subscriptions with the same subscribed profile * Stream of subscriptions with the same subscriber
* *
* Useful for showing pages that list subscribers in reverse * Useful for showing pages that list subscriptions in reverse
* chronological order. Has offset & limit to make paging * chronological order. Has offset & limit to make paging
* easy. * easy.
* *
* @param integer $subscribedId Profile ID of the subscribed * @param integer $profile_id ID of the subscribed profile
* @param integer $offset Offset from latest * @param integer $offset Offset from latest
* @param integer $limit Maximum number to fetch * @param integer $limit Maximum number to fetch
* *
* @return Subscription stream of subscriptions; use fetch() to iterate * @return Subscription stream of subscriptions; use fetch() to iterate
*/ */
static function bySubscribed($subscribedId, public static function bySubscribed($profile_id, $offset = 0, $limit = PROFILES_PER_PAGE)
$offset = 0,
$limit = PROFILES_PER_PAGE)
{ {
if ($offset + $limit > self::CACHE_WINDOW) { // "by subscribed" means it is the list of subscribers we want
return new ArrayWrapper(self::realBySubscribed($subscribedId, $ids = self::getSubscriberIDs($profile_id, $offset, $limit);
$offset, return Subscription::listFind('subscriber', $ids);
$limit));
} else {
$key = 'subscription:by-subscribed:'.$subscribedId;
$window = self::cacheGet($key);
if ($window === false) {
$window = self::realBySubscribed($subscribedId,
0,
self::CACHE_WINDOW);
self::cacheSet($key, $window);
}
return new ArrayWrapper(array_slice($window,
$offset,
$limit));
}
} }
private static function realBySubscribed($subscribedId,
$offset, // The following are helper functions to the subscription lists,
$limit) // notably the public ones get used in places such as Profile
public static function getSubscribedIDs($profile_id, $offset, $limit) {
return self::getSubscriptionIDs('subscribed', $profile_id, $offset, $limit);
}
public static function getSubscriberIDs($profile_id, $offset, $limit) {
return self::getSubscriptionIDs('subscriber', $profile_id, $offset, $limit);
}
private static function getSubscriptionIDs($get_type, $profile_id, $offset, $limit)
{ {
$sub = new Subscription(); switch ($get_type) {
case 'subscribed':
$sub->subscribed = $subscribedId; $by_type = 'subscriber';
break;
$sub->whereAdd('subscriber != ' . $subscribedId); case 'subscriber':
$by_type = 'subscribed';
$sub->orderBy('created DESC'); break;
$sub->limit($offset, $limit); default:
throw new Exception('Bad type argument to getSubscriptionIDs');
$sub->find();
$subs = array();
while ($sub->fetch()) {
$subs[] = clone($sub);
} }
return $subs; $cacheKey = 'subscription:by-'.$by_type.':'.$profile_id;
$queryoffset = $offset;
$querylimit = $limit;
if ($offset + $limit <= self::CACHE_WINDOW) {
// Oh, it seems it should be cached
$ids = self::cacheGet($cacheKey);
if (is_array($ids)) {
return array_slice($ids, $offset, $limit);
}
// Being here indicates we didn't find anything cached
// so we'll have to fill it up simultaneously
$queryoffset = 0;
$querylimit = self::CACHE_WINDOW;
}
$sub = new Subscription();
$sub->$by_type = $profile_id;
$sub->selectAdd($get_type);
$sub->whereAdd("{$get_type} != {$profile_id}");
$sub->orderBy('created DESC');
$sub->limit($queryoffset, $querylimit);
if (!$sub->find()) {
return array();
}
$ids = $sub->fetchAll($get_type);
// If we're simultaneously filling up cache, remember to slice
if ($offset === 0 && $querylimit === self::CACHE_WINDOW) {
self::cacheSet($cacheKey, $ids);
return array_slice($ids, $offset, $limit);
}
return $ids;
} }
/** /**

View File

@ -701,10 +701,10 @@ class User extends Managed_DataObject
return $profile->leaveGroup($group); return $profile->leaveGroup($group);
} }
function getSubscriptions($offset=0, $limit=null) function getSubscribed($offset=0, $limit=null)
{ {
$profile = $this->getProfile(); $profile = $this->getProfile();
return $profile->getSubscriptions($offset, $limit); return $profile->getSubscribed($offset, $limit);
} }
function getSubscribers($offset=0, $limit=null) function getSubscribers($offset=0, $limit=null)

View File

@ -931,7 +931,7 @@ class SubscriptionsCommand extends Command
{ {
function handle($channel) function handle($channel)
{ {
$profile = $this->user->getSubscriptions(0); $profile = $this->user->getSubscribed(0);
$nicknames=array(); $nicknames=array();
while ($profile->fetch()) { while ($profile->fetch()) {
$nicknames[]=$profile->nickname; $nicknames[]=$profile->nickname;

View File

@ -125,7 +125,7 @@ class ProfileAction extends Action
function showSubscriptions() function showSubscriptions()
{ {
$profile = $this->profile->getSubscriptions(0, PROFILES_PER_MINILIST + 1); $profile = $this->profile->getSubscribed(0, PROFILES_PER_MINILIST + 1);
$this->elementStart('div', array('id' => 'entity_subscriptions', $this->elementStart('div', array('id' => 'entity_subscriptions',
'class' => 'section')); 'class' => 'section'));

View File

@ -81,7 +81,7 @@ function updateOStatus($user)
$up = $user->getProfile(); $up = $user->getProfile();
$sp = $user->getSubscriptions(); $sp = $up->getSubscribed();
$rps = array(); $rps = array();

View File

@ -118,7 +118,7 @@ function newNotice($i, $tagmax)
$is_directed = rand(0, 4); $is_directed = rand(0, 4);
if ($is_directed == 0) { if ($is_directed == 0) {
$subs = $user->getSubscriptions(0, 100)->fetchAll(); $subs = $user->getSubscribed(0, 100)->fetchAll();
if (count($subs) > 0) { if (count($subs) > 0) {
$seen = array(); $seen = array();
$f = rand(0, 9); $f = rand(0, 9);