Class: SearchFlip::Response
- Inherits:
-
Object
- Object
- SearchFlip::Response
- Extended by:
- Forwardable
- Defined in:
- lib/search_flip/response.rb
Overview
The SearchFlip::Response class wraps a raw SearchFlip response and decorates it with methods for aggregations, hits, records, pagination, etc.
Instance Attribute Summary collapse
-
#criteria ⇒ Object
Returns the value of attribute criteria.
-
#response ⇒ Object
Returns the value of attribute response.
Instance Method Summary collapse
-
#aggregations(name = nil) ⇒ Hash
Returns a single or all aggregations returned by ElasticSearch, depending on whether or not a name is specified.
-
#current_page ⇒ Fixnum
Returns the current page number, useful for pagination.
-
#first_page? ⇒ Boolean
Returns whether or not the current page is the first page.
-
#hits ⇒ Hash
Returns the hits returned by ElasticSearch.
-
#ids ⇒ Object
Returns the array of ids returned by ElasticSearch for the current result set, ie the ids listed in the hits section of the response.
-
#initialize(criteria, response) ⇒ Response
constructor
private
Initializes a new response object for the provided criteria and raw ElasticSearch response.
-
#last_page? ⇒ Boolean
Returns whether or not the current page is the last page.
-
#next_page ⇒ Fixnum?
Returns the next page number or nil if there is no next page, ie the current page is the last page.
-
#out_of_range? ⇒ Boolean
Returns whether or not the current page is out of range, ie.
-
#previous_page ⇒ Fixnum?
(also: #prev_page)
Returns the previous page number or nil if no previous page exists, ie if the current page is the first page.
-
#raw_response ⇒ Hash
Returns the raw response, ie a hash derived from the ElasticSearch JSON response.
-
#records(options = {}) ⇒ Array
Returns the database records, usually ActiveRecord objects, depending on the ORM you’re using.
-
#results ⇒ Array
Returns the results, ie hits, wrapped in a SearchFlip::Result object which basically is a Hashie::Mash.
-
#scope ⇒ Object
Builds and returns a scope for the array of ids in the current result set returned by ElasticSearch, including the eager load, preload and includes associations, if specified.
-
#scroll_id ⇒ String
Returns the scroll id returned by ElasticSearch, that can be used in the following request to fetch the next batch of records.
-
#suggestions(name = nil) ⇒ Hash, Array
Returns the named sugggetion, if a name is specified or alle suggestions.
-
#took ⇒ Fixnum
Returns the response time in milliseconds of ElasticSearch specified in the took info of the response.
-
#total_entries ⇒ Fixnum
(also: #total_count)
Returns the total number of results.
-
#total_pages ⇒ Fixnum
Returns the number of total pages for the current pagination settings, ie per page/limit settings.
Constructor Details
#initialize(criteria, response) ⇒ Response
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.
Initializes a new response object for the provided criteria and raw ElasticSearch response.
16 17 18 19 |
# File 'lib/search_flip/response.rb', line 16 def initialize(criteria, response) self.criteria = criteria self.response = response end |
Instance Attribute Details
#criteria ⇒ Object
Returns the value of attribute criteria.
9 10 11 |
# File 'lib/search_flip/response.rb', line 9 def criteria @criteria end |
#response ⇒ Object
Returns the value of attribute response.
9 10 11 |
# File 'lib/search_flip/response.rb', line 9 def response @response end |
Instance Method Details
#aggregations(name = nil) ⇒ Hash
Returns a single or all aggregations returned by ElasticSearch, depending on whether or not a name is specified. If no name is specified, the raw aggregation hash is simply returned. Contrary, if a name is specified, only this aggregation is returned. Moreover, if a name is specified and the aggregation includes a buckets section, a post-processed aggregation hash is returned.
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 |
# File 'lib/search_flip/response.rb', line 297 def aggregations(name = nil) return response["aggregations"] || {} unless name @aggregations ||= {} key = name.to_s return @aggregations[key] if @aggregations.key?(key) @aggregations[key] = if response["aggregations"].nil? || response["aggregations"][key].nil? Result.new elsif response["aggregations"][key]["buckets"].is_a?(Array) response["aggregations"][key]["buckets"].each_with_object({}) { |bucket, hash| hash[bucket["key"]] = Result.new(bucket) } elsif response["aggregations"][key]["buckets"].is_a?(Hash) Result.new response["aggregations"][key]["buckets"] else Result.new response["aggregations"][key] end end |
#current_page ⇒ Fixnum
Returns the current page number, useful for pagination.
105 106 107 |
# File 'lib/search_flip/response.rb', line 105 def current_page 1 + (criteria.offset_value_with_default / criteria.limit_value_with_default.to_f).ceil end |
#first_page? ⇒ Boolean
Returns whether or not the current page is the first page.
60 61 62 |
# File 'lib/search_flip/response.rb', line 60 def first_page? current_page == 1 end |
#hits ⇒ Hash
Returns the hits returned by ElasticSearch.
201 202 203 |
# File 'lib/search_flip/response.rb', line 201 def hits response["hits"] end |
#ids ⇒ Object
Returns the array of ids returned by ElasticSearch for the current result set, ie the ids listed in the hits section of the response.
262 263 264 |
# File 'lib/search_flip/response.rb', line 262 def ids @ids ||= hits["hits"].map { |hit| hit["_id"] } end |
#last_page? ⇒ Boolean
Returns whether or not the current page is the last page.
76 77 78 |
# File 'lib/search_flip/response.rb', line 76 def last_page? current_page == total_pages end |
#next_page ⇒ Fixnum?
Returns the next page number or nil if there is no next page, ie the current page is the last page.
152 153 154 155 156 157 |
# File 'lib/search_flip/response.rb', line 152 def next_page return nil if current_page >= total_pages return 1 if current_page < 1 return current_page + 1 end |
#out_of_range? ⇒ Boolean
Returns whether or not the current page is out of range, ie. smaller than 1 or larger than #total_pages
93 94 95 |
# File 'lib/search_flip/response.rb', line 93 def out_of_range? current_page < 1 || current_page > total_pages end |
#previous_page ⇒ Fixnum? Also known as: prev_page
Returns the previous page number or nil if no previous page exists, ie if the current page is the first page.
134 135 136 137 138 139 |
# File 'lib/search_flip/response.rb', line 134 def previous_page return nil if current_page <= 1 return total_pages if current_page > total_pages current_page - 1 end |
#raw_response ⇒ Hash
Returns the raw response, ie a hash derived from the ElasticSearch JSON response.
30 31 32 |
# File 'lib/search_flip/response.rb', line 30 def raw_response response end |
#records(options = {}) ⇒ Array
Returns the database records, usually ActiveRecord objects, depending on the ORM you’re using. The records are sorted using the order returned by ElasticSearch.
226 227 228 229 230 231 232 |
# File 'lib/search_flip/response.rb', line 226 def records( = {}) @records ||= begin sort_map = ids.each_with_index.each_with_object({}) { |(id, index), hash| hash[id.to_s] = index } scope.to_a.sort_by { |record| sort_map[criteria.target.record_id(record).to_s] } end end |
#results ⇒ Array
Returns the results, ie hits, wrapped in a SearchFlip::Result object which basically is a Hashie::Mash. Check out the Hashie docs for further details.
169 170 171 |
# File 'lib/search_flip/response.rb', line 169 def results @results ||= hits["hits"].map { |hit| Result.new hit["_source"].merge(hit["highlight"] ? { highlight: hit["highlight"] } : {}) } end |
#scope ⇒ Object
Builds and returns a scope for the array of ids in the current result set returned by ElasticSearch, including the eager load, preload and includes associations, if specified. A scope is eg an ActiveRecord::Relation, depending on the ORM you’re using.
244 245 246 247 248 249 250 251 252 |
# File 'lib/search_flip/response.rb', line 244 def scope res = criteria.target.fetch_records(ids) res = res.includes(*criteria.includes_values) if criteria.includes_values res = res.eager_load(*criteria.eager_load_values) if criteria.eager_load_values res = res.preload(*criteria.preload_values) if criteria.preload_values res end |
#scroll_id ⇒ String
Returns the scroll id returned by ElasticSearch, that can be used in the following request to fetch the next batch of records.
213 214 215 |
# File 'lib/search_flip/response.rb', line 213 def scroll_id response["_scroll_id"] end |
#suggestions(name = nil) ⇒ Hash, Array
Returns the named sugggetion, if a name is specified or alle suggestions.
185 186 187 188 189 190 191 |
# File 'lib/search_flip/response.rb', line 185 def suggestions(name = nil) if name response["suggest"][name.to_s].first["options"] else response["suggest"] end end |
#took ⇒ Fixnum
Returns the response time in milliseconds of ElasticSearch specified in the took info of the response.
276 277 278 |
# File 'lib/search_flip/response.rb', line 276 def took response["took"] end |
#total_entries ⇒ Fixnum Also known as: total_count
Returns the total number of results.
42 43 44 |
# File 'lib/search_flip/response.rb', line 42 def total_entries hits["total"] end |
#total_pages ⇒ Fixnum
Returns the number of total pages for the current pagination settings, ie per page/limit settings.
118 119 120 |
# File 'lib/search_flip/response.rb', line 118 def total_pages [(total_entries / criteria.limit_value_with_default.to_f).ceil, 1].max end |