[geary/wip/713150-conversations: 4/9] Fix find_boundaries_async in search, imap-engine Folder impl's
- From: Jim Nelson <jnelson src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/713150-conversations: 4/9] Fix find_boundaries_async in search, imap-engine Folder impl's
- Date: Tue, 3 Mar 2015 01:28:46 +0000 (UTC)
commit 70bc00c623eb4e4e85254afe3b05f2795f239338
Author: Jim Nelson <jim yorba org>
Date: Fri Feb 27 15:28:02 2015 -0800
Fix find_boundaries_async in search, imap-engine Folder impl's
src/engine/api/geary-search-folder.vala | 34 ++++++++++++++----
.../imap-engine/imap-engine-minimal-folder.vala | 39 +++++++++++++-------
2 files changed, 53 insertions(+), 20 deletions(-)
---
diff --git a/src/engine/api/geary-search-folder.vala b/src/engine/api/geary-search-folder.vala
index 92363ae..0570419 100644
--- a/src/engine/api/geary-search-folder.vala
+++ b/src/engine/api/geary-search-folder.vala
@@ -105,16 +105,36 @@ public class Geary.SearchFolder : Geary.AbstractLocalFolder, Geary.FolderSupport
low = null;
high = null;
+ if (ids.size == 0)
+ return;
+
// This shouldn't require a result_mutex lock since there's no yield.
- Gee.TreeSet<ImapDB.SearchEmailIdentifier> in_folder = Geary.traverse<Geary.EmailIdentifier>(ids)
- .cast_object<ImapDB.SearchEmailIdentifier>()
- .filter(id => id in search_results)
- .to_tree_set();
-
- if (in_folder.size > 0) {
- low = in_folder.first();
- high = in_folder.last();
+
+ // These must be ImapDB.EmailIdentifiers (which may also be SearchEmailIdentifiers) to
+ // xlat them into SearchEmailIdentifiers
+ Gee.HashSet<ImapDB.EmailIdentifier> db_ids = Geary.traverse<Geary.EmailIdentifier>(ids)
+ .cast_object<ImapDB.EmailIdentifier>()
+ .to_hash_set();
+ if (db_ids.size == 0)
+ return;
+
+ // Translate all ImapDB.EmailIdentifiers to the SearchEmailIdentifiers in the search results
+ // ... must do this in order to get the SearchEmailIdentifier's ordering, which is different
+ // than other ImapDB.EmailIdentifiers
+ //
+ // TODO: A dictionary of message_id => SearchEmailIdentifier would be useful here
+ Gee.TreeSet<ImapDB.SearchEmailIdentifier> in_folder = new
Gee.TreeSet<ImapDB.SearchEmailIdentifier>();
+ foreach (ImapDB.EmailIdentifier db_id in db_ids) {
+ foreach (ImapDB.SearchEmailIdentifier search_id in search_results) {
+ if (search_id.message_id == db_id.message_id)
+ in_folder.add(search_id);
+ }
}
+ if (in_folder.size == 0)
+ return;
+
+ low = in_folder.first();
+ high = in_folder.last();
}
private async void append_new_email_async(Geary.SearchQuery query, Geary.Folder folder,
diff --git a/src/engine/imap-engine/imap-engine-minimal-folder.vala
b/src/engine/imap-engine/imap-engine-minimal-folder.vala
index 440578f..c8e460e 100644
--- a/src/engine/imap-engine/imap-engine-minimal-folder.vala
+++ b/src/engine/imap-engine/imap-engine-minimal-folder.vala
@@ -1026,23 +1026,36 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
low = null;
high = null;
+ // Get paths for all email identifiers
Gee.MultiMap<Geary.EmailIdentifier, Geary.FolderPath>? map
= yield account.get_containing_folders_async(ids, cancellable);
+ if (map == null || map.size == 0)
+ return;
- if (map != null) {
- Gee.ArrayList<Geary.EmailIdentifier> in_folder = new Gee.ArrayList<Geary.EmailIdentifier>();
- foreach (Geary.EmailIdentifier id in map.get_keys()) {
- if (path in map.get(id))
- in_folder.add(id);
- }
-
- if (in_folder.size > 0) {
- Gee.SortedSet<Geary.EmailIdentifier> sorted = Geary.EmailIdentifier.sort(in_folder);
-
- low = sorted.first();
- high = sorted.last();
- }
+ // only deal with email identifiers in this folder
+ Gee.ArrayList<Geary.EmailIdentifier> in_folder = new Gee.ArrayList<Geary.EmailIdentifier>();
+ foreach (Geary.EmailIdentifier id in map.get_keys()) {
+ if (path in map.get(id))
+ in_folder.add(id);
}
+
+ if (in_folder.size == 0)
+ return;
+
+ // get new Emails for these; they will have their UIDs and can be sorted properly
+ Gee.List<Email>? list = yield local_folder.list_email_by_sparse_id_async(in_folder,
+ Email.Field.NONE, ImapDB.Folder.ListFlags.NONE, cancellable);
+ if (list == null || list.size == 0)
+ return;
+
+ Gee.HashSet<EmailIdentifier> db_ids = traverse<Email>(list)
+ .map<EmailIdentifier>(email => email.id)
+ .to_hash_set();
+
+ Gee.SortedSet<Geary.EmailIdentifier> sorted = Geary.EmailIdentifier.sort(db_ids);
+
+ low = sorted.first();
+ high = sorted.last();
}
private void on_email_complete(Gee.Collection<Geary.EmailIdentifier> email_ids) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]