Commit 2363d71019ffd14e77d5607b5ece34f052732e59
1 parent
7b7c6b1f
Exists in
elasticsearch_filter
and in
1 other branch
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>
Showing
6 changed files
with
59 additions
and
8 deletions
Show diff stats
plugins/elasticsearch/controllers/elasticsearch_plugin_controller.rb
@@ -22,12 +22,12 @@ class ElasticsearchPluginController < ApplicationController | @@ -22,12 +22,12 @@ class ElasticsearchPluginController < 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 < Grape::API | @@ -14,10 +14,14 @@ class ElasticsearchPlugin::API < 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 '../../helpers/searchable_model_helper' | @@ -4,6 +4,7 @@ require_relative '../../helpers/searchable_model_helper' | ||
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 |