Commit 5d6ef37862c7e9980841f3ed609bd1e5611323c0
Committed by
Gabriela Navarro
1 parent
d137d2ab
Exists in
master
and in
79 other branches
Refactor sort_by_relevance and add unit tests
Signed-off-by: Fabio Teixeira <fabio1079@gmail.com> Signed-off-by: Luciano Prestes <lucianopcbr@gmail.com>
Showing
2 changed files
with
65 additions
and
15 deletions
Show diff stats
lib/ext/search_helper.rb
... | ... | @@ -9,26 +9,23 @@ module SearchHelper |
9 | 9 | def sort_by_relevance list, text |
10 | 10 | text_splited = text.split |
11 | 11 | |
12 | - relevance_map = {} | |
13 | - list.each do |element| | |
14 | - relevance_map[element] = yield(element) | |
15 | - end | |
16 | - | |
17 | - list.sort! do |a, b| | |
18 | - found_in_a, found_in_b = 1, 1 | |
12 | + element_relevance = {} | |
19 | 13 | |
20 | - relevance_list_a = relevance_map[a] | |
21 | - relevance_list_b = relevance_map[b] | |
14 | + list.each do |element| | |
15 | + relevance = 1 | |
16 | + relevance_list = yield(element) | |
22 | 17 | |
23 | - text_splited.each do |q| | |
24 | - relevance_list_a.count.times do |i| | |
25 | - relevance = i * -1 | |
26 | - found_in_a = relevance if relevance_list_a[i].downcase.include?(q.downcase) | |
27 | - found_in_b = relevance if relevance_list_b[i].downcase.include?(q.downcase) | |
18 | + text_splited.each do |t| | |
19 | + relevance_list.count.times do |i| | |
20 | + relevance = -1 * i if relevance_list[i].downcase.include?(t.downcase) | |
28 | 21 | end |
29 | 22 | end |
30 | 23 | |
31 | - found_in_a <=> found_in_b | |
24 | + element_relevance[element] = relevance | |
25 | + end | |
26 | + | |
27 | + list.sort! do |a, b| | |
28 | + element_relevance[a] <=> element_relevance[b] | |
32 | 29 | end |
33 | 30 | |
34 | 31 | list | ... | ... |
... | ... | @@ -0,0 +1,53 @@ |
1 | +require File.dirname(__FILE__) + '/../../../../test/test_helper' | |
2 | +require File.dirname(__FILE__) + '/../../lib/ext/search_helper.rb' | |
3 | + | |
4 | +class SearchHelperTest < ActiveSupport::TestCase | |
5 | + | |
6 | + include SearchHelper | |
7 | + | |
8 | + should "return communities list with relevance by nickname" do | |
9 | + communities_list = [] | |
10 | + communities_list << Community.create(:name => "Help One", :nickname => "need") | |
11 | + communities_list << Community.create(:name => "Need Two", :nickname => "help") | |
12 | + communities_list << Community.create(:name => "Help Three", :nickname => "need") | |
13 | + communities_list << Community.create(:name => "Need Four", :nickname => "help") | |
14 | + | |
15 | + relevanced_list = sort_by_relevance(communities_list, "need") { |community| [community.nickname] } | |
16 | + | |
17 | + assert_equal relevanced_list[0].nickname, "need" | |
18 | + assert_equal relevanced_list[1].nickname, "need" | |
19 | + assert_equal relevanced_list[2].nickname, "help" | |
20 | + assert_equal relevanced_list[3].nickname, "help" | |
21 | + end | |
22 | + | |
23 | + should "return communities list with relevance by name" do | |
24 | + communities_list = [] | |
25 | + communities_list << Community.create(:name => "Help One", :nickname => "need") | |
26 | + communities_list << Community.create(:name => "Need Two", :nickname => "help") | |
27 | + communities_list << Community.create(:name => "Help Three", :nickname => "need") | |
28 | + communities_list << Community.create(:name => "Need Four", :nickname => "help") | |
29 | + | |
30 | + relevanced_list = sort_by_relevance(communities_list, "need") { |community| [community.name] } | |
31 | + | |
32 | + assert relevanced_list[0].name.include?("Need") | |
33 | + assert relevanced_list[1].name.include?("Need") | |
34 | + assert relevanced_list[2].name.include?("Help") | |
35 | + assert relevanced_list[3].name.include?("Help") | |
36 | + end | |
37 | + | |
38 | + should "return communities list with relevance by nickname first and custom_header second" do | |
39 | + communities_list = [] | |
40 | + communities_list << Community.create(:name => "Help One", :nickname => "need", :custom_header => "help") | |
41 | + communities_list << Community.create(:name => "Need Two", :nickname => "help", :custom_header => "need") | |
42 | + communities_list << Community.create(:name => "Help Three", :nickname => "need", :custom_header => "help") | |
43 | + communities_list << Community.create(:name => "Need Four", :nickname => "help", :custom_header => "help") | |
44 | + | |
45 | + relevanced_list = sort_by_relevance(communities_list, "need") { |community| [community.custom_header, community.nickname] } | |
46 | + | |
47 | + assert relevanced_list[0].nickname.include?("need") | |
48 | + assert relevanced_list[1].nickname.include?("need") | |
49 | + assert relevanced_list[2].custom_header.include?("need") | |
50 | + assert relevanced_list[3].custom_header.include?("help") | |
51 | + end | |
52 | + | |
53 | +end | ... | ... |