elasticated 2.4.0 → 2.5.0

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.
@@ -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