X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fnoticestream.php;h=01c5ee4a72e56e970aec2db641f26daf63b3300d;hb=42545c662560e15e29cf620f6ed4f5e2c75b5647;hp=2b6e10f7b92c59d8581eddc4395a552833a3d99f;hpb=0b35ce7c370bbb6cb9d55bb2a4256f58cb1158f1;p=quix0rs-gnu-social.git diff --git a/lib/noticestream.php b/lib/noticestream.php index 2b6e10f7b9..01c5ee4a72 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,34 @@ 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; - } - - function getNotices($offset=0, $limit=20, $sinceId=0, $maxId=0) - { - $ids = $this->getNoticeIds($offset, $limit, $sinceId, $maxId); - - $notices = $this->getStreamByIds($ids); - - return $notices; - } + protected $selectVerbs = null; // must be set to array + protected $unselectVerbs = null; // must be set to array - function getNoticeIds($offset=0, $limit=20, $sinceId=0, $maxId=0) + public function __construct() { - $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); + if ($this->selectVerbs === null) { + $this->selectVerbs = array(ActivityVerb::POST, ActivityUtils::resolveUri(ActivityVerb::POST, true)); } - - // 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; + if ($this->unselectVerbs === null) { + $this->unselectVerbs = array(ActivityVerb::DELETE); } - - // 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) - { - $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); - } + abstract function getNoticeIds($offset, $limit, $since_id, $max_id); - $wrapped = array(); + function getNotices($offset, $limit, $sinceId = null, $maxId = null) + { + $ids = $this->getNoticeIds($offset, $limit, $sinceId, $maxId); - foreach ($ids as $id) { - if (array_key_exists($id, $temp)) { - $wrapped[] = $temp[$id]; - } - } + $notices = self::getStreamByIds($ids); - return new ArrayWrapper($wrapped); - } + return $notices; } - function generate($offset, $limit, $sinceId, $maxId) + static function getStreamByIds($ids) { - $args = array_merge($this->args, array($offset, - $limit, - $sinceId, - $maxId)); - - return call_user_func_array($this->generator, $args); + return Notice::multiGet('id', $ids); } }