Class: ElasticsearchRecord::Result

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/elasticsearch_record/result.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(response, columns = [], column_types = {}) ⇒ Result

initializes a new result object

Parameters:

  • response (Elasticsearch::API::Response, Object, nil)
  • columns (Array) (defaults to: [])
  • column_types (Hash) (defaults to: {})


19
20
21
22
23
24
25
26
27
28
# File 'lib/elasticsearch_record/result.rb', line 19

def initialize(response, columns = [], column_types = {})
  # contains either the response or creates a empty hash (if nil)
  @response = response.presence || {}

  # used to build computed_results
  @columns = columns

  # used to cast values
  @column_types = column_types
end

Instance Attribute Details

#column_typesObject (readonly)

Returns the value of attribute column_types.



13
14
15
# File 'lib/elasticsearch_record/result.rb', line 13

def column_types
  @column_types
end

#columnsObject (readonly)

Returns the value of attribute columns.



13
14
15
# File 'lib/elasticsearch_record/result.rb', line 13

def columns
  @columns
end

#responseObject (readonly)

Returns the value of attribute response.



13
14
15
# File 'lib/elasticsearch_record/result.rb', line 13

def response
  @response
end

Class Method Details

.emptyElasticsearchRecord::Result (frozen)

creates an empty response

Returns:



9
10
11
# File 'lib/elasticsearch_record/result.rb', line 9

def self.empty
  new(nil).freeze
end

Instance Method Details

#[](idx) ⇒ Object



124
125
126
# File 'lib/elasticsearch_record/result.rb', line 124

def [](idx)
  computed_results[idx]
end

#aggregationsActiveSupport::HashWithIndifferentAccess, Hash

returns the response RAW aggregations hash.

Returns:

  • (ActiveSupport::HashWithIndifferentAccess, Hash)


65
66
67
# File 'lib/elasticsearch_record/result.rb', line 65

def aggregations
  response.key?('aggregations') ? response['aggregations'].with_indifferent_access : {}
end

#bucketsActiveSupport::HashWithIndifferentAccess

returns the (nested) bucket values (and aggregated values) from the response aggregations.

Returns:

  • (ActiveSupport::HashWithIndifferentAccess)


71
72
73
74
75
76
77
78
# File 'lib/elasticsearch_record/result.rb', line 71

def buckets
  # aggregations are already a hash with key => data, but to prevent reference manipulation on the hash
  # we have to create a new one here...
  aggregations.reduce({}) { |buckets, (key, agg)|
    buckets[key] = _resolve_bucket(agg)
    buckets
  }.with_indifferent_access
end

#cancelObject

used by ActiveRecord



140
141
142
# File 'lib/elasticsearch_record/result.rb', line 140

def cancel # :nodoc:
  self
end

#cast_values(type_overrides = {}) ⇒ Object

used by ActiveRecord



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/elasticsearch_record/result.rb', line 145

def cast_values(type_overrides = {})
  # :nodoc:
  if columns.one?
    # Separated to avoid allocating an array per row
    key = columns.first

    type = if type_overrides.is_a?(Array)
             type_overrides.first
           else
             column_type(columns.first, type_overrides)
           end

    computed_results.map do |result|
      type.deserialize(result[key])
    end
  else
    types = if type_overrides.is_a?(Array)
              type_overrides
            else
              columns.map { |name| column_type(name, type_overrides) }
            end

    size = types.size

    computed_results.map do |result|
      Array.new(size) { |i|
        key = columns[i]
        types[i].deserialize(result[key])
      }
    end
  end
end

#each(&block) ⇒ Object

Calls the given block once for each element in row collection, passing row as parameter.

Returns an +Enumerator+ if no block is given.



104
105
106
107
108
109
110
# File 'lib/elasticsearch_record/result.rb', line 104

def each(&block)
  if block_given?
    computed_results.each(&block)
  else
    computed_results.to_enum { @computed_results.size }
  end
end

#empty?Boolean

Returns true if there are no records, otherwise false.

Returns:

  • (Boolean)


113
114
115
# File 'lib/elasticsearch_record/result.rb', line 113

def empty?
  length == 0
end

#hitsActiveSupport::HashWithIndifferentAccess, Hash

returns the response RAW hits hash. PLEASE NOTE: Does not return the nested hits (+response['hits']['hits']+) array!

Returns:

  • (ActiveSupport::HashWithIndifferentAccess, Hash)


47
48
49
# File 'lib/elasticsearch_record/result.rb', line 47

def hits
  response.key?('hits') ? response['hits'].with_indifferent_access : {}
end

#includes_column?(name) ⇒ Boolean

Returns true if this result set includes the column named +name+. used by ActiveRecord

Returns:

  • (Boolean)


82
83
84
# File 'lib/elasticsearch_record/result.rb', line 82

def includes_column?(name)
  @columns&.include?(name)
end

#last(n = nil) ⇒ Object

Returns the last record from the rows collection.



129
130
131
# File 'lib/elasticsearch_record/result.rb', line 129

def last(n = nil)
  n ? computed_results.last(n) : computed_results.last
end

#lengthInteger

Returns the number of elements in the response array. Either uses the +hits+ length or the +responses+ length (msearch).

Returns:

  • (Integer)


89
90
91
92
93
94
95
96
97
98
# File 'lib/elasticsearch_record/result.rb', line 89

def length
  if response.key?('hits')
    response['hits']['hits'].length
  elsif response.key?('responses')
    # used by +msearch+
    response['responses'].length
  else
    0
  end
end

#resultString

returns the response result string

Returns:

  • (String)


135
136
137
# File 'lib/elasticsearch_record/result.rb', line 135

def result
  response['result'] || ''
end

#resultsArray Also known as: rows

Returns the RAW +_source+ data from each hit - aka. +rows+. PLEASE NOTE: The array will only contain the RAW data from each +_source+ (meta info like '_id' or '_score' are not included)

Returns:

  • (Array)


54
55
56
57
58
# File 'lib/elasticsearch_record/result.rb', line 54

def results
  return [] unless response['hits']

  response['hits']['hits'].map { |result| result['_source'] }
end

#to_aryObject Also known as: to_a

Returns an array of hashes representing each row record.



118
119
120
# File 'lib/elasticsearch_record/result.rb', line 118

def to_ary
  computed_results
end

#tookInteger

returns the response duration time

Returns:

  • (Integer)


32
33
34
# File 'lib/elasticsearch_record/result.rb', line 32

def took
  response['took']
end

#totalInteger

returns the response total value. either chops the +total+ value directly from response, from hits or aggregations.

Returns:

  • (Integer)


39
40
41
42
# File 'lib/elasticsearch_record/result.rb', line 39

def total
  # chop total only
  @total ||= _chop_total
end