X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fnoticestream.php;h=0f53daf83f407e15a878d747d1268b972eb451c9;hb=5ebe01ba365886bf19edbb1dc5f5591c2135a8be;hp=2b6e10f7b92c59d8581eddc4395a552833a3d99f;hpb=0b35ce7c370bbb6cb9d55bb2a4256f58cb1158f1;p=quix0rs-gnu-social.git diff --git a/lib/noticestream.php b/lib/noticestream.php index 2b6e10f7b9..0f53daf83f 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,146 +44,29 @@ 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; + // Will only get notices with the 'post' activityverb by default. + protected $selectVerbs = 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)); } - 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); - $notices = $this->getStreamByIds($ids); + $notices = self::getStreamByIds($ids); 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; - } - - function getStreamByIds($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); } }