From 31aa080609f6ea8a561182eb5b3da46733bef313 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Wed, 23 Apr 2014 07:21:51 -0400
Subject: [PATCH] Further refine cross-folder searching: - Store incomplete search results in session and re-send search requests   to the server if returned before complete (this should avoid hitting request timeouts). - Display full folder path on mouseover in message list - Remove pthreads implementation stuff as this wasn't really working

---
 program/lib/Roundcube/rcube_result_multifolder.php |   52 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 51 insertions(+), 1 deletions(-)

diff --git a/program/lib/Roundcube/rcube_result_multifolder.php b/program/lib/Roundcube/rcube_result_multifolder.php
index b5473b8..e5abead 100644
--- a/program/lib/Roundcube/rcube_result_multifolder.php
+++ b/program/lib/Roundcube/rcube_result_multifolder.php
@@ -28,6 +28,7 @@
 {
     public $multi = true;
     public $sets = array();
+    public $incomplete = false;
     public $folder;
 
     protected $meta = array();
@@ -54,14 +55,18 @@
      */
     public function add($result)
     {
+        $this->sets[] = $result;
+
         if ($count = $result->count()) {
-            $this->sets[] = $result;
             $this->meta['count'] += $count;
 
             // append UIDs to global index
             $folder = $result->get_parameters('MAILBOX');
             $index = array_map(function($uid) use ($folder) { return $uid . '-' . $folder; }, $result->get());
             $this->index = array_merge($this->index, $index);
+        }
+        else if ($result->incomplete) {
+            $this->incomplete = true;
         }
     }
 
@@ -266,6 +271,22 @@
         return $params;
     }
 
+    /**
+     * Returns the stored result object for a particular folder
+     *
+     * @param string $folder  Folder name
+     * @return false|obejct rcube_result_* instance of false if none found
+     */
+    public function get_set($folder)
+    {
+        foreach ($this->sets as $set) {
+            if ($set->get_parameters('MAILBOX') == $folder) {
+                return $set;
+            }
+        }
+
+        return false;
+    }
 
     /**
      * Returns length of internal data representation
@@ -276,4 +297,33 @@
     {
         return $this->count();
     }
+
+
+    /* Serialize magic methods */
+
+    public function __sleep()
+    {
+        return array('sets','folders','sorting','order');
+    }
+
+    public function __wakeup()
+    {
+        // restore index from saved result sets
+        $this->meta = array('count' => 0);
+
+        foreach ($this->sets as $result) {
+            if ($count = $result->count()) {
+                $this->meta['count'] += $count;
+
+                // append UIDs to global index
+                $folder = $result->get_parameters('MAILBOX');
+                $index = array_map(function($uid) use ($folder) { return $uid . '-' . $folder; }, $result->get());
+                $this->index = array_merge($this->index, $index);
+            }
+            else if ($result->incomplete) {
+                $this->incomplete = true;
+            }
+        }
+    }
+
 }

--
Gitblit v1.9.1