Sha256: 523fc0aed3afb5938053a0d3d63c647e00cc5fe29fff83b0a8370b1900b83fd9

Contents?: true

Size: 1.41 KB

Versions: 8

Compression:

Stored size: 1.41 KB

Contents

# based on Administrate Search: https://github.com/thoughtbot/administrate/blob/main/lib/administrate/search.rb

module Madmin
  class Search
    attr_reader :query

    def initialize(scoped_resource, resource, term)
      @resource = resource
      @scoped_resource = scoped_resource
      @query = term
    end

    def run
      if query.blank?
        @scoped_resource.all
      else
        search_results(@scoped_resource)
      end
    end

    private

    def search_results(resources)
      resources.where(query_template, *query_values)
    end

    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

    def searchable_fields(attr)
      [attr[:name]]
    end

    def query_values
      fields_count = search_attributes.sum do |attr|
        searchable_fields(attr).count
      end
      ["%#{@query.mb_chars.downcase}%"] * fields_count
    end

    def search_attributes
      @resource.searchable_attributes
    end

    def query_table_name(attr)
      ActiveRecord::Base.connection.quote_column_name(@scoped_resource.table_name)
    end

    def column_to_query(attr)
      ActiveRecord::Base.connection.quote_column_name(attr)
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
madmin-1.2.8 lib/madmin/search.rb
madmin-1.2.7 lib/madmin/search.rb
madmin-1.2.6 lib/madmin/search.rb
madmin-1.2.5 lib/madmin/search.rb
madmin-1.2.4 lib/madmin/search.rb
madmin-1.2.3 lib/madmin/search.rb
madmin-1.2.2 lib/madmin/search.rb
madmin-1.2.1 lib/madmin/search.rb