[tracker/wip/carlosg/sparql1.1: 126/145] libtracker-data: Add FTS5 union view



commit d51901744b6cfc1c5440bb2bd0dffea7842870e0
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Jul 10 00:08:04 2019 +0200

    libtracker-data: Add FTS5 union view
    
    This works similarly to other union views, except we need to export
    the relevant function right away from the view query, since we can't
    do that on the outside.
    
    There's still the question about what to do with fts:snippet though,
    since that takes additional arguments.

 src/libtracker-data/tracker-data-manager.c | 40 +++++++++++++++++++++++++++---
 src/libtracker-fts/tracker-fts.c           | 10 +++++---
 2 files changed, 43 insertions(+), 7 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index c49bec1bd..11c785198 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -3901,7 +3901,7 @@ tracker_data_manager_update_union_views (TrackerDataManager  *manager,
                                                              "DROP VIEW IF EXISTS temp.\"unionGraph_%s\"",
                                                              tracker_class_get_name (classes[i]));
                if (!stmt)
-                       break;
+                       goto error;
 
                tracker_db_statement_execute (stmt, NULL);
                g_object_unref (stmt);
@@ -3925,7 +3925,7 @@ tracker_data_manager_update_union_views (TrackerDataManager  *manager,
                                                              "%s", str->str);
                g_string_free (str, TRUE);
                if (!stmt)
-                       break;
+                       goto error;
 
                tracker_db_statement_execute (stmt, &inner_error);
                g_object_unref (stmt);
@@ -3943,7 +3943,7 @@ tracker_data_manager_update_union_views (TrackerDataManager  *manager,
                                                              tracker_class_get_name (service),
                                                              tracker_property_get_name (properties[i]));
                if (!stmt)
-                       break;
+                       goto error;
 
                tracker_db_statement_execute (stmt, NULL);
                g_object_unref (stmt);
@@ -3971,12 +3971,44 @@ tracker_data_manager_update_union_views (TrackerDataManager  *manager,
                g_string_free (str, TRUE);
 
                if (!stmt)
-                       break;
+                       goto error;
 
                tracker_db_statement_execute (stmt, &inner_error);
                g_object_unref (stmt);
        }
 
+       /* Update FTS5 union view */
+       stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, 
&inner_error,
+                                                     "DROP VIEW IF EXISTS temp.\"unionGraph_fts5\"");
+       if (!stmt)
+               goto error;
+
+       tracker_db_statement_execute (stmt, NULL);
+       g_object_unref (stmt);
+
+       str = g_string_new (NULL);
+       g_string_append (str,
+                        "CREATE VIEW temp.\"unionGraph_fts5\" AS "
+                        "SELECT 0 AS graph, ROWID, *, fts5, rank, tracker_offsets(fts5) AS offsets FROM 
\"main\".\"fts5\" ");
+
+       g_hash_table_iter_init (&iter, graphs);
+       while (g_hash_table_iter_next (&iter, &graph_name, &graph_id)) {
+               g_string_append_printf (str, "UNION ALL SELECT %d AS graph, ROWID, *, fts5, rank, 
tracker_offsets(fts5) AS offsets FROM \"%s\".\"fts5\" ",
+                                       GPOINTER_TO_INT (graph_id),
+                                       (gchar *) graph_name);
+       }
+
+       stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, 
&inner_error,
+                                                     "%s", str->str);
+       g_string_free (str, TRUE);
+
+       if (!stmt)
+               goto error;
+
+       tracker_db_statement_execute (stmt, &inner_error);
+       g_object_unref (stmt);
+
+error:
        if (inner_error) {
                g_propagate_error (error, inner_error);
                return FALSE;
diff --git a/src/libtracker-fts/tracker-fts.c b/src/libtracker-fts/tracker-fts.c
index 49ba4d362..19db53987 100644
--- a/src/libtracker-fts/tracker-fts.c
+++ b/src/libtracker-fts/tracker-fts.c
@@ -164,9 +164,13 @@ tracker_fts_delete_table (sqlite3 *db,
        gchar *query;
        int rc;
 
-       query = g_strdup_printf ("DROP VIEW fts_view");
-       rc = sqlite3_exec (db, query, NULL, NULL, NULL);
-       g_free (query);
+       rc = sqlite3_exec (db, "DROP VIEW IF EXISTS unionGraph_fts5", NULL, NULL, NULL);
+
+       if (rc == SQLITE_OK) {
+               query = g_strdup_printf ("DROP VIEW fts_view");
+               rc = sqlite3_exec (db, query, NULL, NULL, NULL);
+               g_free (query);
+       }
 
        if (rc == SQLITE_OK) {
                query = g_strdup_printf ("DROP TABLE %s", table_name);


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