[tracker/wip/carlosg/sparql1.1: 179/201] libtracker-data: Ensure ordering of FTS columns



commit 0ca4f8fe869a9c2bbb72d4b58249d0b36fa7372a
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Jul 28 20:16:21 2019 +0200

    libtracker-data: Ensure ordering of FTS columns
    
    We need it stable for fts:offsets(), and it was far from it due to
    the usage of GHashTableIter. Sort the table names and the columns
    on each table so that the ordering is stable and columns can be
    matched.

 src/libtracker-data/tracker-data-manager.c |  5 ++++-
 src/libtracker-fts/tracker-fts.c           | 24 ++++++++++++++++--------
 2 files changed, 20 insertions(+), 9 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index 9b918eb90..2c62c5cb6 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -3846,7 +3846,10 @@ ontology_get_fts_properties (TrackerDataManager  *manager,
                        list = g_list_prepend (NULL, (gpointer) name);
                        g_hash_table_insert (*fts_properties, (gpointer) table_name, list);
                } else {
-                       list = g_list_append (list, (gpointer) name);
+                       g_hash_table_steal (*fts_properties, (gpointer) table_name);
+                       list = g_list_insert_sorted (list, (gpointer) name,
+                                                    (GCompareFunc) strcmp);
+                       g_hash_table_insert (*fts_properties, (gpointer) table_name, list);
                }
        }
 }
diff --git a/src/libtracker-fts/tracker-fts.c b/src/libtracker-fts/tracker-fts.c
index 9d2d40f95..4abc14121 100644
--- a/src/libtracker-fts/tracker-fts.c
+++ b/src/libtracker-fts/tracker-fts.c
@@ -40,17 +40,20 @@ get_fts_properties (GHashTable  *tables)
 {
        GList *table_columns, *columns;
        gchar **property_names;
-       GHashTableIter iter;
+       GList *keys, *l;
 
        columns = NULL;
-       g_hash_table_iter_init (&iter, tables);
+       keys = g_hash_table_get_keys (tables);
+       keys = g_list_sort (keys, (GCompareFunc) strcmp);
 
-       while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &table_columns)) {
+       for (l = keys; l; l = l->next) {
+               table_columns = g_hash_table_lookup (tables, l->data);
                columns = g_list_concat (columns, g_list_copy (table_columns));
        }
 
        property_names = tracker_glist_to_string_list (columns);
        g_list_free (columns);
+       g_list_free (keys);
 
        return property_names;
 }
@@ -86,16 +89,14 @@ tracker_fts_create_table (sqlite3     *db,
                           GHashTable  *grouped_columns)
 {
        GString *str, *from, *fts;
-       GHashTableIter iter;
        gchar *index_table;
-       GList *columns;
+       GList *columns, *keys, *l;
        gint rc;
 
        if (g_hash_table_size (tables) == 0)
                return TRUE;
 
        /* Create view on tables/columns marked as FTS-indexed */
-       g_hash_table_iter_init (&iter, tables);
        str = g_string_new ("CREATE VIEW ");
        g_string_append_printf (str, "\"%s\".fts_view AS SELECT \"rdfs:Resource\".ID as rowid ",
                                database);
@@ -105,8 +106,13 @@ tracker_fts_create_table (sqlite3     *db,
        g_string_append_printf (fts, "\"%s\".%s USING fts5(content=\"fts_view\", ",
                                database, table_name);
 
-       while (g_hash_table_iter_next (&iter, (gpointer *) &index_table,
-                                      (gpointer *) &columns)) {
+       keys = g_hash_table_get_keys (tables);
+       keys = g_list_sort (keys, (GCompareFunc) strcmp);
+
+       for (l = keys; l; l = l->next) {
+               index_table = l->data;
+               columns = g_hash_table_lookup (tables, l->data);
+
                while (columns) {
                        if (grouped_columns &&
                            g_hash_table_lookup (grouped_columns, columns->data)) {
@@ -132,6 +138,8 @@ tracker_fts_create_table (sqlite3     *db,
                                        database, index_table, index_table);
        }
 
+       g_list_free (keys);
+
        g_string_append (str, from->str);
        g_string_free (from, TRUE);
 


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