Module: Elasticsearch::Model::Adapter::Multiple::Records

Defined in:
lib/elasticsearch/model/adapters/multiple.rb

Instance Method Summary collapse

Instance Method Details

#__adapter_for_klass(klass) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns the adapter registered for a particular ‘klass` or `nil` if not available



129
130
131
# File 'lib/elasticsearch/model/adapters/multiple.rb', line 129

def __adapter_for_klass(klass)
  Adapter.adapters.select { |name, checker| checker.call(klass) }.keys.first
end

#__ids_by_typeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns the record IDs grouped by class based on type ‘_type`

Example:

{ Foo => ["1"], Bar => ["1", "5"] }


90
91
92
93
94
95
96
97
98
99
# File 'lib/elasticsearch/model/adapters/multiple.rb', line 90

def __ids_by_type
  ids_by_type = {}

  response.response["hits"]["hits"].each do |hit|
    type = __type_for_hit(hit)
    ids_by_type[type] ||= []
    ids_by_type[type] << hit[:_id]
  end
  ids_by_type
end

#__no_type?(hit) ⇒ Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/elasticsearch/model/adapters/multiple.rb', line 121

def __no_type?(hit)
  hit[:_type].nil? || hit[:_type] == '_doc'
end

#__records_by_typeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

 Returns the collection of records grouped by class based on ‘_type`

Example:

Foo  => {"1"=> #<Foo id: 1, title: "ABC", ...},
Bar  => #<Bar id: 1, name: "XYZ", ...}

}



55
56
57
58
59
60
61
62
63
# File 'lib/elasticsearch/model/adapters/multiple.rb', line 55

def __records_by_type
  result = __ids_by_type.map do |klass, ids|
    records = __records_for_klass(klass, ids)
    ids     = records.map(&:id).map(&:to_s)
    [ klass, Hash[ids.zip(records)] ]
  end

  Hash[result]
end

#__records_for_klass(klass, ids) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns the collection of records for a specific type based on passed ‘klass`



69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/elasticsearch/model/adapters/multiple.rb', line 69

def __records_for_klass(klass, ids)
  adapter = __adapter_for_klass(klass)

  case
    when Elasticsearch::Model::Adapter::ActiveRecord.equal?(adapter)
      klass.where(klass.primary_key => ids)
    when Elasticsearch::Model::Adapter::Mongoid.equal?(adapter)
      klass.where(:id.in => ids)
  else
    klass.find(ids)
  end
end

#__type_for_hit(hit) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns the class of the model corresponding to a specific ‘hit` in Elasticsearch results

See Also:



107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/elasticsearch/model/adapters/multiple.rb', line 107

def __type_for_hit(hit)
  @@__types ||= {}

  key = "#{hit[:_index]}::#{hit[:_type]}" if hit[:_type] && hit[:_type] != '_doc'
  key = hit[:_index] unless key

  @@__types[key] ||= begin
    Registry.all.detect do |model|
      (model.index_name == hit[:_index] && __no_type?(hit)) ||
          (model.index_name == hit[:_index] && model.document_type == hit[:_type])
    end
  end
end

#recordsObject

Note:

The order of results in the Elasticsearch response is preserved

Returns a collection of model instances, possibly of different classes (ActiveRecord, Mongoid, …)



34
35
36
37
38
39
40
41
42
# File 'lib/elasticsearch/model/adapters/multiple.rb', line 34

def records
  records_by_type = __records_by_type

  records = response.response["hits"]["hits"].map do |hit|
    records_by_type[ __type_for_hit(hit) ][ hit[:_id] ]
  end

  records.compact
end