summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2015-07-21 20:42:11 +0200
committerCarlos Garnacho <carlosg@gnome.org>2015-07-21 23:09:06 +0200
commitd97f20bd62e0218bda242f1ea7ec225df31b53df (patch)
treea889060379cfc90cfb29271a98e6823246c5f31f
parent58da1a0a868c4e2cbcab22de505af02d7c399124 (diff)
downloadtracker-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.c18
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);