[gtk+] GtkSearchEngine: Add recursive flag



commit a3a58fa7d9997c2296f7bcfed6169f6b936cb8d1
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Jun 18 22:44:11 2015 -0400

    GtkSearchEngine: Add recursive flag
    
    Add a flag for recursive search, and implement non-recursive
    search in both the tracker and simple search engines.
    
    This is not currently used in the file chooser.

 gtk/gtksearchengine.c        |   26 ++++++++++++++++++++++++++
 gtk/gtksearchengine.h        |    3 +++
 gtk/gtksearchenginesimple.c  |    4 +++-
 gtk/gtksearchenginetracker.c |   16 +++++++++++++---
 4 files changed, 45 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtksearchengine.c b/gtk/gtksearchengine.c
index 553f0fe..c685a8b 100644
--- a/gtk/gtksearchengine.c
+++ b/gtk/gtksearchengine.c
@@ -41,6 +41,7 @@ struct _GtkSearchEnginePrivate {
   gchar *simple_error;
 
   gboolean running;
+  gboolean recursive;
   GHashTable *hits;
 };
 
@@ -400,3 +401,28 @@ _gtk_search_engine_error (GtkSearchEngine *engine,
 
   g_signal_emit (engine, signals[ERROR], 0, error_message);
 }
+
+void
+_gtk_search_engine_set_recursive (GtkSearchEngine *engine,
+                                  gboolean         recursive)
+{
+  g_return_if_fail (GTK_IS_SEARCH_ENGINE (engine));
+
+  g_assert (!engine->priv->running);
+
+  engine->priv->recursive = recursive;
+
+  if (engine->priv->native)
+    _gtk_search_engine_set_recursive (engine->priv->native, recursive);
+
+  if (engine->priv->simple)
+    _gtk_search_engine_set_recursive (engine->priv->simple, recursive);
+}
+
+gboolean
+_gtk_search_engine_get_recursive (GtkSearchEngine *engine)
+{
+  g_return_val_if_fail (GTK_IS_SEARCH_ENGINE (engine), TRUE);
+
+  return engine->priv->recursive;
+}
diff --git a/gtk/gtksearchengine.h b/gtk/gtksearchengine.h
index 4d74c1a..9e92e31 100644
--- a/gtk/gtksearchengine.h
+++ b/gtk/gtksearchengine.h
@@ -84,6 +84,9 @@ void           _gtk_search_engine_hits_added      (GtkSearchEngine *engine,
 void            _gtk_search_engine_finished        (GtkSearchEngine *engine);
 void            _gtk_search_engine_error           (GtkSearchEngine *engine, 
                                                     const gchar     *error_message);
+void             _gtk_search_engine_set_recursive   (GtkSearchEngine *engine,
+                                                     gboolean         recursive);
+gboolean         _gtk_search_engine_get_recursive   (GtkSearchEngine *engine);
 
 void             _gtk_search_hit_free (GtkSearchHit *hit);
 GtkSearchHit    *_gtk_search_hit_dup (GtkSearchHit *hit);
diff --git a/gtk/gtksearchenginesimple.c b/gtk/gtksearchenginesimple.c
index fc33c4b..769dd04 100644
--- a/gtk/gtksearchenginesimple.c
+++ b/gtk/gtksearchenginesimple.c
@@ -43,6 +43,7 @@ typedef struct
   GList *hits;
 
   GtkQuery *query;
+  gboolean recursive;
 } SearchThreadData;
 
 
@@ -95,6 +96,7 @@ search_thread_data_new (GtkSearchEngineSimple *engine,
   data->engine = g_object_ref (engine);
   data->directories = g_queue_new ();
   data->query = g_object_ref (query);
+  data->recursive = _gtk_search_engine_get_recursive (GTK_SEARCH_ENGINE (engine));
   uri = gtk_query_get_location (query);
   if (uri != NULL)
     location = g_file_new_for_uri (uri);
@@ -225,7 +227,7 @@ visit_directory (GFile *dir, SearchThreadData *data)
       if (data->n_processed_files > BATCH_SIZE)
         send_batch (data);
 
-      if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
+      if (data->recursive && g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
         g_queue_push_tail (data->directories, g_object_ref (child));
     }
 
diff --git a/gtk/gtksearchenginetracker.c b/gtk/gtksearchenginetracker.c
index 562b14d..21b2e32 100644
--- a/gtk/gtksearchenginetracker.c
+++ b/gtk/gtksearchenginetracker.c
@@ -327,6 +327,7 @@ gtk_search_engine_tracker_start (GtkSearchEngine *engine)
   gchar *search_text;
   gchar *location_uri;
   GString *sparql;
+  gboolean recursive;
 
   tracker = GTK_SEARCH_ENGINE_TRACKER (engine);
 
@@ -344,6 +345,7 @@ gtk_search_engine_tracker_start (GtkSearchEngine *engine)
 
   search_text = gtk_query_get_text (tracker->priv->query);
   location_uri = gtk_query_get_location (tracker->priv->query);
+  recursive = _gtk_search_engine_get_recursive (engine);
 
   sparql = g_string_new ("SELECT nie:url(?urn) "
                          "WHERE {"
@@ -356,16 +358,24 @@ gtk_search_engine_tracker_start (GtkSearchEngine *engine)
   sparql_append_string_literal (sparql, search_text, TRUE);
 #endif
 
-  g_string_append (sparql, ". FILTER (fn:contains(fn:lower-case(nfo:fileName(?urn)),");
+  g_string_append (sparql, ". FILTER (");
+
+  g_string_append (sparql, "fn:contains(fn:lower-case(nfo:fileName(?urn)),");
   sparql_append_string_literal_lower_case (sparql, search_text);
+  g_string_append (sparql, ")");
 
   if (location_uri)
     {
-      g_string_append (sparql, ") && fn:starts-with(nie:url(?urn),");
+      g_string_append (sparql, " && ");
+      if (recursive)
+        g_string_append (sparql, "tracker-uri-is-descendant(");
+      else
+        g_string_append (sparql, "tracker-uri-is-parent(");
       sparql_append_string_literal (sparql, location_uri, FALSE);
+      g_string_append (sparql, ",nie:url(?urn))");
     }
 
-  g_string_append (sparql, "))");
+  g_string_append (sparql, ")");
 
 #ifdef FTS_MATCHING
   g_string_append (sparql, " } ORDER BY DESC(fts:rank(?urn)) DESC(nie:url(?urn))");


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