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



commit 10711091c65bd2ced218eeb89b0686bc3be3c549
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 990eb3eca..b5bcdb4c1 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]