18F/e-manifest

View on GitHub
app/search/fielded_query.rb

Summary

Maintainability
A
3 hrs
Test Coverage
module Search
  class FieldedQuery
    attr_reader :field_pairs

    def initialize(field_pairs)
      @field_pairs = field_pairs
    end

    def present?
      return false unless field_pairs
      to_s.present?
    end

    def value_for(key)
      if field_pairs && field_pairs.key?(key)
        field_pairs[key]
      end
    end

    def to_s
      clauses = []
      if field_pairs
        field_pairs.each do |k, v|
          next if v.nil?
          next if v.blank?
          next if v == "*"
          clauses << clause_to_s(k, v)
        end
      end
      clauses.join(" ")
    end

    def to_h
      hash = {}
      if field_pairs
        field_pairs.each do |k, v|
          next if v.nil?
          next if v.blank?
          next if v == "*"
          hash[k] = v
        end
      end
      hash
    end

    def humanized(model)
      humanized = {}
      to_h.each do |k, v|
        attr = k.gsub('.', '_')
        humanized[model.human_attribute_name(attr)] = v
      end
      self.class.new(humanized)
    end

    private

    def clause_to_s(key, value)
      if value.to_s.match(/^\w/)
        "#{key}:(#{value})"
      else
        "#{key}:#{value}"
      end
    end
  end
end