class PgSearch::ScopeOptions

def conditions

def conditions
  @feature_names.map { |feature_name| "(#{sanitize_sql_array(feature_for(feature_name).conditions)})" }.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, @model, normalizer)
end

def initialize(name, model, config)

def initialize(name, model, config)
  @name = name
  @model = model
  @config = config
  @feature_options = @config.features.inject({}) do |features_hash, (feature_name, feature_options)|
    features_hash.merge(
      feature_name => feature_options
    )
  end
  @feature_names = @config.features.map { |feature_name, feature_options| feature_name }
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

def to_relation

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