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



commit b0727bd8226cd388f4deff43587941bb2240065e
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 1ef5e92b2..0f01c2c7c 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]