orchestrate 0.11.2 → 0.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ce3fe8f2f327ee80634c2a1cf9ee17a468db30eb
4
- data.tar.gz: 671ec20412081c443941b6f4ab07e26ba2086d12
3
+ metadata.gz: 3b27b7b75267567dba9d38ac452324aab237059a
4
+ data.tar.gz: 332d9bb074378805436b10eadefc6e3db031f030
5
5
  SHA512:
6
- metadata.gz: 6f1b8460ad20f8b779e738374b5276c4ee0af7e415826d8a57a37769313430f565c436c2f48a0a00ead3794a20aa5a1b8307dd566de772efd0d48afa62e0ebc7
7
- data.tar.gz: 39d65b0dba9b87decc41f1e9107b6bc352935ce81fb38873c8ed8aced33aa8170754fca34a2421eb3be7caabca0cb4d87c72eb3a96e7363bf4875b076ce6bf43
6
+ metadata.gz: 3a133d87db07278ee15a52cfbd9dedb271da759e0122bc857c60ae7ab2ad59017f95721b5e2a751b7ecfeaf38860ba335cd57e4984450604e1f8018eff8e9128
7
+ data.tar.gz: 9e1fc2be1075499e59283723db17b41b7c845c10f19a9d2dbb3c3ee203fc509d909bbb173651b9419cc6367a2ef6d968d50d256afb5c56c8cb56ff3c3d7f8245
data/README.md CHANGED
@@ -428,6 +428,9 @@ end
428
428
 
429
429
  ## Release Notes
430
430
 
431
+ ### April 30, 2015: release 0.11.3
432
+ - Implement `Orchestrate::Search::TopValuesBuilder` to construct top values aggregates.
433
+
431
434
  ### March 27, 2015: release 0.11.2
432
435
  - Implement `Orchestrate::Search::QueryBuilder#kinds` to search events as well as KV items.
433
436
  - Implement `Orchestrate::Search::QueryBuilder#types` to search specific types of events.
@@ -438,6 +438,7 @@ module Orchestrate
438
438
  headers = options.fetch(:headers, {})
439
439
  headers['User-Agent'] = "ruby/orchestrate/#{Orchestrate::VERSION}"
440
440
  headers['Accept'] = 'application/json' if method == :get
441
+ headers['Connection'] = 'close' if method == :head
441
442
 
442
443
  http_response = http.send(method) do |request|
443
444
  request.url path, query_string
@@ -445,7 +446,7 @@ module Orchestrate
445
446
  headers['Content-Type'] = 'application/json'
446
447
  request.body = body.to_json
447
448
  elsif [:patch].include?(method)
448
- request.body = body.to_json
449
+ request.body = body.to_json
449
450
  end
450
451
  headers.each {|header, value| request[header] = value }
451
452
  end
@@ -1,15 +1,24 @@
1
1
  module Orchestrate::Search
2
+ module QueryBuilderDelegator
3
+ extend Forwardable
4
+ def_delegators :@builder, :options, :order, :limit, :offset, :aggregate, :find, :collection
5
+ end
6
+
7
+ module AggregateBuilderDelegator
8
+ extend Forwardable
9
+ def_delegators :@builder, :top_values, :stats, :range, :distance, :time_series
10
+ end
11
+
2
12
  # Aggregate Builder object for constructing aggregate params included in a search
3
13
  class AggregateBuilder
14
+ include QueryBuilderDelegator
4
15
 
5
- # @return [QueryBuilder]
16
+ # @return [QueryBuilder]
6
17
  attr_reader :builder
7
18
 
8
19
  # @return [Array] Aggregate param arguments
9
20
  attr_reader :aggregates
10
21
 
11
- extend Forwardable
12
-
13
22
  # Initialize a new AggregateBuilder object
14
23
  # @param builder [Orchestrate::Search::SearchBuilder] The Search Builder object
15
24
  def initialize(builder)
@@ -17,14 +26,6 @@ module Orchestrate::Search
17
26
  @aggregates = []
18
27
  end
19
28
 
20
- def_delegator :@builder, :options
21
- def_delegator :@builder, :order
22
- def_delegator :@builder, :limit
23
- def_delegator :@builder, :offset
24
- def_delegator :@builder, :aggregate
25
- def_delegator :@builder, :find
26
- def_delegator :@builder, :collection
27
-
28
29
  # @return Pretty-Printed string representation of the AggregateBuilder object
29
30
  def to_s
30
31
  "#<Orchestrate::Search::AggregateBuilder collection=#{collection.name} query=#{builder.query} aggregate=#{to_param}>"
@@ -38,6 +39,16 @@ module Orchestrate::Search
38
39
 
39
40
  # @!group Aggregate Functions
40
41
 
42
+ # @param field_name [#to_s]
43
+ # @param offset [Integer, nil]
44
+ # @param limit [Integer, nil]
45
+ # @return [AggregateBuilder]
46
+ def top_values(field_name, offset = nil, limit = nil)
47
+ top_values = TopValuesBuilder.new(self, "#{field_name}", offset, limit)
48
+ aggregates << top_values
49
+ top_values
50
+ end
51
+
41
52
  # @param field_name [#to_s]
42
53
  # @return [AggregateBuilder]
43
54
  def stats(field_name)
@@ -72,17 +83,61 @@ module Orchestrate::Search
72
83
  # @!endgroup
73
84
  end
74
85
 
86
+ # Stats Builder object for constructing top-values functions to be included in the aggregate param
87
+ class TopValuesBuilder
88
+ include QueryBuilderDelegator
89
+ include AggregateBuilderDelegator
90
+
91
+ # @return [AggregateBuilder]
92
+ attr_reader :builder
93
+
94
+ # @return [#to_s] The field to operate over
95
+ attr_reader :field_name
96
+
97
+ # Initialize a new TopValuesBuilder object
98
+ # @param builder [AggregateBuilder] The Aggregate Builder object
99
+ # @param field_name [#to_s] The field to operate over
100
+ # @param offset [Integer,nil] The zero-based index of the first paged value to retrieve in this aggregation.
101
+ # If omitted, uses the server default value of zero.
102
+ # @param limit [Integer,nil] The maximum number of values to retrieve per page of results for this aggregation.
103
+ # If omitted, uses the server default value of ten.
104
+ def initialize(builder, field_name, offset=nil, limit=nil)
105
+ @builder = builder
106
+ @field_name = field_name
107
+ if offset.nil? ^ limit.nil?
108
+ raise ArgumentError, "offset and limit arguments can only be supplied together, or not at all"
109
+ end
110
+ @offset = offset
111
+ @limit = limit
112
+ end
113
+
114
+ # @return [#to_s] Pretty-Printed string representation of the TopValuesBuilder object
115
+ def to_s
116
+ "#<Orchestrate::Search::TopValuesBuilder collection=#{collection.name} field_name=#{@field_name} offset=#{@offset} limit=#{@limit}>"
117
+ end
118
+ alias :inspect :to_s
119
+
120
+ # @return [#to_s] constructed aggregate string clause
121
+ def to_param
122
+ if @offset.nil? && @limit.nil?
123
+ "#{@field_name}:top_values"
124
+ else
125
+ "#{@field_name}:top_values:offset:#{@offset}:limit:#{@limit}"
126
+ end
127
+ end
128
+ end
129
+
75
130
  # Stats Builder object for constructing stats functions to be included in the aggregate param
76
131
  class StatsBuilder
77
-
132
+ include QueryBuilderDelegator
133
+ include AggregateBuilderDelegator
134
+
78
135
  # @return [AggregateBuilder]
79
136
  attr_reader :builder
80
137
 
81
138
  # @return [#to_s] The field to operate over
82
139
  attr_reader :field_name
83
140
 
84
- extend Forwardable
85
-
86
141
  # Initialize a new RangeBuilder object
87
142
  # @param builder [AggregateBuilder] The Aggregate Builder object
88
143
  # @param field_name [#to_s]
@@ -91,18 +146,6 @@ module Orchestrate::Search
91
146
  @field_name = field_name
92
147
  end
93
148
 
94
- def_delegator :@builder, :options
95
- def_delegator :@builder, :order
96
- def_delegator :@builder, :limit
97
- def_delegator :@builder, :offset
98
- def_delegator :@builder, :aggregate
99
- def_delegator :@builder, :find
100
- def_delegator :@builder, :stats
101
- def_delegator :@builder, :range
102
- def_delegator :@builder, :distance
103
- def_delegator :@builder, :time_series
104
- def_delegator :@builder, :collection
105
-
106
149
  # @return Pretty-Printed string representation of the StatsBuilder object
107
150
  def to_s
108
151
  "#<Orchestrate::Search::StatsBuilder collection=#{collection.name} field_name=#{field_name}>"
@@ -117,6 +160,8 @@ module Orchestrate::Search
117
160
 
118
161
  # Range Builder object for constructing range functions to be included in the aggregate param
119
162
  class RangeBuilder
163
+ include QueryBuilderDelegator
164
+ include AggregateBuilderDelegator
120
165
 
121
166
  # @return [AggregateBuilder]
122
167
  attr_reader :builder
@@ -125,9 +170,7 @@ module Orchestrate::Search
125
170
  attr_reader :field_name
126
171
 
127
172
  # @return [#to_s] The range sets
128
- attr_reader :ranges
129
-
130
- extend Forwardable
173
+ attr_reader :ranges
131
174
 
132
175
  # Initialize a new RangeBuilder object
133
176
  # @param builder [AggregateBuilder] The Aggregate Builder object
@@ -138,18 +181,6 @@ module Orchestrate::Search
138
181
  @ranges = ''
139
182
  end
140
183
 
141
- def_delegator :@builder, :options
142
- def_delegator :@builder, :order
143
- def_delegator :@builder, :limit
144
- def_delegator :@builder, :offset
145
- def_delegator :@builder, :aggregate
146
- def_delegator :@builder, :find
147
- def_delegator :@builder, :stats
148
- def_delegator :@builder, :range
149
- def_delegator :@builder, :distance
150
- def_delegator :@builder, :time_series
151
- def_delegator :@builder, :collection
152
-
153
184
  # @return Pretty-Printed string representation of the RangeBuilder object
154
185
  def to_s
155
186
  "#<Orchestrate::Search::RangeBuilder collection=#{collection.name} field_name=#{field_name} ranges=#{ranges}>"
@@ -201,6 +232,8 @@ module Orchestrate::Search
201
232
 
202
233
  # Time Series Builder object for constructing time series functions for the aggregate param
203
234
  class TimeSeriesBuilder
235
+ include QueryBuilderDelegator
236
+ include AggregateBuilderDelegator
204
237
 
205
238
  # @return [AggregateBuilder]
206
239
  attr_reader :builder
@@ -211,8 +244,6 @@ module Orchestrate::Search
211
244
  # @return [#to_s] The interval of time for the TimeSeries function
212
245
  attr_reader :interval
213
246
 
214
- extend Forwardable
215
-
216
247
  # Initialize a new TimeSeriesBuilder object
217
248
  # @param builder [AggregateBuilder] The Aggregate Builder object
218
249
  # @param field_name [#to_s] The field to operate over
@@ -223,18 +254,6 @@ module Orchestrate::Search
223
254
  @time_zone = nil
224
255
  end
225
256
 
226
- def_delegator :@builder, :options
227
- def_delegator :@builder, :order
228
- def_delegator :@builder, :limit
229
- def_delegator :@builder, :offset
230
- def_delegator :@builder, :aggregate
231
- def_delegator :@builder, :find
232
- def_delegator :@builder, :stats
233
- def_delegator :@builder, :range
234
- def_delegator :@builder, :distance
235
- def_delegator :@builder, :time_series
236
- def_delegator :@builder, :collection
237
-
238
257
  # @return Pretty-Printed string representation of the TimeSeriesBuilder object
239
258
  def to_s
240
259
  "#<Orchestrate::Search::TimeSeriesBuilder collection=#{collection.name} field_name=#{field_name} interval=#{interval} time_zone=#{@time_zone}>"
@@ -300,4 +319,4 @@ module Orchestrate::Search
300
319
  self
301
320
  end
302
321
  end
303
- end
322
+ end
@@ -1,4 +1,4 @@
1
1
  module Orchestrate
2
2
  # @return [String] The version number of the Orchestrate Gem
3
- VERSION = "0.11.2"
3
+ VERSION = "0.11.3"
4
4
  end
@@ -0,0 +1,53 @@
1
+ require 'test_helper'
2
+
3
+ class AggregateBuilderTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ collection = OpenStruct.new(name: 'users')
6
+ @query_builder = Orchestrate::Search::QueryBuilder.new(collection, '*')
7
+ @builder = Orchestrate::Search::AggregateBuilder.new(@query_builder)
8
+ end
9
+
10
+ def test_top_values_aggregate
11
+ top_values = @builder.top_values('name')
12
+ assert_equal 'name:top_values', top_values.to_param
13
+ end
14
+
15
+ def test_top_values_aggregate_with_offset_limit
16
+ top_values = @builder.top_values('name', 0, 10)
17
+ assert_equal 'name:top_values:offset:0:limit:10', top_values.to_param
18
+ end
19
+
20
+ def test_top_values_aggregate_with_offset
21
+ assert_raises(ArgumentError) do
22
+ @builder.top_values('name', 0)
23
+ end
24
+ end
25
+
26
+ def test_top_values_aggregate_with_limit
27
+ assert_raises(ArgumentError) do
28
+ @builder.top_values('name', nil, 10)
29
+ end
30
+ end
31
+
32
+ def test_top_values_aggregate_to_s
33
+ top_values = @builder.top_values('name', 3, 4)
34
+ assert_equal '#<Orchestrate::Search::TopValuesBuilder collection=users field_name=name offset=3 limit=4>', top_values.to_s
35
+ end
36
+
37
+ # TODO: abstract delegator assertions into a re-usable helper
38
+ def test_top_values_delegators
39
+ # this test asserts that the top values aggregator delegates all expected
40
+ # query builder and aggregate builder methods
41
+ builder = MiniTest::Mock.new
42
+ top_values = Orchestrate::Search::TopValuesBuilder.new(builder, "field_name")
43
+ Orchestrate::Search::QueryBuilderDelegator.public_instance_methods.each do |m|
44
+ builder.expect(m, true)
45
+ top_values.send(m)
46
+ end
47
+ Orchestrate::Search::AggregateBuilderDelegator.public_instance_methods.each do |m|
48
+ builder.expect(m, true)
49
+ top_values.send(m)
50
+ end
51
+ builder.verify
52
+ end
53
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: orchestrate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.2
4
+ version: 0.11.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Lyon
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2015-03-27 00:00:00.000000000 Z
15
+ date: 2015-04-30 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: faraday
@@ -170,6 +170,7 @@ files:
170
170
  - test/orchestrate/key_value_test.rb
171
171
  - test/orchestrate/ref_test.rb
172
172
  - test/orchestrate/relations_test.rb
173
+ - test/orchestrate/search/aggregate_builder_test.rb
173
174
  - test/orchestrate/search/query_builder_test.rb
174
175
  - test/test_helper.rb
175
176
  homepage: https://github.com/orchestrate-io/orchestrate-ruby
@@ -218,5 +219,6 @@ test_files:
218
219
  - test/orchestrate/key_value_test.rb
219
220
  - test/orchestrate/ref_test.rb
220
221
  - test/orchestrate/relations_test.rb
222
+ - test/orchestrate/search/aggregate_builder_test.rb
221
223
  - test/orchestrate/search/query_builder_test.rb
222
224
  - test/test_helper.rb