searchengine: Improve performance for recursive search
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 7 Mar 2023 19:38:46 +0000 (20:38 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 7 Mar 2023 22:18:46 +0000 (23:18 +0100)
As fancy as property paths are, recursive resolution of files
to a location increases the big O complexity enough that it's
not a great option on large homedirs with many indexed files.

Ensure the files are from the right location through a URI
prefix match, which does hits an index. This may dramatically
improve performance on large indexed trees.

Testing this query in an isolated testcase with a total
1434099 indexed files shows that it can run more than 1500 times
per second in this computer (an average of 15200 queries in
several 10 second runs), which presumably is a tad faster than
anyone can type.

Closes: https://gitlab.gnome.org/GNOME/gtk/-/issues/4133
gtk/gtksearchenginetracker3.c

index 25f6576c1f986101788c8ac2bcde7a1180f1af53..ab3224d2acc1702b914f455b0b0d3ef315c76f99 100644 (file)
@@ -52,7 +52,7 @@
   "ORDER BY DESC(fts:rank(?urn)) DESC(?url)"
 
 #define SEARCH_QUERY SEARCH_QUERY_BASE("")
-#define SEARCH_RECURSIVE_QUERY SEARCH_QUERY_BASE("?urn (nfo:belongsToContainer/nie:isStoredAs)+/nie:url ~location")
+#define SEARCH_RECURSIVE_QUERY SEARCH_QUERY_BASE("FILTER (STRSTARTS (?url, CONCAT (~location, '/')))")
 #define SEARCH_LOCATION_QUERY SEARCH_QUERY_BASE("?urn nfo:belongsToContainer/nie:isStoredAs/nie:url ~location")
 
 struct _GtkSearchEngineTracker3