Module: ElasticsearchServerless::API::Utils

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

Class Method Summary collapse

Class Method Details

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


45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/elasticsearch-serverless/api/utils.rb', line 45

def self.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| JSON.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| JSON.dump(item) }
    payload << ''
  end

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

.escape(string) ⇒ 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.

URL-escape a string

Examples:

__escape('foo/bar') # => 'foo%2Fbar'
__escape('bar^bam') # => 'bar%5Ebam'


110
111
112
113
114
# File 'lib/elasticsearch-serverless/api/utils.rb', line 110

def self.escape(string)
  return string if string == '*'

  ERB::Util.url_encode(string.to_s)
end

.listify(*list) ⇒ 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.

Create a “list” of values from arguments, ignoring nil values and encoding special characters.

Examples:

Create a list from array

listify(['A','B']) # => 'A,B'

Create a list from arguments

listify('A','B') # => 'A,B'

Escape values

listify('foo','bar^bam') # => 'foo,bar%5Ebam'

Do not escape the values

listify('foo','bar^bam', escape: false) # => 'foo,bar^bam'


91
92
93
94
95
96
97
98
99
100
101
# File 'lib/elasticsearch-serverless/api/utils.rb', line 91

def self.listify(*list)
  options = list.last.is_a?(Hash) ? list.pop : {}

  escape = options[:escape]
  Array(list)
    .flat_map { |e| e.respond_to?(:split) ? e.split(',') : e }
    .flatten
    .compact
    .map { |e| escape == false ? e : escape(e) }
    .join(',')
end

.process_params(arguments) ⇒ Object



24
25
26
27
# File 'lib/elasticsearch-serverless/api/utils.rb', line 24

def self.process_params(arguments)
  arguments = Hash[arguments] unless arguments.is_a?(Hash)
  Hash[arguments.map { |k, v| v.is_a?(Array) ? [k, listify(v, { escape: false })] : [k, v] }] # Listify Arrays
end

.rescue_from_not_found {|block| ... } ⇒ 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.

Calls the given block, rescuing from ‘StandardError`.

Primary use case is the ‘:ignore` parameter for API calls.

Returns ‘false` if exception contains NotFound in its class name or message, else re-raises the exception.

Yields:

  • (block)

    A block of code to be executed with exception handling.



127
128
129
130
131
132
133
134
135
# File 'lib/elasticsearch-serverless/api/utils.rb', line 127

def self.rescue_from_not_found(&block)
  yield
rescue StandardError => e
  if e.class.to_s =~ /NotFound/ || e.message =~ /Not\s*Found/i
    false
  else
    raise e
  end
end