[tracker] libtracker-data: Don't schedule all deletes only because of FTS



commit a33816f29af384708f1bdf4478f95017dd756796
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Jul 19 13:35:27 2015 +0200

    libtracker-data: Don't schedule all deletes only because of FTS
    
    The limitations in FTS why it made sense to perform the scheduled
    delete no longer apply since FTS4 and external content tables
    (or rather, we don't need the previous values explicitly).
    
    The scheduled delete is a lot more (if not extremely) thorough,
    decomposing the properties and items to be deleted into individual
    queries. This has quite an effect on deletes involving a large
    number of elements, a query like
    
    delete { ?u a rdfs:Resource; }
    where { ?u nie:url ?url .
               FILTER (fn:starts-with (?url, ".../linux/"))}
    
    on a linux git checkout indexed through tracker-miner-fs used
    to involve 7M sqlite queries, with this fast path it's down to
    1.6M (and infinitely less sqlite3_stmt cache misses). In result
    the timing is improved substantially, time(1) from that query
    on the "tracker sparql" command went from:
    
    real        2m33.377s
    user        0m0.021s
    sys 0m0.008s
    
    Down to:
    
    real        1m23.625s
    user        0m0.021s
    sys 0m0.009s

 src/libtracker-data/tracker-data-update.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 694cf67..a83036b 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -2068,9 +2068,11 @@ cache_delete_resource_type_full (TrackerClass *class,
        iface = tracker_db_manager_get_db_interface ();
 
        if (!single_type) {
-               if (!HAVE_TRACKER_FTS &&
-                   strcmp (tracker_class_get_uri (class), TRACKER_PREFIX_RDFS "Resource") == 0 &&
+               if (strcmp (tracker_class_get_uri (class), TRACKER_PREFIX_RDFS "Resource") == 0 &&
                    g_hash_table_size (resource_buffer->tables) == 0) {
+#if HAVE_TRACKER_FTS
+                       tracker_db_interface_sqlite_fts_delete_id (iface, resource_buffer->id);
+#endif
                        /* skip subclass query when deleting whole resource
                           to improve performance */
 
@@ -2134,9 +2136,8 @@ cache_delete_resource_type_full (TrackerClass *class,
                }
        }
 
-       /* bypass buffer if possible
-          we need old property values with FTS */
-       direct_delete = (!HAVE_TRACKER_FTS && g_hash_table_size (resource_buffer->tables) == 0);
+       /* bypass buffer if possible */
+       direct_delete = g_hash_table_size (resource_buffer->tables) == 0;
 
        /* delete all property values */
 


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