[geary/wip/713150-conversations: 4/9] Fix find_boundaries_async in search, imap-engine Folder impl's



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]