dee

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

Proposed by Michal Hruby
Status: Merged
Approved by: Mikkel Kamstrup Erlandsen
Approved revision: 344
Merged at revision: 345
Proposed branch: lp:~mhr3/dee/fix-prefix-search
Merge into: lp:dee
Diff against target: 129 lines (+68/-10)
2 files modified
src/dee-tree-index.c (+24/-10)
tests/test-index.c (+44/-0)
To merge this branch: bzr merge lp:~mhr3/dee/fix-prefix-search
Reviewer Review Type Date Requested Status
Mikkel Kamstrup Erlandsen (community) Approve
Review via email: mp+93307@code.launchpad.net

Description of the change

Fixes a bug in prefix searching.

Added tests for the issue.

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

Tests pass and code looks swell

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/dee-tree-index.c'
--- src/dee-tree-index.c 2011-11-29 12:17:25 +0000
+++ src/dee-tree-index.c 2012-02-15 22:09:17 +0000
@@ -226,7 +226,7 @@
226 DeeTermMatchFlag flags)226 DeeTermMatchFlag flags)
227{227{
228 Term search_term, *term_result;228 Term search_term, *term_result;
229 GSequenceIter *iter, *begin, *end;229 GSequenceIter *found_iter, *iter, *previous, *begin, *end;
230230
231 begin = g_sequence_get_begin_iter (terms);231 begin = g_sequence_get_begin_iter (terms);
232 end = g_sequence_get_end_iter (terms);232 end = g_sequence_get_end_iter (terms);
@@ -239,24 +239,38 @@
239239
240 if (flags & DEE_TERM_MATCH_EXACT)240 if (flags & DEE_TERM_MATCH_EXACT)
241 {241 {
242 // FIXME: do we need to make sure this is the first iter?
242 return g_sequence_lookup (terms, &search_term,243 return g_sequence_lookup (terms, &search_term,
243 (GCompareDataFunc) term_cmp, analyzer);244 (GCompareDataFunc) term_cmp, analyzer);
244 }245 }
245 else if (flags & DEE_TERM_MATCH_PREFIX)246 else if (flags & DEE_TERM_MATCH_PREFIX)
246 {247 {
247 iter = g_sequence_search (terms, &search_term,248 found_iter = g_sequence_search (terms, &search_term,
248 (GCompareDataFunc) term_cmp, analyzer);249 (GCompareDataFunc) term_cmp, analyzer);
249 term_result = g_sequence_get (iter);250
250 if (g_str_has_prefix (term_result->col_key, term))251 /* What can happen now is:
251 return iter;252 * 1) found_iter has our prefix
252 else if (iter != begin)253 * 2) found_iter as well as the found_iter->previous have our prefix
253 {254 * 3) found_iter doesn't have it, but found_iter->previous does
254 /* We might be placed immediately after the iter we want */255 * 4) there isn't any nearby iter that has the prefix */
255 iter = g_sequence_iter_prev (iter);256 previous = iter = found_iter;
257 /* We might be placed after the iter we want */
258 while (previous != begin)
259 {
260 previous = g_sequence_iter_prev (previous);
261 term_result = g_sequence_get (previous);
262 if (g_str_has_prefix (term_result->col_key, term)) iter = previous;
263 else break;
264 }
265 if (iter == found_iter)
266 {
267 /* We never checked this one */
256 term_result = g_sequence_get (iter);268 term_result = g_sequence_get (iter);
257 if (g_str_has_prefix (term_result->col_key, term))269 if (g_str_has_prefix (term_result->col_key, term))
258 return iter;270 return iter;
259 }271 }
272 else
273 return iter;
260 }274 }
261 else275 else
262 {276 {
263277
=== modified file 'tests/test-index.c'
--- tests/test-index.c 2011-12-14 10:49:16 +0000
+++ tests/test-index.c 2012-02-15 22:09:17 +0000
@@ -369,6 +369,47 @@
369}369}
370370
371static void371static void
372test_prefix_2_rows (Fixture *fix, gconstpointer data)
373{
374 DeeModelIter *iter, *i0, *i1;
375 DeeResultSet *results;
376
377 g_assert (dee_index_get_supported_term_match_flags (fix->index) &
378 DEE_TERM_MATCH_PREFIX);
379
380 i0 = dee_model_append (fix->model, "Caravan scrap yard", 0);
381 i1 = dee_model_append (fix->model, "Scraper foo", 1);
382
383 /* NOTE: We can NOT infer anything about the ordering of the matching
384 * iters inside a single term */
385 results = dee_index_lookup (fix->index, "scrap", DEE_TERM_MATCH_PREFIX);
386 g_assert_cmpint (dee_result_set_get_n_rows (results), ==, 2);
387 iter = dee_result_set_next (results);
388 g_assert (iter == i0 || iter == i1);
389 iter = dee_result_set_next (results);
390 g_assert (iter == i0 || iter == i1);
391 g_object_unref (results);
392
393 results = dee_index_lookup (fix->index, "scra", DEE_TERM_MATCH_PREFIX);
394 g_assert_cmpint (dee_result_set_get_n_rows (results), ==, 2);
395 iter = dee_result_set_next (results);
396 g_assert (iter == i0 || iter == i1);
397 iter = dee_result_set_next (results);
398 g_assert (iter == i0 || iter == i1);
399 g_object_unref (results);
400
401 results = dee_index_lookup (fix->index, "scraper", DEE_TERM_MATCH_PREFIX);
402 g_assert_cmpint (dee_result_set_get_n_rows (results), ==, 1);
403 iter = dee_result_set_next (results);
404 g_assert (iter == i1);
405 g_object_unref (results);
406
407 results = dee_index_lookup (fix->index, "scraperer", DEE_TERM_MATCH_PREFIX);
408 g_assert_cmpint (dee_result_set_get_n_rows (results), ==, 0);
409 g_object_unref (results);
410}
411
412static void
372test_prefix_3_rows (Fixture *fix, gconstpointer data)413test_prefix_3_rows (Fixture *fix, gconstpointer data)
373{414{
374 DeeModelIter *iter, *i0, *i1;415 DeeModelIter *iter, *i0, *i1;
@@ -393,6 +434,7 @@
393434
394 results = dee_index_lookup (fix->index, "hel", DEE_TERM_MATCH_PREFIX);435 results = dee_index_lookup (fix->index, "hel", DEE_TERM_MATCH_PREFIX);
395 g_assert_cmpint (dee_result_set_get_n_rows (results), ==, 2);436 g_assert_cmpint (dee_result_set_get_n_rows (results), ==, 2);
437 iter = dee_result_set_next (results);
396 g_assert (iter == i0 || iter == i1);438 g_assert (iter == i0 || iter == i1);
397 iter = dee_result_set_next (results);439 iter = dee_result_set_next (results);
398 g_assert (iter == i0 || iter == i1);440 g_assert (iter == i0 || iter == i1);
@@ -470,6 +512,8 @@
470 setup_text_tree, test_text_with_dupe_terms_per_row, teardown);512 setup_text_tree, test_text_with_dupe_terms_per_row, teardown);
471 g_test_add ("/Index/Tree/Prefix1Row", Fixture, 0,513 g_test_add ("/Index/Tree/Prefix1Row", Fixture, 0,
472 setup_text_tree, test_prefix_1_row, teardown);514 setup_text_tree, test_prefix_1_row, teardown);
515 g_test_add ("/Index/Tree/Prefix2Rows", Fixture, 0,
516 setup_text_tree, test_prefix_2_rows, teardown);
473 g_test_add ("/Index/Tree/Prefix3Rows", Fixture, 0,517 g_test_add ("/Index/Tree/Prefix3Rows", Fixture, 0,
474 setup_text_tree, test_prefix_3_rows, teardown);518 setup_text_tree, test_prefix_3_rows, teardown);
475 g_test_add ("/Index/Tree/Prefix4RowsAndClear", Fixture, 0,519 g_test_add ("/Index/Tree/Prefix4RowsAndClear", Fixture, 0,

Subscribers

People subscribed via source and target branches

to all changes: