elasticated 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,13 +13,18 @@ module Elasticated
13
13
  client.refresh_indices affected_indices
14
14
  end
15
15
 
16
+ # override
17
+ def execute_aggregations(query, opts={})
18
+ super(query, {delimit_by: [:conditions, :aggregations]}.merge(opts))
19
+ end
20
+
16
21
  protected
17
22
 
18
23
  # override
19
24
  def execute(action, query, opts={})
20
- affected_indices = affected_indices_for query
25
+ affected_indices = affected_indices_for query, opts
21
26
  affected_indices = affected_indices*','
22
- super action, query, opts.merge(index: affected_indices)
27
+ super action, query, opts.merge(index: affected_indices).reject { |k,_| k == :delimit_by }
23
28
  end
24
29
 
25
30
  # override
@@ -34,8 +39,8 @@ module Elasticated
34
39
  super action, query, opts.merge(index: affected_index)
35
40
  end
36
41
 
37
- def affected_indices_for(query)
38
- index_selector.indices_for_query(query)
42
+ def affected_indices_for(query, opts={})
43
+ index_selector.indices_for_query(query, opts)
39
44
  end
40
45
 
41
46
  end
@@ -150,11 +150,10 @@ module Elasticated
150
150
  _aggregations.parse response
151
151
  end
152
152
 
153
- # delimiters
154
-
155
- def fill_delimiter(field_delimiter)
156
- _conditions.fill_delimiter field_delimiter
157
- _filter_conditions.fill_delimiter field_delimiter
153
+ # visitor methods
154
+
155
+ def accept_visitor(visitor)
156
+ visitor.visit_query(self)
158
157
  end
159
158
 
160
159
  # conditions & filter shorthands
@@ -27,12 +27,16 @@ module Elasticated
27
27
  end
28
28
  end
29
29
 
30
- def merge! other_query_aggs
30
+ def merge!(other_query_aggs)
31
31
  other_query_aggs._aggregations.each do |other_aggregation|
32
32
  add_aggregation other_aggregation
33
33
  end
34
34
  end
35
35
 
36
+ def accept_visitor(visitor)
37
+ visitor.visit_query_aggregations(self)
38
+ end
39
+
36
40
  private
37
41
 
38
42
  def get_aggregation_class(agg_name)
@@ -11,10 +11,8 @@ module Elasticated
11
11
  self._should = BooleanClause.new
12
12
  end
13
13
 
14
- # delimiters
15
-
16
- def fill_delimiter(field_delimiter)
17
- _must.fill_delimiter field_delimiter
14
+ def accept_visitor(visitor)
15
+ visitor.visit_query_conditions(self)
18
16
  end
19
17
 
20
18
  # conditions
@@ -0,0 +1,14 @@
1
+ module Elasticated
2
+ class StrategyParamsForQueryService
3
+
4
+ def strategy_params_for_query(empty_delimiters, query, opts={})
5
+ query_delimiters = query.accept_visitor(Elasticated.delimiter_visitor)
6
+
7
+ empty_delimiters.inject Hash.new do |params, empty_delimiter|
8
+ built_delimiter = empty_delimiter.completed_with(query_delimiters, opts)
9
+ params.merge built_delimiter.build_strategy_params
10
+ end
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,71 @@
1
+ module Elasticated
2
+ class TermDelimiterFactory
3
+
4
+ def create(empty_delimiter, query_delimiters, opts={})
5
+ klass = Delimiters::TermFieldDelimiter
6
+ field = empty_delimiter.field_name
7
+ delimit_by = opts.fetch(:delimit_by, [:conditions])
8
+
9
+ case delimit_by
10
+ when []
11
+ relevant_delimiters = []
12
+ when [:conditions]
13
+ relevant_delimiters = relevant_field_delimiters(query_delimiters.fetch(:conditions), field)
14
+ when [:aggregations]
15
+ relevant_delimiters = relevant_field_delimiters(query_delimiters.fetch(:aggregations), field)
16
+ else
17
+ condition_delimiters = query_delimiters.fetch(:conditions)
18
+ aggregation_delimiters = query_delimiters.fetch(:aggregations)
19
+ relevant_delimiters = [merge_delimiters(condition_delimiters, aggregation_delimiters,field)]
20
+ end
21
+
22
+ values = empty_delimiter.values + relevant_delimiters.flat_map(&:values).flatten(1)
23
+ klass.new(values: values, field: field, as: empty_delimiter.filter_name)
24
+ end
25
+
26
+
27
+ def relevant_field_delimiters(all_delimiters, field)
28
+ all_delimiters.each_with_object(Array.new) do |delimiter, array|
29
+ field_delimiter = delimiter.select { |k,_| k == field }
30
+ array << field_delimiter unless field_delimiter.empty?
31
+ end
32
+ end
33
+
34
+ def merge_delimiters(condition_delimiters, aggregation_delimiters, field)
35
+ aggregation_delimiters_by_field = extract_aggregation_delimiters(aggregation_delimiters, field)
36
+ condition_delimiters_by_field = extract_condition_delimiters(condition_delimiters,field)
37
+ aggregation_delimiters_by_field.merge condition_delimiters_by_field
38
+ end
39
+
40
+ private
41
+
42
+ def extract_aggregation_delimiters(delimiters, field)
43
+ delimiters.inject(delimiters.first) do |mcd_acum, delimiter|
44
+ merge_aggregation_repeated_keys(mcd_acum, delimiter, field)
45
+ end
46
+ end
47
+
48
+ def extract_condition_delimiters(delimiters, field)
49
+ delimiters.inject(delimiters.first) do |mcd_acum, delimiter|
50
+ merge_condition_repeated_keys(mcd_acum, delimiter, field)
51
+ end
52
+ end
53
+
54
+ def merge_aggregation_repeated_keys(this, another_hash, field)
55
+ this_field = this[field]
56
+ another_hash_field = another_hash[field]
57
+ return {} if this_field.nil? or another_hash_field.nil?
58
+ {field => (this_field + another_hash_field).uniq}
59
+ end
60
+
61
+ def merge_condition_repeated_keys(this, another_hash, field)
62
+ this_field = this[field]
63
+ another_hash_field = another_hash[field]
64
+ return this if another_hash_field.nil? and not this_field.nil?
65
+ return (another_hash.select { |(k,v)| k == field }) if this_field.nil? and not another_hash_field.nil?
66
+ return {} if another_hash_field.nil? and this_field.nil?
67
+ {field => (this_field + another_hash_field).uniq}
68
+ end
69
+
70
+ end
71
+ end
data/lib/version.rb CHANGED
@@ -1,9 +1,13 @@
1
1
  module Elasticated
2
- VERSION = '2.4.0'
2
+ VERSION = '2.5.0'
3
3
  end
4
4
 
5
5
  # Changelog
6
6
 
7
+ # 2.5.0
8
+ # Ahora los delimiters son inmutables
9
+ # Se puede delimitar por aggregations
10
+
7
11
  # 2.4.0
8
12
  # Ahora se puede ordenar un search por un campo, script o hash custom
9
13
 
@@ -14,56 +14,17 @@ module Elasticated
14
14
  end
15
15
 
16
16
  it "should delimit by one term" do
17
- delimiter.add_term :created_at, '2016-07-19'
18
- params = delimiter.build_strategy_params
17
+ completed_delimiter = delimiter.completed_with conditions: [{created_at: '2016-07-19'}]
18
+ params = completed_delimiter.build_strategy_params
19
19
  expect(params).to eq date: '2016-07-19'
20
20
  end
21
21
 
22
22
  it "should delimit by multiple terms" do
23
- delimiter.add_term :created_at, '2017-03-30'
24
- delimiter.add_term :created_at, '2017-03-25'
25
- delimiter.add_term :created_at, '2017-03-27'
26
- params = delimiter.build_strategy_params
23
+ completed_delimiter = delimiter.completed_with conditions: [{created_at: '2017-03-30'},{created_at: '2017-03-25'},{created_at: '2017-03-27'}]
24
+ params = completed_delimiter.build_strategy_params
27
25
  expect(params).to eq date_since: '2017-03-25', date_until: '2017-03-30'
28
26
  end
29
27
 
30
- it "should delimit by a min date" do
31
- delimiter.set_minimum :created_at, '2016-07-19'
32
- params = delimiter.build_strategy_params
33
- expect(params).to eq date_since: '2016-07-19'
34
- end
35
-
36
- it "should delimit by a max date" do
37
- delimiter.set_maximum :created_at, '2016-07-19'
38
- params = delimiter.build_strategy_params
39
- expect(params).to eq date_until: '2016-07-19'
40
- end
41
-
42
- it "should delimit by a range of dates" do
43
- delimiter.set_minimum :created_at, '2016-07-19'
44
- delimiter.set_maximum :created_at, '2016-07-21'
45
- params = delimiter.build_strategy_params
46
- expect(params).to eq date_since: '2016-07-19', date_until: '2016-07-21'
47
- end
48
-
49
- it "should delimit by the most restricted range of dates" do
50
- delimiter.set_minimum :created_at, '2016-07-19'
51
- delimiter.set_maximum :created_at, '2016-07-25'
52
- delimiter.set_minimum :created_at, '2016-07-17' # ignored minimum
53
- delimiter.set_maximum :created_at, '2016-07-24'
54
- delimiter.set_maximum :created_at, '2016-07-26' # ignored maximum
55
- params = delimiter.build_strategy_params
56
- expect(params).to eq date_since: '2016-07-19', date_until: '2016-07-24'
57
- end
58
-
59
- it "should prefer a term over a range of dates" do
60
- delimiter.set_minimum :created_at, '2016-07-19'
61
- delimiter.set_maximum :created_at, '2016-07-21'
62
- delimiter.add_term :created_at, '2016-07-20'
63
- params = delimiter.build_strategy_params
64
- expect(params).to eq date: '2016-07-20'
65
- end
66
-
67
28
  end
68
29
  end
69
30
  end
@@ -0,0 +1,366 @@
1
+ require_relative 'spec_helper'
2
+
3
+ module Elasticated
4
+ describe TermDelimiterFactory do
5
+ let(:empty_delimiter){ Elasticated::Delimiters::TermFieldDelimiter.new(field: :account, as: :accounts) }
6
+
7
+ it "should create empty term delimiter from empty conditions" do
8
+ query_delimiters = { conditions: [], aggregations: []}
9
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :account, as: :accounts, values: [])
10
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters)
11
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
12
+ end
13
+
14
+ it 'should create empty term delimiter from empty condition delimiter definition and none aggregation delimiters' do
15
+ query_delimiters = { conditions: [{}], aggregations: [] }
16
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :account, as: :accounts, values: [])
17
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters)
18
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
19
+
20
+ query_delimiters = { conditions: [{}, {}], aggregations: [] }
21
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters)
22
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
23
+ end
24
+
25
+ it 'should create term delimiter with account from condition delimiter' do
26
+ query_delimiters = { conditions: [{account: [39]}], aggregations: [] }
27
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :account, as: :accounts, values: [39])
28
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters)
29
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
30
+ end
31
+
32
+ it 'should create term delimiter with account from condition delimiter with other empty definitions' do
33
+ query_delimiters = { conditions: [{account: [39]}, {}, {}], aggregations: [] }
34
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :account, as: :accounts, values: [39])
35
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters)
36
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
37
+
38
+ query_delimiters = { conditions: [{account: [39,40]}, {}, {}], aggregations: [] }
39
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :account, as: :accounts, values: [39,40])
40
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters)
41
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
42
+ end
43
+
44
+ it 'should create term delimiter with two accounts from different condition delimiters' do
45
+ query_delimiters = { conditions: [{account: [39]}, {account: 40}, {}], aggregations: [] }
46
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :account, as: :accounts, values: [39, 40])
47
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters)
48
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
49
+ end
50
+
51
+ it 'should create term delimiter with two accounts from different condition delimiters with one different field in one delimiter' do
52
+ query_delimiters = { conditions: [{account: [39], tags: ["a_tag"]}, {account: 40}, {}], aggregations: [] }
53
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :account, as: :accounts, values: [39, 40])
54
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters)
55
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
56
+
57
+ query_delimiters = { conditions: [{account: [39], tags: ["a_tag"]}, {account: 40, tags: ["another_tag"]}, {}], aggregations: [] }
58
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters)
59
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
60
+ end
61
+
62
+ it 'should create term delimiter with account from aggregation delimiter with no condition delimiters' do
63
+ options = {delimit_by: [:aggregations]}
64
+ query_delimiters = { conditions: [{}], aggregations: [{account: [39]}] }
65
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :account, as: :accounts, values: [39])
66
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters, options)
67
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
68
+
69
+ query_delimiters = { conditions: [{}], aggregations: [{account: [39]}, {account: [40]}] }
70
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :account, as: :accounts, values: [39, 40])
71
+ actual = Elasticated.term_delimiter_factory.create(empty_delimiter, query_delimiters, options)
72
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
73
+ end
74
+
75
+ it 'should merge empty delimiters' do
76
+ condition_delimiters = [{}]
77
+ aggregation_delimiters = [{}]
78
+ field = :account
79
+ expected = {}
80
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
81
+ expect(actual).to eq(expected)
82
+ end
83
+
84
+ it 'should merge empty condition delimiter with one aggregation delimiter' do
85
+ condition_delimiters = [{}]
86
+ aggregation_delimiters = [{account: [39]}]
87
+ field = :account
88
+ expected = {account: [39]}
89
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
90
+ expect(actual).to eq(expected)
91
+ end
92
+
93
+ it 'should merge empty condition delimiter with two aggregation delimiters' do
94
+ condition_delimiters = [{}]
95
+ aggregation_delimiters = [{account: [39]}, {account: [40]}]
96
+ field = :account
97
+ expected = {account: [39, 40]}
98
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
99
+ expect(actual).to eq(expected)
100
+ end
101
+
102
+ it 'should merge empty condition delimiter with two different aggregation delimiters' do
103
+ condition_delimiters = [{}]
104
+ aggregation_delimiters = [{account: [39]}, {tags: ["a_tag"]}]
105
+ field = :account
106
+ expected = {}
107
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
108
+ expect(actual).to eq(expected)
109
+
110
+ aggregation_delimiters = [{tags: ["a_tag"]}, {account: [39]}]
111
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
112
+ expect(actual).to eq(expected)
113
+ end
114
+
115
+ it 'should merge empty condition delimiter with two equal aggregation delimiters and one different' do
116
+ condition_delimiters = [{}]
117
+ aggregation_delimiters = [{account: [39]}, {account: [40], tags: ["a_tag"]}]
118
+ field = :account
119
+ expected = {account: [39, 40]}
120
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
121
+ expect(actual).to eq(expected)
122
+ end
123
+
124
+ it 'should merge one condition delimiter with empty aggregation delimiters' do
125
+ condition_delimiters = [{account: [39]}]
126
+ aggregation_delimiters = [{}]
127
+ field = :account
128
+ expected = {account: [39]}
129
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
130
+ expect(actual).to eq(expected)
131
+ end
132
+
133
+ it 'should merge two condition delimiter with empty aggregation delimiters' do
134
+ condition_delimiters = [{account: [39]}, {account: [40]}]
135
+ aggregation_delimiters = [{}]
136
+ field = :account
137
+ expected = {account: [39, 40]}
138
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
139
+ expect(actual).to eq(expected)
140
+ end
141
+
142
+ it 'should merge two different condition delimiters with empty aggregation delimiters' do
143
+ condition_delimiters = [{account: [39]}, {tags: ["a_tag"]}]
144
+ aggregation_delimiters = [{}]
145
+ field = :account
146
+ expected = {account: [39]}
147
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
148
+ expect(actual).to eq(expected)
149
+
150
+ condition_delimiters = [{tags: ["a_tag"]}, {account: [39]}]
151
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
152
+ expect(actual).to eq(expected)
153
+ end
154
+
155
+ it 'should merge two equal and one different condition delimiters with empty delimiters' do
156
+ condition_delimiters = [{account: [39]}, {account: [40], tags: ["a_tag"]}]
157
+ aggregation_delimiters = [{}]
158
+ field = :account
159
+ expected = {account: [39, 40]}
160
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
161
+ expect(actual).to eq(expected)
162
+
163
+ condition_delimiters = [{tags: ["a_tag"], account: [40]}, {account: [39]}]
164
+ expected = {account: [40, 39]}
165
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
166
+ expect(actual).to eq(expected)
167
+ end
168
+
169
+ it 'should merge one condition delimiter with one aggregation delimiter of a different field' do
170
+ condition_delimiters = [{account: [39]}]
171
+ aggregation_delimiters = [{tags: ["a_tag"]}]
172
+ field = :account
173
+ expected = {account: [39]}
174
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
175
+ expect(actual).to eq(expected)
176
+ end
177
+
178
+ it 'should merge one condition delimiter with one aggregation delimiter of the same field' do
179
+ condition_delimiters = [{account: [39]}]
180
+ aggregation_delimiters = [{account: [40]}]
181
+ field = :account
182
+ expected = {account: [39]}
183
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
184
+ expect(actual).to eq(expected)
185
+ end
186
+
187
+ it 'should merge two condition delimiter of different field with one aggregation delimiter of another field' do
188
+ condition_delimiters = [{account: [39]}, {groups: ["a_group"]}]
189
+ aggregation_delimiters = [{tags: ["a_tag"]}]
190
+ field = :account
191
+ expected = {account: [39]}
192
+ actual = Elasticated.term_delimiter_factory.merge_delimiters(condition_delimiters, aggregation_delimiters, field)
193
+ expect(actual).to eq(expected)
194
+ end
195
+
196
+ end
197
+
198
+ describe DateDelimiterFactory do
199
+ let(:empty_delimiter){ Elasticated::Delimiters::DateFieldDelimiter.new(field: :date) }
200
+ let(:term_empty_delimiter){ Elasticated::Delimiters::TermFieldDelimiter.new(field: :date) }
201
+
202
+ it "should create empty date delimiter from empty conditions" do
203
+ query_delimiters = { conditions: [], aggregations: []}
204
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :date)
205
+ actual = Elasticated.term_delimiter_factory.create(term_empty_delimiter, query_delimiters)
206
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
207
+ end
208
+
209
+ it 'should create empty date delimiter from empty condition delimiter definition and none aggregation delimiters' do
210
+ query_delimiters = { conditions: [{}], aggregations: [] }
211
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :date)
212
+ actual = Elasticated.term_delimiter_factory.create(term_empty_delimiter, query_delimiters)
213
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
214
+
215
+ query_delimiters = { conditions: [{}, {}], aggregations: [] }
216
+ actual = Elasticated.term_delimiter_factory.create(term_empty_delimiter, query_delimiters)
217
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
218
+ end
219
+
220
+ it 'should create date delimiter from condition delimiter' do
221
+ query_delimiters = { conditions: [{date: ['2017-05-26']}], aggregations: [] }
222
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :date, values: ['2017-05-26'])
223
+ actual = Elasticated.term_delimiter_factory.create(term_empty_delimiter, query_delimiters)
224
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
225
+
226
+ query_delimiters = { conditions: [{date_since: '2017-05-26'}], aggregations: [] }
227
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-26')
228
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters)
229
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
230
+
231
+ query_delimiters = { conditions: [{date_until: '2017-05-26'}], aggregations: [] }
232
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_until: '2017-05-26')
233
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters)
234
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
235
+
236
+ query_delimiters = { conditions: [{date_since: '2017-05-26', date_until: '2017-05-26'}], aggregations: [] }
237
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-26', date_until: '2017-05-26')
238
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters)
239
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
240
+ end
241
+
242
+ it 'should create date delimiter from many condition delimiters' do
243
+ query_delimiters = { conditions: [{date: ['2017-05-26']}, {date: ['2017-05-27']}, {date: ['2017-05-25']}], aggregations: [] }
244
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :date, values: ['2017-05-26', '2017-05-27', '2017-05-25'])
245
+ actual = Elasticated.term_delimiter_factory.create(term_empty_delimiter, query_delimiters)
246
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
247
+
248
+ query_delimiters = { conditions: [{date_since: '2017-05-26'}, {date_since: '2017-05-25'}, {date_since: '2017-05-27'}], aggregations: [] }
249
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-25')
250
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters)
251
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
252
+
253
+ query_delimiters = { conditions: [{date_until: '2017-05-26'}, {date_until: '2017-05-25'}, {date_until: '2017-05-27'}], aggregations: [] }
254
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_until: '2017-05-27')
255
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters)
256
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
257
+
258
+ query_delimiters = { conditions: [{date_since: '2017-05-25', date_until: '2017-05-26'}, {date_since: '2017-05-27', date_until: '2017-05-28'}], aggregations: [] }
259
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-25', date_until: '2017-05-28')
260
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters)
261
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
262
+ end
263
+
264
+ it 'should create date delimiter from aggregation delimiters' do
265
+ options = {delimit_by: [:aggregations]}
266
+ query_delimiters = { conditions: [{}], aggregations: [{date_since: '2017-05-26'}] }
267
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-26')
268
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
269
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
270
+
271
+ query_delimiters = { conditions: [], aggregations: [{date_since: '2017-05-26'}] }
272
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-26')
273
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
274
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
275
+
276
+ query_delimiters = { conditions: [], aggregations: [{date_until: '2017-05-26'}] }
277
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_until: '2017-05-26')
278
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
279
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
280
+
281
+ query_delimiters = { conditions: [], aggregations: [{date_since: '2017-05-26', date_until: '2017-05-26'}] }
282
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-26', date_until: '2017-05-26')
283
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
284
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
285
+ end
286
+
287
+ it 'should create date delimiter from many aggregation delimiters' do
288
+ options = {delimit_by: [:aggregations]}
289
+ query_delimiters = { conditions: [], aggregations: [{date: ['2017-05-26']}, {date: ['2017-05-27']}, {date: ['2017-05-25']}] }
290
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :date, values: ['2017-05-26', '2017-05-27', '2017-05-25'])
291
+ actual = Elasticated.term_delimiter_factory.create(term_empty_delimiter, query_delimiters, options)
292
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
293
+
294
+ query_delimiters = { conditions: [], aggregations: [{date_since: '2017-05-26'}, {date_since: '2017-05-25'}, {date_since: '2017-05-27'}] }
295
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-25')
296
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
297
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
298
+
299
+ query_delimiters = { conditions: [], aggregations: [{date_until: '2017-05-26'}, {date_until: '2017-05-25'}, {date_until: '2017-05-27'}] }
300
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_until: '2017-05-27')
301
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
302
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
303
+
304
+ query_delimiters = { conditions: [], aggregations: [{date_since: '2017-05-25', date_until: '2017-05-26'}, {date_since: '2017-05-27', date_until: '2017-05-28'}] }
305
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-25', date_until: '2017-05-28')
306
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
307
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
308
+
309
+ query_delimiters = { conditions: [], aggregations: [{date_since: '2017-05-25'}, {date_until: '2017-05-28'}] }
310
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date)
311
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
312
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
313
+ end
314
+
315
+ it 'should create date delimiter from condition and aggregation delimiters' do
316
+ options = {delimit_by: [:conditions, :aggregations]}
317
+ query_delimiters = { conditions: [{date: ['2017-05-26']}, {date: ['2017-05-27']}], aggregations: [{date: ['2017-05-25']}] }
318
+ expected = Elasticated::Delimiters::TermFieldDelimiter.new(field: :date, values: ['2017-05-26', '2017-05-27'])
319
+ actual = Elasticated.term_delimiter_factory.create(term_empty_delimiter, query_delimiters, options)
320
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
321
+
322
+ query_delimiters = { conditions: [{date_since: '2017-05-26'}], aggregations: [{date_since: '2017-05-25'}, {date_since: '2017-05-27'}] }
323
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-26')
324
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
325
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
326
+
327
+ query_delimiters = { conditions: [{date_until: '2017-05-26'}, {date_until: '2017-05-25'}], aggregations: [{date_until: '2017-05-27'}] }
328
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_until: '2017-05-26')
329
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
330
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
331
+
332
+ query_delimiters = { conditions: [{date_since: '2017-05-25', date_until: '2017-05-26'}], aggregations: [{date_since: '2017-05-27', date_until: '2017-05-28'}] }
333
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-25', date_until: '2017-05-26')
334
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
335
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
336
+
337
+ query_delimiters = { conditions: [{date_until: '2017-05-28'}], aggregations: [{date_since: '2017-05-25'}] }
338
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-25', date_until: '2017-05-28')
339
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
340
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
341
+
342
+ query_delimiters = { conditions: [], aggregations: [{date_since: '2017-05-27', date_until: '2017-05-28'}] }
343
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-27', date_until: '2017-05-28')
344
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
345
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
346
+
347
+ query_delimiters = { conditions: [{date_since: '2017-05-26'}], aggregations: [{date_since: '2017-05-27', date_until: '2017-05-28'}] }
348
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-26', date_until: '2017-05-28')
349
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
350
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
351
+
352
+ query_delimiters = { conditions: [{date_since: '2017-05-26'}], aggregations: [{date_since: '2017-05-27', date_until: '2017-05-28'}, {date_since: '2017-05-27'}] }
353
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-26')
354
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
355
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
356
+ end
357
+
358
+ it 'should create date delimiter from condition and aggregation delimiters when condition delimiter has many different filters' do
359
+ options = {delimit_by: [:conditions, :aggregations]}
360
+ query_delimiters = { conditions: [{date_since: '2017-05-26'}, {date_until: '2017-05-31'}], aggregations: [{date_since: '2017-05-27', date_until: '2017-05-28'}, {date_since: '2017-05-27'}] }
361
+ expected = Elasticated::Delimiters::DateFieldDelimiter.new(field: :date, date_since: '2017-05-26', date_until: '2017-05-31')
362
+ actual = Elasticated.date_delimiter_factory.create(empty_delimiter, query_delimiters, options)
363
+ expect(actual.build_strategy_params).to eq(expected.build_strategy_params)
364
+ end
365
+ end
366
+ end