Commit 6ff0271273650a90deaabb452d130c34dcbd5f8b
1 parent
c893df1c
Exists in
master
and in
29 other branches
Moving acts as searchable to the plugin
Showing
4 changed files
with
47 additions
and
134 deletions
Show diff stats
lib/acts_as_searchable.rb
... | ... | @@ -1,87 +0,0 @@ |
1 | -module ActsAsSearchable | |
2 | - | |
3 | - module ClassMethods | |
4 | - ACTS_AS_SEARCHABLE_ENABLED = true unless defined? ACTS_AS_SEARCHABLE_ENABLED | |
5 | - | |
6 | - def acts_as_searchable(options = {}) | |
7 | - return if !ACTS_AS_SEARCHABLE_ENABLED | |
8 | - | |
9 | - if options[:fields] | |
10 | - options[:fields] << {:schema_name => :string} | |
11 | - else | |
12 | - options[:additional_fields] ||= [] | |
13 | - options[:additional_fields] << {:schema_name => :string} | |
14 | - end | |
15 | - | |
16 | - acts_as_solr options | |
17 | - extend FindByContents | |
18 | - send :include, InstanceMethods | |
19 | - end | |
20 | - | |
21 | - module InstanceMethods | |
22 | - def schema_name | |
23 | - self.class.schema_name | |
24 | - end | |
25 | - | |
26 | - # replace solr_id from vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/instance_methods.rb | |
27 | - # to include schema_name | |
28 | - def solr_id | |
29 | - id = "#{self.class.name}:#{record_id(self)}" | |
30 | - id.insert(0, "#{schema_name}:") unless schema_name.blank? | |
31 | - id | |
32 | - end | |
33 | - end | |
34 | - | |
35 | - module FindByContents | |
36 | - | |
37 | - def schema_name | |
38 | - (Noosfero::MultiTenancy.on? and ActiveRecord::Base.postgresql?) ? ActiveRecord::Base.connection.schema_search_path : '' | |
39 | - end | |
40 | - | |
41 | - def find_by_contents(query, pg_options = {}, options = {}, db_options = {}) | |
42 | - pg_options[:page] ||= 1 | |
43 | - pg_options[:per_page] ||= 20 | |
44 | - options[:page] = pg_options[:page].to_i | |
45 | - options[:per_page] = pg_options[:per_page].to_i | |
46 | - options[:scores] ||= true | |
47 | - options[:filter_queries] ||= [] | |
48 | - options[:filter_queries] << "schema_name:\"#{schema_name}\"" unless schema_name.blank? | |
49 | - all_facets_enabled = options.delete(:all_facets) | |
50 | - options[:per_page] = options.delete(:extra_limit) if options[:extra_limit] | |
51 | - results = [] | |
52 | - facets = all_facets = {} | |
53 | - | |
54 | - solr_result = find_by_solr(query, options) | |
55 | - if all_facets_enabled | |
56 | - options[:facets][:browse] = nil | |
57 | - all_facets = find_by_solr(query, options.merge(:per_page => 0)).facets | |
58 | - end | |
59 | - | |
60 | - if !solr_result.nil? | |
61 | - facets = options.include?(:facets) ? solr_result.facets : [] | |
62 | - | |
63 | - if db_options.empty? | |
64 | - results = solr_result | |
65 | - else | |
66 | - ids = solr_result.results.map{ |r| r[:id].to_i } | |
67 | - if ids.empty? | |
68 | - ids << -1 | |
69 | - end | |
70 | - | |
71 | - if db_options[:conditions] | |
72 | - db_options[:conditions] = sanitize_sql_for_conditions(db_options[:conditions]) + " and #{table_name}.id in (#{ids.join(', ')})" | |
73 | - else | |
74 | - db_options[:conditions] = "#{table_name}.id in (#{ids.join(', ')})" | |
75 | - end | |
76 | - | |
77 | - results = find(:all, db_options) | |
78 | - end | |
79 | - end | |
80 | - | |
81 | - {:results => results, :facets => facets, :all_facets => all_facets} | |
82 | - end | |
83 | - end | |
84 | - end | |
85 | -end | |
86 | - | |
87 | -ActiveRecord::Base.send(:extend, ActsAsSearchable::ClassMethods) |
plugins/solr/dependencies.rb
... | ... | @@ -0,0 +1,46 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | +require "#{File.dirname(__FILE__)}../../lib/acts_as_searchable" | |
3 | + | |
4 | +class ActsAsSearchableTest < ActiveSupport::TestCase | |
5 | + | |
6 | + def setup | |
7 | + @test_model = Class.new ActiveRecord::Base | |
8 | + end | |
9 | + | |
10 | + def silent | |
11 | + # http://mentalized.net/journal/2010/04/02/suppress_warnings_from_ruby/ | |
12 | + original_verbosity = $VERBOSE | |
13 | + $VERBOSE = nil | |
14 | + result = yield | |
15 | + $VERBOSE = original_verbosity | |
16 | + return result | |
17 | + end | |
18 | + | |
19 | + should 'be enabled by default' do | |
20 | + assert ActsAsSearchable::ClassMethods::ACTS_AS_SEARCHABLE_ENABLED, true | |
21 | + end | |
22 | + | |
23 | + should 'not be searchable when disabled' do | |
24 | + # suppress warning about already initialized constant | |
25 | + silent { ActsAsSearchable::ClassMethods::ACTS_AS_SEARCHABLE_ENABLED = false } | |
26 | + | |
27 | + @test_model.expects(:acts_as_solr).never | |
28 | + @test_model.acts_as_searchable | |
29 | + end | |
30 | + | |
31 | + should 'correctly pass options to search engine' do | |
32 | + options = {:fields => [{:name => :text}]} | |
33 | + @test_model.expects(:acts_as_solr).with(options) | |
34 | + @test_model.acts_as_searchable options | |
35 | + end | |
36 | + | |
37 | + should 'always include schema name as a field' do | |
38 | + @test_model.expects(:acts_as_solr).with(has_entry(:fields, [{:field1 => :text}, {:schema_name => :string}])) | |
39 | + @test_model.acts_as_searchable :fields => [{:field1 => :text}] | |
40 | + # ...even with no fields | |
41 | + @test_model = Class.new ActiveRecord::Base | |
42 | + @test_model.expects(:acts_as_solr).with(has_entry(:additional_fields, [{:schema_name => :string}])) | |
43 | + @test_model.acts_as_searchable | |
44 | + end | |
45 | + | |
46 | +end | ... | ... |
test/unit/acts_as_searchable_test.rb
... | ... | @@ -1,46 +0,0 @@ |
1 | -require File.dirname(__FILE__) + '/../test_helper' | |
2 | -require 'acts_as_searchable' | |
3 | - | |
4 | -class ActsAsSearchableTest < ActiveSupport::TestCase | |
5 | - | |
6 | - def setup | |
7 | - @test_model = Class.new ActiveRecord::Base | |
8 | - end | |
9 | - | |
10 | - def silent | |
11 | - # http://mentalized.net/journal/2010/04/02/suppress_warnings_from_ruby/ | |
12 | - original_verbosity = $VERBOSE | |
13 | - $VERBOSE = nil | |
14 | - result = yield | |
15 | - $VERBOSE = original_verbosity | |
16 | - return result | |
17 | - end | |
18 | - | |
19 | - should 'be enabled by default' do | |
20 | - assert ActsAsSearchable::ClassMethods::ACTS_AS_SEARCHABLE_ENABLED, true | |
21 | - end | |
22 | - | |
23 | - should 'not be searchable when disabled' do | |
24 | - # suppress warning about already initialized constant | |
25 | - silent { ActsAsSearchable::ClassMethods::ACTS_AS_SEARCHABLE_ENABLED = false } | |
26 | - | |
27 | - @test_model.expects(:acts_as_solr).never | |
28 | - @test_model.acts_as_searchable | |
29 | - end | |
30 | - | |
31 | - should 'correctly pass options to search engine' do | |
32 | - options = {:fields => [{:name => :text}]} | |
33 | - @test_model.expects(:acts_as_solr).with(options) | |
34 | - @test_model.acts_as_searchable options | |
35 | - end | |
36 | - | |
37 | - should 'always include schema name as a field' do | |
38 | - @test_model.expects(:acts_as_solr).with(has_entry(:fields, [{:field1 => :text}, {:schema_name => :string}])) | |
39 | - @test_model.acts_as_searchable :fields => [{:field1 => :text}] | |
40 | - # ...even with no fields | |
41 | - @test_model = Class.new ActiveRecord::Base | |
42 | - @test_model.expects(:acts_as_solr).with(has_entry(:additional_fields, [{:schema_name => :string}])) | |
43 | - @test_model.acts_as_searchable | |
44 | - end | |
45 | - | |
46 | -end |