From 4e977f084e556e9eb52682d4c0e52ad2a8a3f617 Mon Sep 17 00:00:00 2001 From: Braulio Bhavamitra Date: Mon, 29 Aug 2011 15:05:23 -0300 Subject: [PATCH] Update acts_as_solr_reloaded with upstream changes --- vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr.rb | 6 +++++- vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/class_methods.rb | 6 +++++- vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/common_methods.rb | 37 +++++++++++++++---------------------- vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/parser_methods.rb | 44 ++++++++++++++++++++++---------------------- vendor/plugins/acts_as_solr_reloaded/lib/solr/request/select.rb | 2 +- vendor/plugins/acts_as_solr_reloaded/lib/solr/response/standard.rb | 1 - vendor/plugins/acts_as_solr_reloaded/lib/tasks/solr.rake | 22 +++++++++++++++------- 7 files changed, 63 insertions(+), 55 deletions(-) diff --git a/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr.rb b/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr.rb index 402695f..a64d5fb 100644 --- a/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr.rb +++ b/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr.rb @@ -27,6 +27,10 @@ module ActsAsSolr @config ||= YAML::load_file("#{Rails.root}/config/solr.yml")[Rails.env] end + def options + @options ||= credentials.merge( :timeout => config['timeout'] ) + end + def credentials @credentials ||= {:username => config['username'], :password => config['password']} end @@ -36,7 +40,7 @@ module ActsAsSolr end def execute(request, core = nil) - connection = Solr::Connection.new(url(core), credentials) + connection = Solr::Connection.new(url(core), options) connection.send request end end diff --git a/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/class_methods.rb b/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/class_methods.rb index 32b46b6..ada9d09 100644 --- a/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/class_methods.rb +++ b/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/class_methods.rb @@ -13,13 +13,17 @@ module ActsAsSolr #:nodoc: # results = Book.find_by_solr params[:query] # end # - # You can also search for specific fields by searching for 'field:value' + # For specific fields searching use :filter_queries options # # ====options: # offset:: - The first document to be retrieved (offset) # page:: - The page to be retrieved # limit:: - The number of rows per page # per_page:: - Alias for limit + # filter_queries:: - Use solr filter queries to sort by fields + # + # Book.find_by_solr 'ruby', :filter_queries => ['price:5'] + # # order:: - Orders (sort by) the result set using a given criteria: # # Book.find_by_solr 'ruby', :order => 'description asc' diff --git a/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/common_methods.rb b/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/common_methods.rb index 9316e5a..4ad7022 100644 --- a/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/common_methods.rb +++ b/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/common_methods.rb @@ -5,28 +5,21 @@ module ActsAsSolr #:nodoc: # Converts field types into Solr types def get_solr_field_type(field_type) if field_type.is_a?(Symbol) - case field_type - when :float, :decimal - return "f" - when :integer - return "i" - when :boolean - return "b" - when :string - return "s" - when :date - return "d" - when :range_float - return "rf" - when :range_integer - return "ri" - when :facet - return "facet" - when :text - return "t" - else - raise "Unknown field_type symbol: #{field_type}" - end + h = { + :float => "f", + :decimal => "f", + :integer => "i", + :boolean => "b", + :string => "s", + :date => "d", + :range_float => "rf", + :range_integer => "ri", + :facet => "facet", + :text => "t", + } + t = h[field_type] + raise "Unknown field_type symbol: #{field_type}" if t.nil? + t elsif field_type.is_a?(String) return field_type else 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 2b25a24..eff2759 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 @@ -4,13 +4,24 @@ module ActsAsSolr #:nodoc: # Method used by mostly all the ClassMethods when doing a search def parse_query(query=nil, options={}, models=nil) - valid_options = [ :offset, :limit, :facets, :models, :results_format, :order, - :scores, :operator, :include, :lazy, :joins, :select, :core, - :around, :relevance, :highlight, :page, :per_page] + valid_options = [ :filter_queries, :offset, :limit, :facets, :models, :results_format, :order, + :scores, :operator, :include, :lazy, :joins, :select, :core, + :around, :relevance, :highlight, :page, :per_page] query_options = {} - query = sanitize_query(query) if query - return nil if (query.nil? || query.strip == '') - + + field_list = models.nil? ? solr_configuration[:primary_key_field] : "id" + query_options[:field_list] = [field_list, 'score'] + query_options[:filter_queries] = [] + #allow empty queries as a type search will also be done + query = nil if (query.nil? || query == '') + if query.nil? + query = solr_type_condition + else + query = sanitize_query(query) + query_options[:filter_queries].push(solr_type_condition) + end + query_options[:query] = query + order = options[:order].split(/\s*,\s*/).collect{|e| e.gsub(/\s+/,'_t ').gsub(/\bscore_t\b/, 'score') }.join(',') if options[:order] raise "Invalid parameters: #{(options.keys - valid_options).join(',')}" unless (options.keys - valid_options).empty? begin @@ -23,6 +34,9 @@ module ActsAsSolr #:nodoc: query = add_relevance query, options[:relevance] + raise "Expecting and array of strings for :filter_queries" unless options[:filter_queries].nil? or options[:filter_queries].kind_of?(Array) + query_options[:filter_queries] = replace_types([*options[:filter_queries]].collect{|k| "#{k.sub!(/ *: */,"_t:")}"}) if options[:filter_queries] + # first steps on the facet parameter processing if options[:facets] query_options[:facets] = {} @@ -33,7 +47,7 @@ module ActsAsSolr #:nodoc: # override the :zeros (it's deprecated anyway) if :mincount exists query_options[:facets][:mincount] = options[:facets][:mincount] if options[:facets][:mincount] query_options[:facets][:fields] = options[:facets][:fields].collect{|k| "#{k}_facet"} if options[:facets][:fields] - query_options[:filter_queries] = replace_types([*options[:facets][:browse]].collect{|k| "#{k.sub!(/ *: */,"_facet:")}"}) if options[:facets][:browse] + query_options[:filter_queries] += replace_types([*options[:facets][:browse]].collect{|k| "#{k.sub!(/ *: */,"_t:")}"}) if options[:facets][:browse] query_options[:facets][:queries] = replace_types(options[:facets][:query].collect{|k| "#{k.sub!(/ *: */,"_t:")}"}) if options[:facets][:query] @@ -68,19 +82,6 @@ module ActsAsSolr #:nodoc: end end - if models.nil? - # TODO: use a filter query for type, allowing Solr to cache it individually - models = "AND #{solr_type_condition}" - field_list = solr_configuration[:primary_key_field] - else - field_list = "id" - end - - query_options[:field_list] = [field_list, 'score'] - query = "(#{query.gsub(/ *: */,"_t:")}) #{models}" - order = options[:order].split(/\s*,\s*/).collect{|e| e.gsub(/\s+/,'_t ').gsub(/\bscore_t\b/, 'score') }.join(',') if options[:order] - query_options[:query] = replace_types([query])[0] # TODO adjust replace_types to work with String or Array - if options[:highlight] query_options[:highlighting] = {} query_options[:highlighting][:field_list] = [] @@ -232,9 +233,8 @@ module ActsAsSolr #:nodoc: 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 - # Remove all leading ?'s and *'s from query def sanitize_query(query) - query.gsub(/\A([\?|\*| ]+)/, '') + Solr::Util::query_parser_escape query end private diff --git a/vendor/plugins/acts_as_solr_reloaded/lib/solr/request/select.rb b/vendor/plugins/acts_as_solr_reloaded/lib/solr/request/select.rb index c3595cc..3009b48 100644 --- a/vendor/plugins/acts_as_solr_reloaded/lib/solr/request/select.rb +++ b/vendor/plugins/acts_as_solr_reloaded/lib/solr/request/select.rb @@ -33,7 +33,7 @@ class Solr::Request::Select < Solr::Request::Base end def to_hash - return {:qt => query_type, :wt => 'ruby'}.merge(@select_params) + return {:qt => query_type, :wt => 'ruby', 'json.nl' => 'arrarr'}.merge(@select_params) end def to_s diff --git a/vendor/plugins/acts_as_solr_reloaded/lib/solr/response/standard.rb b/vendor/plugins/acts_as_solr_reloaded/lib/solr/response/standard.rb index 91bf7db..177bbbe 100644 --- a/vendor/plugins/acts_as_solr_reloaded/lib/solr/response/standard.rb +++ b/vendor/plugins/acts_as_solr_reloaded/lib/solr/response/standard.rb @@ -36,7 +36,6 @@ class Solr::Response::Standard < Solr::Response::Ruby @response['maxScore'] end - # TODO: consider the use of json.nl parameter def field_facets(field) facets = [] values = @data['facet_counts']['facet_fields'][field] diff --git a/vendor/plugins/acts_as_solr_reloaded/lib/tasks/solr.rake b/vendor/plugins/acts_as_solr_reloaded/lib/tasks/solr.rake index 2eab4f5..0b13ccc 100644 --- a/vendor/plugins/acts_as_solr_reloaded/lib/tasks/solr.rake +++ b/vendor/plugins/acts_as_solr_reloaded/lib/tasks/solr.rake @@ -1,14 +1,22 @@ namespace :solr do - desc 'Download and install Solr+Jetty 3.3.0.' + SOLR_VERSION = '3.3.0' + APACHE_MIRROR = "http://ftp.unicamp.br/pub/apache" + SOLR_FILENAME = "apache-solr-#{SOLR_VERSION}.tgz" + SOLR_DIR = "apache-solr-#{SOLR_VERSION}" + SOLR_URL = "#{APACHE_MIRROR}/lucene/solr/#{SOLR_VERSION}/#{SOLR_FILENAME}" + + desc "Download and install Solr+Jetty #{SOLR_VERSION}." task :download do - if (File.exists?(Rails.root + '/vendor/plugins/acts_as_solr_reloaded/solr/start.jar')) + if File.exists?(Rails.root + '/vendor/plugins/acts_as_solr_reloaded/solr/start.jar') puts 'Solr already downloaded.' else cd '/tmp' - sh 'wget -c http://ftp.unicamp.br/pub/apache/lucene/solr/3.3.0/apache-solr-3.3.0.tgz' - sh 'tar xzf apache-solr-3.3.0.tgz' - cd 'apache-solr-3.3.0/example' + sh "wget -c #{SOLR_URL}" + if !File.directory?("/tmp/#{SOLR_DIR}") + sh "tar xzf apache-solr-#{SOLR_VERSION}.tgz" + end + cd "apache-solr-#{SOLR_VERSION}/example" cp_r ['../LICENSE.txt', '../NOTICE.txt', 'README.txt', 'etc', 'lib', 'start.jar', 'webapps', 'work'], Rails.root + '/vendor/plugins/acts_as_solr_reloaded/solr', :verbose => true cd 'solr' cp_r ['README.txt', 'bin', 'solr.xml'], Rails.root + '/vendor/plugins/acts_as_solr_reloaded/solr/solr', :verbose => true @@ -27,7 +35,7 @@ namespace :solr do end desc 'Starts Solr. Options accepted: RAILS_ENV=your_env, PORT=XX. Defaults to development if none.' - task :start => :environment do + task :start => [:download, :environment] do require File.expand_path("#{File.dirname(__FILE__)}/../../config/solr_environment") FileUtils.mkdir_p(SOLR_LOGS_PATH) FileUtils.mkdir_p(SOLR_DATA_PATH) @@ -62,7 +70,7 @@ namespace :solr do end desc 'Stops Solr. Specify the environment by using: RAILS_ENV=your_env. Defaults to development if none.' - task :stop=> :environment do + task :stop => :environment do require File.expand_path("#{File.dirname(__FILE__)}/../../config/solr_environment") fork do if File.exists?(SOLR_PID_FILE) -- libgit2 0.21.2