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
klassornilif 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
hitin 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 |