From 2baeac116abef9d5bcb748c687577d16dce868a0 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Thu, 16 Jan 2014 08:17:08 -0500
Subject: [PATCH] Fix sorting and paging in cross-folder searches
---
program/steps/mail/list.inc | 16 ++++++++
program/steps/mail/search.inc | 42 ++++++---------------
program/lib/Roundcube/rcube_imap.php | 4 +-
3 files changed, 30 insertions(+), 32 deletions(-)
diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php
index 0cf34b2..e265946 100644
--- a/program/lib/Roundcube/rcube_imap.php
+++ b/program/lib/Roundcube/rcube_imap.php
@@ -952,7 +952,7 @@
$search_set = $this->search_set;
$this->sort_field = null;
- $this->page_size = 100; // limit to 100 messages per folder
+ $this->page_size = 1000; // fetch up to 1000 matching messages per folder
$a_msg_headers = array();
foreach ($search_set->sets as $resultset) {
@@ -970,7 +970,7 @@
// sort headers
if (!$this->threading && !empty($a_msg_headers)) {
- $a_msg_headers = $this->conn->sortHeaders($a_msg_headers, $this->sort_field, $this->sort_order);
+ $a_msg_headers = $this->conn->sortHeaders($a_msg_headers, $sort_field, $this->sort_order);
}
// only return the requested part of the set
diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc
index 277564c..4b2a955 100644
--- a/program/steps/mail/list.inc
+++ b/program/steps/mail/list.inc
@@ -75,6 +75,22 @@
&& $_SESSION['search_request'] == $_REQUEST['_search']
) {
$_SESSION['search'] = $RCMAIL->storage->get_search_set();
+
+ // multi-folder search
+ if ($_SESSION['search'][1]->multi) {
+ if (empty($cols))
+ $cols = $_SESSION['list_attrib']['columns'] ? $_SESSION['list_attrib']['columns'] : (array)$CONFIG['list_cols'];
+ if (!in_array('folder', $cols))
+ $cols[] = 'folder'; // Add 'folder' column to list
+
+ // make message UIDs unique by appending the folder name
+ foreach ($a_headers as $i => $header) {
+ $header->uid .= '-'.$header->folder;
+ $header->flags['skip_mbox_check'] = true;
+ if ($header->parent_uid)
+ $header->parent_uid .= '-'.$header->folder;
+ }
+ }
}
// remove old search data
else if (empty($_REQUEST['_search']) && isset($_SESSION['search'])) {
diff --git a/program/steps/mail/search.inc b/program/steps/mail/search.inc
index 67fee75..5ce9fe6 100644
--- a/program/steps/mail/search.inc
+++ b/program/steps/mail/search.inc
@@ -111,7 +111,7 @@
// execute IMAP search
if ($search_str) {
- $RCMAIL->storage->search($mbox, $search_str, $imap_charset, $sort_column);
+ $RCMAIL->storage->search($mboxes, $search_str, $imap_charset, $sort_column);
}
// save search results in session
@@ -125,43 +125,25 @@
}
$_SESSION['search_request'] = $search_request;
-
// Get the headers
$result_h = $RCMAIL->storage->list_messages($mbox, 1, $sort_column, rcmail_sort_order());
$count = $RCMAIL->storage->count($mbox, $RCMAIL->storage->get_threading() ? 'THREADS' : 'ALL');
// Add 'folder' column to list
if ($_SESSION['search'][1]->multi) {
- $a_show_cols = $_SESSION['list_attrib']['columns'] ? $_SESSION['list_attrib']['columns'] : (array)$CONFIG['list_cols'];
- if (!in_array('folder', $a_show_cols))
- $a_show_cols[] = 'folder';
+ $a_show_cols = $_SESSION['list_attrib']['columns'] ? $_SESSION['list_attrib']['columns'] : (array)$CONFIG['list_cols'];
+ if (!in_array('folder', $a_show_cols))
+ $a_show_cols[] = 'folder';
- // make message UIDs unique by appending the folder name
- foreach ($result_h as $i => $header) {
- $header->uid .= '-'.$header->folder;
- $header->flags['skip_mbox_check'] = true;
- if ($header->parent_uid)
- $header->parent_uid .= '-'.$header->folder;
- }
+ // make message UIDs unique by appending the folder name
+ foreach ($result_h as $i => $header) {
+ $header->uid .= '-'.$header->folder;
+ $header->flags['skip_mbox_check'] = true;
+ if ($header->parent_uid)
+ $header->parent_uid .= '-'.$header->folder;
+ }
- $OUTPUT->command('select_folder', '');
-}
-
-// Add 'folder' column to list
-if ($_SESSION['search'][1]->multi) {
- $a_show_cols = $_SESSION['list_attrib']['columns'] ? $_SESSION['list_attrib']['columns'] : (array)$CONFIG['list_cols'];
- if (!in_array('folder', $a_show_cols))
- $a_show_cols[] = 'folder';
-
- // make message UIDs unique by appending the folder name
- foreach ($result_h as $i => $header) {
- $header->uid .= '-'.$header->folder;
- $header->flags['skip_mbox_check'] = true;
- if ($header->parent_uid)
- $header->parent_uid .= '-'.$header->folder;
- }
-
- $OUTPUT->command('select_folder', '');
+ $OUTPUT->command('select_folder', '');
}
// Make sure we got the headers
--
Gitblit v1.9.1