SUBDIR | = | "config/ultrasphinx" | Internal file paths | |
DIR | = | "#{RAILS_ROOT}/#{SUBDIR}" | ||
THIS_DIR | = | File.expand_path(File.dirname(__FILE__)) | ||
CONF_PATH | = | "#{DIR}/#{RAILS_ENV}.conf" | ||
ENV_BASE_PATH | = | "#{DIR}/#{RAILS_ENV}.base" | ||
GENERIC_BASE_PATH | = | "#{DIR}/default.base" | ||
BASE_PATH | = | (File.exist?(ENV_BASE_PATH) ? ENV_BASE_PATH : GENERIC_BASE_PATH) | ||
MAX_INT | = | 2**32-1 | Some miscellaneous constants | |
MAX_WORDS | = | 2**16 | ||
MAIN_INDEX | = | "main" | ||
DELTA_INDEX | = | "delta" | ||
INDEXES | = | [MAIN_INDEX, DELTA_INDEX] | ||
CONFIG_MAP | = | { # These must be symbols for key mapping against Rails itself. :username => 'sql_user', :password => 'sql_pass', :host => 'sql_host', :database => 'sql_db', :port => 'sql_port', :socket => 'sql_sock' | ||
CONNECTION_DEFAULTS | = | { :host => 'localhost', :password => '', :username => 'root' | ||
SQL_FUNCTIONS | = | { 'mysql' => { 'group_concat' => "CAST(GROUP_CONCAT(DISTINCT ? ? SEPARATOR ' ') AS CHAR)", 'delta' => "DATE_SUB(NOW(), INTERVAL ? SECOND)", 'hash' => "CAST(CRC32(?) AS unsigned)", 'range_cast' => "?" | ||
DEFAULTS | = | { 'mysql' => %( type = mysql sql_query_pre = SET SESSION group_concat_max_len = 65535 sql_query_pre = SET NAMES utf8 ), 'postgresql' => %( type = pgsql sql_query_pre = ) | ||
ADAPTER | = | ActiveRecord::Base.connection.instance_variable_get("@config")[:adapter] rescue 'mysql' | ||
INDEXER_SETTINGS | = | options_for('indexer', BASE_PATH) | Introspect on the existing generated conf files. | |
CLIENT_SETTINGS | = | options_for('client', BASE_PATH) | ||
DAEMON_SETTINGS | = | options_for('searchd', BASE_PATH) | ||
SOURCE_SETTINGS | = | options_for('source', BASE_PATH) | ||
INDEX_SETTINGS | = | options_for('index', BASE_PATH) | ||
DICTIONARY | = | CLIENT_SETTINGS['dictionary_name'] || 'ap' | ||
STOPWORDS_PATH | = | "#{Ultrasphinx::INDEX_SETTINGS['path']}/#{DICTIONARY}-stopwords.txt" | ||
MODEL_CONFIGURATION | = | {} | ||
SUBDIR | = | "config/ultrasphinx" | Internal file paths | |
DIR | = | "#{RAILS_ROOT}/#{SUBDIR}" | ||
THIS_DIR | = | File.expand_path(File.dirname(__FILE__)) | ||
CONF_PATH | = | "#{DIR}/#{RAILS_ENV}.conf" | ||
ENV_BASE_PATH | = | "#{DIR}/#{RAILS_ENV}.base" | ||
GENERIC_BASE_PATH | = | "#{DIR}/default.base" | ||
BASE_PATH | = | (File.exist?(ENV_BASE_PATH) ? ENV_BASE_PATH : GENERIC_BASE_PATH) | ||
MAX_INT | = | 2**32-1 | Some miscellaneous constants | |
MAX_WORDS | = | 2**16 | ||
MAIN_INDEX | = | "main" | ||
DELTA_INDEX | = | "delta" | ||
INDEXES | = | [MAIN_INDEX, DELTA_INDEX] | ||
CONFIG_MAP | = | { # These must be symbols for key mapping against Rails itself. :username => 'sql_user', :password => 'sql_pass', :host => 'sql_host', :database => 'sql_db', :port => 'sql_port', :socket => 'sql_sock' | ||
CONNECTION_DEFAULTS | = | { :host => 'localhost', :password => '', :username => 'root' | ||
SQL_FUNCTIONS | = | { 'mysql' => { 'group_concat' => "CAST(GROUP_CONCAT(DISTINCT ? ? SEPARATOR ' ') AS CHAR)", 'delta' => "DATE_SUB(NOW(), INTERVAL ? SECOND)", 'hash' => "CAST(CRC32(?) AS unsigned)", 'range_cast' => "?" | ||
DEFAULTS | = | { 'mysql' => %( type = mysql sql_query_pre = SET SESSION group_concat_max_len = 65535 sql_query_pre = SET NAMES utf8 ), 'postgresql' => %( type = pgsql sql_query_pre = ) | ||
ADAPTER | = | ActiveRecord::Base.connection.instance_variable_get("@config")[:adapter] rescue 'mysql' | ||
INDEXER_SETTINGS | = | options_for('indexer', BASE_PATH) | Introspect on the existing generated conf files. | |
CLIENT_SETTINGS | = | options_for('client', BASE_PATH) | ||
DAEMON_SETTINGS | = | options_for('searchd', BASE_PATH) | ||
SOURCE_SETTINGS | = | options_for('source', BASE_PATH) | ||
INDEX_SETTINGS | = | options_for('index', BASE_PATH) | ||
DICTIONARY | = | CLIENT_SETTINGS['dictionary_name'] || 'ap' | ||
STOPWORDS_PATH | = | "#{Ultrasphinx::INDEX_SETTINGS['path']}/#{DICTIONARY}-stopwords.txt" | ||
MODEL_CONFIGURATION | = | {} |
See if a delta index was defined.
# File lib/ultrasphinx/ultrasphinx.rb, line 191 191: def self.delta_index_present? 192: if File.exist?(CONF_PATH) 193: File.open(CONF_PATH).readlines.detect do |line| 194: line =~ /^index delta/ 195: end 196: end 197: end
See if a delta index was defined.
# File lib/ultrasphinx/ultrasphinx.rb, line 191 191: def self.delta_index_present? 192: if File.exist?(CONF_PATH) 193: File.open(CONF_PATH).readlines.detect do |line| 194: line =~ /^index delta/ 195: end 196: end 197: end
# File lib/ultrasphinx/ultrasphinx.rb, line 61 61: def self.load_stored_procedure(name) 62: open("#{THIS_DIR}/postgresql/#{name}.sql").read.gsub(/\s+/, ' ') 63: end
# File lib/ultrasphinx/ultrasphinx.rb, line 61 61: def self.load_stored_procedure(name) 62: open("#{THIS_DIR}/postgresql/#{name}.sql").read.gsub(/\s+/, ' ') 63: end
Debug-mode logger.
# File lib/ultrasphinx/ultrasphinx.rb, line 111 111: def self.log msg 112: # XXX Method name is stupid. 113: if defined?(RAILS_DEFAULT_LOGGER) && RAILS_DEFAULT_LOGGER 114: RAILS_DEFAULT_LOGGER.debug msg 115: else 116: STDERR.puts msg 117: end 118: end
Debug-mode logger.
# File lib/ultrasphinx/ultrasphinx.rb, line 111 111: def self.log msg 112: # XXX Method name is stupid. 113: if defined?(RAILS_DEFAULT_LOGGER) && RAILS_DEFAULT_LOGGER 114: RAILS_DEFAULT_LOGGER.debug msg 115: else 116: STDERR.puts msg 117: end 118: end
Configuration file parser.
# File lib/ultrasphinx/ultrasphinx.rb, line 121 121: def self.options_for(heading, path) 122: # Evaluate ERB 123: template = ERB.new(File.open(path) {|f| f.read}) 124: contents = template.result(binding) 125: 126: # Find the correct heading. 127: section = contents[/^#{heading.gsub('/', '__')}\s*?\{(.*?)\}/m, 1] 128: 129: if section 130: # Convert to a hash 131: options = section.split("\n").map do |line| 132: line =~ /\s*(.*?)\s*=\s*([^\#]*)/ 133: $1 ? [$1, $2.strip] : [] 134: end 135: Hash[*options.flatten] 136: else 137: # XXX Is it safe to raise here? 138: Ultrasphinx.say "warning; heading #{heading} not found in #{path}; it may be corrupted. " 139: {} 140: end 141: end
Configuration file parser.
# File lib/ultrasphinx/ultrasphinx.rb, line 121 121: def self.options_for(heading, path) 122: # Evaluate ERB 123: template = ERB.new(File.open(path) {|f| f.read}) 124: contents = template.result(binding) 125: 126: # Find the correct heading. 127: section = contents[/^#{heading.gsub('/', '__')}\s*?\{(.*?)\}/m, 1] 128: 129: if section 130: # Convert to a hash 131: options = section.split("\n").map do |line| 132: line =~ /\s*(.*?)\s*=\s*([^\#]*)/ 133: $1 ? [$1, $2.strip] : [] 134: end 135: Hash[*options.flatten] 136: else 137: # XXX Is it safe to raise here? 138: Ultrasphinx.say "warning; heading #{heading} not found in #{path}; it may be corrupted. " 139: {} 140: end 141: end
Warn-mode logger. Also called from rake tasks.
# File lib/ultrasphinx/ultrasphinx.rb, line 95 95: def self.say msg 96: # XXX Method name is stupid. 97: if with_rake 98: puts msg[0..0].upcase + msg[1..-1] 99: else 100: msg = "** ultrasphinx: #{msg}" 101: if defined?(RAILS_DEFAULT_LOGGER) && RAILS_DEFAULT_LOGGER 102: RAILS_DEFAULT_LOGGER.warn msg 103: else 104: STDERR.puts msg 105: end 106: end 107: nil # Explicitly return nil 108: end
Warn-mode logger. Also called from rake tasks.
# File lib/ultrasphinx/ultrasphinx.rb, line 95 95: def self.say msg 96: # XXX Method name is stupid. 97: if with_rake 98: puts msg[0..0].upcase + msg[1..-1] 99: else 100: msg = "** ultrasphinx: #{msg}" 101: if defined?(RAILS_DEFAULT_LOGGER) && RAILS_DEFAULT_LOGGER 102: RAILS_DEFAULT_LOGGER.warn msg 103: else 104: STDERR.puts msg 105: end 106: end 107: nil # Explicitly return nil 108: end