Commit 5d6ef37862c7e9980841f3ed609bd1e5611323c0

Authored by Luciano Prestes
Committed by Gabriela Navarro
1 parent d137d2ab
Exists in master and in 79 other branches add_sisp_to_chef, add_super_archives_plugin, api_for_colab, automates_core_packing, backup_not_prod, changes_in_buttons_on_content_panel, colab_automated_login, colab_spb_plugin_recipe, colab_widgets_settings, design_validation, dev_env_minimal, disable_email_dev, fix_breadcrumbs_position, fix_categories_software_link, fix_edit_institution, fix_edit_software_with_another_license, fix_get_license_info, fix_gitlab_assets_permission, fix_list_style_inside_article, fix_list_style_on_folder_elements, fix_members_pagination, fix_merge_request_url, fix_models_translations, fix_no_license, fix_software_api, fix_software_block_migration, fix_software_communities_translations, fix_software_communities_unit_test, fix_style_create_institution_admin_panel, fix_superarchives_imports, fix_sym_links_noosfero, focus_search_field_theme, gov-user-refactoring, gov-user-refactoring-rails4, header_fix, institution_modal_on_rating, kalibro-conf-refactoring, kalibro-processor-package, lxc_settings, margin_fix, mezuro_cookbook, prezento, refactor_download_block, refactor_software_communities, refactor_software_for_sisp, register_page, release-process, release-process-v2, remove-unused-images, remove_broken_theme, remove_secondary_email_from_user, remove_sisp_buttons, removing_super_archives_email, review_message, scope2method, signals_user_noosfero, sisp_catalog_header, sisp_colab_config, sisp_dev, sisp_dev_master, sisp_simple_version, software_as_organization, software_catalog_style_fix, software_communities_html_refactor, software_infos_api, spb_minimal_env, spb_to_rails4, spec_refactor, stable-4.1, stable-4.2, stable-4.x, temp_soft_comm_refactoring, theme_header, theme_javascript_refactory, thread_dropdown, thread_page, update_search_by_categories, update_software_api, update_softwares_boxes

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,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
test/unit/search_helper_test.rb 0 → 100644
@@ -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