module ElasticRecord::FromSearchHit

Public Instance Methods

from_search_hit(hit) click to toggle source
# File lib/elastic_record/from_search_hit.rb, line 4
def from_search_hit(hit)
  hit = hit['_source'].merge('id' => hit['_id'])

  attrs = value_from_search_hit_object(hit)

  if respond_to?(:instantiate)
    instantiate(attrs)
  else
    self.new.tap do |record|
      attrs.each do |k, v|
        record.send("#{k}=", v) if record.respond_to?("#{k}=")
      end
    end
  end
end

Private Instance Methods

value_for_date_range(value) click to toggle source
# File lib/elastic_record/from_search_hit.rb, line 58
def value_for_date_range(value)
  Date.parse(value['gte'])..Date.parse(value['lte'])
end
value_for_range(value) click to toggle source
# File lib/elastic_record/from_search_hit.rb, line 52
def value_for_range(value)
  value['gte'] = -Float::INFINITY if value['gte'].nil?
  value['lte'] =  Float::INFINITY if value['lte'].nil?
  value['gte']..value['lte']
end
value_from_search_hit(value) click to toggle source
# File lib/elastic_record/from_search_hit.rb, line 41
def value_from_search_hit(value)
  case value['gte'] # the gte lower bound is never nil
  when String
    value_for_date_range(value)
  when Integer
    value_for_range(value)
  else # type: 'object'
    value_from_search_hit_object(value)
  end
end
value_from_search_hit_object(hit) click to toggle source
# File lib/elastic_record/from_search_hit.rb, line 22
def value_from_search_hit_object(hit)
  hit.each do |field, value|
    next unless value

    case value
    when Hash
      hit[field] = value_from_search_hit(value)
    when Array # type: 'nested'
      value.each do |element|
        if element.is_a? Hash
          value_from_search_hit_object(element)
        end
      end
    end
  end

  hit
end