Module: Ultrasphinx

Child modules and classes

Module Ultrasphinx::Spell
Class Ultrasphinx::Search

Constants

NameValue
SUBDIR "config/ultrasphinx"
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
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)
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 {}

Public Class Methods


delta_index_present? ()

See if a delta index was defined.

     # File lib/ultrasphinx/ultrasphinx.rb, line 207
207:   def self.delta_index_present?
208:     if File.exist?(CONF_PATH) 
209:       File.open(CONF_PATH).readlines.detect do |line|
210:         line =~ /^index delta/
211:       end
212:     end
213:   end

load_stored_procedure (name)

    # 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

log (msg)

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
114:       RAILS_DEFAULT_LOGGER.debug msg
115:     else
116:       STDERR.puts msg
117:     end
118:   end

options_for (heading, path)

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

say (msg)

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
102:         RAILS_DEFAULT_LOGGER.warn msg
103:       else
104:         STDERR.puts msg
105:       end
106:     end        
107:     nil # Explicitly return nil
108:   end

verify_database_name ()

Complain if the database names go out of sync.

     # File lib/ultrasphinx/ultrasphinx.rb, line 191
191:   def self.verify_database_name
192:     if File.exist? CONF_PATH
193:       begin
194:         if options_for(
195:           "source #{MODEL_CONFIGURATION.keys.first.tableize}_#{MAIN_INDEX}", 
196:           CONF_PATH
197:         )['sql_db'] != ActiveRecord::Base.connection.instance_variable_get("@config")[:database]
198:           say "warning; configured database name is out-of-date"
199:           say "please run 'rake ultrasphinx:configure'"
200:         end 
201:       rescue Object
202:       end
203:     end
204:   end