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 18
def initialize(context)
  @context = context
end

Public Instance Methods

call() click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 22
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 36
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 42
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 48
def model_names
  @model_names ||= context[:results].collect { |row|
    row['sphinx_internal_class']
  }.uniq
end
model_relation_with_sql_options(relation) click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 86
def model_relation_with_sql_options(relation)
  relation = relation.includes sql_options[:include] if sql_options[:include]
  relation = relation.joins  sql_options[:joins]  if sql_options[:joins]
  relation = relation.order  sql_options[:order]  if sql_options[:order]
  relation = relation.select sql_options[:select] if sql_options[:select]
  relation = relation.group  sql_options[:group]  if sql_options[:group]
  relation
end
primary_key_for(model) click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 54
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 61
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 66
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 74
def results_for_models
  @results_for_models ||= model_names.inject({}) do |hash, name|
    model = name.constantize

    hash[name] = model_relation_with_sql_options(model.unscoped).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 95
def sql_options
  context.search.options[:sql] || {}
end