Method: Elasticsearch::API::Utils#__bulkify

Defined in:
lib/elasticsearch/api/utils.rb

#__bulkify(payload) ⇒ Object

Convert an array of payloads into Elasticsearch ‘headerndata` format

Supports various different formats of the payload: Array of Strings, Header/Data pairs, or the conveniency “combined” format where data is passed along with the header in a single item.

Elasticsearch::API::Utils.__bulkify [
  { :index =>  { :_index => 'myindexA', :_type => 'mytype', :_id => '1', :data => { :title => 'Test' } } },
  { :update => { :_index => 'myindexB', :_type => 'mytype', :_id => '2', :data => { :doc => { :title => 'Update' } } } }
]

# => {"index":{"_index":"myindexA","_type":"mytype","_id":"1"}}
# => {"title":"Test"}
# => {"update":{"_index":"myindexB","_type":"mytype","_id":"2"}}
# => {"doc":{"title":"Update"}}

99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/elasticsearch/api/utils.rb', line 99

def __bulkify(payload)
  operations = %w[index create delete update]

  case

  # Hashes with `:data`
  when payload.any? { |d| d.is_a?(Hash) && d.values.first.is_a?(Hash) && operations.include?(d.keys.first.to_s) && (d.values.first[:data] || d.values.first['data']) }
    payload = payload.
      inject([]) do |sum, item|
        operation, meta = item.to_a.first
        meta            = meta.clone
        data            = meta.delete(:data) || meta.delete('data')

        sum << { operation => meta }
        sum << data if data
        sum
      end.
      map { |item| Elasticsearch::API.serializer.dump(item) }
    payload << '' unless payload.empty?

  # Array of strings
  when payload.all? { |d| d.is_a? String }
    payload << ''

  # Header/Data pairs
  else
    payload = payload.map { |item| Elasticsearch::API.serializer.dump(item) }
    payload << ''
  end

  payload = payload.join("\n")
end