diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2015-07-21 20:42:11 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2015-07-21 23:09:06 +0200 |
commit | d97f20bd62e0218bda242f1ea7ec225df31b53df (patch) | |
tree | a889060379cfc90cfb29271a98e6823246c5f31f | |
parent | 58da1a0a868c4e2cbcab22de505af02d7c399124 (diff) | |
download | tracker-d97f20bd62e0218bda242f1ea7ec225df31b53df.tar.gz |
libtracker-miner: Avoid full table scans on recursive sparql buffer queries
If MATCH_CHILDREN is specified for a TrackerTask, we use
tracker:uri-is-descendant(), it's however smarter to use fn:starts-with,
as that'll resort to sqlite tricks that will avoid full table scans.
-rw-r--r-- | src/libtracker-miner/tracker-sparql-buffer.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/libtracker-miner/tracker-sparql-buffer.c b/src/libtracker-miner/tracker-sparql-buffer.c index 43a43b467..c04831355 100644 --- a/src/libtracker-miner/tracker-sparql-buffer.c +++ b/src/libtracker-miner/tracker-sparql-buffer.c @@ -414,13 +414,23 @@ bulk_operation_merge_finish (BulkOperationMerge *merge) } if (task_data->data.bulk.flags & TRACKER_BULK_MATCH_CHILDREN) { + gchar *dir_uri; + if (!children_string) { - children_string = g_string_new (""); + children_string = g_string_new (NULL); } else { - g_string_append_c (children_string, ','); + g_string_append (children_string, "||"); } - g_string_append_printf (children_string, "\"%s\"", uri); + if (uri[strlen (uri) - 1] == '/') + dir_uri = g_strdup (uri); + else + dir_uri = g_strdup_printf ("%s/", uri); + + g_string_append_printf (children_string, + "fn:starts-with (?u, \"%s\")", + dir_uri); + g_free (dir_uri); } if (task_data->data.bulk.flags & TRACKER_BULK_MATCH_LOGICAL_RESOURCES) { @@ -459,7 +469,7 @@ bulk_operation_merge_finish (BulkOperationMerge *merge) g_string_append_printf (sparql, " WHERE { " " ?f nie:url ?u ." - " FILTER (tracker:uri-is-descendant (%s, ?u))", + " FILTER (%s)", children_string->str); g_string_free (children_string, TRUE); |