infopark_cloud_connector 6.8.0.406.131718077 → 6.8.0.444.171626367

Sign up to get free protection for your applications and to get access to all the features.
@@ -21,58 +21,32 @@ module RailsConnector
21
21
  # Accesses Cms Api Search using #query and fetches search hits.
22
22
  # @api public
23
23
  def fetch_hits
24
- hits = CmsRestApi.get(resource_path, {
25
- :query => query,
26
- :offset => @options[:offset],
27
- :size => @options[:limit],
28
- })
24
+ search_enum = search_results
29
25
 
30
- result = SES::SearchResult.new(hits['total'])
31
- hits['results'].each do |hit|
26
+ result = SES::SearchResult.new(search_enum.size)
27
+ search_enum.take(@options[:limit] || 10).each do |obj|
32
28
  hard_coded_score = 1
33
- result << SES::Hit.new(hit['id'], hard_coded_score, hit)
29
+ result << SES::Hit.new(obj.id, hard_coded_score, {}, obj)
34
30
  end
31
+
35
32
  result
36
33
  end
37
34
 
38
35
  private
39
36
 
40
- def resource_path
41
- "revisions/#{Workspace.current.revision_id}/objs/search"
42
- end
43
-
44
- def query
37
+ def search_results
45
38
  now = Time.now
46
-
47
- q = [
48
- {
49
- "field" => "_obj_class",
50
- "operator" => "equal",
51
- "value" => "Image",
52
- "negate" => true
53
- },
54
- {
55
- "field" => "_valid_from",
56
- "operator" => "less_than",
57
- "value" => now.to_iso
58
- },
59
- {
60
- "field" => "_valid_until",
61
- "operator" => "less_than",
62
- "value" => now.to_iso,
63
- "negate" => true
64
- }
65
- ]
39
+ search_enum = Obj.where(:_valid_from, :is_less_than, now.to_iso
40
+ ).and_not(:_valid_until, :is_less_than, now.to_iso
41
+ ).and_not(:_obj_class, :equals, 'Image'
42
+ ).offset(@options[:offset] || 0
43
+ ).batch_size(@options[:limit] || 10)
66
44
 
67
45
  @query_string.strip.split(/[\s]+/).each do |word|
68
- q << {
69
- "field" => "*",
70
- "operator" => "prefix_search",
71
- "value" => word,
72
- }
46
+ search_enum.and(:*, :contains_prefix, word)
73
47
  end
74
48
 
75
- q
49
+ search_enum
76
50
  end
77
51
  end
78
52
 
@@ -39,6 +39,8 @@ module RailsConnector
39
39
 
40
40
  # Find an Obj by it's id.
41
41
  # If the paremeter is an Array containing ids, return a list of corresponding Objs.
42
+ # @param [String, Integer, Array<String, Integer>]id_or_list
43
+ # @return [Obj, Array<Obj>]
42
44
  # @api public
43
45
  def self.find(id_or_list)
44
46
  case id_or_list
@@ -50,8 +52,28 @@ module RailsConnector
50
52
  end
51
53
  end
52
54
 
55
+ # Returns a {ObjSearchEnumerator} with the given initial subquery consisting of the four arguments.
56
+ #
57
+ # Note that +field+ and +value+ can also be arrays for searching several fields or searching for several values.
58
+ #
59
+ # {ObjSearchEnumerator}s can be chained using one of the chainable methods (e.g. {ObjSearchEnumerator#and} and {ObjSearchEnumerator#and_not}).
60
+ #
61
+ # @example Look for the first 10 Objs whose ObjClass is "Pressrelease" and whose title contains "quarterly":
62
+ # Obj.where(:_obj_class, :equals, 'Pressrelease').and(:title, :contains, 'quarterly').take(10).map{ |obj| obj.valid_from }
63
+ # @param [Symbol, String, Array<Symbol, String>] field See {ObjSearchEnumerator#and} for details
64
+ # @param [Symbol, String] operator See {ObjSearchEnumerator#and} for details
65
+ # @param [String, Array<String>] value See {ObjSearchEnumerator#and} for details
66
+ # @param [Hash] boost See {ObjSearchEnumerator#and} for details
67
+ # @return [ObjSearchEnumerator]
68
+ # @api public
69
+ def self.where(field, operator, value, boost = nil)
70
+ ObjSearchEnumerator.new(nil).and(field, operator, value, boost)
71
+ end
72
+
53
73
  # Returns a {ObjSearchEnumerator} of all Objs.
54
74
  # If invoked on a subclass of Obj, the result will be restricted to Obj of that subclass.
75
+ # @return [ObjSearchEnumerator]
76
+ # @api public
55
77
  def self.all
56
78
  if self.name == 'RailsConnector::Obj'
57
79
  ObjSearchEnumerator.new(nil)
@@ -60,13 +82,18 @@ module RailsConnector
60
82
  end
61
83
  end
62
84
 
63
- # Returns an {ObjSearchEnumerator} of all Objs with the given obj_class.
85
+ # Returns a {ObjSearchEnumerator} of all Objs with the given +obj_class+.
86
+ # @param [String] obj_class Name of the ObjClass.
87
+ # @return [ObjSearchEnumerator]
88
+ # @api public
64
89
  def self.find_all_by_obj_class(obj_class)
65
- ObjSearchEnumerator.new([{:field => '_obj_class', :operator => 'equal', :value => obj_class}])
90
+ where(:_obj_class, :equals, obj_class)
66
91
  end
67
92
 
68
93
  # Find the Obj with the given path.
69
- # Returns nil if no matching Obj exists.
94
+ # Returns +nil+ if no matching Obj exists.
95
+ # @param [String] path Path of the {Obj}.
96
+ # @return [Obj]
70
97
  # @api public
71
98
  def self.find_by_path(path)
72
99
  find_objs_by(:path, [path]).first.first
@@ -77,26 +104,34 @@ module RailsConnector
77
104
  end
78
105
 
79
106
  # Find an Obj with the given name.
80
- # If several Objs exist with the given name, one of them is chosen and returned.
81
- # If no Obj with the name exits, nil is returned.
107
+ # If several Objs with the given name exist, an arbitrary one of these Objs is chosen and returned.
108
+ # If no Obj with the name exits, +nil+ is returned.
109
+ # @param [String] name Name of the {Obj}.
110
+ # @return [Obj]
111
+ # @api public
82
112
  def self.find_by_name(name)
83
- enum = ObjSearchEnumerator.new(
84
- [{:field => '_name', :operator => 'equal', :value => name}], {:batch_size => 1})
85
- enum.first
113
+ where(:_name, :equals, name).batch_size(1).first
86
114
  end
87
115
 
88
- # Returns an {ObjSearchEnumerator} of all Objs with the given name.
116
+ # Returns a {ObjSearchEnumerator} of all Objs with the given name.
117
+ # @param [String] name Name of the {Obj}.
118
+ # @return [ObjSearchEnumerator]
119
+ # @api public
89
120
  def self.find_all_by_name(name)
90
- ObjSearchEnumerator.new([{:field => '_name', :operator => 'equal', :value => name}])
121
+ where(:_name, :equals, name)
91
122
  end
92
123
 
93
- # Return the Obj with the given permalink or nil if no matching Obj exists.
124
+ # Returns the Obj with the given permalink, or +nil+ if no matching Obj exists.
125
+ # @param [String] permalink The permalink of the {Obj}.
126
+ # @return [Obj]
94
127
  # @api public
95
128
  def self.find_by_permalink(permalink)
96
129
  find_objs_by(:permalink, [permalink]).first.first
97
130
  end
98
131
 
99
- # Return the Obj with the given permalink or raise ResourceNotFound if no matching Obj exists.
132
+ # Returns the Obj with the given permalink, or raise ResourceNotFound if no matching Obj exists.
133
+ # @param [String] permalink The permalink of the {Obj}.
134
+ # @return [Obj]
100
135
  # @api public
101
136
  def self.find_by_permalink!(permalink)
102
137
  find_by_permalink(permalink) or
@@ -136,13 +171,14 @@ module RailsConnector
136
171
  end
137
172
 
138
173
  # return the Obj that is the parent of this Obj.
139
- # returns nil for the root Obj.
174
+ # returns +nil+ for the root Obj.
140
175
  # @api public
141
176
  def parent
142
177
  root? ? nil : Obj.find_by_path(parent_path)
143
178
  end
144
179
 
145
180
  # Returns an Array of all the ancestor objects, starting at the root and ending at this object's parent.
181
+ # @return [Array<Obj>]
146
182
  # @api public
147
183
  def ancestors
148
184
  return [] if root?
@@ -154,6 +190,7 @@ module RailsConnector
154
190
  end
155
191
 
156
192
  # return a list of all child Objs.
193
+ # @return [Array<Obj>]
157
194
  # @api public
158
195
  def children
159
196
  Obj.find_objs_by(:ppath, [path]).first
@@ -201,6 +238,7 @@ module RailsConnector
201
238
  end
202
239
 
203
240
  # Returns the root Obj, i.e. the Obj with the path "/"
241
+ # @return [Obj]
204
242
  # @api public
205
243
  def self.root
206
244
  Obj.find_by_path("/") or raise ResourceNotFound, "Obj.root not found: There is no Obj with path '/'."
@@ -208,6 +246,7 @@ module RailsConnector
208
246
 
209
247
  # Returns the homepage object. This can be overwritten in your application's +ObjExtensions+.
210
248
  # Use <tt>Obj#homepage?</tt> to check if an object is the homepage.
249
+ # @return [Obj]
211
250
  # @api public
212
251
  def self.homepage
213
252
  root
@@ -223,6 +262,7 @@ module RailsConnector
223
262
  # By default a controller matching the Obj's obj_class will be used.
224
263
  # If the controller does not exist, the CmsController will be used as a fallback.
225
264
  # Overwrite this method to force a different controller to be used.
265
+ # @return [String]
226
266
  # @api public
227
267
  def controller_name
228
268
  obj_class
@@ -231,6 +271,7 @@ module RailsConnector
231
271
  # This method determines the action that should be invoked when the Obj is requested.
232
272
  # The default action is 'index'.
233
273
  # Overwrite this method to force a different action to be used.
274
+ # @return [String]
234
275
  # @api public
235
276
  def controller_action_name
236
277
  "index"
@@ -243,6 +284,7 @@ module RailsConnector
243
284
  end
244
285
 
245
286
  # Returns the title of the content or the name.
287
+ # @return [String]
246
288
  # @api public
247
289
  def display_title
248
290
  self.title || name
@@ -335,6 +377,7 @@ module RailsConnector
335
377
 
336
378
  # Returns a list of exportable? children excluding the binary? ones unless :all is specfied.
337
379
  # This is mainly used for navigations.
380
+ # @return [Array<Obj>]
338
381
  # @api public
339
382
  def toclist(*args)
340
383
  return [] unless publication?
@@ -345,6 +388,7 @@ module RailsConnector
345
388
  end
346
389
 
347
390
  # Returns the sorted +toclist+, respecting sort order and type of this Obj.
391
+ # @return [Array<Obj>]
348
392
  # @api public
349
393
  def sorted_toclist(*args)
350
394
  list = self.toclist(*args)
@@ -406,7 +450,9 @@ module RailsConnector
406
450
  end
407
451
 
408
452
  # Returns the Object with the given name next in the hierarchy
409
- # returns nil if no object with the given name was found.
453
+ # returns +nil+ if no object with the given name was found.
454
+ # @param [String] name
455
+ # @return [Obj]
410
456
  # @api public
411
457
  def find_nearest(name)
412
458
  obj = self.class.find_by_path(root? ? "/#{name}" : "#{path}/#{name}")
@@ -440,7 +486,7 @@ module RailsConnector
440
486
  ])
441
487
 
442
488
  # Returns the value of an internal or external attribute specified by its name.
443
- # Passing an invalid key will not raise an error, but return nil.
489
+ # Passing an invalid key will not raise an error, but return +nil+.
444
490
  # @api public
445
491
  def [](key)
446
492
  key = key.to_s
@@ -469,6 +515,7 @@ module RailsConnector
469
515
  read_attribute('_text_links')
470
516
  end
471
517
 
518
+ # @return [String]
472
519
  # @api public
473
520
  def obj_class
474
521
  read_attribute('_obj_class')
@@ -494,6 +541,7 @@ module RailsConnector
494
541
  # Override this method in subclasses to define a different content_type.
495
542
  # Note that only Objs with content_type "text/html"
496
543
  # will be rendered with layout and templates by the DefaultCmsController.
544
+ # @return [String]
497
545
  # @api public
498
546
  def content_type
499
547
  if binary?
@@ -506,13 +554,15 @@ module RailsConnector
506
554
 
507
555
  # returns the extension (the part after the last dot) from the Obj's name.
508
556
  # returns an empty string if no extension is present in the Obj's name.
557
+ # @return [String]
509
558
  # @api public
510
559
  def file_extension
511
560
  File.extname(name)[1..-1] || ""
512
561
  end
513
562
 
514
563
  # Returns the body (main content) of the Obj for non-binary Objs.
515
- # Returns nil for binary Objs.
564
+ # Returns +nil+ for binary Objs.
565
+ # @return [String]
516
566
  # @api public
517
567
  def body
518
568
  if binary?
@@ -535,7 +585,8 @@ module RailsConnector
535
585
  end
536
586
 
537
587
  # returns an URL to retrieve the Obj's body for binary Objs.
538
- # returns nil for non-binary Objs.
588
+ # returns +nil+ for non-binary Objs.
589
+ # @return [String]
539
590
  # @api public
540
591
  def body_data_url
541
592
  if binary?
@@ -550,7 +601,8 @@ module RailsConnector
550
601
  end
551
602
 
552
603
  # returns the content type of the Obj's body for binary Objs.
553
- # returns nil for non-binary Objs.
604
+ # returns +nil+ for non-binary Objs.
605
+ # @return [String]
554
606
  # @api public
555
607
  def body_content_type
556
608
  if binary?
@@ -1,39 +1,251 @@
1
1
  module RailsConnector
2
- # Provides an enumerator, to iterate over obj search results and return "real" objs.
3
- # This is done using the {http://ruby-doc.org/core-1.8.7/Enumerable.html <code>Enumerable</code> mixin}, which provided methods like <code>map</code>, <code>select</code> or <code>take</code>.
2
+ # Provides an enumerator for iterating over obj search results and retrieving obj instances.
3
+ # This is done using the {http://ruby-doc.org/core-1.8.7/Enumerable.html <code>Enumerable</code> mixin},
4
+ # which provides methods such as <code>map</code>, <code>select</code> or <code>take</code>.
4
5
  #
5
- # This enumerator is lazy. Let's say, that when looking for Objs with the ObjClass Publication there are 123 objs in total. Now <code>enum.take(10)</code> will only fetch the first 10 objs, leaving the other 113 objs untouched.
6
- # This also means, that iterating multiple times over this enumerator, each time the search results and objs are fetched again. If you want to get all objs at once, use <code>enum.to_a</code>.
6
+ # This enumerator is lazy. If for example you are looking for Objs with the ObjClass "Publication",
7
+ # and there are 93 objs in total, than <code>enum.take(10)</code> will fetch the first 10 objs only,
8
+ # ignoring the other 83 objs.
9
+ # This also means, that iterating multiple times over this enumerator causes the search results and objs to be fetched again.
10
+ # If you want to get all objs at once, use <code>enum.to_a</code>.
7
11
  #
8
- # For all possible <code>query</code>'s and <code>options</code> have a look at the cms api documentation about objs/search.
9
- # There is one exception: To adjust how many search results should be fetch with one chunk, use the option <code>:batch_size</code>. The default is <code>10</code>. The <code>:size</code> option will be silently ignored.
12
+ # To start searching use one of the {Obj} methods that returns an {ObjSearchEnumerator}. The preferred way is to start with {Obj.where}.
10
13
  #
11
- # @example All objs, which are Publications
12
- # enum = ObjSearchEnumerator([{:field => '_obj_class', :operator => 'equal', :value => 'Publication'}])
13
- # enum.each { |obj| puts obj.path }
14
+ # == Currently available fields and their values
15
+ #
16
+ # [+:*+] Searches all fields.
17
+ # This is only possible with the operators +contais+ or +starts_with+.
18
+ # [+:id+] Id of an {Obj}. This is a +string+ field.
19
+ # [+:_path+] Path of an {Obj}. This is a +string+ field.
20
+ # [+:_name+] Name of an {Obj}. This is a +string+ field.
21
+ # [+:title+] Title of an {Obj}. This is a +string+ field.
22
+ # [+:body+] Body of an {Obj}. This is an +html+ field. Thus, only the +contains+ and
23
+ # +contains_prefix+ operators can be applied to this field.
24
+ # [+:_obj_class+] ObjClass of an {Obj}. This is a +string+ field.
25
+ # [+:_permalink+] Permalink of an {Obj}. This is a +string+ field.
26
+ # [+:_valid_from+] The valid-from date of an {Obj}.
27
+ # [+:_valid_until+] The valid-until date of an {Obj}.
28
+ # [+:_last_changed+] Date of last change of an {Obj}.
29
+ # [every <em><code>:custom_attribute</code></em>] Custom attribute of an {Obj}. Note that
30
+ # depending on the attribute type (e.g. an
31
+ # +html+ field), some operators can not be applied.
32
+ #
33
+ # All values are stored as strings.
34
+ #
35
+ # Date values are stored in the format YYYYMMDDHHMMSS in UTC. For example, 2000-01-01 00:00:00 UTC is stored as "<code>20000101000000</code>".
36
+ # This is relevant for string comparisons using the +is_less_than+ and +is_greater_than+ operators.
37
+ #
38
+ # == Currently available operators
39
+ #
40
+ # For +:contains+ and +:contains_prefix+, the examples are based on the following field value:
41
+ # "Behind every cloud is another cloud."
42
+ #
43
+ # [+:contains+] Searches for one or more whole words. Each word needs to be present.
44
+ #
45
+ # Example subquery values:
46
+ #
47
+ # ✔ "behind cloud" (case insensitive)
48
+ #
49
+ # ✘ "behi clo" (not whole words)
50
+ #
51
+ # ✘ "behind everything" (second word does not match)
52
+ # [+:contains_prefix+] Searches for one prefix. A whole word is also a prefix.
53
+ #
54
+ # Example subquery values:
55
+ #
56
+ # ✔ "Clou" (case insensitive)
57
+ #
58
+ # ✔ "Every" (case insensitive)
59
+ #
60
+ # For +:equals+ and +:starts_with+, the examples are based on the following field value:
61
+ # "Some content."
62
+ #
63
+ # [+:equals+] The +field+ value needs to be identical to the +value+ of this subquery.
64
+ #
65
+ # Only applicable to +string+, +enum+, +multienum+ and +date+ fields.
66
+ #
67
+ # Example subquery values:
68
+ #
69
+ # ✔ "Some content." (exact value)
70
+ #
71
+ # ✘ "Some" (not exact value)
72
+ #
73
+ # [+:starts_with+] The +field+ value needs to start exactly with the +value+ of this subquery.
74
+ #
75
+ # Only applicable to +string+, +enum+, +multienum+ and +date+ fields.
76
+ #
77
+ # Example subquery values:
78
+ #
79
+ # ✔ "Som" (prefix of the value)
80
+ #
81
+ # ✘ "som" (incorrect case of prefix)
82
+ #
83
+ # ✘ "content" (not prefix of the whole value)
84
+ #
85
+ # For +:is_less_than+ and +:is_greater_than+, the examples are based on the following field value (date string):
86
+ # "20000101000000"
87
+ #
88
+ # [+:is_less_than+] Matches if the field string value is less than the subquery string value.
89
+ #
90
+ # Only applicable to +string+, +enum+, +multienum+ and +date+ fields.
91
+ #
92
+ # Example subquery values:
93
+ #
94
+ # ✔ "19991231235959" (is less than "20000101000000")
95
+ #
96
+ # ✘ "20000101000000" (equal, not less than)
97
+ #
98
+ # [+:is_greater_than+] Matches if the field string value is greater than the subquery string value.
99
+ #
100
+ # Only applicable to +string+, +enum+, +multienum+ and +date+ fields.
101
+ #
102
+ # Example subquery values:
103
+ #
104
+ # ✔ "20000101000001" (is greater than "20000101000000")
105
+ #
106
+ # ✘ "20000101000000" (equal, not greater than)
107
+ #
108
+ # @api public
14
109
  class ObjSearchEnumerator
15
110
  include Enumerable
16
111
 
17
112
  attr_reader :query
18
113
  attr_reader :options
114
+ attr_reader :initial_offset
19
115
 
20
- # @param [Array] query
116
+ # For all possible <code>query</code>'s and <code>options</code> have a look at the cms api documentation about objs/search.
117
+ # There is one exception: To adjust how many search results should be fetch with one chunk, use the option <code>:batch_size</code>. The default is <code>10</code>. The <code>:size</code> option will be silently ignored.
118
+ #
119
+ # @example All objs, which are Publications
120
+ # enum = ObjSearchEnumerator([{:field => '_obj_class', :operator => 'equal', :value => 'Publication'}])
121
+ # enum.each { |obj| puts obj.path }
122
+ #
123
+ # @param [Array<Hash>] query
21
124
  # @param [Hash] options
22
- def initialize(query, options = {})
125
+ # @param [Integer] initial_offset
126
+ def initialize(query, options = {}, initial_offset = 0)
23
127
  @query = query
24
- @query.freeze
128
+ @options = options.symbolize_keys
129
+ @initial_offset = initial_offset
130
+ end
131
+
132
+ # @group Chainable methods
133
+
134
+ # Adds this additional AND subquery to this {ObjSearchEnumerator}.
135
+ #
136
+ # Compares the +field(s)+ with the +value(s)+ using the +operator+ of this subquery.
137
+ # All objs to which this criterion applies remain in the result set.
138
+ #
139
+ # @param [Symbol, String, Array<Symbol, String>] field Name(s) of the field(s) to be searched.
140
+ # For arrays, the subquery matches, if one or more of these fields meet this criterion.
141
+ # @param [Symbol, String] operator See "Currently available operators" at the top.
142
+ # @param [String, Array<String>] value The value(s) with which the field value(s) are compared using the +operator+ of this subquery.
143
+ # For arrays, the subquery matches, if the condition is met for one or more of the array elements.
144
+ # @param [Hash] boost A hash where the keys are field names and their values are boosting factors.
145
+ # Boosting factors must be in the range from 1 to 10.
146
+ # Boosting can only be applied to subqueries in which the +contains+ or +contains_prefix+ operator is used.
147
+ # @return [ObjSearchEnumerator]
148
+ # @api public
149
+ def and(field, operator, value, boost = nil)
150
+ real_operator = operator_mapping(operator)
151
+ subquery = {:field => field, :operator => real_operator, :value => convert_value(value)}
152
+ if boost.present?
153
+ valid_boost_operators = [:contains, :contains_prefix]
154
+ if valid_boost_operators.include?(operator.to_sym)
155
+ subquery[:boost] = boost
156
+ else
157
+ raise "Boost is not allowed with operator '#{operator}'. " +
158
+ "Valid operators are: #{valid_boost_operators.join(', ')}"
159
+ end
160
+ end
161
+ @query = (query || []) + [subquery]
162
+
163
+ self
164
+ end
25
165
 
26
- options.delete(:size)
27
- options.delete('size')
28
- if batch_size = options.delete(:batch_size)
29
- options[:size] = batch_size
166
+ # Adds this additional negated AND subquery to this {ObjSearchEnumerator}.
167
+ #
168
+ # Compares the +field(s)+ with the +value(s)+ using the negated +operator+ of this subquery.
169
+ # All objs to which this criterion applies are removed from the result set.
170
+ #
171
+ # @param [Symbol, String, Array<Symbol, String>] field Name(s) of the field(s) to be searched.
172
+ # For arrays, the subquery matches, if one or more of these fields meet this criterion.
173
+ # @param [Symbol, String] operator Only applicable to subqueries in which the +equals+,
174
+ # +starts_with+, +is_greater_than+ and +is_less_than+ operator is used
175
+ # (See "Currently available operators" at the top).
176
+ # @param [String, Array<String>] value The value(s) with which the field value(s) are compared using the +operator+ of this subquery.
177
+ # For arrays, the subquery matches, if the condition is met for one or more of the array elements.
178
+ # @return [ObjSearchEnumerator]
179
+ # @api public
180
+ def and_not(field, operator, value)
181
+ real_operator = operator_mapping(operator)
182
+ valid_negated_operators = [:equals, :starts_with, :is_greater_than, :is_less_than]
183
+ unless valid_negated_operators.include?(operator.to_sym)
184
+ raise "Negating operator '#{operator}' is not valid."
30
185
  end
31
- @options = options
32
- @options.freeze
186
+ subquery = {:field => field, :operator => real_operator, :value => convert_value(value),
187
+ :negate => true}
188
+ @query = (query || []) + [subquery]
189
+
190
+ self
191
+ end
192
+
193
+ # Orders the results by +field_name+.
194
+ # @param [Symbol, String] field_name This parameter determines by which field the hits are sorted (e.g. +:_path+).
195
+ # @return [ObjSearchEnumerator]
196
+ # @api public
197
+ def order(field_name)
198
+ @options[:sort_by] = field_name.to_sym
199
+
200
+ self
201
+ end
202
+
203
+ # Reverses the order of the results.
204
+ # @return [ObjSearchEnumerator]
205
+ # @api public
206
+ def reverse_order
207
+ @options[:sort_order] = case options[:sort_order]
208
+ when :asc
209
+ :desc
210
+ when :desc
211
+ :asc
212
+ else
213
+ options[:sort_by].present? ? :desc : :asc
214
+ end
215
+
216
+ self
33
217
  end
34
218
 
219
+ # Sets the internal batch_size to +size+.
220
+ # The default is +10+, the maximum is +100+.
221
+ # @param [Integer] size A value in the range from +1+ to +100+.
222
+ # @return [ObjSearchEnumerator]
223
+ # @api public
224
+ def batch_size(size)
225
+ @options[:size] = size
226
+
227
+ self
228
+ end
229
+
230
+
231
+ # Omits the first +amount+ number of {Obj}s from the results. The default is +0+.
232
+ # @param [Integer] amount
233
+ # @return [ObjSearchEnumerator]
234
+ # @api public
235
+ def offset(amount)
236
+ @initial_offset += amount
237
+
238
+ self
239
+ end
240
+
241
+ # @!endgroup
242
+
243
+ # Iterates over the search result.
244
+ # @yield [Obj]
245
+ # @return [void]
246
+ # @api public
35
247
  def each
36
- offset = 0
248
+ offset = @initial_offset
37
249
  current_batch, total = fetch_next_batch(offset)
38
250
  loop do
39
251
  if current_batch.size == 0
@@ -50,19 +262,56 @@ module RailsConnector
50
262
  end
51
263
  end
52
264
 
53
- # The total size of all results.
265
+ # The total number of hits.
54
266
  # @return [Integer]
267
+ # @api public
55
268
  def size
56
269
  if @size.blank?
57
- @size = CmsRestApi.get(resource_path, {:query => query, :size => 1})['total'].to_i
270
+ @size = CmsRestApi.get(resource_path, {:query => query, :size => 0})['total'].to_i
58
271
  end
59
272
  @size
60
273
  end
61
274
 
275
+ # @api public
62
276
  alias_method :length, :size
63
277
 
64
278
  private
65
279
 
280
+ def convert_value(value)
281
+ if value.kind_of?(Array)
282
+ value.map{ |v| convert_single_value(v) }
283
+ else
284
+ convert_single_value(value)
285
+ end
286
+ end
287
+
288
+ def convert_single_value(value)
289
+ if value.kind_of?(Time)
290
+ value.to_iso
291
+ else
292
+ value
293
+ end
294
+ end
295
+
296
+ def operator_mapping(operator)
297
+ case operator.to_sym
298
+ when :contains
299
+ :search
300
+ when :contains_prefix
301
+ :prefix_search
302
+ when :equals
303
+ :equal
304
+ when :starts_with
305
+ :prefix
306
+ when :is_greater_than
307
+ :greater_than
308
+ when :is_less_than
309
+ :less_than
310
+ else
311
+ raise "Operator '#{operator}'' is not valid!"
312
+ end
313
+ end
314
+
66
315
  def fetch_next_batch(offset)
67
316
  request_result = CmsRestApi.get(resource_path, search_dsl(offset))
68
317
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: infopark_cloud_connector
3
3
  version: !ruby/object:Gem::Version
4
- hash: 263434717
4
+ hash: 343251185
5
5
  prerelease:
6
6
  segments:
7
7
  - 6
8
8
  - 8
9
9
  - 0
10
- - 406
11
- - 131718077
12
- version: 6.8.0.406.131718077
10
+ - 444
11
+ - 171626367
12
+ version: 6.8.0.444.171626367
13
13
  platform: ruby
14
14
  authors:
15
15
  - Infopark AG
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2012-12-04 00:00:00 +01:00
20
+ date: 2012-12-06 00:00:00 +01:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -57,14 +57,14 @@ dependencies:
57
57
  requirements:
58
58
  - - "="
59
59
  - !ruby/object:Gem::Version
60
- hash: 263434717
60
+ hash: 343251185
61
61
  segments:
62
62
  - 6
63
63
  - 8
64
64
  - 0
65
- - 406
66
- - 131718077
67
- version: 6.8.0.406.131718077
65
+ - 444
66
+ - 171626367
67
+ version: 6.8.0.444.171626367
68
68
  version_requirements: *id003
69
69
  name: kvom
70
70
  prerelease: false