require 'erb'
module Sunspot #:nodoc:
module Rails #:nodoc:
#
# Sunspot::Rails is configured via the config/sunspot.yml file, which
# contains properties keyed by environment name. A sample sunspot.yml file
# would look like:
#
# development:
# solr:
# hostname: localhost
# port: 8982
# min_memory: 512M
# max_memory: 1G
# solr_jar: /some/path/solr15/start.jar
# bind_address: 0.0.0.0
# disabled: false
# test:
# solr:
# hostname: localhost
# port: 8983
# log_level: OFF
# open_timeout: 0.5
# read_timeout: 2
# production:
# solr:
# hostname: localhost
# port: 8983
# path: /solr/myindex
# log_level: WARNING
# solr_home: /some/path
# open_timeout: 0.5
# read_timeout: 2
# master_solr:
# hostname: localhost
# port: 8982
# path: /solr
# auto_commit_after_request: true
#
# Sunspot::Rails uses the configuration to set up the Solr connection, as
# well as for starting Solr with the appropriate port using the
# rake sunspot:solr:start
task.
#
# If the master_solr
configuration is present, Sunspot will use
# the Solr instance specified here for all write operations, and the Solr
# configured under solr
for all read operations.
#
class Configuration
attr_writer :user_configuration
#
# The host name at which to connect to Solr. Default 'localhost'.
#
# ==== Returns
#
# String:: host name
#
def hostname
unless defined?(@hostname)
@hostname = solr_url.host if solr_url
@hostname ||= user_configuration_from_key('solr', 'hostname')
@hostname ||= default_hostname
end
@hostname
end
#
# The port at which to connect to Solr.
# Defaults to 8981 in test, 8982 in development and 8983 in production.
#
# ==== Returns
#
# Integer:: port
#
def port
unless defined?(@port)
@port = solr_url.port if solr_url
@port ||= user_configuration_from_key('solr', 'port')
@port ||= default_port
@port = @port.to_i
end
@port
end
#
# The url path to the Solr servlet (useful if you are running multicore).
# Default '/solr'.
#
# ==== Returns
#
# String:: path
#
def path
unless defined?(@path)
@path = solr_url.path if solr_url
@path ||= user_configuration_from_key('solr', 'path')
@path ||= default_path
end
@path
end
#
# The host name at which to connect to the master Solr instance. Defaults
# to the 'hostname' configuration option.
#
# ==== Returns
#
# String:: host name
#
def master_hostname
@master_hostname ||= (user_configuration_from_key('master_solr', 'hostname') || hostname)
end
#
# The port at which to connect to the master Solr instance. Defaults to
# the 'port' configuration option.
#
# ==== Returns
#
# Integer:: port
#
def master_port
@master_port ||= (user_configuration_from_key('master_solr', 'port') || port).to_i
end
#
# The path to the master Solr servlet (useful if you are running multicore).
# Defaults to the value of the 'path' configuration option.
#
# ==== Returns
#
# String:: path
#
def master_path
@master_path ||= (user_configuration_from_key('master_solr', 'path') || path)
end
#
# True if there is a master Solr instance configured, otherwise false.
#
# ==== Returns
#
# Boolean:: bool
#
def has_master?
@has_master = !!user_configuration_from_key('master_solr')
end
#
# The default log_level that should be passed to solr. You can
# change the individual log_levels in the solr admin interface.
# Default 'INFO'.
#
# ==== Returns
#
# String:: log_level
#
def log_level
@log_level ||= (user_configuration_from_key('solr', 'log_level') || 'INFO')
end
#
# Should the solr index receive a commit after each http-request.
# Default true
#
# ==== Returns
#
# Boolean: auto_commit_after_request?
#
def auto_commit_after_request?
@auto_commit_after_request ||=
user_configuration_from_key('auto_commit_after_request') != false
end
#
# As for #auto_commit_after_request? but only for deletes
# Default false
#
# ==== Returns
#
# Boolean: auto_commit_after_delete_request?
#
def auto_commit_after_delete_request?
@auto_commit_after_delete_request ||=
(user_configuration_from_key('auto_commit_after_delete_request') || false)
end
#
# The log directory for solr logfiles
#
# ==== Returns
#
# String:: log_dir
#
def log_file
@log_file ||= (user_configuration_from_key('solr', 'log_file') || default_log_file_location )
end
def data_path
@data_path ||= user_configuration_from_key('solr', 'data_path') || File.join(::Rails.root, 'solr', 'data', ::Rails.env)
end
def pid_dir
@pid_dir ||= user_configuration_from_key('solr', 'pid_dir') || File.join(::Rails.root, 'solr', 'pids', ::Rails.env)
end
#
# The solr home directory. Sunspot::Rails expects this directory
# to contain a config, data and pids directory. See
# Sunspot::Rails::Server.bootstrap for more information.
#
# ==== Returns
#
# String:: solr_home
#
def solr_home
@solr_home ||=
if user_configuration_from_key('solr', 'solr_home')
user_configuration_from_key('solr', 'solr_home')
else
File.join(::Rails.root, 'solr')
end
end
#
# Solr start jar
#
def solr_jar
@solr_jar ||= user_configuration_from_key('solr', 'solr_jar')
end
#
# Minimum java heap size for Solr instance
#
def min_memory
@min_memory ||= user_configuration_from_key('solr', 'min_memory')
end
#
# Maximum java heap size for Solr instance
#
def max_memory
@max_memory ||= user_configuration_from_key('solr', 'max_memory')
end
#
# Interface on which to run Solr
#
def bind_address
@bind_address ||= user_configuration_from_key('solr', 'bind_address')
end
def multicore
@multicore ||= !!user_configuration_from_key('solr', 'multicore')
end
def read_timeout
@read_timeout ||= user_configuration_from_key('solr', 'read_timeout')
end
def open_timeout
@open_timeout ||= user_configuration_from_key('solr', 'open_timeout')
end
#
# Whether or not to disable Solr.
# Defaults to false.
#
def disabled?
@disabled ||= (user_configuration_from_key('disabled') || false)
end
private
#
# Logging in rails_root/log as solr_.log as a
# default.
#
# ===== Returns
#
# String:: default_log_file_location
#
def default_log_file_location
File.join(::Rails.root, 'log', "solr_" + ::Rails.env + ".log")
end
#
# return a specific key from the user configuration in config/sunspot.yml
#
# ==== Returns
#
# Mixed:: requested_key or nil
#
def user_configuration_from_key( *keys )
keys.inject(user_configuration) do |hash, key|
hash[key] if hash
end
end
#
# Memoized hash of configuration options for the current Rails environment
# as specified in config/sunspot.yml
#
# ==== Returns
#
# Hash:: configuration options for current environment
#
def user_configuration
@user_configuration ||=
begin
path = File.join(::Rails.root, 'config', 'sunspot.yml')
if File.exist?(path)
File.open(path) do |file|
processed = ERB.new(file.read).result
YAML.load(processed)[::Rails.env]
end
else
{}
end
end
end
protected
#
# When a specific hostname, port and path aren't provided in the
# sunspot.yml file, look for a key named 'url', then check the
# environment, then fall back to a sensible localhost default.
#
def solr_url
if ENV['SOLR_URL'] || ENV['WEBSOLR_URL']
URI.parse(ENV['SOLR_URL'] || ENV['WEBSOLR_URL'])
end
end
def default_hostname
'localhost'
end
def default_port
{ 'test' => 8981,
'development' => 8982,
'production' => 8983
}[::Rails.env] || 8983
end
def default_path
'/solr'
end
end
class ExtendedConfiguration < Sunspot::Rails::Configuration
def initialize( configuration_hash )
@supplied_configuration = configuration_hash
end
protected
def solr_url
unless @cached_solr_url
@cached_solr_url = super
@cached_solr_url.path = @supplied_configuration["path"] if @cached_solr_url # fold in the path constructed from the multicore session
end
@cached_solr_url
end
private
def user_configuration
@user_configuration ||= @supplied_configuration || super
end
end
end
end