Merge lp:~mhr3/unity-lens-applications/camelcase-friendly-index into lp:unity-lens-applications

Proposed by Michal Hruby
Status: Merged
Approved by: Mikkel Kamstrup Erlandsen
Approved revision: 263
Merged at revision: 261
Proposed branch: lp:~mhr3/unity-lens-applications/camelcase-friendly-index
Merge into: lp:unity-lens-applications
Diff against target: 233 lines (+70/-28)
8 files modified
TESTS-TODO.txt (+3/-0)
configure.ac (+1/-0)
src/Makefile.am (+2/-2)
src/daemon.vala (+7/-13)
src/runner.vala (+1/-1)
src/unity-package-search.cc (+12/-2)
src/unity-ratings-db.c (+1/-1)
src/utils.vala (+43/-9)
To merge this branch: bzr merge lp:~mhr3/unity-lens-applications/camelcase-friendly-index
Reviewer Review Type Date Requested Status
Mikkel Kamstrup Erlandsen (community) Approve
Review via email: mp+89926@code.launchpad.net

Description of the change

Split CamelCase words from application names before feeding them to xapian, which allows us to search for any part of the name.

To post a comment you must log in.
Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote :

Looks good and manual testing confirms that this works. Before I approve it can you queue a testcase in TESTS-TODO.txt?

review: Needs Fixing
Revision history for this message
Michal Hruby (mhr3) wrote :

Done.

263. By Michal Hruby

Add test desciption

Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'TESTS-TODO.txt'
--- TESTS-TODO.txt 2012-01-19 12:12:06 +0000
+++ TESTS-TODO.txt 2012-01-25 08:25:28 +0000
@@ -10,5 +10,8 @@
102) Start a search with non-sensical string and check that it returns 0 results102) Start a search with non-sensical string and check that it returns 0 results
11 and that the "no-results-hint" is set in the method reply.11 and that the "no-results-hint" is set in the method reply.
1212
133) Make sure it's possible to search for CamelCase apps by searching "case",
14 plus this should properly work with accented characters as well.
15
13More to come...16More to come...
1417
1518
=== modified file 'configure.ac'
--- configure.ac 2012-01-12 15:29:22 +0000
+++ configure.ac 2012-01-25 08:25:28 +0000
@@ -18,6 +18,7 @@
18AM_PROG_VALAC([0.12.1])18AM_PROG_VALAC([0.12.1])
19AS_IF([test -z "$VALAC"], [AC_MSG_ERROR(["No valac compiler found."])])19AS_IF([test -z "$VALAC"], [AC_MSG_ERROR(["No valac compiler found."])])
20AC_PROG_CC20AC_PROG_CC
21AC_PROG_CXX
21AM_PROG_CC_C_O22AM_PROG_CC_C_O
22AC_HEADER_STDC23AC_HEADER_STDC
23AC_LANG([C++])24AC_LANG([C++])
2425
=== modified file 'src/Makefile.am'
--- src/Makefile.am 2012-01-18 17:02:52 +0000
+++ src/Makefile.am 2012-01-25 08:25:28 +0000
@@ -61,10 +61,10 @@
61 $(NULL)61 $(NULL)
6262
63unity-package-search.o : $(srcdir)/unity-package-search.cc $(srcdir)/unity-package-search.h63unity-package-search.o : $(srcdir)/unity-package-search.cc $(srcdir)/unity-package-search.h
64 g++ -g $(unity_package_search_libs) -DGMENU_I_KNOW_THIS_IS_UNSTABLE `pkg-config --cflags --libs glib-2.0 libgnome-menu unity gee-1.0` -c $(srcdir)/unity-package-search.cc64 $(AM_V_GEN)$(CXX) -g $(unity_package_search_libs) -DGMENU_I_KNOW_THIS_IS_UNSTABLE `pkg-config --cflags --libs glib-2.0 libgnome-menu unity gee-1.0` -c $(srcdir)/unity-package-search.cc
6565
66unity-ratings-db.o : $(srcdir)/unity-ratings-db.c $(srcdir)/unity-ratings-db.h66unity-ratings-db.o : $(srcdir)/unity-ratings-db.c $(srcdir)/unity-ratings-db.h
67 gcc -g $(unity_ratings_db_libs) `pkg-config --cflags --libs glib-2.0` -c $(srcdir)/unity-ratings-db.c67 $(AM_V_CC)$(CC) -g $(unity_ratings_db_libs) `pkg-config --cflags --libs glib-2.0` -c $(srcdir)/unity-ratings-db.c
6868
69unity_applications_daemon_SOURCES = \69unity_applications_daemon_SOURCES = \
70 $(unity_applications_daemon_VALASOURCES:.vala=.c) \70 $(unity_applications_daemon_VALASOURCES:.vala=.c) \
7171
=== modified file 'src/daemon.vala'
--- src/daemon.vala 2012-01-24 16:20:35 +0000
+++ src/daemon.vala 2012-01-25 08:25:28 +0000
@@ -357,16 +357,10 @@
357 scope.queue_search_changed (SearchType.GLOBAL);357 scope.queue_search_changed (SearchType.GLOBAL);
358 }358 }
359359
360 private string prepare_zg_search_string (Unity.LensSearch? search,360 private string prepare_zg_search_string (Unity.LensSearch search,
361 string type_id="all")361 string type_id="all")
362 {362 {
363 string s;363 string s = search.search_string.strip ();
364 if (search != null)
365 s = search.search_string;
366 else
367 s = "";
368
369 s = s.strip ();
370 364
371 if (!s.has_suffix ("*") && s != "")365 if (!s.has_suffix ("*") && s != "")
372 s = s + "*";366 s = s + "*";
@@ -397,7 +391,7 @@
397391
398 string pkg_search_string = prepare_pkg_search_string (search, type_id);392 string pkg_search_string = prepare_pkg_search_string (search, type_id);
399393
400 bool has_search = !Utils.search_is_invalid (search);394 bool has_search = !Utils.is_search_empty (search);
401 395
402 Timer timer = new Timer ();396 Timer timer = new Timer ();
403397
@@ -475,7 +469,7 @@
475 else469 else
476 {470 {
477 timer.start ();471 timer.start ();
478 string? filter_query = prepare_pkg_search_string (null, type_id);472 string? filter_query = prepare_pkg_search_string (search, type_id);
479 var random_pkgresults = pkgsearcher.get_random_apps (filter_query, 12);473 var random_pkgresults = pkgsearcher.get_random_apps (filter_query, 12);
480 add_pkg_search_result (random_pkgresults, installed_uris, available_uris,474 add_pkg_search_result (random_pkgresults, installed_uris, available_uris,
481 model, Category.AVAILABLE, 6);475 model, Category.AVAILABLE, 6);
@@ -502,7 +496,7 @@
502 * hits under one Applications category496 * hits under one Applications category
503 */497 */
504 498
505 if (Utils.search_is_invalid (search))499 if (Utils.is_search_empty (search))
506 {500 {
507 yield update_global_without_search (search, cancellable);501 yield update_global_without_search (search, cancellable);
508 return;502 return;
@@ -576,9 +570,9 @@
576 search.finished ();570 search.finished ();
577 }571 }
578 572
579 private string prepare_pkg_search_string (Unity.LensSearch? search, string type_id="all")573 private string prepare_pkg_search_string (Unity.LensSearch search, string type_id="all")
580 {574 {
581 if (Utils.search_is_invalid (search))575 if (Utils.is_search_empty (search))
582 {576 {
583 if (type_id == "all")577 if (type_id == "all")
584 return "type:Application";578 return "type:Application";
585579
=== modified file 'src/runner.vala'
--- src/runner.vala 2011-12-07 16:21:04 +0000
+++ src/runner.vala 2012-01-25 08:25:28 +0000
@@ -139,7 +139,7 @@
139 model.clear ();139 model.clear ();
140140
141 var search_string = search.search_string;141 var search_string = search.search_string;
142 bool has_search = !Utils.search_is_invalid (search);142 bool has_search = !Utils.is_search_empty (search);
143143
144 string uri; 144 string uri;
145 Icon icon;145 Icon icon;
146146
=== modified file 'src/unity-package-search.cc'
--- src/unity-package-search.cc 2011-09-27 12:22:51 +0000
+++ src/unity-package-search.cc 2012-01-25 08:25:28 +0000
@@ -52,6 +52,11 @@
5252
53#include "unity-package-search.h"53#include "unity-package-search.h"
5454
55extern "C"
56{
57extern gchar* unity_applications_lens_utils_uncamelcase (const gchar* input);
58}
59
55struct _UnityPackageSearcher60struct _UnityPackageSearcher
56{61{
57 Xapian::Database *db;62 Xapian::Database *db;
@@ -169,14 +174,19 @@
169 /* Index full text data */174 /* Index full text data */
170 indexer->set_document(doc);175 indexer->set_document(doc);
171 if (gmenu_tree_entry_get_display_name (entry))176 if (gmenu_tree_entry_get_display_name (entry))
172 indexer->index_text(gmenu_tree_entry_get_display_name (entry), 5);177 {
178 dum1 = unity_applications_lens_utils_uncamelcase (
179 gmenu_tree_entry_get_display_name (entry));
180 indexer->index_text(dum1, 5);
181 g_free (dum1);
182 }
173 if (gmenu_tree_entry_get_name (entry))183 if (gmenu_tree_entry_get_name (entry))
174 indexer->index_text(gmenu_tree_entry_get_name (entry), 5);184 indexer->index_text(gmenu_tree_entry_get_name (entry), 5);
175 if (gmenu_tree_entry_get_comment (entry))185 if (gmenu_tree_entry_get_comment (entry))
176 indexer->index_text(gmenu_tree_entry_get_comment (entry), 0);186 indexer->index_text(gmenu_tree_entry_get_comment (entry), 0);
177 187
178 /* Index the XDG categories */188 /* Index the XDG categories */
179 appman = unity_app_info_manager_get_instance ();189 appman = unity_app_info_manager_get_default ();
180 cats = unity_app_info_manager_get_categories (appman, // const return190 cats = unity_app_info_manager_get_categories (appman, // const return
181 gmenu_tree_entry_get_desktop_file_id (entry),191 gmenu_tree_entry_get_desktop_file_id (entry),
182 &len);192 &len);
183193
=== modified file 'src/unity-ratings-db.c'
--- src/unity-ratings-db.c 2011-09-23 12:49:07 +0000
+++ src/unity-ratings-db.c 2012-01-25 08:25:28 +0000
@@ -168,7 +168,7 @@
168 if (data.size != 3*sizeof (gint32))168 if (data.size != 3*sizeof (gint32))
169 {169 {
170 g_critical ("Unexpected datum size from ratings database %i bytes. "170 g_critical ("Unexpected datum size from ratings database %i bytes. "
171 "Expected %i bytes", data.size, 3*sizeof (gint32));171 "Expected %lu bytes", data.size, 3*sizeof (gint32));
172 goto not_found;172 goto not_found;
173 }173 }
174 174
175175
=== modified file 'src/utils.vala'
--- src/utils.vala 2011-12-06 15:25:46 +0000
+++ src/utils.vala 2012-01-25 08:25:28 +0000
@@ -70,18 +70,52 @@
70 return actor;70 return actor;
71 }71 }
72 72
73 public bool search_is_invalid (Unity.LensSearch? search)73 public bool is_search_empty (Unity.LensSearch search)
74 {74 {
75 /* This boolean expression is unfolded as we seem to get75 if (search.search_string == null) return true;
76 * some null dereference if we join them in a big || expression */
77 if (search == null)
78 return true;
79 else if (search.search_string == null)
80 return true;
81
82 return search.search_string == "";76 return search.search_string == "";
83 }77 }
84 78
79 private static Regex camelcase_matcher;
80
81 public string uncamelcase (string text)
82 {
83 if (camelcase_matcher == null)
84 {
85 try
86 {
87 // 1+ upper characters followed by 1+ non-upper
88 // (but preceded by non-upper or start of the string)
89 camelcase_matcher = new Regex ("(?<=^|[^[:upper:]])[[:upper:]]+[^[:upper:]]+",
90 RegexCompileFlags.OPTIMIZE);
91 }
92 catch (Error e) { warning ("%s", e.message); }
93 }
94
95 /* we want to do "pyKaraoke" -> "py Karaoke",
96 "CompizConfig" -> "Compiz Config", but leave "System Monitor" alone
97 */
98 try
99 {
100 string result;
101 result = camelcase_matcher.replace_eval (text, -1, 0, 0,(mi, builder) =>
102 {
103 int start_pos;
104 mi.fetch_pos (0, out start_pos, null);
105 if (start_pos != 0) builder.append_c (' ');
106 builder.append (mi.fetch (0));
107
108 return false;
109 });
110 return result;
111 }
112 catch (Error e)
113 {
114 warning ("%s", e.message);
115 return text;
116 }
117 }
118
85 /* Substitute tilde character in @s by the home directory.119 /* Substitute tilde character in @s by the home directory.
86 * Expansion of ~username also works if 'username' is found. */120 * Expansion of ~username also works if 'username' is found. */
87 public string subst_tilde (string s)121 public string subst_tilde (string s)

Subscribers

People subscribed via source and target branches