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,26 +9,23 @@ module SearchHelper | ||
9 | def sort_by_relevance list, text | 9 | def sort_by_relevance list, text |
10 | text_splited = text.split | 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 | end | 21 | end |
29 | end | 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 | end | 29 | end |
33 | 30 | ||
34 | list | 31 | list |
@@ -0,0 +1,53 @@ | @@ -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 |