X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fnoticestream.php;h=025138be4ded80db592be3f9e46ed0138b92d9a8;hb=ced00cf0bdd4f119e2126e2eba18a3df7ee45c11;hp=a96eb53da627ce89f84fbef85b9a81324af1495e;hpb=efb6a7b441dc14227a30b83454e8b47e79274997;p=quix0rs-gnu-social.git diff --git a/lib/noticestream.php b/lib/noticestream.php index a96eb53da6..025138be4d 100644 --- a/lib/noticestream.php +++ b/lib/noticestream.php @@ -4,7 +4,7 @@ * Copyright (C) 2011, StatusNet, Inc. * * A stream of notices - * + * * PHP version 5 * * This program is free software: you can redistribute it and/or modify @@ -44,21 +44,11 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ - -class NoticeStream +abstract class NoticeStream { - public $generator = null; - public $args = null; - public $cachekey = null; - - function __construct($generator, $args, $cachekey) - { - $this->generator = $generator; - $this->args = $args; - $this->cachekey = $cachekey; - } + abstract function getNoticeIds($offset, $limit, $since_id, $max_id); - function getNotices($offset=0, $limit=20, $sinceId=0, $maxId=0) + function getNotices($offset, $limit, $sinceId, $maxId) { $ids = $this->getNoticeIds($offset, $limit, $sinceId, $maxId); @@ -67,75 +57,6 @@ class NoticeStream return $notices; } - function getNoticeIds($offset=0, $limit=20, $sinceId=0, $maxId=0) - { - $cache = Cache::instance(); - - // We cache NOTICE_CACHE_WINDOW elements at the tip of the stream. - // If the cache won't be hit, just generate directly. - - if (empty($cache) || - $sinceId != 0 || $maxId != 0 || - is_null($limit) || - ($offset + $limit) > NOTICE_CACHE_WINDOW) { - return $this->generate($offset, $limit, $sinceId, $maxId); - } - - // Check the cache to see if we have the stream. - - $idkey = Cache::key($this->cachekey); - - $idstr = $cache->get($idkey); - - if ($idstr !== false) { - // Cache hit! Woohoo! - $window = explode(',', $idstr); - $ids = array_slice($window, $offset, $limit); - return $ids; - } - - // Check the cache to see if we have a "last-known-good" version. - // The actual cache gets blown away when new notices are added, but - // the "last" value holds a lot of info. We might need to only generate - // a few at the "tip", which can bound our queries and save lots - // of time. - - $laststr = $cache->get($idkey.';last'); - - if ($laststr !== false) { - $window = explode(',', $laststr); - $last_id = $window[0]; - $new_ids = $this->generate(0, NOTICE_CACHE_WINDOW, $last_id, 0); - - $new_window = array_merge($new_ids, $window); - - $new_windowstr = implode(',', $new_window); - - $result = $cache->set($idkey, $new_windowstr); - $result = $cache->set($idkey . ';last', $new_windowstr); - - $ids = array_slice($new_window, $offset, $limit); - - return $ids; - } - - // No cache hits :( Generate directly and stick the results - // into the cache. Note we generate the full cache window. - - $window = $this->generate(0, NOTICE_CACHE_WINDOW, 0, 0); - - $windowstr = implode(',', $window); - - $result = $cache->set($idkey, $windowstr); - $result = $cache->set($idkey . ';last', $windowstr); - - // Return just the slice that was requested - - $ids = array_slice($window, $offset, $limit); - - return $ids; - } - static function getStreamByIds($ids) { $cache = Cache::instance(); @@ -176,14 +97,4 @@ class NoticeStream return new ArrayWrapper($wrapped); } } - - function generate($offset, $limit, $sinceId, $maxId) - { - $args = array_merge($this->args, array($offset, - $limit, - $sinceId, - $maxId)); - - return call_user_func_array($this->generator, $args); - } }