X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fnoticestream.php;h=2b04a89ca4297c4ba905634af275f2f4ec188626;hb=73dbc5ca1b203758693f73d6423fea71ef6b6fb6;hp=2ceef17d74e5e633b76cedef53ab8076571ea7de;hpb=c1a27922ba738f71b100a520e5db6f32985a307b;p=quix0rs-gnu-social.git diff --git a/lib/noticestream.php b/lib/noticestream.php index 2ceef17d74..2b04a89ca4 100644 --- a/lib/noticestream.php +++ b/lib/noticestream.php @@ -28,11 +28,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET')) { - // This check helps protect against security problems; - // your code file can't be executed directly from the web. - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * Class for notice streams @@ -44,22 +40,23 @@ 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(ActivityVerb::POST => true, + ActivityVerb::SHARE => true); - function __construct($generator, $args, $cachekey) + public function __construct() { - $this->generator = $generator; - $this->args = $args; - $this->cachekey = $cachekey; + foreach ($this->selectVerbs as $key=>$val) { + // to avoid database inconsistency issues we select both relative and absolute verbs + $this->selectVerbs[ActivityUtils::resolveUri($key)] = $val; + $this->selectVerbs[ActivityUtils::resolveUri($key, true)] = $val; + } } - 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); @@ -68,123 +65,25 @@ class NoticeStream return $notices; } - function getNoticeIds($offset=0, $limit=20, $sinceId=0, $maxId=0) + static function getStreamByIds($ids) { - $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; + return Notice::multiGet('id', $ids); } - static function getStreamByIds($ids) + static function filterVerbs(Notice $notice, array $selectVerbs) { - $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); + $filter = array_keys(array_filter($selectVerbs)); + if (!empty($filter)) { + // include verbs in selectVerbs with values that equate to true + $notice->whereAddIn('verb', $filter, $notice->columnType('verb')); } - } - function generate($offset, $limit, $sinceId, $maxId) - { - $args = array_merge($this->args, array($offset, - $limit, - $sinceId, - $maxId)); + $filter = array_keys(array_filter($selectVerbs, function ($v) { return !$v; })); + if (!empty($filter)) { + // exclude verbs in selectVerbs with values that equate to false + $notice->whereAddIn('!verb', $filter, $notice->columnType('verb')); + } - return call_user_func_array($this->generator, $args); + unset($filter); } }