Class: Chewy::Search::Loader
- Inherits:
- 
      Object
      
        - Object
- Chewy::Search::Loader
 
- Defined in:
- lib/chewy/search/loader.rb
Overview
This class is used for two different purposes: load ORM/ODM source objects.
Instance Method Summary collapse
- #derive_index(index_name) ⇒ Object
- 
  
    
      #initialize(indexes: [], **options)  ⇒ Loader 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of Loader. 
- 
  
    
      #load(hits)  ⇒ Array<Object, nil> 
    
    
  
  
  
  
  
  
  
  
  
    For each passed hit this method loads an ORM/ORD source object using hit['_id'].
Constructor Details
#initialize(indexes: [], **options) ⇒ Loader
Returns a new instance of Loader.
| 14 15 16 17 | # File 'lib/chewy/search/loader.rb', line 14 def initialize(indexes: [], **) @indexes = indexes @options = end | 
Instance Method Details
#derive_index(index_name) ⇒ Object
| 19 20 21 22 23 24 25 26 27 28 | # File 'lib/chewy/search/loader.rb', line 19 def derive_index(index_name) index = (@derive_index ||= {})[index_name] ||= indexes_hash[index_name] || indexes_hash[indexes_hash.keys.sort_by(&:length) .reverse.detect do |name| index_name.match(/#{name}(_.+|\z)/) end] raise Chewy::UndefinedIndex, "Can not find index named `#{index}`" unless index index end | 
#load(hits) ⇒ Array<Object, nil>
For each passed hit this method loads an ORM/ORD source object
using hit['_id']. The returned array is exactly in the same order
as hits were. If source object was not found for some hit, nil
will be returned at the corresponding position in array.
Records/documents are loaded in an efficient manner, performing a single query for each index present.
| 40 41 42 43 44 45 46 47 48 49 50 51 52 | # File 'lib/chewy/search/loader.rb', line 40 def load(hits) hit_groups = hits.group_by { |hit| hit['_index'] } loaded_objects = hit_groups.each_with_object({}) do |(index_name, hit_group), result| index = derive_index(index_name) ids = hit_group.map { |hit| hit['_id'] } loaded = index.adapter.load(ids, **@options.merge(_index: index.base_name)) loaded ||= hit_group.map { |hit| index.build(hit) } result.merge!(hit_group.zip(loaded).to_h) end hits.map { |hit| loaded_objects[hit] } end |