summaryrefslogtreecommitdiff
path: root/classes
diff options
context:
space:
mode:
authorEvan Prodromou <evan@status.net>2010-12-11 11:00:04 -0500
committerEvan Prodromou <evan@status.net>2010-12-11 11:00:04 -0500
commitd0ea138888cbc5de30f2c9a52a771921efa9fdc1 (patch)
treebc96b66956cdb8bbe745592b20a06d603ff96ba5 /classes
parent7285bbc93b5394a16731e498b62188ea847de38d (diff)
cache stream of subscriptions
Diffstat (limited to 'classes')
-rw-r--r--classes/Subscription.php91
1 files changed, 89 insertions, 2 deletions
diff --git a/classes/Subscription.php b/classes/Subscription.php
index a4764e9f1..763e3835b 100644
--- a/classes/Subscription.php
+++ b/classes/Subscription.php
@@ -26,6 +26,8 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
class Subscription extends Memcached_DataObject
{
+ const CACHE_WINDOW = 201;
+
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
@@ -91,6 +93,9 @@ class Subscription extends Memcached_DataObject
self::blow('user:notices_with_friends:%d', $subscriber->id);
+ self::blow('subscription:by-subscriber:'.$subscriber->id);
+ self::blow('subscription:by-subscribed:'.$other->id);
+
$subscriber->blowSubscriptionCount();
$other->blowSubscriberCount();
@@ -220,6 +225,9 @@ class Subscription extends Memcached_DataObject
self::blow('user:notices_with_friends:%d', $subscriber->id);
+ self::blow('subscription:by-subscriber:'.$subscriber->id);
+ self::blow('subscription:by-subscribed:'.$other->id);
+
$subscriber->blowSubscriptionCount();
$other->blowSubscriberCount();
@@ -283,6 +291,29 @@ class Subscription extends Memcached_DataObject
$offset = 0,
$limit = PROFILES_PER_PAGE)
{
+ if ($offset + $limit > self::CACHE_WINDOW) {
+ return new ArrayWrapper(self::realBySubscriber($subscriberId,
+ $offset,
+ $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;
@@ -294,7 +325,13 @@ class Subscription extends Memcached_DataObject
$sub->find();
- return $sub;
+ $subs = array();
+
+ while ($sub->fetch()) {
+ $subs[] = clone($sub);
+ }
+
+ return $subs;
}
/**
@@ -315,6 +352,29 @@ class Subscription extends Memcached_DataObject
$offset = 0,
$limit = PROFILES_PER_PAGE)
{
+ if ($offset + $limit > self::CACHE_WINDOW) {
+ return new ArrayWrapper(self::realBySubscribed($subscribedId,
+ $offset,
+ $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,
+ $limit)
+ {
$sub = new Subscription();
$sub->subscribed = $subscribedId;
@@ -326,6 +386,33 @@ class Subscription extends Memcached_DataObject
$sub->find();
- return $sub;
+ $subs = array();
+
+ while ($sub->fetch()) {
+ $subs[] = clone($sub);
+ }
+
+ return $subs;
+ }
+
+ /**
+ * Flush cached subscriptions when subscription is updated
+ *
+ * Because we cache subscriptions, it's useful to flush them
+ * here.
+ *
+ * @param mixed $orig Original version of object
+ *
+ * @return boolean success flag.
+ */
+
+ function update($orig=null)
+ {
+ $result = parent::update($orig);
+
+ self::blow('subscription:by-subscriber:'.$this->subscriber);
+ self::blow('subscription:by-subscribed:'.$this->subscribed);
+
+ return $result;
}
}