diff --git a/config/solr.yml.dist b/config/solr.yml.dist index 70b83ca..2edf9ed 100644 --- a/config/solr.yml.dist +++ b/config/solr.yml.dist @@ -3,25 +3,8 @@ # If you change the host or port number here, make sure you update # them in your Solr config file -# This file must follow a structure in order to achieve multitenancy -# support. In this example, we will configure solr to support 3 -# different schemas: env1, env2 and env3. -# -# Each "hosted" environment must have an entry like this: -# -# production: &PRODUCTION -# url: http://127.0.0.1:8983/solr -# jvm_options: -server -Xmx192M -Xms64M -# timeout: 0 -# -# env1_production: -# <<: *PRODUCTION -# -# env2_production: -# <<: *PRODUCTION -# -# env3_production: -# <<: *PRODUCTION +# No change is need to support multitenancy. Only one solr environment is need. +# Just remember to use 'rake multitenancy:reindex' for reindexation. production: url: http://127.0.0.1:8983/solr diff --git a/lib/acts_as_searchable.rb b/lib/acts_as_searchable.rb index fc67063..feb07ea 100644 --- a/lib/acts_as_searchable.rb +++ b/lib/acts_as_searchable.rb @@ -6,12 +6,13 @@ module ActsAsSearchable def acts_as_searchable(options = {}) return if !ACTS_AS_SEARCHABLE_ENABLED - if (!options[:fields]) - options[:additional_fields] ||= [] - options[:additional_fields] |= [{:schema_name => :string}] - else + if options[:fields] options[:fields] << {:schema_name => :string} + else + options[:additional_fields] ||= [] + options[:additional_fields] << {:schema_name => :string} end + acts_as_solr options extend FindByContents send :include, InstanceMethods @@ -19,7 +20,15 @@ module ActsAsSearchable module InstanceMethods def schema_name - (Noosfero::MultiTenancy.on? and ActiveRecord::Base.postgresql?) ? ActiveRecord::Base.connection.schema_search_path : '' + self.class.schema_name + end + + # replace solr_id from vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/instance_methods.rb + # to include schema_name + def solr_id + id = "#{self.class.name}:#{record_id(self)}" + id.insert(0, "#{schema_name}:") unless schema_name.blank? + id end end @@ -36,7 +45,7 @@ module ActsAsSearchable options[:per_page] = pg_options[:per_page].to_i options[:scores] ||= true options[:filter_queries] ||= [] - options[:filter_queries] << "schema_name:\"#{schema_name}\"" unless schema_name.empty? + options[:filter_queries] << "schema_name:\"#{schema_name}\"" unless schema_name.blank? all_facets_enabled = options.delete(:all_facets) options[:per_page] = options.delete(:extra_limit) if options[:extra_limit] results = [] diff --git a/lib/tasks/multitenancy.rake b/lib/tasks/multitenancy.rake index a68218d..5904586 100644 --- a/lib/tasks/multitenancy.rake +++ b/lib/tasks/multitenancy.rake @@ -15,18 +15,17 @@ namespace :multitenancy do end task :reindex => :environment do - envs = ActiveRecord::Base.configurations.keys.select{ |k| k.match(/_#{RAILS_ENV}$/) } - models = [ Profile, Article, Product ] - envs.each do |e| - puts "Rebuilding Index for #{e}" if Rake.application.options.trace + # enable output from rebuild_index + logger = ActiveRecord::Base.logger = Logger.new(STDOUT) + logger.level = ActiveSupport::BufferedLogger::INFO + + db_envs = ActiveRecord::Base.configurations.keys.select{ |k| k.match(/_#{RAILS_ENV}$/) } + db_envs.each do |e| + puts "REBUILDING INDEX FOR ENVIRONMENT #{e}" ActiveRecord::Base.connection.schema_search_path = ActiveRecord::Base.configurations[e]['schema_search_path'] - models.each do |m| - if e == envs[0] - m.rebuild_index - puts "Rebuilt index for #{m}" if Rake.application.options.trace - end - m.paginated_each(:per_page => 50) { |i| i.solr_save } - puts "Reindexed all instances of #{m}" if Rake.application.options.trace + $solr_indexed_models.each do |m| + puts "Rebuilding index for model #{m}" + m.rebuild_index end end end diff --git a/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/parser_methods.rb b/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/parser_methods.rb index d3c4dbe..db1e874 100644 --- a/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/parser_methods.rb +++ b/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/parser_methods.rb @@ -30,7 +30,7 @@ module ActsAsSolr #:nodoc: query = replace_types([*query], ':').first end - query_options[:filter_queries] += replace_types([*options[:filter_queries]], '') if options[:filter_queries] + query_options[:filter_queries] += replace_types([*options[:filter_queries]], ':') if options[:filter_queries] options[:alternate_query] ||= '' options[:alternate_query].strip! @@ -125,7 +125,7 @@ module ActsAsSolr #:nodoc: def solr_type_condition(options = {}) classes = [self] + (self.subclasses || []) + (options[:models] || []) classes.map do |klass| - next if klass.name.empty? + next if klass.name.empty? "#{solr_configuration[:type_field]}:\"#{klass.name}\"" end.compact.join(' OR ') end @@ -248,7 +248,7 @@ module ActsAsSolr #:nodoc: bad_options = options.map {|x| x.to_sym} - valid_other_options raise "Invalid option#{'s' if bad_options.size > 1} for faceted date's other param: #{bad_options.join(', ')}. May only be one of :after, :all, :before, :between, :none" if bad_options.size > 0 end - + def sanitize_query(query) fields = self.configuration[:solr_fields].keys fields += DynamicAttribute.all(:select => 'name', :group => 'name').map(&:name) if DynamicAttribute.table_exists? -- libgit2 0.21.2