class PgSearch::ScopeOptions

def apply(scope)

def apply(scope)
  scope.select("#{quoted_table_name}.*, (#{rank}) AS pg_search_rank").where(conditions).order("pg_search_rank DESC, #{order_within_rank}").joins(joins)
end

def conditions

def conditions
  config.features.map do |feature_name, feature_options|
    "(#{sanitize_sql_array(feature_for(feature_name).conditions)})"
  end.join(" OR ")
end

def feature_for(feature_name)

def feature_for(feature_name)
  feature_name = feature_name.to_sym
  feature_class = FEATURE_CLASSES[feature_name]
  raise ArgumentError.new("Unknown feature: #{feature_name}") unless feature_class
  normalizer = Normalizer.new(config)
  feature_class.new(
    config.query,
    feature_options[feature_name],
    config.columns,
    config.model,
    normalizer
  )
end

def initialize(config)

def initialize(config)
  @config = config
  @model = config.model
  @feature_options = Hash[config.features]
end

def joins

def joins
  config.associations.map do |association|
    association.join(primary_key)
  end.join(' ')
end

def order_within_rank

def order_within_rank
  config.order_within_rank || "#{primary_key} ASC"
end

def primary_key

def primary_key
  "#{quoted_table_name}.#{connection.quote_column_name(@model.primary_key)}"
end

def rank

def rank
  (config.ranking_sql || ":tsearch").gsub(/:(\w*)/) do
    sanitize_sql_array(feature_for($1).rank)
  end
end