Merge lp:~mhr3/unity-lens-files/fix-749566 into lp:unity-lens-files

Proposed by Michal Hruby
Status: Merged
Approved by: Gord Allott
Approved revision: 226
Merged at revision: 225
Proposed branch: lp:~mhr3/unity-lens-files/fix-749566
Merge into: lp:unity-lens-files
Diff against target: 216 lines (+115/-15)
2 files modified
src/daemon.vala (+105/-15)
tests/manual/folders.txt (+10/-0)
To merge this branch: bzr merge lp:~mhr3/unity-lens-files/fix-749566
Reviewer Review Type Date Requested Status
Gord Allott (community) Approve
Review via email: mp+100655@code.launchpad.net

Commit message

Add also directory results to non-empty global searches

Description of the change

Searches in home lens do not include folders.

Extract folders for the uris we find and add them to the results (add to the beginning if they prefix match, to the end otherwise).

Added a manual test.

To post a comment you must log in.
lp:~mhr3/unity-lens-files/fix-749566 updated
226. By Michal Hruby

Add a manual test

Revision history for this message
Gord Allott (gordallott) wrote :

Seems good, +1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/daemon.vala'
--- src/daemon.vala 2012-03-20 10:33:37 +0000
+++ src/daemon.vala 2012-04-04 10:14:28 +0000
@@ -428,9 +428,28 @@
428 var category_id = has_search ?428 var category_id = has_search ?
429 Categories.FILES_AND_FOLDERS : Categories.RECENT_FILES;429 Categories.FILES_AND_FOLDERS : Categories.RECENT_FILES;
430430
431 Unity.FilesLens.append_events_sorted (results, results_model,431 Set<string>? bookmark_uris = null;
432 0, int64.MAX, ResultFlags.NONE,432 if (has_search)
433 null, category_id);433 {
434 /* add bookmarks first */
435 GLib.List<Bookmark> matching_bookmarks;
436 matching_bookmarks = bookmarks.prefix_search (search.search_string);
437 append_bookmarks (matching_bookmarks, results_model, category_id);
438
439 /* make sure we don't duplicate the bookmark uris */
440 bookmark_uris = new Gee.HashSet<string> ();
441 foreach (var bookmark_obj in matching_bookmarks)
442 {
443 /* uri has bookmark: scheme */
444 bookmark_uris.add (bookmark_obj.dnd_uri);
445 }
446 }
447
448 var result_flags = has_search ? ResultFlags.EXTRACT_ORIGINS : 0;
449 Unity.FilesLens.append_events_sorted (search.search_string,
450 results, results_model,
451 0, int64.MAX, result_flags,
452 bookmark_uris, category_id);
434453
435 /* Add downloads catagory if we don't have a search */454 /* Add downloads catagory if we don't have a search */
436 if (has_search == false)455 if (has_search == false)
@@ -443,7 +462,8 @@
443 cancellable,462 cancellable,
444 true);463 true);
445464
446 Unity.FilesLens.append_events_sorted (results, results_model,465 Unity.FilesLens.append_events_sorted (search.search_string,
466 results, results_model,
447 0, int64.MAX, ResultFlags.NONE,467 0, int64.MAX, ResultFlags.NONE,
448 null, Categories.DOWNLOADS);468 null, Categories.DOWNLOADS);
449 }469 }
@@ -512,7 +532,8 @@
512532
513 if (results != null)533 if (results != null)
514 {534 {
515 Unity.FilesLens.append_events_sorted (results, txn,535 Unity.FilesLens.append_events_sorted (search.search_string,
536 results, txn,
516 min_size, max_size,537 min_size, max_size,
517 ResultFlags.SKIP_FOLDERS);538 ResultFlags.SKIP_FOLDERS);
518 }539 }
@@ -526,7 +547,8 @@
526 cancellable,547 cancellable,
527 true);548 true);
528549
529 Unity.FilesLens.append_events_sorted (results, txn,550 Unity.FilesLens.append_events_sorted (search.search_string,
551 results, txn,
530 min_size, max_size,552 min_size, max_size,
531 ResultFlags.NONE,553 ResultFlags.NONE,
532 null, Categories.DOWNLOADS);554 null, Categories.DOWNLOADS);
@@ -574,7 +596,8 @@
574 bookmark_uris.add (bookmark_obj.dnd_uri);596 bookmark_uris.add (bookmark_obj.dnd_uri);
575 }597 }
576598
577 Unity.FilesLens.append_events_sorted (results, results_model,599 Unity.FilesLens.append_events_sorted (search.search_string,
600 results, results_model,
578 min_size, max_size,601 min_size, max_size,
579 ResultFlags.USE_ORIGIN,602 ResultFlags.USE_ORIGIN,
580 bookmark_uris);603 bookmark_uris);
@@ -879,12 +902,14 @@
879 {902 {
880 NONE = 0,903 NONE = 0,
881 USE_ORIGIN,904 USE_ORIGIN,
905 EXTRACT_ORIGINS,
882 SKIP_FOLDERS,906 SKIP_FOLDERS,
883 }907 }
884908
885 /* Appends a set of Zeitgeist.Events to our Dee.Model assuming that909 /* Appends a set of Zeitgeist.Events to our Dee.Model assuming that
886 * these events are already sorted with descending timestamps */910 * these events are already sorted with descending timestamps */
887 public void append_events_sorted (Zeitgeist.ResultSet? events,911 public void append_events_sorted (string search_string,
912 Zeitgeist.ResultSet? events,
888 Dee.Model results,913 Dee.Model results,
889 int64 min_size, int64 max_size,914 int64 min_size, int64 max_size,
890 ResultFlags flags,915 ResultFlags flags,
@@ -892,12 +917,62 @@
892 int category_override = -1)917 int category_override = -1)
893 {918 {
894 if (events == null) return;919 if (events == null) return;
920 uint category_id;
921 Set<string>? extracted_directories = null;
922
923 if (ResultFlags.EXTRACT_ORIGINS in flags)
924 {
925 var folded_search = search_string.casefold ();
926 var origins = new HashSet<string> ();
927 // loop through all found events, take a look at origin field, add it
928 // to result set if it matches our search
929 // NOTE: using separate zg query with MOST_RECENT_ORIGINS grouping
930 // is more likely to find relevant directories, but is much slower
931 // than this kind of "approximation"
932 foreach (var ev in events)
933 {
934 if (ev.num_subjects () > 0)
935 {
936 string origin = ev.get_subject (0).get_origin ();
937 if (origin == null || origin == "") continue;
938 var f = File.new_for_uri (origin);
939 origin = f.get_uri ();
940 if (excluded_uris != null && origin in excluded_uris) continue;
941 if (!(origin in origins) && f.is_native () && f.query_exists ())
942 {
943 var display_name = Path.get_basename (f.get_parse_name ());
944 if (display_name.casefold ().has_prefix (folded_search))
945 {
946 string mimetype = "inode/directory";
947 string icon = Utils.get_icon_for_uri (origin, mimetype);
948 if (category_override >= 0)
949 category_id = category_override;
950 else
951 category_id = Categories.FOLDERS;
952 results.append (origin, icon, category_id, mimetype,
953 display_name, "", origin);
954 }
955 else
956 {
957 if (extracted_directories == null)
958 {
959 extracted_directories = new HashSet<string> ();
960 }
961 extracted_directories.add (origin);
962 }
963 origins.add (origin);
964 }
965 }
966 }
967 // we need this because of way ResultSet works with foreach
968 if (events.size () > 0) events.seek (0);
969 }
895 foreach (var ev in events)970 foreach (var ev in events)
896 {971 {
897 if (ev.num_subjects() > 0)972 if (ev.num_subjects () > 0)
898 {973 {
899 // FIXME: We only use the first subject...974 // FIXME: We only use the first subject...
900 Zeitgeist.Subject su = ev.get_subject(0);975 Zeitgeist.Subject su = ev.get_subject (0);
901976
902 string uri;977 string uri;
903 string display_name;978 string display_name;
@@ -946,15 +1021,13 @@
946 }1021 }
947 file_type = info.get_file_type ();1022 file_type = info.get_file_type ();
948 }1023 }
949 catch (GLib.Error e) 1024 catch (GLib.Error e)
950 {1025 {
951 // as error occurred file must be missing therefore ignoring it1026 // as error occurred file must be missing therefore ignoring it
952 continue;1027 continue;
953 }1028 }
954 }1029 }
955 string icon = Utils.get_icon_for_uri (uri, mimetype);1030 string icon = Utils.get_icon_for_uri (uri, mimetype);
956
957 uint category_id;
958 string comment = file.get_parse_name ();1031 string comment = file.get_parse_name ();
9591032
960 var is_dir = file_type == FileType.DIRECTORY;1033 var is_dir = file_type == FileType.DIRECTORY;
@@ -966,8 +1039,25 @@
966 category_id = is_dir ? Categories.FOLDERS : Categories.RECENT;1039 category_id = is_dir ? Categories.FOLDERS : Categories.RECENT;
9671040
968 results.append (uri, icon, category_id, mimetype,1041 results.append (uri, icon, category_id, mimetype,
969 display_name, comment);1042 display_name, comment, uri);
9701043
1044 }
1045 }
1046
1047 if (extracted_directories != null)
1048 {
1049 foreach (var dir_uri in extracted_directories)
1050 {
1051 var f = File.new_for_uri (dir_uri);
1052 var display_name = Path.get_basename (f.get_parse_name ());
1053 string mimetype = "inode/directory";
1054 string icon = Utils.get_icon_for_uri (dir_uri, mimetype);
1055 if (category_override >= 0)
1056 category_id = category_override;
1057 else
1058 category_id = Categories.FOLDERS;
1059 results.append (dir_uri, icon, category_id, mimetype,
1060 display_name, "", dir_uri);
971 }1061 }
972 }1062 }
973 }1063 }
9741064
=== added file 'tests/manual/folders.txt'
--- tests/manual/folders.txt 1970-01-01 00:00:00 +0000
+++ tests/manual/folders.txt 2012-04-04 10:14:28 +0000
@@ -0,0 +1,10 @@
1Folders
2=======
3Tests that global searches find folders as well as files.
4
5#. Open the Dash.
6#. Perform a generic search in the home view. (for example 'd')
7
8Outcome
9 You should see "Files and Folders" category with both folders starting with 'd', followed by files containing 'd' or residing in a folder with 'd' in name.
10

Subscribers

People subscribed via source and target branches