aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-folder-search.c
diff options
context:
space:
mode:
Diffstat (limited to 'camel/camel-folder-search.c')
-rw-r--r--camel/camel-folder-search.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c
index 4c5bd070d6..44eb03faad 100644
--- a/camel/camel-folder-search.c
+++ b/camel/camel-folder-search.c
@@ -256,6 +256,7 @@ camel_folder_search_execute_expression(CamelFolderSearch *search, const char *ex
ESExpResult *r;
GPtrArray *matches = g_ptr_array_new ();
int i;
+ GHashTable *results;
/* only re-parse if the search has changed */
if (search->last_search == NULL
@@ -271,9 +272,25 @@ camel_folder_search_execute_expression(CamelFolderSearch *search, const char *ex
if (r
&& r->type == ESEXP_RES_ARRAY_PTR) {
d(printf("got result ...\n"));
- for (i=0;i<r->value.ptrarray->len;i++) {
- d(printf("adding match: %s\n", (char *)g_ptr_array_index(r->value.ptrarray, i)));
- g_ptr_array_add(matches, g_strdup(g_ptr_array_index(r->value.ptrarray, i)));
+ if (search->summary) {
+ /* reorder result in summary order */
+ results = g_hash_table_new(g_str_hash, g_str_equal);
+ for (i=0;i<r->value.ptrarray->len;i++) {
+ d(printf("adding match: %s\n", (char *)g_ptr_array_index(r->value.ptrarray, i)));
+ g_hash_table_insert(results, g_ptr_array_index(r->value.ptrarray, i), (void *)1);
+ }
+ for (i=0;i<search->summary->len;i++) {
+ CamelMessageInfo *info = g_ptr_array_index(search->summary, i);
+ if (g_hash_table_lookup(results, info->uid)) {
+ g_ptr_array_add(matches, g_strdup(info->uid));
+ }
+ }
+ g_hash_table_destroy(results);
+ } else {
+ for (i=0;i<r->value.ptrarray->len;i++) {
+ d(printf("adding match: %s\n", (char *)g_ptr_array_index(r->value.ptrarray, i)));
+ g_ptr_array_add(matches, g_strdup(g_ptr_array_index(r->value.ptrarray, i)));
+ }
}
e_sexp_result_free(r);
} else {