Commit af8e20d4725f971b7d613fd9bad48a3edf39e67c

Authored by Macartur Sousa
1 parent b2ee20a1
Exists in fix_sign_up_form

Elasticsearch: Changed models and adding tests

Signed-off-by: Macartur Sousa <macartur.sc@gmail.com>
plugins/elasticsearch/Gemfile
1 source 'https://rubygems.org' 1 source 'https://rubygems.org'
2 2
3 gem 'elasticsearch-model' 3 gem 'elasticsearch-model'
4 -gem 'elasticsearch-rails' 4 +gem 'elasticsearch-rails'
  5 +gem 'elasticsearch-extensions'
plugins/elasticsearch/controllers/elasticsearch_plugin_controller.rb
@@ -5,24 +5,16 @@ class ElasticsearchPluginController &lt; ApplicationController @@ -5,24 +5,16 @@ class ElasticsearchPluginController &lt; ApplicationController
5 @results = [] 5 @results = []
6 @query = params[:q] 6 @query = params[:q]
7 @checkbox = {} 7 @checkbox = {}
8 - terms = get_terms(params)  
9 - puts "=" * 80, terms, "=" * 80 8 +
10 if params[:model].present? 9 if params[:model].present?
11 params[:model].keys.each do |model| 10 params[:model].keys.each do |model|
12 @checkbox[model.to_sym] = true 11 @checkbox[model.to_sym] = true
13 klass = model.classify.constantize 12 klass = model.classify.constantize
14 query = get_query params[:q], klass 13 query = get_query params[:q], klass
15 - @results += klass.__elasticsearch__.search(query).records.to_a 14 + @results |= klass.__elasticsearch__.search(query).records.to_a
16 end 15 end
17 end 16 end
18 17
19 - if params[:filter].present?  
20 - params[:filter].keys.each do |model|  
21 - params[:filter][model].keys.each do |filter|  
22 - @checkbox[filter.to_sym] = true  
23 - end  
24 - end  
25 - end  
26 end 18 end
27 19
28 private 20 private
plugins/elasticsearch/lib/elasticsearch_plugin.rb
1 class ElasticsearchPlugin < Noosfero::Plugin 1 class ElasticsearchPlugin < Noosfero::Plugin
2 2
3 def self.plugin_name 3 def self.plugin_name
4 - # FIXME  
5 "ElasticsearchPlugin" 4 "ElasticsearchPlugin"
6 end 5 end
7 6
8 def self.plugin_description 7 def self.plugin_description
9 - # FIXME  
10 - _("A plugin that does this and that.") 8 + _("This plugin is used to communicate a elasticsearch to privide a search.")
11 end 9 end
12 10
13 - Noosfero::Application.class_eval do  
14 - config.after_initialize do 11 + # load all models to provide searchable fields
  12 + require_relative "load_models"
15 13
16 - Rails.application.eager_load! #TODO: REMOVE THIS LINE  
17 -  
18 - models = ActiveRecord::Base.descendants.select do |model|  
19 - model.const_defined?("SEARCHABLE_FIELDS")  
20 - end  
21 -  
22 - models.each do |model|  
23 - model.class_eval do  
24 - include Elasticsearch::Model  
25 - include Elasticsearch::Model::Callbacks  
26 -  
27 - settings index: { number_of_shards: 1 } do  
28 - mappings dynamic: 'false' do  
29 - model::SEARCHABLE_FIELDS.each do |field, value|  
30 - indexes field  
31 - end  
32 - end  
33 - model.__elasticsearch__.client.indices.delete \  
34 - index: model.index_name rescue nil  
35 - model.__elasticsearch__.client.indices.create \  
36 - index: model.index_name,  
37 - body: {  
38 - settings: model.settings.to_hash,  
39 - mappings: model.mappings.to_hash  
40 - }  
41 -  
42 - model.import  
43 - end  
44 - end  
45 - end  
46 - end  
47 - end  
48 end 14 end
plugins/elasticsearch/lib/load_models.rb 0 → 100644
@@ -0,0 +1,59 @@ @@ -0,0 +1,59 @@
  1 +Noosfero::Application.class_eval do
  2 +
  3 + config.after_initialize do
  4 + Rails.application.eager_load! #TODO: REMOVE THIS LINE
  5 + indeces_models searchables_models
  6 + end
  7 +
  8 + def searchables_models
  9 + ActiveRecord::Base.descendants.select do |model|
  10 + model.const_defined?("SEARCHABLE_FIELDS")
  11 + end
  12 + end
  13 +
  14 + def indeces_models models
  15 + indexed_models = Array.new
  16 + models.each do |model|
  17 + next if indexed_models.include? model
  18 +
  19 + create_searchable_model model
  20 + indexed_models.push model
  21 +
  22 + if model.descendants.count > 0
  23 + model.descendants.each { | descendant_model|
  24 + indexed_models.push descendant_model
  25 + create_searchable_model descendant_model
  26 + }
  27 + end
  28 +
  29 + end
  30 +
  31 + end
  32 +
  33 + def create_searchable_model model
  34 + model.class_eval do
  35 + include Elasticsearch::Model
  36 + include Elasticsearch::Model::Callbacks
  37 + settings index: { number_of_shards: 1 } do
  38 + mappings dynamic: 'false' do
  39 + model::SEARCHABLE_FIELDS.each do |field, value|
  40 + indexes field
  41 + end
  42 + end
  43 +
  44 + model.__elasticsearch__.client.indices.delete \
  45 + index: model.index_name rescue nil
  46 +
  47 + model.__elasticsearch__.client.indices.create \
  48 + index: model.index_name,
  49 + body: {
  50 + settings: model.settings.to_hash,
  51 + mappings: model.mappings.to_hash
  52 + }
  53 +
  54 + model.import
  55 + end
  56 + end
  57 + end
  58 +
  59 +end
plugins/elasticsearch/views/elasticsearch_plugin/_article_display.html.erb
1 1
2 -Article: <%= article.name %> 2 +Article: <%= article.id %><%= article.name %>
plugins/elasticsearch/views/elasticsearch_plugin/search.html.erb
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 <%= check_box_tag 'model[articles]', 1, @checkbox[:articles] %> 15 <%= check_box_tag 'model[articles]', 1, @checkbox[:articles] %>
16 <%= label_tag('articles', _("articles")) %> 16 <%= label_tag('articles', _("articles")) %>
17 17
18 - <%= check_box_tag 'filter[articles][gallery]', :type, @checkbox[:gallery] %> 18 + <%= check_box_tag 'model[gallery]', :type, @checkbox[:gallery] %>
19 <%= label_tag('gallery', _("gallery")) %> 19 <%= label_tag('gallery', _("gallery")) %>
20 <% end %> 20 <% end %>
21 21
spec/models/community_spec.rb
@@ -2,37 +2,22 @@ require &#39;rails_helper&#39; @@ -2,37 +2,22 @@ require &#39;rails_helper&#39;
2 require 'rake' 2 require 'rake'
3 require 'elasticsearch/extensions/test/cluster/tasks' 3 require 'elasticsearch/extensions/test/cluster/tasks'
4 4
5 -RSpec.configure do |config|  
6 - config.before :each, elasticsearch: true do  
7 - puts '='*10, 'before', '='*10  
8 - Elasticsearch::Extensions::Test::Cluster.start() unless Elasticsearch::Extensions::Test::Cluster.running?  
9 - end  
10 -  
11 - config.after :suite do  
12 - puts '='*10, 'after', '='*10  
13 - Elasticsearch::Extensions::Test::Cluster.stop() if Elasticsearch::Extensions::Test::Cluster.running?  
14 - end  
15 -end  
16 -  
17 -RSpec.describe Community, type: :model, elasticsearch: true do 5 +describe Community, type: :model, elasticsearch: true do
18 before do 6 before do
19 - Environment.create!(:name => 'Noosfero', :contact_email => 'noosfero@localhost.localdomain', :is_default => true)  
20 -  
21 @environment = Environment.default 7 @environment = Environment.default
22 @environment.enabled_plugins = ['ElasticsearchPlugin'] 8 @environment.enabled_plugins = ['ElasticsearchPlugin']
23 @environment.save! 9 @environment.save!
24 10
25 @community = Community.new(name: "Debian") 11 @community = Community.new(name: "Debian")
26 @community.save! 12 @community.save!
27 -  
28 - sleep 2 13 + _start = Time.new
  14 + Article.import
  15 + sleep 4
  16 + p Article.__elasticsearch__.client.cluster.health
29 end 17 end
30 18
31 it "assert true" do 19 it "assert true" do
32 - communities = Community.__elasticsearch__.search({}).records.to_a  
33 -  
34 - p communities  
35 - 20 + Article.__elasticsearch__.search({}).records.to_a
36 expect(true).to be true 21 expect(true).to be true
37 end 22 end
38 end 23 end
spec/spec_helper.rb
@@ -16,7 +16,11 @@ @@ -16,7 +16,11 @@
16 # users commonly want. 16 # users commonly want.
17 # 17 #
18 # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration 18 # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
  19 +require 'rake'
  20 +require 'elasticsearch/extensions/test/cluster/tasks'
  21 +
19 RSpec.configure do |config| 22 RSpec.configure do |config|
  23 +
20 # rspec-expectations config goes here. You can use an alternate 24 # rspec-expectations config goes here. You can use an alternate
21 # assertion/expectation library such as wrong or the stdlib/minitest 25 # assertion/expectation library such as wrong or the stdlib/minitest
22 # assertions if you prefer. 26 # assertions if you prefer.