Commit 5d6ef37862c7e9980841f3ed609bd1e5611323c0
Committed by
Gabriela Navarro
1 parent
d137d2ab
Exists in
master
and in
5 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 | ... | ... |