[evolution-data-server/openismus-work] Bug 699597 - Autocomplete using GAL is slow



commit b209d91e7e4e715bd3c7114989bda373f0b0e928
Author: David Woodhouse <David Woodhouse intel com>
Date:   Mon May 20 14:14:24 2013 +0100

    Bug 699597 - Autocomplete using GAL is slow
    
    With large addressbooks, using an inner join which produces hundreds of
    thousands of duplicate results, and then filtering them back down to what
    we really wanted with 'DISTINCT' is really inefficient. I can't even tell
    you *how* inefficient, because it didn't complete a single query in the
    hours that I left it running. Switch it to a more sensible outer join and
    it completes in a second or so on my 216000-entry address book.

 .../libedata-book/e-book-backend-sqlitedb.c        |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)
---
diff --git a/addressbook/libedata-book/e-book-backend-sqlitedb.c 
b/addressbook/libedata-book/e-book-backend-sqlitedb.c
index da9911c..7ade413 100644
--- a/addressbook/libedata-book/e-book-backend-sqlitedb.c
+++ b/addressbook/libedata-book/e-book-backend-sqlitedb.c
@@ -3616,7 +3616,7 @@ convert_match_exp (struct _ESExp *f,
                                if (is_list) {
                                        gchar *tmp;
 
-                                       tmp = sqlite3_mprintf ("summary.uid = multi.uid AND multi.field = 
%Q", field);
+                                       tmp = sqlite3_mprintf ("multi.field = %Q", field);
                                        str = g_strdup_printf (
                                                "(%s AND (%s %s %s%s))",
                                                tmp, field_name, oper, query_term,
@@ -3833,7 +3833,8 @@ book_backend_sqlitedb_search_query (EBookBackendSqliteDB *ebsdb,
                                gchar *list_table = g_strconcat (folderid, "_lists", NULL);
 
                                stmt = sqlite3_mprintf (
-                                       "%s FROM %Q AS summary, %Q AS multi WHERE %s",
+                                       "%s FROM %Q AS summary "
+                                       "LEFT OUTER JOIN %Q AS multi ON summary.uid = multi.uid WHERE %s",
                                        select_portion, folderid, list_table, sql);
                                g_free (list_table);
                        } else {
@@ -3866,8 +3867,8 @@ book_backend_sqlitedb_search_query (EBookBackendSqliteDB *ebsdb,
                                gchar *list_table = g_strconcat (folderid, "_lists", NULL);
 
                                stmt = sqlite3_mprintf (
-                                       "SELECT DISTINCT summary.uid, vcard, bdata "
-                                       "FROM %Q AS summary, %Q AS multi WHERE %s",
+                                       "SELECT DISTINCT summary.uid, vcard, bdata FROM %Q AS summary "
+                                       "LEFT OUTER JOIN %Q AS multi ON summary.uid = multi.uid WHERE %s",
                                        folderid, list_table, sql);
                                g_free (list_table);
                        } else {
@@ -4126,7 +4127,8 @@ e_book_backend_sqlitedb_search_uids (EBookBackendSqliteDB *ebsdb,
                                gchar *list_table = g_strconcat (folderid, "_lists", NULL);
 
                                stmt = sqlite3_mprintf (
-                                       "SELECT DISTINCT summary.uid FROM %Q AS summary, %Q AS multi WHERE 
%s",
+                                       "SELECT DISTINCT summary.uid FROM %Q AS summary "
+                                       "LEFT OUTER JOIN %Q AS multi ON summary.uid = multi.uid WHERE %s",
                                        folderid, list_table, sql_query);
 
                                g_free (list_table);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]