Module: ThinkingSphinx

Extended by:
SearchMethods::ClassMethods
Defined in:
lib/thinking_sphinx.rb,
lib/thinking_sphinx/join.rb,
lib/thinking_sphinx/facet.rb,
lib/thinking_sphinx/field.rb,
lib/thinking_sphinx/index.rb,
lib/thinking_sphinx/search.rb,
lib/thinking_sphinx/deltas.rb,
lib/thinking_sphinx/source.rb,
lib/thinking_sphinx/railtie.rb,
lib/thinking_sphinx/version.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/class_facet.rb,
lib/thinking_sphinx/association.rb,
lib/thinking_sphinx/core/string.rb,
lib/thinking_sphinx/auto_version.rb,
lib/thinking_sphinx/facet_search.rb,
lib/thinking_sphinx/index/builder.rb,
lib/thinking_sphinx/configuration.rb,
lib/thinking_sphinx/active_record.rb,
lib/thinking_sphinx/bundled_search.rb,
lib/thinking_sphinx/search_methods.rb,
lib/thinking_sphinx/index/faux_column.rb,
lib/thinking_sphinx/action_controller.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/log_subscriber.rb,
lib/thinking_sphinx/active_record/collection_proxy.rb,
lib/thinking_sphinx/active_record/attribute_updates.rb,
lib/thinking_sphinx/active_record/has_many_association.rb,
lib/thinking_sphinx/active_record/collection_proxy_with_scopes.rb,
lib/thinking_sphinx/active_record/has_many_association_with_scopes.rb

Defined Under Namespace

Modules: ActionController, ActiveRecord, Core, Deltas, SearchMethods Classes: AbstractAdapter, Association, Attribute, AutoVersion, BundledSearch, ClassFacet, Configuration, ConnectionError, Context, Excerpter, Facet, FacetSearch, Field, Index, Join, MysqlAdapter, PostgreSQLAdapter, Property, Railtie, Search, Source, SphinxError, StaleIdsException, Test

Constant Summary

Version =
'2.0.13'
@@sphinx_mutex =

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.

Mutex.new
@@context =
nil
@@define_indexes =
true
@@deltas_enabled =
nil
@@updates_enabled =
nil
@@suppress_delta_output =
false
@@remote_sphinx =
false
@@use_group_by_shortcut =
nil

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

+ (Object) context



76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/thinking_sphinx.rb', line 76

def self.context
  if @@context.nil?
    mutex.synchronize do
      if @@context.nil?
        @@context = ThinkingSphinx::Context.new
        @@context.prepare
      end
    end
  end

  @@context
end

+ (Object) define_indexes=(value)

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

ThinkingSphinx.define_indexes = false


109
110
111
112
113
# File 'lib/thinking_sphinx.rb', line 109

def self.define_indexes=(value)
  mutex.synchronize do
    @@define_indexes = value
  end
end

+ (Boolean) define_indexes?

Check if index definition is disabled.

Returns:

  • (Boolean)


101
102
103
# File 'lib/thinking_sphinx.rb', line 101

def self.define_indexes?
  @@define_indexes
end

+ (Object) deltas_enabled=(value)

Enable/disable delta indexing.

ThinkingSphinx.deltas_enabled = false


135
136
137
138
139
# File 'lib/thinking_sphinx.rb', line 135

def self.deltas_enabled=(value)
  mutex.synchronize do
    @@deltas_enabled = value
  end
end

+ (Boolean) deltas_enabled?

Check if delta indexing is enabled/disabled.

Returns:

  • (Boolean)


117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/thinking_sphinx.rb', line 117

def self.deltas_enabled?
  if @@deltas_enabled.nil?
    mutex.synchronize do
      if @@deltas_enabled.nil?
        @@deltas_enabled = (
          ThinkingSphinx::Configuration.environment != "test"
        )
      end
    end
  end

  @@deltas_enabled && !deltas_suspended?
end

+ (Object) deltas_suspended=(value)

Suspend/resume delta indexing.

ThinkingSphinx.deltas_suspended = false


155
156
157
# File 'lib/thinking_sphinx.rb', line 155

def self.deltas_suspended=(value)
  Thread.current[:thinking_sphinx_deltas_suspended] = value
end

+ (Boolean) deltas_suspended?

Check if delta indexing is suspended.

Returns:

  • (Boolean)


143
144
145
146
147
148
149
# File 'lib/thinking_sphinx.rb', line 143

def self.deltas_suspended?
  if Thread.current[:thinking_sphinx_deltas_suspended].nil?
    Thread.current[:thinking_sphinx_deltas_suspended] = false
  end

  Thread.current[:thinking_sphinx_deltas_suspended]
end

+ (Boolean) jruby?

Returns:

  • (Boolean)


279
280
281
# File 'lib/thinking_sphinx.rb', line 279

def self.jruby?
  defined?(JRUBY_VERSION)
end

+ (Boolean) microsoft?

Returns:

  • (Boolean)


275
276
277
# File 'lib/thinking_sphinx.rb', line 275

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

+ (Object) mutex



72
73
74
# File 'lib/thinking_sphinx.rb', line 72

def self.mutex
  @@sphinx_mutex
end

+ (Boolean) mysql?

Returns:

  • (Boolean)


283
284
285
286
287
288
289
# File 'lib/thinking_sphinx.rb', line 283

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

+ (Boolean) pid_active?(pid)

Returns:

  • (Boolean)


267
268
269
270
271
272
273
# File 'lib/thinking_sphinx.rb', line 267

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

+ (Boolean) rails_3_1?

Returns:

  • (Boolean)


291
292
293
# File 'lib/thinking_sphinx.rb', line 291

def self.rails_3_1?
  !!defined?(::ActiveRecord::Associations::CollectionProxy)
end

+ (Object) remote_sphinx=(value)

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


238
239
240
241
242
# File 'lib/thinking_sphinx.rb', line 238

def self.remote_sphinx=(value)
  mutex.synchronize do
    @@remote_sphinx = value
  end
end

+ (Boolean) remote_sphinx?

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

Returns:

  • (Boolean)


226
227
228
# File 'lib/thinking_sphinx.rb', line 226

def self.remote_sphinx?
  @@remote_sphinx
end

+ (Object) reset_context!(context = nil)



89
90
91
92
93
# File 'lib/thinking_sphinx.rb', line 89

def self.reset_context!(context = nil)
  mutex.synchronize do
    @@context = context
  end
end

+ (Object) reset_use_group_by_shortcut



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

def self.reset_use_group_by_shortcut
  mutex.synchronize do
    @@use_group_by_shortcut = nil
  end
end

+ (Object) sphinx_pid



259
260
261
262
263
264
265
# File 'lib/thinking_sphinx.rb', line 259

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

+ (Boolean) sphinx_running?

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)


248
249
250
# File 'lib/thinking_sphinx.rb', line 248

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

+ (Boolean) sphinx_running_by_pid?

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

Returns:

  • (Boolean)


255
256
257
# File 'lib/thinking_sphinx.rb', line 255

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

+ (Object) suppress_delta_output=(value)



190
191
192
193
194
# File 'lib/thinking_sphinx.rb', line 190

def self.suppress_delta_output=(value)
  mutex.synchronize do
    @@suppress_delta_output = value
  end
end

+ (Boolean) suppress_delta_output?

Returns:

  • (Boolean)


186
187
188
# File 'lib/thinking_sphinx.rb', line 186

def self.suppress_delta_output?
  @@suppress_delta_output
end

+ (Object) unique_id_expression(adapter, offset = nil)



95
96
97
# File 'lib/thinking_sphinx.rb', line 95

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

+ (Object) updates_enabled=(value)

Enable/disable updates to Sphinx

ThinkingSphinx.updates_enabled = false


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

def self.updates_enabled=(value)
  mutex.synchronize do
    @@updates_enabled = value
  end
end

+ (Boolean) updates_enabled?

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

Returns:

  • (Boolean)


162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/thinking_sphinx.rb', line 162

def self.updates_enabled?
  if @@updates_enabled.nil?
    mutex.synchronize do
      if @@updates_enabled.nil?
        @@updates_enabled = (
          ThinkingSphinx::Configuration.environment != "test"
        )
      end
    end
  end

  @@updates_enabled
end

+ (Boolean) use_group_by_shortcut?

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

Returns:

  • (Boolean)


199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/thinking_sphinx.rb', line 199

def self.use_group_by_shortcut?
  if @@use_group_by_shortcut.nil?
    mutex.synchronize do
      if @@use_group_by_shortcut.nil?
        @@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
    end
  end

  @@use_group_by_shortcut
end