class Administrate::Search

Attributes

query[R]
resolver[R]

Public Class Methods

new(scoped_resource, dashboard, term) click to toggle source
# File lib/administrate/search.rb, line 51
def initialize(scoped_resource, dashboard, term)
  @dashboard = dashboard
  @scoped_resource = scoped_resource
  @query = Query.new(term, valid_filters.keys)
end

Public Instance Methods

run() click to toggle source
# File lib/administrate/search.rb, line 57
def run
  if query.blank?
    @scoped_resource.all
  else
    results = search_results(@scoped_resource)
    results = filter_results(results)
    results
  end
end

Private Instance Methods

apply_filter(filter, filter_param, resources) click to toggle source
# File lib/administrate/search.rb, line 69
def apply_filter(filter, filter_param, resources)
  return resources unless filter
  if filter.parameters.size == 1
    filter.call(resources)
  else
    filter.call(resources, filter_param)
  end
end
association_search?(attribute) click to toggle source
# File lib/administrate/search.rb, line 159
def association_search?(attribute)
  attribute_types[attribute].associative?
end
attribute_types() click to toggle source
# File lib/administrate/search.rb, line 128
def attribute_types
  @dashboard.class.const_get(:ATTRIBUTE_TYPES)
end
column_to_query(attr) click to toggle source
# File lib/administrate/search.rb, line 149
def column_to_query(attr)
  ActiveRecord::Base.connection.quote_column_name(attr)
end
filter_results(resources) click to toggle source
# File lib/administrate/search.rb, line 78
def filter_results(resources)
  query.filters.each do |filter_query|
    filter_name, filter_param = filter_query.split(":")
    filter = valid_filters[filter_name]
    resources = apply_filter(filter, filter_param, resources)
  end
  resources
end
query_table_name(attr) click to toggle source
# File lib/administrate/search.rb, line 132
def query_table_name(attr)
  if association_search?(attr)
    provided_class_name = attribute_types[attr].options[:class_name]
    unquoted_table_name =
      if provided_class_name
        Administrate.warn_of_deprecated_option(:class_name)
        provided_class_name.constantize.table_name
      else
        @scoped_resource.reflect_on_association(attr).klass.table_name
      end
    ActiveRecord::Base.connection.quote_table_name(unquoted_table_name)
  else
    ActiveRecord::Base.connection.
      quote_table_name(@scoped_resource.table_name)
  end
end
query_template() click to toggle source
# File lib/administrate/search.rb, line 87
def query_template
  search_attributes.map do |attr|
    table_name = query_table_name(attr)
    searchable_fields(attr).map do |field|
      column_name = column_to_query(field)
      "LOWER(CAST(#{table_name}.#{column_name} AS CHAR(256))) LIKE ?"
    end.join(" OR ")
  end.join(" OR ")
end
query_values() click to toggle source
# File lib/administrate/search.rb, line 103
def query_values
  fields_count = search_attributes.sum do |attr|
    searchable_fields(attr).count
  end
  ["%#{term.mb_chars.downcase}%"] * fields_count
end
search_attributes() click to toggle source
# File lib/administrate/search.rb, line 110
def search_attributes
  @dashboard.search_attributes
end
search_results(resources) click to toggle source
# File lib/administrate/search.rb, line 114
def search_results(resources)
  resources.
    left_joins(tables_to_join).
    where(query_template, *query_values)
end
searchable_fields(attr) click to toggle source
# File lib/administrate/search.rb, line 97
def searchable_fields(attr)
  return [attr] unless association_search?(attr)

  attribute_types[attr].searchable_fields
end
tables_to_join() click to toggle source
# File lib/administrate/search.rb, line 153
def tables_to_join
  attribute_types.keys.select do |attribute|
    attribute_types[attribute].searchable? && association_search?(attribute)
  end
end
term() click to toggle source
# File lib/administrate/search.rb, line 163
def term
  query.terms
end
valid_filters() click to toggle source
# File lib/administrate/search.rb, line 120
def valid_filters
  if @dashboard.class.const_defined?(:COLLECTION_FILTERS)
    @dashboard.class.const_get(:COLLECTION_FILTERS).stringify_keys
  else
    {}
  end
end