]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Caching for conversation root lookup, some logic fixes in threaded view
authorBrion Vibber <brion@pobox.com>
Fri, 18 Mar 2011 00:36:53 +0000 (17:36 -0700)
committerBrion Vibber <brion@pobox.com>
Fri, 18 Mar 2011 00:36:53 +0000 (17:36 -0700)
classes/Fave.php
classes/Notice.php
lib/threadednoticelist.php

index e4e00d27ca386712a7f32a861085fd9ebf07c843..efbceee6a83ae8de1b69d8e49ff2095cacf97419 100644 (file)
@@ -44,7 +44,7 @@ class Fave extends Memcached_DataObject
                 common_log_db_error($fave, 'INSERT', __FILE__);
                 return false;
             }
-            self::blow('fave:by_notice', $fave->notice_id);
+            self::blow('fave:by_notice:%d', $fave->notice_id);
 
             Event::handle('EndFavorNotice', array($profile, $notice));
         }
@@ -62,7 +62,7 @@ class Fave extends Memcached_DataObject
         if (Event::handle('StartDisfavorNotice', array($profile, $notice, &$result))) {
 
             $result = parent::delete();
-            self::blow('fave:by_notice', $this->notice_id);
+            self::blow('fave:by_notice:%d', $this->notice_id);
 
             if ($result) {
                 Event::handle('EndDisfavorNotice', array($profile, $notice));
@@ -219,7 +219,7 @@ class Fave extends Memcached_DataObject
     static function byNotice($noticeId)
     {
         $c = self::memcache();
-        $key = Cache::key('fave:by_notice', $noticeId);
+        $key = Cache::key('fave:by_notice:' . $noticeId);
 
         $wrapper = $c->get($key);
         if (!$wrapper) {
@@ -228,7 +228,7 @@ class Fave extends Memcached_DataObject
             $fave->notice_id = $noticeId;
             $fave->find();
 
-            $profiles = array();
+            $list = array();
             while ($fave->fetch()) {
                 $list[] = clone($fave);
             }
index 560d45a64043cc545d798f56afde0fea2e49b60f..a158a4930df6f4eb4aa3c1d1401f3933f1845d3b 100644 (file)
@@ -498,6 +498,11 @@ class Notice extends Memcached_DataObject
         }
 
         self::blow('fave:by_notice', $this->id);
+
+        if ($this->conversation) {
+            // In case we're the first, will need to calc a new root.
+            self::blow('notice:conversation_root:%d', $this->conversation);
+        }
     }
 
     /** save all urls in the notice to the db
@@ -776,6 +781,35 @@ class Notice extends Memcached_DataObject
         return false;
     }
 
+    /**
+     * Grab the earliest notice from this conversation.
+     *
+     * @return Notice or null
+     */
+    function conversationRoot()
+    {
+        if (!empty($this->conversation)) {
+            $c = self::memcache();
+
+            $key = Cache::key('notice:conversation_root:' . $this->conversation);
+            $notice = $c->get($key);
+            if ($notice) {
+                return $notice;
+            }
+
+            $notice = new Notice();
+            $notice->conversation = $this->conversation;
+            $notice->orderBy('CREATED');
+            $notice->limit(1);
+            $notice->find(true);
+
+            if ($notice->N) {
+                $c->set($key, $notice);
+                return $notice;
+            }
+        }
+        return null;
+    }
     /**
      * Pull up a full list of local recipients who will be getting
      * this notice in their inbox. Results will be cached, so don't
index c6fe77ddb40a9b8ed63e1c2d775620a24f7ae2b5..e8f0d0c8d1d2001fee9052bb7f9e28e499c6203a 100644 (file)
@@ -91,17 +91,13 @@ class ThreadedNoticeList extends NoticeList
             $conversations[$convo] = true;
 
             // Get the convo's root notice
-            // @fixme stream goes in wrong direction, this needs sane caching
-            //$notice = Notice::conversationStream($convo, 0, 1);
-            //$notice->fetch();
-            $root = new Notice();
-            $root->conversation = $notice->conversation;
-            $root->orderBy('CREATED');
-            $root->limit(1);
-            $root->find(true);
+            $root = $notice->conversationRoot();
+            if ($root) {
+                $notice = $root;
+            }
 
             try {
-                $item = $this->newListItem($root);
+                $item = $this->newListItem($notice);
                 $item->show();
             } catch (Exception $e) {
                 // we log exceptions and continue