Module: Elasticsearch::Model::Adapter::Multiple::Records
- Defined in:
- lib/elasticsearch/model/adapters/multiple.rb
Instance Method Summary collapse
-
#__adapter_for_klass(klass) ⇒ Object
private
Returns the adapter registered for a particular ‘klass` or `nil` if not available.
-
#__ids_by_type ⇒ Object
private
Returns the record IDs grouped by class based on type ‘_type`.
- #__no_type?(hit) ⇒ Boolean
-
#__records_by_type ⇒ Object
private
Returns the collection of records grouped by class based on ‘_type`.
-
#__records_for_klass(klass, ids) ⇒ Object
private
Returns the collection of records for a specific type based on passed ‘klass`.
-
#__type_for_hit(hit) ⇒ Object
private
Returns the class of the model corresponding to a specific ‘hit` in Elasticsearch results.
-
#records ⇒ Object
Returns a collection of model instances, possibly of different classes (ActiveRecord, Mongoid, …).
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_type ⇒ 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 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
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_type ⇒ 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 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
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 |
#records ⇒ Object
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 |