Module: ThinkingSphinx

Extended by:
SearchMethods::ClassMethods
Defined in:
lib/thinking_sphinx.rb,
lib/thinking_sphinx/facet.rb,
lib/thinking_sphinx/field.rb,
lib/thinking_sphinx/index.rb,
lib/thinking_sphinx/deltas.rb,
lib/thinking_sphinx/search.rb,
lib/thinking_sphinx/source.rb,
lib/thinking_sphinx/property.rb,
lib/thinking_sphinx/attribute.rb,
lib/thinking_sphinx/excerpter.rb,
lib/thinking_sphinx/source/sql.rb,
lib/thinking_sphinx/association.rb,
lib/thinking_sphinx/class_facet.rb,
lib/thinking_sphinx/core/string.rb,
lib/thinking_sphinx/auto_version.rb,
lib/thinking_sphinx/facet_search.rb,
lib/thinking_sphinx/active_record.rb,
lib/thinking_sphinx/configuration.rb,
lib/thinking_sphinx/index/builder.rb,
lib/thinking_sphinx/search_methods.rb,
lib/thinking_sphinx/rails_additions.rb,
lib/thinking_sphinx/rails_additions.rb,
lib/thinking_sphinx/rails_additions.rb,
lib/thinking_sphinx/rails_additions.rb,
lib/thinking_sphinx/rails_additions.rb,
lib/thinking_sphinx/index/faux_column.rb,
lib/thinking_sphinx/active_record/delta.rb,
lib/thinking_sphinx/active_record/scopes.rb,
lib/thinking_sphinx/deltas/default_delta.rb,
lib/thinking_sphinx/adapters/mysql_adapter.rb,
lib/thinking_sphinx/adapters/abstract_adapter.rb,
lib/thinking_sphinx/source/internal_properties.rb,
lib/thinking_sphinx/adapters/postgresql_adapter.rb,
lib/thinking_sphinx/active_record/attribute_updates.rb,
lib/thinking_sphinx/active_record/has_many_association.rb,
lib/thinking_sphinx/rails_additions.rb,
lib/thinking_sphinx/rails_additions.rb,
lib/thinking_sphinx/rails_additions.rb

Defined Under Namespace

Modules: AbstractQuotedTableName, ActiveRecord, ActiveRecordQuotedName, ActiveRecordStoreFullSTIClass, ArrayExtractOptions, ClassAttributeMethods, Core, Deltas, HashExcept, MetaClass, MysqlQuotedTableName, SearchMethods Classes: AbstractAdapter, Association, Attribute, AutoVersion, ClassFacet, Configuration, ConnectionError, Context, Excerpter, Facet, FacetSearch, Field, Index, MysqlAdapter, PostgreSQLAdapter, Property, Search, Source, StaleIdsException, Test

Class Method Summary collapse

Methods included from SearchMethods::ClassMethods

count, facets, search, search_context, search_count, search_for_id, search_for_ids

Class Method Details

.contextObject

The collection of indexed models. Keep in mind that Rails lazily loads its classes, so this may not actually be populated with all the models that have Sphinx indexes.



66
67
68
69
70
71
72
73
# File 'lib/thinking_sphinx.rb', line 66

def self.context
  if Thread.current[:thinking_sphinx_context].nil?
    Thread.current[:thinking_sphinx_context] = ThinkingSphinx::Context.new
    Thread.current[:thinking_sphinx_context].prepare
  end
  
  Thread.current[:thinking_sphinx_context]
end

.define_indexes=(value) ⇒ Object

Enable/disable indexes - you may want to do this while migrating data.

ThinkingSphinx.define_indexes = false


97
98
99
# File 'lib/thinking_sphinx.rb', line 97

def self.define_indexes=(value)
  Thread.current[:thinking_sphinx_define_indexes] = value
end

.define_indexes?Boolean

Check if index definition is disabled.

Returns:

  • (Boolean)


85
86
87
88
89
90
91
# File 'lib/thinking_sphinx.rb', line 85

def self.define_indexes?
  if Thread.current[:thinking_sphinx_define_indexes].nil?
    Thread.current[:thinking_sphinx_define_indexes] = true
  end
  
  Thread.current[:thinking_sphinx_define_indexes]
end

.deltas_enabled=(value) ⇒ Object

Enable/disable all delta indexing.

ThinkingSphinx.deltas_enabled = false


117
118
119
# File 'lib/thinking_sphinx.rb', line 117

def self.deltas_enabled=(value)
  Thread.current[:thinking_sphinx_deltas_enabled] = value
end

.deltas_enabled?Boolean

Check if delta indexing is enabled.

Returns:

  • (Boolean)


103
104
105
106
107
108
109
110
111
# File 'lib/thinking_sphinx.rb', line 103

def self.deltas_enabled?
  if Thread.current[:thinking_sphinx_deltas_enabled].nil?
    Thread.current[:thinking_sphinx_deltas_enabled] = (
      ThinkingSphinx::Configuration.environment != "test"
    )
  end
  
  Thread.current[:thinking_sphinx_deltas_enabled]
end

.jruby?Boolean

Returns:

  • (Boolean)


217
218
219
# File 'lib/thinking_sphinx.rb', line 217

def self.jruby?
  defined?(JRUBY_VERSION)
end

.microsoft?Boolean

Returns:

  • (Boolean)


213
214
215
# File 'lib/thinking_sphinx.rb', line 213

def self.microsoft?
  RUBY_PLATFORM =~ /mswin/
end

.mysql?Boolean

Returns:

  • (Boolean)


221
222
223
224
225
226
# File 'lib/thinking_sphinx.rb', line 221

def self.mysql?
  ::ActiveRecord::Base.connection.class.name.demodulize == "MysqlAdapter" ||
  ::ActiveRecord::Base.connection.class.name.demodulize == "MysqlplusAdapter" || (
    jruby? && ::ActiveRecord::Base.connection.config[:adapter] == "jdbcmysql"
  )
end

.pid_active?(pid) ⇒ Boolean

Returns:

  • (Boolean)


207
208
209
210
211
# File 'lib/thinking_sphinx.rb', line 207

def self.pid_active?(pid)
  !!Process.kill(0, pid.to_i)
rescue Exception => e
  false
end

.remote_sphinx=(value) ⇒ Object

Tells Thinking Sphinx that Sphinx is running on a different machine, and thus it can’t reliably guess whether it is running or not (ie: the #sphinx_running? method), and so just assumes it is.

Useful for multi-machine deployments. Set it in your production.rb file.

ThinkingSphinx.remote_sphinx = true


180
181
182
# File 'lib/thinking_sphinx.rb', line 180

def self.remote_sphinx=(value)
  Thread.current[:thinking_sphinx_remote_sphinx] = value
end

.remote_sphinx?Boolean

An indication of whether Sphinx is running on a remote machine instead of the same machine.

Returns:

  • (Boolean)


168
169
170
# File 'lib/thinking_sphinx.rb', line 168

def self.remote_sphinx?
  Thread.current[:thinking_sphinx_remote_sphinx] ||= false
end

.reset_context!Object



75
76
77
# File 'lib/thinking_sphinx.rb', line 75

def self.reset_context!
  Thread.current[:thinking_sphinx_context] = nil
end

.sphinx_pidObject



199
200
201
202
203
204
205
# File 'lib/thinking_sphinx.rb', line 199

def self.sphinx_pid
  if File.exists?(ThinkingSphinx::Configuration.instance.pid_file)
    File.read(ThinkingSphinx::Configuration.instance.pid_file)[/\d+/]
  else
    nil
  end
end

.sphinx_running?Boolean

Check if Sphinx is running. If remote_sphinx is set to true (indicating Sphinx is on a different machine), this will always return true, and you will have to handle any connection errors yourself.

Returns:

  • (Boolean)


188
189
190
# File 'lib/thinking_sphinx.rb', line 188

def self.sphinx_running?
  remote_sphinx? || sphinx_running_by_pid?
end

.sphinx_running_by_pid?Boolean

Check if Sphinx is actually running, provided the pid is on the same machine as this code.

Returns:

  • (Boolean)


195
196
197
# File 'lib/thinking_sphinx.rb', line 195

def self.sphinx_running_by_pid?
  !!sphinx_pid && pid_active?(sphinx_pid)
end

.suppress_delta_output=(value) ⇒ Object



146
147
148
# File 'lib/thinking_sphinx.rb', line 146

def self.suppress_delta_output=(value)
  Thread.current[:thinking_sphinx_suppress_delta_output] = value
end

.suppress_delta_output?Boolean

Returns:

  • (Boolean)


142
143
144
# File 'lib/thinking_sphinx.rb', line 142

def self.suppress_delta_output?
  Thread.current[:thinking_sphinx_suppress_delta_output] ||= false
end

.unique_id_expression(offset = nil) ⇒ Object



79
80
81
# File 'lib/thinking_sphinx.rb', line 79

def self.unique_id_expression(offset = nil)
  "* #{context.indexed_models.size} + #{offset || 0}"
end

.updates_enabled=(value) ⇒ Object

Enable/disable updates to Sphinx

ThinkingSphinx.updates_enabled = false


138
139
140
# File 'lib/thinking_sphinx.rb', line 138

def self.updates_enabled=(value)
  Thread.current[:thinking_sphinx_updates_enabled] = value
end

.updates_enabled?Boolean

Check if updates are enabled. True by default, unless within the test environment.

Returns:

  • (Boolean)


124
125
126
127
128
129
130
131
132
# File 'lib/thinking_sphinx.rb', line 124

def self.updates_enabled?
  if Thread.current[:thinking_sphinx_updates_enabled].nil?
    Thread.current[:thinking_sphinx_updates_enabled] = (
      ThinkingSphinx::Configuration.environment != "test"
    )
  end
  
  Thread.current[:thinking_sphinx_updates_enabled]
end

.use_group_by_shortcut?Boolean

Checks to see if MySQL will allow simplistic GROUP BY statements. If not, or if not using MySQL, this will return false.

Returns:

  • (Boolean)


153
154
155
156
157
158
159
160
161
162
163
# File 'lib/thinking_sphinx.rb', line 153

def self.use_group_by_shortcut?
  if Thread.current[:thinking_sphinx_use_group_by_shortcut].nil?
    Thread.current[:thinking_sphinx_use_group_by_shortcut] = !!(
      mysql? && ::ActiveRecord::Base.connection.select_all(
        "SELECT @@global.sql_mode, @@session.sql_mode;"
      ).all? { |key,value| value.nil? || value[/ONLY_FULL_GROUP_BY/].nil? }
    )
  end
  
  Thread.current[:thinking_sphinx_use_group_by_shortcut]
end

.versionString

The current version of Thinking Sphinx.

Returns:

  • (String)

    The version number as a string



57
58
59
60
61
# File 'lib/thinking_sphinx.rb', line 57

def self.version
  open(File.join(File.dirname(__FILE__), '../VERSION')) { |f|
    f.read.strip
  }
end