[nautilus/wip/csoriano/search-popover] f with date ranges



commit 8a56ebd101a59cbb06fc01373ffe0600ac2e8ecd
Author: Carlos Soriano <csoriano gnome org>
Date:   Tue Feb 2 00:41:21 2016 +0100

    f with date ranges

 libnautilus-private/nautilus-query.c               |    9 ++---
 libnautilus-private/nautilus-search-engine-model.c |   29 +++++++----------
 .../nautilus-search-engine-simple.c                |   21 ++++++------
 .../nautilus-search-engine-tracker.c               |   33 ++++++++++++++------
 libnautilus-private/nautilus-ui-utilities.c        |   26 +++++++++++++++
 libnautilus-private/nautilus-ui-utilities.h        |    4 ++
 src/nautilus-query-editor.c                        |    3 ++
 src/nautilus-search-popover.c                      |    5 +++
 8 files changed, 88 insertions(+), 42 deletions(-)
---
diff --git a/libnautilus-private/nautilus-query.c b/libnautilus-private/nautilus-query.c
index 121ee1a..83293e8 100644
--- a/libnautilus-private/nautilus-query.c
+++ b/libnautilus-private/nautilus-query.c
@@ -190,11 +190,10 @@ nautilus_query_class_init (NautilusQueryClass *class)
          */
         g_object_class_install_property (gobject_class,
                                          PROP_DATE_RANGE,
-                                         g_param_spec_boxed ("date",
-                                                             "Date range of the query",
-                                                             "The range date of the query",
-                                                             G_TYPE_POINTER,
-                                                             G_PARAM_READWRITE));
+                                         g_param_spec_pointer ("date-range",
+                                                               "Date range of the query",
+                                                               "The range date of the query",
+                                                               G_PARAM_READWRITE));
 
         /**
          * NautilusQuery::location:
diff --git a/libnautilus-private/nautilus-search-engine-model.c 
b/libnautilus-private/nautilus-search-engine-model.c
index 1f7a87f..8a6b7a2 100644
--- a/libnautilus-private/nautilus-search-engine-model.c
+++ b/libnautilus-private/nautilus-search-engine-model.c
@@ -129,13 +129,12 @@ model_directory_ready_cb (NautilusDirectory       *directory,
        gdouble match;
        gboolean found;
        NautilusSearchHit *hit;
-        GDateTime *date;
+        GDateTime *initial_date;
+        GDateTime *end_date;
         GPtrArray *date_range;
 
        files = nautilus_directory_get_file_list (directory);
        mime_types = nautilus_query_get_mime_types (model->details->query);
-        date_range = nautilus_query_get_date_range (model->details->query);
-       date = date_range ? g_ptr_array_index (date_range, 0) : NULL;
        hits = NULL;
 
        for (l = files; l != NULL; l = l->next) {
@@ -157,28 +156,24 @@ model_directory_ready_cb (NautilusDirectory       *directory,
                        }
                }
 
-                if (found && date != NULL) {
+                date_range = nautilus_query_get_date_range (model->details->query);
+                if (found && date_range != NULL) {
                         NautilusQuerySearchType type;
-                        guint64 query_time, current_file_time;
-
+                        guint64 current_file_unix_time;
 
                         type = nautilus_query_get_search_type (model->details->query);
+                        initial_date = g_ptr_array_index (date_range, 0);
+                        end_date = g_ptr_array_index (date_range, 1);
 
                         if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
-                                current_file_time = nautilus_file_get_atime (file);
+                                current_file_unix_time = nautilus_file_get_atime (file);
                         } else {
-                                current_file_time = nautilus_file_get_mtime (file);
+                                current_file_unix_time = nautilus_file_get_mtime (file);
                         }
 
-
-                        query_time = g_date_time_to_unix (date);
-
-                        if (current_file_time == 0) {
-                                /* Silently ignore errors */
-                                found = FALSE;
-                        } else {
-                                found = (query_time <= current_file_time);
-                        }
+                        found = nautilus_file_date_in_between (current_file_unix_time,
+                                                               initial_date,
+                                                               end_date);
                 }
 
                if (found) {
diff --git a/libnautilus-private/nautilus-search-engine-simple.c 
b/libnautilus-private/nautilus-search-engine-simple.c
index 43e753c..e6deed9 100644
--- a/libnautilus-private/nautilus-search-engine-simple.c
+++ b/libnautilus-private/nautilus-search-engine-simple.c
@@ -214,7 +214,8 @@ visit_directory (GFile *dir, SearchThreadData *data)
        guint64 atime;
        guint64 mtime;
         GPtrArray *date_range;
-        GDateTime *date;
+        GDateTime *initial_date;
+        GDateTime *end_date;
 
 
        enumerator = g_file_enumerate_children (dir,
@@ -261,12 +262,13 @@ visit_directory (GFile *dir, SearchThreadData *data)
                mtime = g_file_info_get_attribute_uint64 (info, "time::modified");
                atime = g_file_info_get_attribute_uint64 (info, "time::access");
 
-               date_range = nautilus_query_get_date_range (data->query);
-               date = date_range ? g_ptr_array_index (date_range, 0) : NULL;
-                if (found && date != NULL) {
+                date_range = nautilus_query_get_date_range (data->query);
+                if (found && date_range != NULL) {
                         NautilusQuerySearchType type;
-                        guint64 current_file_time, query_time;
+                        guint64 current_file_time;
 
+                        initial_date = g_ptr_array_index (date_range, 0);
+                        end_date = g_ptr_array_index (date_range, 1);
                         type = nautilus_query_get_search_type (data->query);
 
                         if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
@@ -274,12 +276,11 @@ visit_directory (GFile *dir, SearchThreadData *data)
                         } else {
                                 current_file_time = mtime;
                         }
-
-                        query_time = g_date_time_to_unix (date);
-
-                        found = (query_time <= current_file_time);
+                        found = nautilus_file_date_in_between (current_file_time,
+                                                               initial_date,
+                                                               end_date);
                 }
-               
+
                if (found) {
                        NautilusSearchHit *hit;
                        GDateTime *date;
diff --git a/libnautilus-private/nautilus-search-engine-tracker.c 
b/libnautilus-private/nautilus-search-engine-tracker.c
index 20115a2..7218e3a 100644
--- a/libnautilus-private/nautilus-search-engine-tracker.c
+++ b/libnautilus-private/nautilus-search-engine-tracker.c
@@ -263,7 +263,6 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
        GList *mimetypes, *l;
        gint mime_count;
        gboolean recursive;
-        GDateTime *date;
         GPtrArray *date_range;
 
        tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (provider);
@@ -295,9 +294,6 @@ 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);
-        date_range = nautilus_query_get_date_range (tracker->details->query);
-        date = date_range ? g_ptr_array_index (date_range, 0) : NULL;
-
        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)) AS ?mtime 
tracker:coalesce(nfo:fileLastAccessed(?urn), nie:contentAccessed(?urn)) AS ?atime \n"
@@ -319,22 +315,38 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
 
        g_string_append_printf (sparql, "fn:contains(fn:lower-case(nfo:fileName(?urn)), '%s')", search_text);
 
-        if (date != NULL) {
+        date_range = nautilus_query_get_date_range (tracker->details->query);
+        if (date_range) {
                 NautilusQuerySearchType type;
-                gchar *date_format;
+                gchar *initial_date_format;
+                gchar *end_date_format;
+                GDateTime *initial_date;
+                GDateTime *end_date;
+                GDateTime *shifted_end_date;
+
+                initial_date = g_ptr_array_index (date_range, 0);
+                end_date = g_ptr_array_index (date_range, 1);
+                /* As we do for other searches, we want to make the end date inclusive.
+                 * For that, add a day to it */
+                shifted_end_date = g_date_time_add_days (end_date, 1);
 
                 type = nautilus_query_get_search_type (tracker->details->query);
-                date_format = g_date_time_format (date, "%Y-%m-%dT%H:%M:%S");
+                initial_date_format = g_date_time_format (initial_date, "%Y-%m-%dT%H:%M:%S");
+                end_date_format = g_date_time_format (shifted_end_date, "%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", date_format);
+                        g_string_append_printf (sparql, "?atime <= \"%s\"^^xsd:dateTime", 
initial_date_format);
+                        g_string_append_printf (sparql, " && ?atime >= \"%s\"^^xsd:dateTime", 
end_date_format);
                 } else {
-                        g_string_append_printf (sparql, "?mtime <= \"%s\"^^xsd:dateTime", date_format);
+                        g_string_append_printf (sparql, "?mtime <= \"%s\"^^xsd:dateTime", 
initial_date_format);
+                        g_string_append_printf (sparql, " && ?mtime >= \"%s\"^^xsd:dateTime", 
end_date_format);
                 }
 
-                g_free (date_format);
+
+                g_free (initial_date_format);
+                g_free (end_date_format);
         }
 
        if (mime_count > 0) {
@@ -352,6 +364,7 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
        }
 
        g_string_append (sparql, ")} ORDER BY DESC (fts:rank(?urn))");
+                          g_print ("%s", sparql->str);
 
        tracker->details->cancellable = g_cancellable_new ();
        tracker_sparql_connection_query_async (tracker->details->connection,
diff --git a/libnautilus-private/nautilus-ui-utilities.c b/libnautilus-private/nautilus-ui-utilities.c
index e57b157..98e07ac 100644
--- a/libnautilus-private/nautilus-ui-utilities.c
+++ b/libnautilus-private/nautilus-ui-utilities.c
@@ -326,3 +326,29 @@ nautilus_ui_frame_video (GdkPixbuf **pixbuf)
                                      1, 1, GDK_INTERP_NEAREST, 255);
        }
 }
+
+gboolean
+nautilus_file_date_in_between (guint64    unix_file_time,
+                               GDateTime *initial_date,
+                               GDateTime *end_date)
+{
+        GDateTime *date;
+        gboolean in_between;
+
+        /* Silently ignore errors */
+        if (unix_file_time == 0)
+                return FALSE;
+
+        date = g_date_time_new_from_unix_local (unix_file_time);
+
+        /* For the end date, we want to make end_date inclusive,
+         * for that the difference between the start of the day and the in_between
+         * has to be more than -1 day
+         */
+        in_between = g_date_time_difference (date, initial_date) > 0 &&
+                     g_date_time_difference (end_date, date) / G_TIME_SPAN_DAY > -1;
+
+        g_date_time_unref (date);
+
+        return in_between;
+}
diff --git a/libnautilus-private/nautilus-ui-utilities.h b/libnautilus-private/nautilus-ui-utilities.h
index 283293c..b7943ed 100644
--- a/libnautilus-private/nautilus-ui-utilities.h
+++ b/libnautilus-private/nautilus-ui-utilities.h
@@ -47,4 +47,8 @@ char * nautilus_escape_action_name                 (const char        *action_na
 void   nautilus_ui_frame_image                     (GdkPixbuf        **pixbuf);
 void   nautilus_ui_frame_video                     (GdkPixbuf        **pixbuf);
 
+gboolean   nautilus_file_date_in_between           (guint64           file_unix_time,
+                                                    GDateTime         *initial_date,
+                                                    GDateTime         *end_date);
+
 #endif /* NAUTILUS_UI_UTILITIES_H */
diff --git a/src/nautilus-query-editor.c b/src/nautilus-query-editor.c
index cc9ed3e..0639846 100644
--- a/src/nautilus-query-editor.c
+++ b/src/nautilus-query-editor.c
@@ -375,7 +375,10 @@ search_popover_date_range_changed_cb (NautilusSearchPopover *popover,
         if (!priv->query)
                 create_query (editor);
 
+        g_print ("query editor range changed\n");
         nautilus_query_set_date_range (priv->query, data);
+
+        nautilus_query_editor_changed (editor);
 }
 
 static void
diff --git a/src/nautilus-search-popover.c b/src/nautilus-search-popover.c
index 9279368..ec681ec 100644
--- a/src/nautilus-search-popover.c
+++ b/src/nautilus-search-popover.c
@@ -372,6 +372,8 @@ date_entry_activate (GtkEntry              *entry,
           update_date_label (popover, date_range);
           show_date_selection_widgets (popover, FALSE);
           emit_date_changes_for_day (popover, date_range);
+
+          g_ptr_array_unref (date_range);
         }
 
       g_date_time_unref (now);
@@ -397,6 +399,9 @@ dates_listbox_row_activated (GtkListBox            *listbox,
   update_date_label (popover, date_range);
   show_date_selection_widgets (popover, FALSE);
   emit_date_changes_for_day (popover, date_range);
+
+  g_ptr_array_unref (date_range);
+  g_date_time_unref (now);
 }
 
 static void


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