class Elos::Criteria

Public Class Methods

new(params:, query_builder_class:, klass:) click to toggle source
# File lib/elos/criteria.rb, line 4
def initialize(params:, query_builder_class:, klass:)
  @client = Elos.client
  @params = params
  @query_builder_class = query_builder_class
  @klass = klass
end

Public Instance Methods

current_page() click to toggle source
# File lib/elos/criteria.rb, line 37
def current_page
  @params[:page]
end
first!() click to toggle source
# File lib/elos/criteria.rb, line 59
def first!
  r = first
  raise Elos::Errors::NotFound unless r
  r
end
first_page?() click to toggle source
# File lib/elos/criteria.rb, line 45
def first_page?
  current_page == 1
end
includes(*names) click to toggle source
# File lib/elos/criteria.rb, line 27
def includes(*names)
  @includes = names
  self
end
last_page?() click to toggle source
# File lib/elos/criteria.rb, line 49
def last_page?
  current_page == total_pages
end
limit(per = nil)
Alias for: per
page(page) click to toggle source
# File lib/elos/criteria.rb, line 11
def page(page)
  @params[:page] = page
  self
end
per(per = nil) click to toggle source
# File lib/elos/criteria.rb, line 16
def per(per = nil)
  if per
    @params[:per] = per
    self
  else
    @params[:per]
  end
end
Also aliased as: limit
query() click to toggle source
# File lib/elos/criteria.rb, line 65
def query
  @query_builder_class.new(@params.merge(class: @klass)).wrap_build
end
to_a!() click to toggle source
# File lib/elos/criteria.rb, line 53
def to_a!
  r = to_a
  raise Elos::Errors::NotFound if r.empty?
  r
end
total_count() click to toggle source
# File lib/elos/criteria.rb, line 32
def total_count
  result
  @total_count
end
total_pages() click to toggle source
# File lib/elos/criteria.rb, line 41
def total_pages
  [0, total_count - 1].max / @params[:per] + 1
end

Protected Instance Methods

result() click to toggle source
# File lib/elos/criteria.rb, line 71
def result
  return @result if @result
  search_result = @client.search(index: @klass.read_alias_name, type: @klass.type_name, body: query)
  # puts JSON.pretty_generate(results)
  @total_count = search_result['hits']['total']
  @results = search_result['hits']['hits'].map do |h|
    source = h['_source']
    if json = source.delete('json')
      source.reverse_merge!(JSON.parse(json))
    end
    source.deep_symbolize_keys!
    @klass.new(source.reverse_merge(score: h['_score'], highlight: h['highlight']).merge(id: h['_id'], _persisted: true))
  end
end