Commit 5d6ef37862c7e9980841f3ed609bd1e5611323c0

Authored by Luciano Prestes
Committed by Gabriela Navarro
1 parent d137d2ab

Refactor sort_by_relevance and add unit tests

Signed-off-by: Fabio Teixeira <fabio1079@gmail.com>
Signed-off-by: Luciano Prestes <lucianopcbr@gmail.com>
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
... ...
test/unit/search_helper_test.rb 0 → 100644
... ... @@ -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
... ...