Commit 2363d71019ffd14e77d5607b5ece34f052732e59

Authored by Macartur Sousa
1 parent 7b7c6b1f

Elasticsearch: Adding dynamic sort

* Adding more_popular and more_active to Community and Person
* Fixed Api to support dynamic filter

Signed-off-by: Macartur Sousa <macartur.sc@gmail.com>
plugins/elasticsearch/controllers/elasticsearch_plugin_controller.rb
@@ -22,12 +22,12 @@ class ElasticsearchPluginController &lt; ApplicationController @@ -22,12 +22,12 @@ class ElasticsearchPluginController &lt; ApplicationController
22 end 22 end
23 23
24 def define_searchable_types 24 def define_searchable_types
25 - @searchable_types = ElasticsearchHelper::searchable_types 25 + @searchable_types = searchable_types
26 @selected_type = (params[:selected_type]|| :all ).to_sym 26 @selected_type = (params[:selected_type]|| :all ).to_sym
27 end 27 end
28 28
29 def define_search_fields_types 29 def define_search_fields_types
30 - @filter_types = ElasticsearchHelper::filters 30 + @filter_types = filters
31 @selected_filter = (params[:filter] || :relevance).to_sym 31 @selected_filter = (params[:filter] || :relevance).to_sym
32 end 32 end
33 33
plugins/elasticsearch/helpers/elasticsearch_helper.rb
1 module ElasticsearchHelper 1 module ElasticsearchHelper
2 2
3 - def self.searchable_types 3 + def searchable_types
4 { 4 {
5 :all => { label: _("All Results")}, 5 :all => { label: _("All Results")},
6 :text_article => { label: _("Articles")}, 6 :text_article => { label: _("Articles")},
@@ -11,12 +11,20 @@ module ElasticsearchHelper @@ -11,12 +11,20 @@ module ElasticsearchHelper
11 } 11 }
12 end 12 end
13 13
14 - def self.filters  
15 - { 14 + def filters
  15 + filters = {
16 :relevance => { label: _("Relevance")}, 16 :relevance => { label: _("Relevance")},
17 :lexical => { label: _("Alphabetical")}, 17 :lexical => { label: _("Alphabetical")},
18 :more_recent => { label: _("More Recent")}, 18 :more_recent => { label: _("More Recent")},
19 } 19 }
  20 +
  21 + selected_type = params[:selected_type] || nil
  22 +
  23 + if selected_type
  24 + klass = selected_type.to_s.classify.constantize
  25 + filters.update klass.especific_filter if klass.respond_to? :especific_filter
  26 + end
  27 + filters
20 end 28 end
21 29
22 def process_results 30 def process_results
@@ -35,7 +43,7 @@ module ElasticsearchHelper @@ -35,7 +43,7 @@ module ElasticsearchHelper
35 begin 43 begin
36 klass = model.to_s.classify.constantize 44 klass = model.to_s.classify.constantize
37 45
38 - query = get_query params[:query], klass: klass, sort_by: get_sort_by(params[:filter]) 46 + query = get_query params[:query], klass: klass, sort_by: get_sort_by(params[:filter],klass)
39 klass.search(query, size: default_per_page(params[:per_page])).page(params[:page]).records 47 klass.search(query, size: default_per_page(params[:per_page])).page(params[:page]).records
40 rescue 48 rescue
41 [] 49 []
@@ -46,12 +54,14 @@ module ElasticsearchHelper @@ -46,12 +54,14 @@ module ElasticsearchHelper
46 per_page ||= 10 54 per_page ||= 10
47 end 55 end
48 56
49 - def get_sort_by sort_by 57 + def get_sort_by sort_by, klass=nil
50 case sort_by 58 case sort_by
51 when "lexical" 59 when "lexical"
52 { "name.raw" => {"order" => "asc" }} 60 { "name.raw" => {"order" => "asc" }}
53 when "more_recent" 61 when "more_recent"
54 { "created_at" => {"order" => "desc"}} 62 { "created_at" => {"order" => "desc"}}
  63 + else
  64 + ( klass and klass.respond_to?(:get_sort_by) ) ? klass.get_sort_by(sort_by) : nil
55 end 65 end
56 end 66 end
57 67
plugins/elasticsearch/lib/elasticsearch_plugin/api.rb
@@ -14,10 +14,14 @@ class ElasticsearchPlugin::API &lt; Grape::API @@ -14,10 +14,14 @@ class ElasticsearchPlugin::API &lt; Grape::API
14 end 14 end
15 15
16 get 'types' do 16 get 'types' do
17 - types = {types: ElasticsearchHelper::searchable_types.stringify_keys.keys} 17 + types = {types: searchable_types.stringify_keys.keys }
18 present types, with: Grape::Presenters::Presenter 18 present types, with: Grape::Presenters::Presenter
19 end 19 end
20 20
  21 + get 'filters' do
  22 + present filters, with: Grape::Presenters::Presenter
  23 + end
  24 +
21 end 25 end
22 26
23 end 27 end
plugins/elasticsearch/lib/ext/community.rb
@@ -7,6 +7,8 @@ class Community @@ -7,6 +7,8 @@ class Community
7 { 7 {
8 :secret => { type: :boolean }, 8 :secret => { type: :boolean },
9 :visible => { type: :boolean }, 9 :visible => { type: :boolean },
  10 + :activities_count => { type: :integer },
  11 + :members_count => { type: :integer }
10 } 12 }
11 end 13 end
12 14
@@ -21,5 +23,21 @@ class Community @@ -21,5 +23,21 @@ class Community
21 ] 23 ]
22 end 24 end
23 25
  26 + def self.especific_filter
  27 + {
  28 + :more_active => { label: _("More Active") },
  29 + :more_popular => { label: _("More Popular") }
  30 + }
  31 + end
  32 +
  33 + def self.get_sort_by sort_by
  34 + case sort_by
  35 + when "more_active"
  36 + { :activities_count => {order: :desc}}
  37 + when "more_popular"
  38 + { :members_count => {order: :desc} }
  39 + end
  40 + end
  41 +
24 include SearchableModelHelper 42 include SearchableModelHelper
25 end 43 end
plugins/elasticsearch/lib/ext/event.rb
@@ -4,6 +4,7 @@ require_relative &#39;../../helpers/searchable_model_helper&#39; @@ -4,6 +4,7 @@ require_relative &#39;../../helpers/searchable_model_helper&#39;
4 require_relative '../../helpers/nested_helper/profile' 4 require_relative '../../helpers/nested_helper/profile'
5 5
6 class Event 6 class Event
  7 + #TODO: o filtro é feito de forma diferente do artigo
7 8
8 def self.control_fields 9 def self.control_fields
9 { 10 {
plugins/elasticsearch/lib/ext/person.rb
@@ -8,6 +8,8 @@ class Person @@ -8,6 +8,8 @@ class Person
8 { 8 {
9 :visible => {type: 'boolean'}, 9 :visible => {type: 'boolean'},
10 :secret => { type: :boolean }, 10 :secret => { type: :boolean },
  11 + :activities_count => { type: :integer },
  12 + :friends_count => { type: :integer }
11 } 13 }
12 end 14 end
13 15
@@ -22,5 +24,21 @@ class Person @@ -22,5 +24,21 @@ class Person
22 ] 24 ]
23 end 25 end
24 26
  27 + def self.especific_filter
  28 + {
  29 + :more_active => { label: _("More Active") },
  30 + :more_popular => { label: _("More Popular") }
  31 + }
  32 + end
  33 +
  34 + def self.get_sort_by sort_by
  35 + case sort_by
  36 + when "more_active"
  37 + { :activities_count => {order: :desc}}
  38 + when "more_popular"
  39 + { :friends_count => {order: :desc} }
  40 + end
  41 + end
  42 +
25 include SearchableModelHelper 43 include SearchableModelHelper
26 end 44 end