Sha256: f37ec81b81ce1616d395dcdac416bb625ee37965faab801bac09914931694714

Contents?: true

Size: 1.43 KB

Versions: 2

Compression:

Stored size: 1.43 KB

Contents

class Wallaby::ActiveRecord::ModelOperator::Querier
  def initialize(model_decorator)
    @model_decorator  = model_decorator
    @model_class      = @model_decorator.model_class
  end

  def search(params)
    text_keywords, field_keywords = extract params
    query = @model_class.where nil
    query = text_search text_keywords, query
    query = field_search field_keywords, query
    query
  end

  protected
  def extract(params)
    all_keywords = (params[:q] || '').split(' ').compact
    field_keywords = all_keywords.select{ |v| v.split(':').length == 2 }
    [ all_keywords - field_keywords, field_keywords ]
  end

  def text_search(keywords, query)
    return query if keywords.blank?

    queries = text_fields.inject([]) do |queries, field_name|
      likes = keywords.map do |keyword|
        [ "UPPER(#{ field_name }) LIKE ?", "%#{ keyword.upcase }%" ]
      end
      queries << [ "(#{ likes.map(&:first).join ' AND ' })", likes.map(&:last) ]
    end
    query.where queries.map(&:first).join(' OR '), *queries.map(&:last).flatten
  end

  def field_search(keywords, query)
    return query if keywords.blank?

    hashed_queries = Wallaby::Utils.to_hash(keywords.map{ |v| v.split ':' })
    query.where hashed_queries
  end

  def text_fields
    @model_decorator.fields.select do |field_name, metadata|
      @model_decorator.index_field_names.include?(field_name) &&
      %w( string text citext ).include?(metadata[:type])
    end.keys
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
wallaby-4.1.6 lib/adaptors/wallaby/active_record/model_operator/querier.rb
wallaby-5.0.1 lib/adaptors/wallaby/active_record/model_operator/querier.rb