dee

Merge lp:~mhr3/dee/locale-prefix-search into lp:dee

Proposed by Michal Hruby
Status: Merged
Approved by: Mikkel Kamstrup Erlandsen
Approved revision: 356
Merged at revision: 356
Proposed branch: lp:~mhr3/dee/locale-prefix-search
Merge into: lp:dee
Diff against target: 174 lines (+32/-15)
2 files modified
src/dee-tree-index.c (+30/-15)
tests/test-dee.c (+2/-0)
To merge this branch: bzr merge lp:~mhr3/dee/locale-prefix-search
Reviewer Review Type Date Requested Status
Mikkel Kamstrup Erlandsen (community) Approve
Review via email: mp+97855@code.launchpad.net

Commit message

Make sure we don't prefix-compare collation keys when searching in the index

Description of the change

Makes sure we don't prefix-compare collation keys when searching in the index, instead the original terms have to be prefix-compared.

Tests are now using non-C locale to make sure this doesn't regress (is that a good idea though?)

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

Great. Nice detective work there! :-)

I don't particularly mind setting the locale in the tests. If it ever becomes a problem we can set it to some hard coded value or something.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/dee-tree-index.c'
2--- src/dee-tree-index.c 2012-02-28 09:59:38 +0000
3+++ src/dee-tree-index.c 2012-03-16 11:57:22 +0000
4@@ -119,10 +119,12 @@
5
6 static GSequenceIter* find_term (GSequence *terms,
7 const gchar *term,
8+ const gchar *col_key,
9 DeeAnalyzer *analyzer);
10
11 static GSequenceIter* find_term_real (GSequence *terms,
12 const gchar *term,
13+ const gchar *col_key,
14 DeeAnalyzer *analyzer,
15 DeeTermMatchFlag flags);
16 /*
17@@ -214,14 +216,16 @@
18 /* Search priv->terms for a string from priv->term_list.
19 * ! Doesn't work for strings not in priv->term_list ! */
20 static GSequenceIter*
21-find_term (GSequence *terms, const gchar *term, DeeAnalyzer *analyzer)
22+find_term (GSequence *terms, const gchar *term, const gchar *col_key,
23+ DeeAnalyzer *analyzer)
24 {
25- return find_term_real (terms, term, analyzer, DEE_TERM_MATCH_EXACT);
26+ return find_term_real (terms, term, col_key, analyzer, DEE_TERM_MATCH_EXACT);
27 }
28
29 static GSequenceIter*
30 find_term_real (GSequence *terms,
31 const gchar *term,
32+ const gchar *col_key,
33 DeeAnalyzer *analyzer,
34 DeeTermMatchFlag flags)
35 {
36@@ -235,7 +239,7 @@
37 if (begin == end)
38 return NULL;
39
40- search_term.col_key = term;
41+ search_term.col_key = col_key;
42
43 if (flags & DEE_TERM_MATCH_EXACT)
44 {
45@@ -259,14 +263,14 @@
46 {
47 previous = g_sequence_iter_prev (previous);
48 term_result = g_sequence_get (previous);
49- if (g_str_has_prefix (term_result->col_key, term)) iter = previous;
50+ if (g_str_has_prefix (term_result->term, term)) iter = previous;
51 else break;
52 }
53 if (iter == found_iter)
54 {
55 /* We never checked this one */
56 term_result = g_sequence_get (iter);
57- if (g_str_has_prefix (term_result->col_key, term))
58+ if (g_str_has_prefix (term_result->term, term))
59 return iter;
60 }
61 else
62@@ -421,14 +425,16 @@
63 priv = DEE_TREE_INDEX (self)->priv;
64 analyzer = dee_index_get_analyzer (self);
65 col_key = dee_analyzer_collate_key (analyzer, term);
66- term_iter = find_term_real (priv->terms, col_key, analyzer, flags);
67+ term_iter = find_term_real (priv->terms, term, col_key, analyzer, flags);
68 g_free (col_key);
69
70 if (term_iter == NULL ||
71 term_iter == g_sequence_get_end_iter (priv->terms))
72- return dee_glist_result_set_new (NULL, /* The empty GList */
73- dee_index_get_model (self),
74- NULL);
75+ {
76+ return dee_glist_result_set_new (NULL, /* The empty GList */
77+ dee_index_get_model (self),
78+ NULL);
79+ }
80
81 if (flags & DEE_TERM_MATCH_EXACT)
82 {
83@@ -446,7 +452,8 @@
84 end = g_sequence_get_end_iter (priv->terms);
85 term_data = g_sequence_get (term_iter);
86
87- while (g_str_has_prefix (term_data->col_key, term))
88+ /* We can't use collation keys for prefix matching */
89+ while (g_str_has_prefix (term_data->term, term))
90 {
91 GList *rows = term_rows (term_data);
92 iter = rows;
93@@ -503,9 +510,11 @@
94 {
95 DeeTreeIndexPrivate *priv;
96 DeeModel *model;
97+ DeeAnalyzer *analyzer;
98 DeeResultSet *results;
99 GSequenceIter *iter, *end;
100 Term *term_data;
101+ gchar *col_key;
102
103 g_return_if_fail (DEE_IS_TREE_INDEX (self));
104 g_return_if_fail (func != NULL);
105@@ -517,8 +526,10 @@
106 iter = g_sequence_get_begin_iter (priv->terms);
107 else
108 {
109- iter = find_term (priv->terms, start_term, // FIXME: col key?
110- dee_index_get_analyzer (self));
111+ analyzer = dee_index_get_analyzer (self);
112+ col_key = dee_analyzer_collate_key (analyzer, start_term);
113+ iter = find_term (priv->terms, start_term, col_key, analyzer);
114+ g_free (col_key);
115 if (iter == NULL ||
116 iter == g_sequence_get_end_iter (priv->terms))
117 return;
118@@ -568,13 +579,16 @@
119 Term *term_data;
120 GSequenceIter *term_iter;
121 DeeAnalyzer *analyzer;
122+ gchar *col_key;
123
124 g_return_val_if_fail (DEE_IS_TREE_INDEX (self), 0);
125 g_return_val_if_fail (term != NULL, 0);
126
127 priv = DEE_TREE_INDEX (self)->priv;
128 analyzer = dee_index_get_analyzer (self);
129- term_iter = find_term (priv->terms, term, analyzer); // FIXME: col key?
130+ col_key = dee_analyzer_collate_key (analyzer, term);
131+ term_iter = find_term (priv->terms, term, col_key, analyzer);
132+ g_free (col_key);
133
134 if (term_iter == NULL ||
135 term_iter == g_sequence_get_end_iter (priv->terms))
136@@ -641,7 +655,7 @@
137 term = dee_term_list_get_term (priv->term_list, i);
138
139 /* Update priv->terms */
140- term_iter = find_term (priv->terms, colkey, analyzer);
141+ term_iter = find_term (priv->terms, term, colkey, analyzer);
142
143 if (term_iter == NULL ||
144 term_iter == g_sequence_get_end_iter (priv->terms))
145@@ -698,7 +712,8 @@
146 if (term_n_rows (term_data) == 0)
147 {
148 /* Removing the term from the sequence also frees it */
149- term_iter = find_term (priv->terms, term_data->col_key, analyzer);
150+ term_iter = find_term (priv->terms, term_data->term,
151+ term_data->col_key, analyzer);
152 g_sequence_remove (term_iter);
153 }
154 }
155
156=== modified file 'tests/test-dee.c'
157--- tests/test-dee.c 2012-01-25 12:51:48 +0000
158+++ tests/test-dee.c 2012-03-16 11:57:22 +0000
159@@ -20,6 +20,7 @@
160 #include "config.h"
161 #include <glib.h>
162 #include <glib-object.h>
163+#include <locale.h>
164
165 void test_model_column_create_suite (void);
166 void test_model_complex_column_create_suite (void);
167@@ -54,6 +55,7 @@
168 g_thread_init (NULL);
169
170 g_test_init (&argc, &argv, NULL);
171+ setlocale (LC_ALL, "");
172
173 test_model_column_create_suite ();
174 test_model_complex_column_create_suite ();

Subscribers

People subscribed via source and target branches

to all changes: