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



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

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"] }


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

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)


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

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", ...}

}



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

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`



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

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:



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

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, …)



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

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