73 lines
1.9 KiB
Ruby
73 lines
1.9 KiB
Ruby
module Elasticsearch
|
|
module Model
|
|
module Response
|
|
|
|
# Encapsulates the collection of records returned from the database
|
|
#
|
|
# Implements Enumerable and forwards its methods to the {#records} object,
|
|
# which is provided by an {Elasticsearch::Model::Adapter::Adapter} implementation.
|
|
#
|
|
class Records
|
|
include Enumerable
|
|
|
|
delegate :each, :empty?, :size, :slice, :[], :to_a, :to_ary, to: :records
|
|
|
|
attr_accessor :options
|
|
|
|
include Base
|
|
|
|
# @see Base#initialize
|
|
#
|
|
def initialize(klass, response, options={})
|
|
super
|
|
|
|
# Include module provided by the adapter in the singleton class ("metaclass")
|
|
#
|
|
adapter = Adapter.from_class(klass)
|
|
metaclass = class << self; self; end
|
|
metaclass.__send__ :include, adapter.records_mixin
|
|
|
|
self.options = options
|
|
self
|
|
end
|
|
|
|
# Returns the hit IDs
|
|
#
|
|
def ids
|
|
response.response['hits']['hits'].map { |hit| hit['_id'] }
|
|
end
|
|
|
|
# Returns the {Results} collection
|
|
#
|
|
def results
|
|
response.results
|
|
end
|
|
|
|
# Yields [record, hit] pairs to the block
|
|
#
|
|
def each_with_hit(&block)
|
|
records.to_a.zip(results).each(&block)
|
|
end
|
|
|
|
# Yields [record, hit] pairs and returns the result
|
|
#
|
|
def map_with_hit(&block)
|
|
records.to_a.zip(results).map(&block)
|
|
end
|
|
|
|
# Delegate methods to `@records`
|
|
#
|
|
def method_missing(method_name, *arguments)
|
|
records.respond_to?(method_name) ? records.__send__(method_name, *arguments) : super
|
|
end
|
|
|
|
# Respond to methods from `@records`
|
|
#
|
|
def respond_to?(method_name, include_private = false)
|
|
records.respond_to?(method_name) || super
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|