class ThinkingSphinx::Middlewares::ActiveRecordTranslator::Inner

Attributes

context[R]

Public Class Methods

new(context) click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 20
def initialize(context)
  @context = context
end

Public Instance Methods

call() click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 24
def call
  results_for_models # load now to avoid segfaults

  context[:results] = if sql_options[:order]
    results_for_models.values.first
  else
    context[:results].collect { |row| result_for(row) }
  end
end

Private Instance Methods

ids_for_model(model_name) click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 38
def ids_for_model(model_name)
  context[:results].collect { |row|
    row['sphinx_internal_id'] if row['sphinx_internal_class'] == model_name
  }.compact
end
index_for(model) click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 44
def index_for(model)
  return NO_INDEX unless context[:indices]

  context[:indices].detect { |index| index.model == model } || NO_INDEX
end
model_names() click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 50
def model_names
  @model_names ||= context[:results].collect { |row|
    row['sphinx_internal_class']
  }.uniq
end
model_relation_with_sql_options(relation, model_sql_options) click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 90
def model_relation_with_sql_options(relation, model_sql_options)
  relation = relation.includes model_sql_options[:include] if model_sql_options[:include]
  relation = relation.joins  model_sql_options[:joins]  if model_sql_options[:joins]
  relation = relation.order  model_sql_options[:order]  if model_sql_options[:order]
  relation = relation.select model_sql_options[:select] if model_sql_options[:select]
  relation = relation.group  model_sql_options[:group]  if model_sql_options[:group]
  relation
end
primary_key_for(model) click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 56
def primary_key_for(model)
  model = NO_MODEL unless model.respond_to?(:primary_key)

  @primary_keys        ||= {}
  @primary_keys[model] ||= index_for(model).primary_key
end
reset_memos() click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 63
def reset_memos
  @model_names        = nil
  @results_for_models = nil
end
result_for(row) click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 68
def result_for(row)
  results_for_models[row['sphinx_internal_class']].detect { |record|
    record.public_send(
      primary_key_for(record.class)
    ) == row['sphinx_internal_id']
  }
end
results_for_models() click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 76
def results_for_models
  @results_for_models ||= model_names.inject({}) do |hash, name|
    model = name.constantize

    model_sql_options = sql_options[name] || sql_options

    hash[name] = model_relation_with_sql_options(model.unscoped, model_sql_options).where(
      primary_key_for(model) => ids_for_model(name)
    )

    hash
  end
end
sql_options() click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 99
def sql_options
  context.search.options[:sql] || {}
end