class ArtirixDataModels::EsCollection

Constants

CACHE_KEY_RESULT_SEPARATOR
CACHE_KEY_SECTION_SEPARATOR
DEFAULT_SIZE
EMPTY_RESPONSE

Attributes

from[R]
klass_or_factory[R]
response[R]
size[R]

Public Class Methods

empty(model_class, from: 0, size: DEFAULT_SIZE) click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 37
def self.empty(model_class, from: 0, size: DEFAULT_SIZE)
  new model_class, response: EMPTY_RESPONSE, from: from, size: size
end
from_array(array, total: nil, page_number: nil, per_page: nil) click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 41
def self.from_array(array, total: nil, page_number: nil, per_page: nil)
  self.new(-> (x) { x }, response: {}).tap do |obj|
    total    ||= array.length
    per_page = per_page.to_i

    from  = 0
    size  = total
    slice = array

    if per_page > 0
      page_number = page_number.to_i
      page_number = 1 if page_number < 1

      from  = (page_number - 1) * per_page
      size  = per_page
      slice = array.drop(from).take(per_page)
    end

    obj.instance_variable_set(:@results, slice)
    obj.instance_variable_set(:@hits, { hits: slice })
    obj.instance_variable_set(:@total, total)
    obj.instance_variable_set(:@from, from)
    obj.instance_variable_set(:@size, size)
    obj.instance_variable_set(:@max_score, 1)
  end
end
new(klass_or_factory, response:, from: 0, size: DEFAULT_SIZE, dao_registry: nil, dao_registry_loader: nil, aggregations_factory: nil) click to toggle source

@param klass_or_factory [A Model Class|Callable] The model class or the Factory (callable object) to build the model @param response [Hash] The full response returned from the DataLayer @param from [Int] requested offset (0 by default) @param size [Int] requested amount of hits (10 by default) @param aggregations_factory [Int] requested amount of hits (10 by default)

# File lib/artirix_data_models/es_collection.rb, line 79
def initialize(klass_or_factory,
               response:,
               from: 0,
               size: DEFAULT_SIZE,
               dao_registry: nil,
               dao_registry_loader: nil,
               aggregations_factory: nil)

  set_dao_registry_and_loader dao_registry_loader, dao_registry

  @klass_or_factory     = klass_or_factory
  @response             = response
  @from                 = from
  @size                 = size
  @aggregations_factory = aggregations_factory
end
work_with_kaminari() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 10
def self.work_with_kaminari
  require 'kaminari'
  include KaminariEsCollection
end
work_with_will_paginate() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 15
def self.work_with_will_paginate
  require 'will_paginate'
  include WillPaginateEsCollection
end

Public Instance Methods

aggregation(name) click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 122
def aggregation(name)
  n = name.to_sym
  aggregations.detect { |x| x.name == n }
end
aggregations() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 118
def aggregations
  @aggregations ||= build_aggregations
end
aggregations_factory() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 96
def aggregations_factory
  @aggregations_factory || dao_registry.get(:aggregations_factory)
end
cache_key() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 156
def cache_key
  [
    total,
    size,
    from,
    results.map { |x| x.try(:cache_key) || x.to_s }.join(CACHE_KEY_RESULT_SEPARATOR)
  ].join(CACHE_KEY_SECTION_SEPARATOR)
end
current_page() click to toggle source

Return the current page

# File lib/artirix_data_models/es_collection.rb, line 152
def current_page
  from / size + 1 if from && size
end
data_hash(&block) click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 133
def data_hash(&block)
  block ||= :data_hash

  {
    size:         size,
    from:         from,
    total:        total,
    max_score:    max_score,
    aggregations: aggregations.map(&:data_hash),
    hits:         results.map(&block),
  }
end
hits() click to toggle source

The raw hits

# File lib/artirix_data_models/es_collection.rb, line 114
def hits
  @hits ||= response[:hits]
end
hits_data() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 146
def hits_data
  results.map(&:data_hash)
end
max_score() click to toggle source

The maximum score for a query

# File lib/artirix_data_models/es_collection.rb, line 108
def max_score
  @max_score ||= hits[:max_score]
end
raw_aggregations_data() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 165
def raw_aggregations_data
  response[:aggregations]
end
results() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 127
def results
  @results ||= load_results
end
total() click to toggle source

The number of total hits for a query

# File lib/artirix_data_models/es_collection.rb, line 102
def total
  @total ||= hits[:total]
end

Private Instance Methods

build_aggregations() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 170
def build_aggregations
  aggregations_factory.build_all_from_raw_data(raw_aggregations_data)
end
complete_model(model) click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 193
def complete_model(model)
  if model
    dao_registry.register_model model
    model.try :set_dao_registry_loader, dao_registry_loader
  end

  model
end
deserialize_document(document) click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 180
def deserialize_document(document)
  info = info_from_document(document)

  model = if model_factory
            model_factory.call info
          elsif model_class
            model_class.new info
          else
            raise 'no model class, nor model factory'
          end
  complete_model model
end
info_from_document(document) click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 210
def info_from_document(document)
  document[:_source].merge _score: document[:_score],
                           _type:  document[:_type],
                           _index: document[:_index],
                           _id:    document[:_id]
end
load_results() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 174
def load_results
  hits[:hits].map do |document|
    deserialize_document(document)
  end
end
model_class() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 206
def model_class
  klass_or_factory.respond_to?(:new) ? klass_or_factory : nil
end
model_factory() click to toggle source
# File lib/artirix_data_models/es_collection.rb, line 202
def model_factory
  klass_or_factory.respond_to?(:call) ? klass_or_factory : nil
end