X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fnoticestream.php;h=3b597fa08cf03899ca42406084fad93dc5c99d8b;hb=5beea658a463609933ea11f6c0f0fd1773daddc6;hp=d1ed203a6726cb9925c692f785fb034a3e94b6e7;hpb=eb1faa78658669bff57288ff48a4af4aa1a89c1b;p=quix0rs-gnu-social.git diff --git a/lib/noticestream.php b/lib/noticestream.php index d1ed203a67..3b597fa08c 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,23 +44,20 @@ 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 { - const CACHE_WINDOW = 200; - - public $generator = null; - public $args = null; - public $cachekey = null; + protected $selectVerbs = array(); + protected $unselectVerbs = array(); - function __construct($generator, $args, $cachekey) + public function __construct() { - $this->generator = $generator; - $this->args = $args; - $this->cachekey = $cachekey; + $this->selectVerbs = array(ActivityVerb::POST, ActivityUtils::resolveUri(ActivityVerb::POST, true)); + $this->unselectVerbs = array(ActivityVerb::DELETE); } - function getNotices($offset=0, $limit=20, $sinceId=0, $maxId=0) + abstract function getNoticeIds($offset, $limit, $since_id, $max_id); + + function getNotices($offset, $limit, $sinceId = null, $maxId = null) { $ids = $this->getNoticeIds($offset, $limit, $sinceId, $maxId); @@ -69,123 +66,8 @@ class NoticeStream return $notices; } - function getNoticeIds($offset=0, $limit=20, $sinceId=0, $maxId=0) - { - $cache = Cache::instance(); - - // We cache self::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) > self::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, self::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, self::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(); - - if (!empty($cache)) { - $notices = array(); - foreach ($ids as $id) { - $n = Notice::staticGet('id', $id); - if (!empty($n)) { - $notices[] = $n; - } - } - return new ArrayWrapper($notices); - } else { - $notice = new Notice(); - if (empty($ids)) { - //if no IDs requested, just return the notice object - return $notice; - } - $notice->whereAdd('id in (' . implode(', ', $ids) . ')'); - - $notice->find(); - - $temp = array(); - - while ($notice->fetch()) { - $temp[$notice->id] = clone($notice); - } - - $wrapped = array(); - - foreach ($ids as $id) { - if (array_key_exists($id, $temp)) { - $wrapped[] = $temp[$id]; - } - } - - 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); + return Notice::multiGet('id', $ids); } }