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/deltas.rb,
lib/thinking_sphinx/search.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/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/bundled_search.rb,
lib/thinking_sphinx/search_methods.rb,
lib/thinking_sphinx/action_controller.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/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 collapse

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

.contextObject



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

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

  @@context
end

.define_indexes=(value) ⇒ Object

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

ThinkingSphinx.define_indexes = false


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

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

.define_indexes?Boolean

Check if index definition is disabled.

Returns:

  • (Boolean)


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

def self.define_indexes?
  @@define_indexes
end

.deltas_enabled=(value) ⇒ Object

Enable/disable delta indexing.

ThinkingSphinx.deltas_enabled = false


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

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

.deltas_enabled?Boolean

Check if delta indexing is enabled/disabled.

Returns:

  • (Boolean)


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

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

.deltas_suspended=(value) ⇒ Object

Suspend/resume delta indexing.

ThinkingSphinx.deltas_suspended = false


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

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

.deltas_suspended?Boolean

Check if delta indexing is suspended.

Returns:

  • (Boolean)


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

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

.jruby?Boolean

Returns:

  • (Boolean)


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

def self.jruby?
  defined?(JRUBY_VERSION)
end

.microsoft?Boolean

Returns:

  • (Boolean)


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

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

.mutexObject



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

def self.mutex
  @@sphinx_mutex
end

.mysql?Boolean

Returns:

  • (Boolean)


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

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

.pid_active?(pid) ⇒ Boolean

Returns:

  • (Boolean)


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

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

.rails_3_1?Boolean

Returns:

  • (Boolean)


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

def self.rails_3_1?
  !!defined?(::ActiveRecord::Associations::CollectionProxy)
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


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

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

.remote_sphinx?Boolean

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

Returns:

  • (Boolean)


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

def self.remote_sphinx?
  @@remote_sphinx
end

.reset_context!(context = nil) ⇒ Object



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

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

.reset_use_group_by_shortcutObject



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

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

.sphinx_pidObject



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

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)


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

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)


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

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

.suppress_delta_output=(value) ⇒ Object



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

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

.suppress_delta_output?Boolean

Returns:

  • (Boolean)


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

def self.suppress_delta_output?
  @@suppress_delta_output
end

.unique_id_expression(adapter, offset = nil) ⇒ Object



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

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

.updates_enabled=(value) ⇒ Object

Enable/disable updates to Sphinx

ThinkingSphinx.updates_enabled = false


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

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

.updates_enabled?Boolean

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

Returns:

  • (Boolean)


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

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

.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)


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

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