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