[nautilus/wip/gbsneto/search-popover: 6/6] search-engines: implement search by access/modification time
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/gbsneto/search-popover: 6/6] search-engines: implement search by access/modification time
- Date: Wed, 23 Dec 2015 11:57:28 +0000 (UTC)
commit 4bb219f405b2c88c8f4c8ee384018f8915c40825
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Tue Oct 6 07:09:11 2015 -0300
search-engines: implement search by access/modification time
The search engines currently aren't able to perform searches
against modification or access times.
This commit implements it for simple, model & tracker search
engines.
libnautilus-private/nautilus-search-directory.c | 14 ++++++-
libnautilus-private/nautilus-search-engine-model.c | 41 ++++++++++++++++++++
.../nautilus-search-engine-simple.c | 22 ++++++++++
.../nautilus-search-engine-tracker.c | 24 ++++++++++-
4 files changed, 97 insertions(+), 4 deletions(-)
---
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c
index 10b5525..5aacdf3 100644
--- a/libnautilus-private/nautilus-search-directory.c
+++ b/libnautilus-private/nautilus-search-directory.c
@@ -172,6 +172,9 @@ start_search (NautilusSearchDirectory *search)
return;
}
+ /* Update the query state */
+ nautilus_query_set_searching (search->details->query, TRUE);
+
/* We need to start the search engine */
search->details->search_running = TRUE;
search->details->search_ready_and_valid = FALSE;
@@ -206,6 +209,7 @@ stop_search (NautilusSearchDirectory *search)
search->details->search_running = FALSE;
nautilus_search_provider_stop (NAUTILUS_SEARCH_PROVIDER (search->details->engine));
+ nautilus_query_set_searching (search->details->query, FALSE);
reset_file_list (search);
}
@@ -602,6 +606,8 @@ search_engine_error (NautilusSearchEngine *engine, const char *error_message, Na
{
GError *error;
+ nautilus_query_set_searching (search->details->query, FALSE);
+
error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED,
error_message);
nautilus_directory_emit_load_error (NAUTILUS_DIRECTORY (search),
@@ -623,6 +629,7 @@ search_engine_finished (NautilusSearchEngine *engine,
* that it finished the current search, not an old one like it's actually
* happening. */
if (status == NAUTILUS_SEARCH_PROVIDER_STATUS_NORMAL) {
+ nautilus_query_set_searching (search->details->query, FALSE);
on_search_directory_search_ready_and_valid (search);
nautilus_directory_emit_done_loading (NAUTILUS_DIRECTORY (search));
} else if (status == NAUTILUS_SEARCH_PROVIDER_STATUS_RESTARTING) {
@@ -925,7 +932,9 @@ nautilus_search_directory_set_query (NautilusSearchDirectory *search,
old_query = search->details->query;
- if (g_set_object (&search->details->query, query)) {
+ if (search->details->query != query) {
+ search->details->query = query;
+
/* Disconnect from the previous query changes */
if (old_query) {
g_signal_handlers_disconnect_by_func (old_query, search_force_reload, search);
@@ -935,8 +944,9 @@ nautilus_search_directory_set_query (NautilusSearchDirectory *search,
g_signal_connect_swapped (query, "notify", G_CALLBACK (search_force_reload), search);
}
-
g_object_notify_by_pspec (G_OBJECT (search), properties[PROP_QUERY]);
+
+ g_clear_object (&old_query);
}
file = nautilus_directory_get_existing_corresponding_file (NAUTILUS_DIRECTORY (search));
diff --git a/libnautilus-private/nautilus-search-engine-model.c
b/libnautilus-private/nautilus-search-engine-model.c
index 4dfb5eb..441b8e2 100644
--- a/libnautilus-private/nautilus-search-engine-model.c
+++ b/libnautilus-private/nautilus-search-engine-model.c
@@ -120,9 +120,11 @@ model_directory_ready_cb (NautilusDirectory *directory,
gdouble match;
gboolean found;
NautilusSearchHit *hit;
+ GDateTime *dt;
files = nautilus_directory_get_file_list (directory);
mime_types = nautilus_query_get_mime_types (model->details->query);
+ dt = nautilus_query_get_date (model->details->query);
hits = NULL;
for (l = files; l != NULL; l = l->next) {
@@ -143,6 +145,45 @@ model_directory_ready_cb (NautilusDirectory *directory,
}
}
+ if (found && dt != NULL) {
+ NautilusQuerySearchType type;
+ guint64 query_time, current_file_time;
+ const gchar *attrib;
+ GFileInfo *info;
+ GError *error;
+ GFile *location;
+
+ type = nautilus_query_get_search_type (model->details->query);
+ location = nautilus_file_get_location (file);
+ error = NULL;
+
+ if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
+ attrib = G_FILE_ATTRIBUTE_TIME_ACCESS;
+ } else {
+ attrib = G_FILE_ATTRIBUTE_TIME_MODIFIED;
+ }
+
+ query_time = g_date_time_to_unix (dt);
+
+ /* Query current file's attribute */
+ info = g_file_query_info (location,
+ attrib,
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ NULL,
+ &error);
+
+ if (error) {
+ /* Silently ignore errors */
+ g_clear_error (&error);
+ found = FALSE;
+ } else {
+ current_file_time = g_file_info_get_attribute_uint64 (info, attrib);
+ found = (query_time <= current_file_time);
+ }
+
+ g_clear_object (&location);
+ }
+
if (found) {
uri = nautilus_file_get_uri (file);
hit = nautilus_search_hit_new (uri);
diff --git a/libnautilus-private/nautilus-search-engine-simple.c
b/libnautilus-private/nautilus-search-engine-simple.c
index f3557d6..c161b39 100644
--- a/libnautilus-private/nautilus-search-engine-simple.c
+++ b/libnautilus-private/nautilus-search-engine-simple.c
@@ -195,6 +195,7 @@ send_batch (SearchThreadData *thread_data)
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "," \
G_FILE_ATTRIBUTE_STANDARD_TYPE "," \
G_FILE_ATTRIBUTE_TIME_MODIFIED "," \
+ G_FILE_ATTRIBUTE_TIME_ACCESS "," \
G_FILE_ATTRIBUTE_ID_FILE
static void
@@ -250,6 +251,27 @@ visit_directory (GFile *dir, SearchThreadData *data)
}
}
}
+
+ if (found && nautilus_query_get_date (data->query) != NULL) {
+ NautilusQuerySearchType type;
+ GDateTime *date;
+ guint64 current_file_time, query_time;
+ const gchar *attrib;
+
+ type = nautilus_query_get_search_type (data->query);
+
+ if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
+ attrib = G_FILE_ATTRIBUTE_TIME_ACCESS;
+ } else {
+ attrib = G_FILE_ATTRIBUTE_TIME_MODIFIED;
+ }
+
+ date = nautilus_query_get_date (data->query);
+ query_time = g_date_time_to_unix (date);
+ current_file_time = g_file_info_get_attribute_uint64 (info, attrib);
+
+ found = (query_time <= current_file_time);
+ }
if (found) {
NautilusSearchHit *hit;
diff --git a/libnautilus-private/nautilus-search-engine-tracker.c
b/libnautilus-private/nautilus-search-engine-tracker.c
index e49a631..15cf3cd 100644
--- a/libnautilus-private/nautilus-search-engine-tracker.c
+++ b/libnautilus-private/nautilus-search-engine-tracker.c
@@ -255,6 +255,7 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
GList *mimetypes, *l;
gint mime_count;
gboolean recursive;
+ GDateTime *dt;
tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (provider);
@@ -283,10 +284,11 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
location = nautilus_query_get_location (tracker->details->query);
location_uri = location ? g_file_get_uri (location) : NULL;
mimetypes = nautilus_query_get_mime_types (tracker->details->query);
+ dt = nautilus_query_get_date (tracker->details->query);
mime_count = g_list_length (mimetypes);
- sparql = g_string_new ("SELECT DISTINCT nie:url(?urn) fts:rank(?urn)
tracker:coalesce(nfo:fileLastModified(?urn), nie:contentLastModified(?urn))
tracker:coalesce(nfo:fileLastAccessed(?urn), nie:contentAccessed(?urn)) "
+ sparql = g_string_new ("SELECT DISTINCT nie:url(?urn) fts:rank(?urn)
tracker:coalesce(nfo:fileLastModified(?urn), nie:contentLastModified(?urn)) AS ?mtime
tracker:coalesce(nfo:fileLastAccessed(?urn), nie:contentAccessed(?urn)) AS ?atime \n"
"WHERE {"
" ?urn a nfo:FileDataObject ;"
" tracker:available true ; ");
@@ -305,6 +307,24 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
g_string_append_printf (sparql, "fn:contains(fn:lower-case(nfo:fileName(?urn)), '%s')", search_text);
+ if (dt != NULL) {
+ NautilusQuerySearchType type;
+ gchar *dt_format;
+
+ type = nautilus_query_get_search_type (tracker->details->query);
+ dt_format = g_date_time_format (dt, "%Y-%m-%dT%H:%M:%S");
+
+ g_string_append (sparql, " && ");
+
+ if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
+ g_string_append_printf (sparql, "?atime <= \"%s\"^^xsd:dateTime", dt_format);
+ } else {
+ g_string_append_printf (sparql, "?mtime <= \"%s\"^^xsd:dateTime", dt_format);
+ }
+
+ g_free (dt_format);
+ }
+
if (mime_count > 0) {
g_string_append (sparql, " && (");
@@ -316,7 +336,7 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
g_string_append_printf (sparql, "fn:contains(?mime, '%s')",
(gchar *) l->data);
}
- g_string_append (sparql, ")");
+ g_string_append (sparql, ")\n");
}
g_string_append (sparql, ")} ORDER BY DESC (fts:rank(?urn))");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]