From 5d6ef37862c7e9980841f3ed609bd1e5611323c0 Mon Sep 17 00:00:00 2001 From: Luciano Prestes Cavalcanti Date: Wed, 11 Feb 2015 10:45:30 -0200 Subject: [PATCH] Refactor sort_by_relevance and add unit tests --- lib/ext/search_helper.rb | 27 ++++++++++++--------------- test/unit/search_helper_test.rb | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 test/unit/search_helper_test.rb diff --git a/lib/ext/search_helper.rb b/lib/ext/search_helper.rb index 69671f8..2d43602 100644 --- a/lib/ext/search_helper.rb +++ b/lib/ext/search_helper.rb @@ -9,26 +9,23 @@ module SearchHelper def sort_by_relevance list, text text_splited = text.split - relevance_map = {} - list.each do |element| - relevance_map[element] = yield(element) - end - - list.sort! do |a, b| - found_in_a, found_in_b = 1, 1 + element_relevance = {} - relevance_list_a = relevance_map[a] - relevance_list_b = relevance_map[b] + list.each do |element| + relevance = 1 + relevance_list = yield(element) - text_splited.each do |q| - relevance_list_a.count.times do |i| - relevance = i * -1 - found_in_a = relevance if relevance_list_a[i].downcase.include?(q.downcase) - found_in_b = relevance if relevance_list_b[i].downcase.include?(q.downcase) + text_splited.each do |t| + relevance_list.count.times do |i| + relevance = -1 * i if relevance_list[i].downcase.include?(t.downcase) end end - found_in_a <=> found_in_b + element_relevance[element] = relevance + end + + list.sort! do |a, b| + element_relevance[a] <=> element_relevance[b] end list diff --git a/test/unit/search_helper_test.rb b/test/unit/search_helper_test.rb new file mode 100644 index 0000000..f9a38f8 --- /dev/null +++ b/test/unit/search_helper_test.rb @@ -0,0 +1,53 @@ +require File.dirname(__FILE__) + '/../../../../test/test_helper' +require File.dirname(__FILE__) + '/../../lib/ext/search_helper.rb' + +class SearchHelperTest < ActiveSupport::TestCase + + include SearchHelper + + should "return communities list with relevance by nickname" do + communities_list = [] + communities_list << Community.create(:name => "Help One", :nickname => "need") + communities_list << Community.create(:name => "Need Two", :nickname => "help") + communities_list << Community.create(:name => "Help Three", :nickname => "need") + communities_list << Community.create(:name => "Need Four", :nickname => "help") + + relevanced_list = sort_by_relevance(communities_list, "need") { |community| [community.nickname] } + + assert_equal relevanced_list[0].nickname, "need" + assert_equal relevanced_list[1].nickname, "need" + assert_equal relevanced_list[2].nickname, "help" + assert_equal relevanced_list[3].nickname, "help" + end + + should "return communities list with relevance by name" do + communities_list = [] + communities_list << Community.create(:name => "Help One", :nickname => "need") + communities_list << Community.create(:name => "Need Two", :nickname => "help") + communities_list << Community.create(:name => "Help Three", :nickname => "need") + communities_list << Community.create(:name => "Need Four", :nickname => "help") + + relevanced_list = sort_by_relevance(communities_list, "need") { |community| [community.name] } + + assert relevanced_list[0].name.include?("Need") + assert relevanced_list[1].name.include?("Need") + assert relevanced_list[2].name.include?("Help") + assert relevanced_list[3].name.include?("Help") + end + + should "return communities list with relevance by nickname first and custom_header second" do + communities_list = [] + communities_list << Community.create(:name => "Help One", :nickname => "need", :custom_header => "help") + communities_list << Community.create(:name => "Need Two", :nickname => "help", :custom_header => "need") + communities_list << Community.create(:name => "Help Three", :nickname => "need", :custom_header => "help") + communities_list << Community.create(:name => "Need Four", :nickname => "help", :custom_header => "help") + + relevanced_list = sort_by_relevance(communities_list, "need") { |community| [community.custom_header, community.nickname] } + + assert relevanced_list[0].nickname.include?("need") + assert relevanced_list[1].nickname.include?("need") + assert relevanced_list[2].custom_header.include?("need") + assert relevanced_list[3].custom_header.include?("help") + end + +end -- libgit2 0.21.2