Class: RailsConnector::ObjSearchEnumerator
- Inherits:
-
Object
- Object
- RailsConnector::ObjSearchEnumerator
- Includes:
- Enumerable
- Defined in:
- lib/rails_connector/obj_search_enumerator.rb
Overview
Provides an enumerator for iterating over obj search results and retrieving obj instances. This is done using the Enumerable mixin, which provides methods such as map, select or take.
This enumerator is lazy. If for example you are looking for Objs with the ObjClass “Publication”, and there are 93 objs in total, than enum.take(10) will fetch the first 10 objs only, ignoring the other 83 objs. This also means, that iterating multiple times over this enumerator causes the search results and objs to be fetched again. If you want to get all objs at once, use enum.to_a.
To start searching use one of the Obj methods that returns an ObjSearchEnumerator. The preferred way is to start with Obj.where.
Currently available fields and their values
:*-
Searches all fields. This is only possible with the operators
contaisorstarts_with. :id-
Id of an Obj. This is a
stringfield. :_path-
Path of an Obj. This is a
stringfield. :_name-
Name of an Obj. This is a
stringfield. :title-
Title of an Obj. This is a
stringfield. :body-
Body of an Obj. This is an
htmlfield. Thus, only thecontainsandcontains_prefixoperators can be applied to this field. :_obj_class-
ObjClass of an Obj. This is a
stringfield. :_permalink-
Permalink of an Obj. This is a
stringfield. :_valid_from-
The valid-from date of an Obj.
:_valid_until-
The valid-until date of an Obj.
:_last_changed-
Date of last change of an Obj.
- every
:custom_attribute -
Custom attribute of an Obj. Note that depending on the attribute type (e.g. an
htmlfield), some operators can not be applied.
All values are stored as strings.
Date values are stored in the format YYYYMMDDHHMMSS in UTC. For example, 2000-01-01 00:00:00 UTC is stored as “20000101000000”. This is relevant for string comparisons using the is_less_than and is_greater_than operators.
Currently available operators
For :contains and :contains_prefix, the examples are based on the following field value: “Behind every cloud is another cloud.”
:contains-
Searches for one or more whole words. Each word needs to be present.
Example subquery values:
✔ “behind cloud” (case insensitive)
✘ “behi clo” (not whole words)
✘ “behind everything” (second word does not match)
:contains_prefix-
Searches for one prefix. A whole word is also a prefix.
Example subquery values:
✔ “Clou” (case insensitive)
✔ “Every” (case insensitive)
For :equals and :starts_with, the examples are based on the following field value: “Some content.”
:equals-
The
fieldvalue needs to be identical to thevalueof this subquery.Only applicable to
string,enum,multienumanddatefields.Example subquery values:
✔ “Some content.” (exact value)
✘ “Some” (not exact value)
:starts_with-
The
fieldvalue needs to start exactly with thevalueof this subquery.Only applicable to
string,enum,multienumanddatefields.Example subquery values:
✔ “Som” (prefix of the value)
✘ “som” (incorrect case of prefix)
✘ “content” (not prefix of the whole value)
For :is_less_than and :is_greater_than, the examples are based on the following field value (date string): “20000101000000”
:is_less_than-
Matches if the field string value is less than the subquery string value.
Only applicable to
string,enum,multienumanddatefields.Example subquery values:
✔ “19991231235959” (is less than “20000101000000”)
✘ “20000101000000” (equal, not less than)
:is_greater_than-
Matches if the field string value is greater than the subquery string value.
Only applicable to
string,enum,multienumanddatefields.Example subquery values:
✔ “20000101000001” (is greater than “20000101000000”)
✘ “20000101000000” (equal, not greater than)
Chainable methods collapse
-
#and(field, operator, value, boost = nil) ⇒ ObjSearchEnumerator
Adds this additional AND subquery to this ObjSearchEnumerator.
-
#and_not(field, operator, value) ⇒ ObjSearchEnumerator
Adds this additional negated AND subquery to this ObjSearchEnumerator.
-
#batch_size(size) ⇒ ObjSearchEnumerator
Sets the internal batch_size to
size. -
#offset(amount) ⇒ ObjSearchEnumerator
Omits the first
amountnumber of Objs from the results. -
#order(field_name) ⇒ ObjSearchEnumerator
Orders the results by
field_name. -
#reverse_order ⇒ ObjSearchEnumerator
Reverses the order of the results.
Instance Method Summary collapse
-
#each {|Obj| ... }
Iterates over the search result.
-
#size ⇒ Integer
(also: #length, #count)
The total number of hits.
Instance Method Details
#and(field, operator, value, boost = nil) ⇒ ObjSearchEnumerator
Adds this additional AND subquery to this RailsConnector::ObjSearchEnumerator.
Compares the field(s) with the value(s) using the operator of this subquery. All objs to which this criterion applies remain in the result set.
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/rails_connector/obj_search_enumerator.rb', line 150 def and(field, operator, value, boost = nil) real_operator = operator_mapping(operator) subquery = {:field => field, :operator => real_operator, :value => convert_value(value)} if boost.present? valid_boost_operators = [:contains, :contains_prefix] if valid_boost_operators.include?(operator.to_sym) subquery[:boost] = boost else raise "Boost is not allowed with operator '#{operator}'. " + "Valid operators are: #{valid_boost_operators.join(', ')}" end end @query = (query || []) + [subquery] self end |
#and_not(field, operator, value) ⇒ ObjSearchEnumerator
Adds this additional negated AND subquery to this RailsConnector::ObjSearchEnumerator.
Compares the field(s) with the value(s) using the negated operator of this subquery. All objs to which this criterion applies are removed from the result set.
181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/rails_connector/obj_search_enumerator.rb', line 181 def and_not(field, operator, value) real_operator = operator_mapping(operator) valid_negated_operators = [:equals, :starts_with, :is_greater_than, :is_less_than] unless valid_negated_operators.include?(operator.to_sym) raise "Negating operator '#{operator}' is not valid." end subquery = {:field => field, :operator => real_operator, :value => convert_value(value), :negate => true} @query = (query || []) + [subquery] self end |
#batch_size(size) ⇒ ObjSearchEnumerator
Sets the internal batch_size to size. The default is 10, the maximum is 100.
225 226 227 228 229 |
# File 'lib/rails_connector/obj_search_enumerator.rb', line 225 def batch_size(size) [:size] = size self end |
#each {|Obj| ... }
This method returns an undefined value.
Iterates over the search result.
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
# File 'lib/rails_connector/obj_search_enumerator.rb', line 248 def each offset = @initial_offset current_batch, total = fetch_next_batch(offset) loop do if current_batch.size == 0 if offset < total current_batch, total = fetch_next_batch(offset) else raise StopIteration end end offset += 1 hit = current_batch.shift yield Obj.find(hit['id']) end end |
#offset(amount) ⇒ ObjSearchEnumerator
Omits the first amount number of Objs from the results. The default is 0.
236 237 238 239 240 |
# File 'lib/rails_connector/obj_search_enumerator.rb', line 236 def offset(amount) @initial_offset += amount self end |
#order(field_name) ⇒ ObjSearchEnumerator
Orders the results by field_name.
198 199 200 201 202 |
# File 'lib/rails_connector/obj_search_enumerator.rb', line 198 def order(field_name) [:sort_by] = field_name.to_sym self end |
#reverse_order ⇒ ObjSearchEnumerator
Reverses the order of the results.
207 208 209 210 211 212 213 214 215 216 217 218 |
# File 'lib/rails_connector/obj_search_enumerator.rb', line 207 def reverse_order [:sort_order] = case [:sort_order] when :asc :desc when :desc :asc else [:sort_by].present? ? :desc : :asc end self end |
#size ⇒ Integer Also known as: length, count
The total number of hits.
269 270 271 |
# File 'lib/rails_connector/obj_search_enumerator.rb', line 269 def size @size ||= CmsRestApi.get(resource_path, {:query => query, :size => 0})['total'].to_i end |