[tracker-miners/wip/carlosg/delete-perf: 5/5] tracker-miner-fs: Speed up delete of individual files




commit f88e926b325e4e0142470e8cbaf1f8dcb320e9f8
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Dec 21 12:37:24 2020 +0100

    tracker-miner-fs: Speed up delete of individual files
    
    Querying the graphs that contain some data for the given file may be a bit
    expensive, perhaps not that much noticeable during individual deletes, but
    gets to show with many updates batched together.
    
    It is sensibly faster to provide all known graphs to the query, and let
    the individual DELETE operations do nothing in those graphs that don't have
    any data for the file.
    
    Fixes: https://gitlab.gnome.org/GNOME/tracker/-/issues/182

 src/miners/fs/tracker-miner-files.c | 82 ++++++++++++++++++++++++++-----------
 1 file changed, 58 insertions(+), 24 deletions(-)
---
diff --git a/src/miners/fs/tracker-miner-files.c b/src/miners/fs/tracker-miner-files.c
index ce5a6ed59..45fc45fc9 100644
--- a/src/miners/fs/tracker-miner-files.c
+++ b/src/miners/fs/tracker-miner-files.c
@@ -2238,36 +2238,70 @@ add_delete_sparql (GFile               *file,
        g_return_if_fail (delete_self || delete_children);
 
        uri = g_file_get_uri (file);
-       sparql = g_string_new ("DELETE { "
-                              "  GRAPH " DEFAULT_GRAPH " {"
-                              "    ?f a rdfs:Resource . "
-                              "  }"
-                              "  GRAPH ?g {"
-                              "    ?f a rdfs:Resource . "
-                              "    ?ie a rdfs:Resource . "
-                              "  }"
-                              "} WHERE {"
-                              "  GRAPH " DEFAULT_GRAPH " {"
-                              "    ?f a rdfs:Resource ; "
-                              "       nie:url ?u . "
-                              "  }"
-                              "  GRAPH ?g {"
-                              "    ?f a rdfs:Resource . "
-                              "    OPTIONAL { ?ie nie:isStoredAs ?f } . "
-                              "  }"
-                              "  FILTER (");
-
-       if (delete_self)
-               g_string_append_printf (sparql, "?u = \"%s\" ", uri);
+
+       sparql = g_string_new (NULL);
 
        if (delete_children) {
-               if (delete_self)
-                       g_string_append (sparql, " || ");
+               sparql = g_string_new ("DELETE { "
+                                      "  GRAPH " DEFAULT_GRAPH " {"
+                                      "    ?f a rdfs:Resource . "
+                                      "  }"
+                                      "  GRAPH ?g {"
+                                      "    ?f a rdfs:Resource . "
+                                      "    ?ie a rdfs:Resource . "
+                                      "  }"
+                                      "} WHERE {"
+                                      "  GRAPH " DEFAULT_GRAPH " {"
+                                      "    ?f a rdfs:Resource ; "
+                                      "       nie:url ?u . "
+                                      "  }"
+                                      "  GRAPH ?g {"
+                                      "    ?f a rdfs:Resource . "
+                                      "    OPTIONAL { ?ie nie:isStoredAs ?f } . "
+                                      "  }"
+                                      "  FILTER (");
 
                g_string_append_printf (sparql, "STRSTARTS (?u, \"%s/\")", uri);
+
+               g_string_append (sparql, ")}");
+       }
+
+       if (delete_self) {
+               const gchar *data_graphs[] = {
+                       "tracker:Audio",
+                       "tracker:Documents",
+                       "tracker:Pictures",
+                       "tracker:Software",
+                       "tracker:Video",
+                       "tracker:FileSystem",
+               };
+               gint i;
+
+               for (i = 0; i < G_N_ELEMENTS (data_graphs); i++) {
+                       g_string_append_printf (sparql,
+                                               "DELETE { "
+                                               "  GRAPH %s {"
+                                               "    <%s> a rdfs:Resource . "
+                                               "    ?ie a rdfs:Resource . "
+                                               "  }"
+                                               "} WHERE {"
+                                               "  GRAPH " DEFAULT_GRAPH " {"
+                                               "    <%s> a rdfs:Resource . "
+                                               "    OPTIONAL { "
+                                               "      GRAPH %s {"
+                                               "        ?ie nie:isStoredAs <%s> "
+                                               "      }"
+                                               "    }"
+                                               "  }"
+                                               "} ",
+                                               data_graphs[i],
+                                               uri,
+                                               uri,
+                                               data_graphs[i],
+                                               uri);
+               }
        }
 
-       g_string_append (sparql, ")}");
        g_free (uri);
 
        tracker_sparql_buffer_push_sparql (buffer, file, sparql->str);


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