>From 943751b680a07f9d98489a7e71df55b1d0f7fdde Mon Sep 17 00:00:00 2001 From: Juan A. Suarez Romero Date: Fri, 30 Oct 2009 17:59:54 +0100 Subject: [PATCH] tracker-search-tool: allow restrict search to a path When entering search words, if "path:" is enter, then search is restricted to a path that contains . As example, entering "offspring path:Videos" will search "offspring" in paths that contain "Videos", as in "/home/user/Videos". This has been inspired from Banshee. --- src/tracker-search-tool/tracker-entry.gs | 3 +- src/tracker-search-tool/tracker-query.gs | 18 ++++++++++- src/tracker-search-tool/tracker-utils.gs | 49 ++++++++++++++++++++++++++---- 3 files changed, 60 insertions(+), 10 deletions(-) diff --git a/src/tracker-search-tool/tracker-entry.gs b/src/tracker-search-tool/tracker-entry.gs index 5f02004..39bf8e5 100644 --- a/src/tracker-search-tool/tracker-entry.gs +++ b/src/tracker-search-tool/tracker-entry.gs @@ -22,7 +22,6 @@ uses Gtk - TrackerUtils const static RUN_DELAY : int = 500 @@ -64,6 +63,6 @@ class TrackerSearchEntry : Gtk.Entry Query.SearchTerms = "" else set_icon_sensitive (EntryIconPosition.SECONDARY, true) - Query.SearchTerms = EscapeSparql (text, true) + Query.SearchTerms = text return false diff --git a/src/tracker-search-tool/tracker-query.gs b/src/tracker-search-tool/tracker-query.gs index e504da2..009382f 100644 --- a/src/tracker-search-tool/tracker-query.gs +++ b/src/tracker-search-tool/tracker-query.gs @@ -20,6 +20,10 @@ */ +uses + TrackerUtils + + [DBus (name = "org.freedesktop.Tracker1.Resources")] interface Resources : GLib.Object def abstract SparqlQuery (query : string) : array of string[,] raises DBus.Error @@ -75,13 +79,23 @@ class TrackerQuery : Object def Search () : array of string[,] cat, query : string + terms_to_search : string + restrict_path : string + escaped_terms : string if Category is null or Category is "All" cat = "nfo:FileDataObject" else cat = Category - - query = "SELECT ?s WHERE { ?s fts:match \"%s\". ?s a %s } limit 100 ".printf (SearchTerms, cat) + + escaped_terms = EscapeSparql (SearchTerms, false) + terms_to_search = GetSearchWords (escaped_terms) + restrict_path = GetPath (escaped_terms) + + if restrict_path is null + query = "SELECT ?s WHERE { ?s fts:match \"%s*\". ?s a %s } limit 100 ".printf (terms_to_search, cat) + else + query = "SELECT ?s WHERE { ?s fts:match \"%s*\". ?s a %s. ?s nfo:belongsToContainer ?c. FILTER regex(STR(?c), \".*%s.*\") } limit 100 ".printf (terms_to_search, cat, EscapeRegex (restrict_path)) // to do : add Fields, Category and SortField try diff --git a/src/tracker-search-tool/tracker-utils.gs b/src/tracker-search-tool/tracker-utils.gs index 33835db..152f782 100644 --- a/src/tracker-search-tool/tracker-utils.gs +++ b/src/tracker-search-tool/tracker-utils.gs @@ -57,11 +57,6 @@ class TrackerUtils if sparql is null return "" - var len = sparql.length - - if len < 3 - return sparql - p : char* = sparql while *p is not '\0' @@ -80,9 +75,51 @@ class TrackerUtils return str.str - + def static EscapeRegex (regex : string) : string + var str = new StringBuilder () + + if regex is null + return "" + + p : char* = regex + + while *p is not '\0' + /* '/' character was already escaped */ + if (*p is '^') or (*p is '.') or (*p is '?') or (*p is '*') or \ + (*p is '+') or (*p is '{') or (*p is '}') or (*p is '(') or \ + (*p is ')') or (*p is '|') or (*p is '$') or (*p is '[') or \ + (*p is ']') + str.append_printf ("\\%c", *p) + else + str.append_c (*p) + p++ + + return str.str + + + def static GetPath (raw_search : string) : string + path : string = null + + var search_split = raw_search.split (" ") + + for word in search_split + if word.has_prefix ("path:") && word.length > 5 + path = word.substring (5) + break + + return path + + def static GetSearchWords (raw_search : string) : string + buffer : StringBuilder = new StringBuilder ("") + + var search_split = raw_search.split (" ") + + for word in search_split + if word.has_prefix ("path:") is false or word.length <= 5 + buffer.append_printf (" %s", word) + return buffer.str def static OpenUri (uri : string, is_dir :bool) : bool command : string -- 1.6.0.4