msfl_visitors 0.1.0.rc3 → 0.3.0.dev

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +2 -2
  4. data/README.md +9 -17
  5. data/lib/msfl_visitors/nodes/and.rb +0 -17
  6. data/lib/msfl_visitors/nodes/base.rb +3 -1
  7. data/lib/msfl_visitors/nodes/binary.rb +0 -7
  8. data/lib/msfl_visitors/nodes/dataset.rb +7 -0
  9. data/lib/msfl_visitors/nodes/equal.rb +17 -0
  10. data/lib/msfl_visitors/nodes/explicit_filter.rb +7 -0
  11. data/lib/msfl_visitors/nodes/filter.rb +16 -15
  12. data/lib/msfl_visitors/nodes/foreign.rb +7 -0
  13. data/lib/msfl_visitors/nodes/given.rb +7 -0
  14. data/lib/msfl_visitors/nodes/iterator.rb +7 -1
  15. data/lib/msfl_visitors/nodes/named_value.rb +16 -0
  16. data/lib/msfl_visitors/nodes/partial.rb +7 -0
  17. data/lib/msfl_visitors/nodes/set.rb +23 -0
  18. data/lib/msfl_visitors/nodes.rb +7 -9
  19. data/lib/msfl_visitors/parsers/msfl_parser.rb +33 -4
  20. data/lib/msfl_visitors/visitor.rb +165 -6
  21. data/lib/msfl_visitors.rb +0 -2
  22. data/msfl_visitors.gemspec +3 -3
  23. data/spec/nodes/iterator_spec.rb +21 -3
  24. data/spec/parsers/msfl_parser_spec.rb +61 -4
  25. data/spec/spec_helper.rb +5 -1
  26. data/spec/visitors/chewy_term_filter_spec.rb +460 -53
  27. metadata +11 -24
  28. data/lib/msfl_visitors/collectors/chewy/term_filter.rb +0 -19
  29. data/lib/msfl_visitors/collectors.rb +0 -1
  30. data/lib/msfl_visitors/nodes/binary_and.rb +0 -7
  31. data/lib/msfl_visitors/nodes/constant_value.rb +0 -11
  32. data/lib/msfl_visitors/nodes/grouping/close.rb +0 -9
  33. data/lib/msfl_visitors/nodes/grouping/grouping.rb +0 -24
  34. data/lib/msfl_visitors/nodes/grouping/open.rb +0 -9
  35. data/lib/msfl_visitors/nodes/set/close.rb +0 -9
  36. data/lib/msfl_visitors/nodes/set/delimiter.rb +0 -9
  37. data/lib/msfl_visitors/nodes/set/open.rb +0 -9
  38. data/lib/msfl_visitors/nodes/set/set.rb +0 -43
  39. data/lib/msfl_visitors/renderers/chewy/term_filter.rb +0 -59
  40. data/spec/renderers/chewy/term_filter_spec.rb +0 -24
@@ -4,27 +4,147 @@ describe MSFLVisitors::Visitor do
4
4
 
5
5
  let(:node) { fail ArgumentError, "You must define the node variable in each scope." }
6
6
 
7
- let(:collector) { MSFLVisitors::Collectors::Chewy::TermFilter.new }
8
-
9
- let(:renderer) { MSFLVisitors::Renderers::Chewy::TermFilter.new }
10
-
11
- let(:visitor) { described_class.new collector, renderer }
7
+ let(:visitor) { described_class.new }
12
8
 
13
9
  let(:left) { MSFLVisitors::Nodes::Field.new "lhs" }
14
10
 
15
11
  let(:right) { MSFLVisitors::Nodes::Word.new "rhs" }
16
12
 
17
- subject(:result) { collector }
18
-
19
- before(:each) { node.accept visitor }
13
+ subject(:result) { node.accept visitor }
20
14
 
21
15
  context "when visiting" do
22
16
 
17
+ describe "an unsupported node" do
18
+
19
+ class UnsupportedNode
20
+
21
+ def accept(visitor)
22
+ visitor.visit self
23
+ end
24
+ end
25
+
26
+ let(:node) { UnsupportedNode.new }
27
+
28
+ context "when using the TermFilter visitor" do
29
+
30
+ it "raises an ArgumentError" do
31
+ expect { subject }.to raise_error ArgumentError
32
+ end
33
+ end
34
+
35
+ context "when using the Aggregations visitor" do
36
+
37
+ before { visitor.mode = :aggregations }
38
+
39
+ it "raises an ArgumentError" do
40
+ expect { subject }.to raise_error ArgumentError
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ # chewy looks like
47
+ # Index::Type.filter { match_all }.aggregations({toyotas: {terms: {make: 'Toyota'}, aggregations: { filter: { range: { avg_age: { gt: 10 }}} }}})
48
+ describe "a Partial node" do
49
+
50
+ let(:node) { MSFLVisitors::Nodes::Partial.new given_node, named_value }
51
+
52
+ let(:given_node) { MSFLVisitors::Nodes::Given.new [given_equal_node] }
53
+
54
+ let(:given_equal_node) { MSFLVisitors::Nodes::Equal.new given_field_node, given_value_node }
55
+
56
+ let(:given_field_node) { MSFLVisitors::Nodes::Field.new :make }
57
+
58
+ let(:given_value_node) { MSFLVisitors::Nodes::Word.new "Toyota" }
59
+
60
+
61
+ let(:named_value) { MSFLVisitors::Nodes::NamedValue.new MSFLVisitors::Nodes::Word.new("partial"), explicit_filter_node }
62
+
63
+ let(:explicit_filter_node) { MSFLVisitors::Nodes::ExplicitFilter.new [greater_than_node] }
64
+
65
+ let(:greater_than_node) { MSFLVisitors::Nodes::GreaterThan.new field_node, value_node }
66
+
67
+ let(:field_node) { MSFLVisitors::Nodes::Field.new :age }
68
+
69
+ let(:value_node) { MSFLVisitors::Nodes::Number.new 10 }
70
+
71
+
72
+ subject { visitor.visit_tree node }
73
+
74
+ it "results in the appropriate aggregation clause" do
75
+ exp = [{
76
+ clause: {
77
+ given: {
78
+ filter: {
79
+ term: { make: "Toyota" }
80
+ },
81
+ aggs: {
82
+ partial: {
83
+ filter: { range: { age: { gt: 10 }}}
84
+ }
85
+ }
86
+ }
87
+ },
88
+ method_to_execute: :aggregations
89
+ }]
90
+ visitor.mode = :aggregations
91
+ expect(subject).to eq exp
92
+ end
93
+ end
94
+
95
+ describe "a Given node" do
96
+
97
+ let(:node) { MSFLVisitors::Nodes::Given.new [given_equal_node] }
98
+
99
+ let(:given_equal_node) { MSFLVisitors::Nodes::Equal.new given_field_node, given_value_node }
100
+
101
+ let(:given_field_node) { MSFLVisitors::Nodes::Field.new :make }
102
+
103
+ let(:given_value_node) { MSFLVisitors::Nodes::Word.new "Toyota" }
104
+
105
+
106
+ it "results in: [:filter, { term: { make: \"Toyota\" } }]" do
107
+ visitor.mode = :aggregations
108
+ expect(subject).to eq([:filter, { term: { make: "Toyota" } }])
109
+ end
110
+ end
111
+
112
+ describe "a Foreign node" do
113
+
114
+ let(:node) { MSFLVisitors::Nodes::Foreign.new dataset_node, filter_node }
115
+
116
+ let(:dataset_node) { MSFLVisitors::Nodes::Dataset.new "person" }
117
+
118
+ let(:filter_node) { MSFLVisitors::Nodes::ExplicitFilter.new [equal_node] }
119
+
120
+ let(:equal_node) { MSFLVisitors::Nodes::Equal.new left, right }
121
+
122
+ let(:left) { MSFLVisitors::Nodes::Field.new :age }
123
+
124
+ let(:right) { MSFLVisitors::Nodes::Number.new 25 }
125
+
126
+ context "when using the TermFilter visitor" do
127
+
128
+ it "results in: 'has_child( :person ).filter { age == 25 }" do
129
+ expect(subject).to eq "has_child( :person ).filter { age == 25 }"
130
+ end
131
+ end
132
+
133
+ context "when using the Aggregations visitor" do
134
+
135
+ before { visitor.mode = :aggregations }
136
+
137
+ it "results in: { has_child: { type: \"person\", filter: { term: { age: 25 } } } }" do
138
+ expect(subject).to eq({ has_child: { type: "person", filter: { term: { age: 25 } } } })
139
+ end
140
+ end
141
+ end
142
+
23
143
  describe "a Containment node" do
24
144
 
25
145
  let(:node) { MSFLVisitors::Nodes::Containment.new field, values }
26
146
 
27
- let(:values) { MSFLVisitors::Nodes::Set::Set.new(MSFL::Types::Set.new([item_one, item_two, item_three])) }
147
+ let(:values) { MSFLVisitors::Nodes::Set.new(MSFL::Types::Set.new([item_one, item_two, item_three])) }
28
148
 
29
149
  let(:item_one) { MSFLVisitors::Nodes::Word.new "item_one" }
30
150
 
@@ -34,14 +154,26 @@ describe MSFLVisitors::Visitor do
34
154
 
35
155
  let(:field) { left }
36
156
 
37
- it "results in: 'lhs == [ \"item_one\", \"item_two\", \"item_three\" ]'" do
38
- expect(subject).to eq "lhs == [ \"item_one\", \"item_two\", \"item_three\" ]"
157
+ context "when using the TermFilter visitor" do
158
+
159
+ it "results in: 'lhs == [ \"item_one\", \"item_two\", \"item_three\" ]'" do
160
+ expect(subject).to eq "lhs == [ \"item_one\" , \"item_two\" , \"item_three\" ]"
161
+ end
162
+ end
163
+
164
+ context "when using the Aggregations visitor" do
165
+
166
+ before { visitor.mode = :aggregations }
167
+
168
+ it "results in: { terms: { lhs: [\"item_one\", \"item_two\", \"item_three\"] } }" do
169
+ expect(subject).to eq({ terms: { lhs: ["item_one", "item_two", "item_three"] } })
170
+ end
39
171
  end
40
172
  end
41
173
 
42
174
  describe "a Set node" do
43
175
 
44
- let(:node) { MSFLVisitors::Nodes::Set::Set.new values }
176
+ let(:node) { MSFLVisitors::Nodes::Set.new values }
45
177
 
46
178
  let(:values) { MSFL::Types::Set.new([item_one, item_two]) }
47
179
 
@@ -49,8 +181,20 @@ describe MSFLVisitors::Visitor do
49
181
 
50
182
  let(:item_two) { MSFLVisitors::Nodes::Word.new "item_two" }
51
183
 
52
- it "results in: '[ \"item_one\", \"item_two\" ]'" do
53
- expect(result).to eq "[ \"item_one\", \"item_two\" ]"
184
+ context "when using the TermFilter visitor" do
185
+
186
+ it "results in: '[ \"item_one\" , \"item_two\" ]'" do
187
+ expect(result).to eq "[ \"item_one\" , \"item_two\" ]"
188
+ end
189
+ end
190
+
191
+ context "when using the Aggregations visitor" do
192
+
193
+ before { visitor.mode = :aggregations }
194
+
195
+ it "results in: [\"item_one\", \"item_two\"]" do
196
+ expect(result).to eq ["item_one", "item_two"]
197
+ end
54
198
  end
55
199
  end
56
200
 
@@ -58,8 +202,20 @@ describe MSFLVisitors::Visitor do
58
202
 
59
203
  let(:node) { MSFLVisitors::Nodes::Equal.new left, right }
60
204
 
61
- it "results in: 'left == right'" do
62
- expect(result).to eq "lhs == \"rhs\""
205
+ context "when the current visitor is Chewy::TermFilter" do
206
+
207
+ it "results in: 'left == right'" do
208
+ expect(result).to eq "lhs == \"rhs\""
209
+ end
210
+ end
211
+
212
+ context "when the current visitor is Chewy::Aggregations" do
213
+
214
+ before { visitor.mode = :aggregations }
215
+
216
+ it "results in: { term: { lhs: \"rhs\" } }" do
217
+ expect(result).to eq({ term: { lhs: "rhs" } })
218
+ end
63
219
  end
64
220
  end
65
221
 
@@ -67,8 +223,22 @@ describe MSFLVisitors::Visitor do
67
223
 
68
224
  let(:node) { MSFLVisitors::Nodes::GreaterThan.new left, right }
69
225
 
70
- it "returns: 'left > right'" do
71
- expect(result).to eq "lhs > \"rhs\""
226
+ let(:right) { MSFLVisitors::Nodes::Number.new 1000 }
227
+
228
+ context "when using the TermFilter visitor" do
229
+
230
+ it "returns: 'left > 1000'" do
231
+ expect(result).to eq "lhs > 1000"
232
+ end
233
+ end
234
+
235
+ context "when using the Aggregations visitor" do
236
+
237
+ before { visitor.mode = :aggregations }
238
+
239
+ it "results in: { range: { lhs: { gt: 1000 } } }" do
240
+ expect(result).to eq({ range: { lhs: { gt: 1000 } } })
241
+ end
72
242
  end
73
243
  end
74
244
 
@@ -76,8 +246,22 @@ describe MSFLVisitors::Visitor do
76
246
 
77
247
  let(:node) { MSFLVisitors::Nodes::GreaterThanEqual.new left, right }
78
248
 
79
- it "returns: 'left >= right'" do
80
- expect(result).to eq "lhs >= \"rhs\""
249
+ let(:right) { MSFLVisitors::Nodes::Number.new 10.52 }
250
+
251
+ context "when using the TermFilter visitor" do
252
+
253
+ it "returns: 'left >= 10.52'" do
254
+ expect(result).to eq "lhs >= 10.52"
255
+ end
256
+ end
257
+
258
+ context "when using the Aggregations visitor" do
259
+
260
+ before { visitor.mode = :aggregations }
261
+
262
+ it "results in: { range: { lhs: { gte: 10.52 } } }" do
263
+ expect(result).to eq({ range: { lhs: { gte: 10.52 } } })
264
+ end
81
265
  end
82
266
  end
83
267
 
@@ -85,8 +269,22 @@ describe MSFLVisitors::Visitor do
85
269
 
86
270
  let(:node) { MSFLVisitors::Nodes::LessThan.new left, right }
87
271
 
88
- it "returns: 'left < right'" do
89
- expect(result).to eq 'lhs < "rhs"'
272
+ let(:right) { MSFLVisitors::Nodes::Number.new 133.7 }
273
+
274
+ context "when using the TermFilter visitor" do
275
+
276
+ it "returns: 'left < 133.7'" do
277
+ expect(result).to eq 'lhs < 133.7'
278
+ end
279
+ end
280
+
281
+ context "when using the Aggregations visitor" do
282
+
283
+ before { visitor.mode = :aggregations }
284
+
285
+ it "returns: { range: { lhs: { lt: 133.7 } } }" do
286
+ expect(result).to eq({ range: { lhs: { lt: 133.7 } } })
287
+ end
90
288
  end
91
289
  end
92
290
 
@@ -94,8 +292,82 @@ describe MSFLVisitors::Visitor do
94
292
 
95
293
  let(:node) { MSFLVisitors::Nodes::LessThanEqual.new left, right }
96
294
 
97
- it "returns: 'left <= right'" do
98
- expect(result).to eq 'lhs <= "rhs"'
295
+ let(:right) { MSFLVisitors::Nodes::Date.new Date.today }
296
+
297
+ context "when using the TermFilter visitor" do
298
+
299
+ it "returns: 'left <= \"#{Date.today}\"'" do
300
+ expect(result).to eq "lhs <= \"#{Date.today}\""
301
+ end
302
+ end
303
+
304
+ context "when using the Aggregations visitor" do
305
+
306
+ before { visitor.mode = :aggregations }
307
+
308
+ it "returns: { range: { lhs: { lte: \"#{Date.today}\" } } }" do
309
+ expect(result).to eq({ range: { lhs: { lte: "#{Date.today}" } } })
310
+ end
311
+ end
312
+ end
313
+
314
+ describe "a Filter node" do
315
+
316
+ let(:node) { MSFLVisitors::Nodes::Filter.new filtered_nodes }
317
+
318
+ let(:filtered_nodes) do
319
+ [
320
+ MSFLVisitors::Nodes::GreaterThanEqual.new(
321
+ MSFLVisitors::Nodes::Field.new(:value),
322
+ MSFLVisitors::Nodes::Number.new(1000))
323
+ ]
324
+ end
325
+
326
+ context "when using the TermFilter visitor" do
327
+
328
+ it "returns: value >= 1000" do
329
+ expect(result).to eq "value >= 1000"
330
+ end
331
+ end
332
+
333
+ context "when using the Aggregations visitor" do
334
+
335
+ before { visitor.mode = :aggregations }
336
+
337
+ it "returns: { range: { value: { gte: 1000 } } }" do
338
+ expect(result).to eq({ range: { value: { gte: 1000 } } })
339
+ end
340
+ end
341
+
342
+ context "when the filter has multiple children" do
343
+
344
+ let(:filtered_nodes) do
345
+ [
346
+ MSFLVisitors::Nodes::Equal.new(
347
+ MSFLVisitors::Nodes::Field.new(:make),
348
+ MSFLVisitors::Nodes::Word.new("Chevy")
349
+ ),
350
+ MSFLVisitors::Nodes::GreaterThanEqual.new(
351
+ MSFLVisitors::Nodes::Field.new(:value),
352
+ MSFLVisitors::Nodes::Number.new(1000))
353
+ ]
354
+ end
355
+
356
+ context "when using the TermFilter visitor" do
357
+
358
+ it "returns: ( make == \"Chevy\" ) & ( value >= 1000 )" do
359
+ expect(result).to eq "( make == \"Chevy\" ) & ( value >= 1000 )"
360
+ end
361
+ end
362
+
363
+ context "when using the Aggregations visitor" do
364
+
365
+ before { visitor.mode = :aggregations }
366
+
367
+ it "returns: { and: [{ term: { make: \"Chevy\" } },{ range: { value: { gte: 1000 } } }] }" do
368
+ expect(result).to eq({ and: [{ term: { make: "Chevy" } },{ range: { value: { gte: 1000 } } }] })
369
+ end
370
+ end
99
371
  end
100
372
  end
101
373
 
@@ -119,38 +391,89 @@ describe MSFLVisitors::Visitor do
119
391
 
120
392
  let(:third) { MSFLVisitors::Nodes::Equal.new(third_field, third_value) }
121
393
 
394
+ let(:node) { MSFLVisitors::Nodes::And.new(set_node) }
395
+
122
396
  context "when the And node has zero items" do
123
- let(:node) { MSFLVisitors::Nodes::And.new([]) }
124
397
 
125
- it "is empty" do
126
- expect(result).to be_empty
398
+ let(:set_node) { MSFLVisitors::Nodes::Set.new [] }
399
+
400
+ context "when using the TermFilter visitor" do
401
+
402
+ it "is empty" do
403
+ expect(result).to be_empty
404
+ end
405
+ end
406
+
407
+ context "when using the Aggregations visitor" do
408
+
409
+ before { visitor.mode = :aggregations }
410
+
411
+ it "returns: { and: [] }" do
412
+ expect(result).to eq({ and: [] })
413
+ end
127
414
  end
128
415
  end
129
416
 
130
417
  context "when the node has one item" do
131
418
 
132
- let(:node) { MSFLVisitors::Nodes::And.new([first])}
419
+ let(:set_node) { MSFLVisitors::Nodes::Set.new [first] }
420
+
421
+ context "when using the TermFilter visitor" do
133
422
 
134
- it "returns: the item without adding parentheses" do
135
- expect(result).to eq 'first_field == "first_word"'
423
+ it "returns: the item without adding parentheses" do
424
+ expect(result).to eq 'first_field == "first_word"'
425
+ end
426
+ end
427
+
428
+ context "when using the Aggregations visitor" do
429
+
430
+ before { visitor.mode = :aggregations }
431
+
432
+ it "returns: { and: [{ term: { first_field: \"first_word\" }] }" do
433
+ expect(result).to eq({ and: [{ term: { first_field: "first_word" } }] })
434
+ end
136
435
  end
137
436
  end
138
437
 
139
438
  context "when the node has two items" do
140
439
 
141
- let(:node) { MSFLVisitors::Nodes::And.new([first, second]) }
440
+ let(:set_node) { MSFLVisitors::Nodes::Set.new [first, second] }
441
+
442
+ context "when using the TermFilter visitor" do
142
443
 
143
- it "returns: '( first_field == \"first_word\" ) & ( second_field == \"second_word\" )'" do
144
- expect(result).to eq '( first_field == "first_word" ) & ( second_field == "second_word" )'
444
+ it "returns: '( first_field == \"first_word\" ) & ( second_field == \"second_word\" )'" do
445
+ expect(result).to eq '( first_field == "first_word" ) & ( second_field == "second_word" )'
446
+ end
447
+ end
448
+
449
+ context "when using the Aggregations visitor" do
450
+
451
+ before { visitor.mode = :aggregations }
452
+
453
+ it "returns: { and: [{ term: { first_field: \"first_word\" } },{ term: { second_field: \"second_word\" } }] }" do
454
+ expect(result).to eq({ and: [{ term: { first_field: "first_word" }}, { term: { second_field: "second_word" } }] })
455
+ end
145
456
  end
146
457
  end
147
458
 
148
459
  context "when the node has three items" do
149
460
 
150
- let(:node) { MSFLVisitors::Nodes::And.new([first, second, third]) }
461
+ let(:set_node) { MSFLVisitors::Nodes::Set.new [first, second, third] }
151
462
 
152
- it "returns: '( first_field == \"first_word\" ) & ( second_field == \"second_word\" ) & ( third_field == \"third_word\" )'" do
153
- expect(result).to eq '( first_field == "first_word" ) & ( second_field == "second_word" ) & ( third_field == "third_word" )'
463
+ context "when using the TermFilter visitor" do
464
+
465
+ it "returns: '( first_field == \"first_word\" ) & ( second_field == \"second_word\" ) & ( third_field == \"third_word\" )'" do
466
+ expect(result).to eq '( first_field == "first_word" ) & ( second_field == "second_word" ) & ( third_field == "third_word" )'
467
+ end
468
+ end
469
+
470
+ context "when using the Aggregations visitor" do
471
+
472
+ before { visitor.mode = :aggregations }
473
+
474
+ it "returns: { and: [{ term: { first_field: \"first_word\" } },{ term: { second_field: \"second_word\" } },{ term: { third_field: \"third_word\" } }] }" do
475
+ expect(result).to eq({ and: [{ term: { first_field: "first_word" } },{ term: { second_field: "second_word" } },{ term: { third_field: "third_word" } }] })
476
+ end
154
477
  end
155
478
  end
156
479
 
@@ -158,13 +481,13 @@ describe MSFLVisitors::Visitor do
158
481
 
159
482
  let(:node) do
160
483
  MSFLVisitors::Nodes::And.new(
161
- MSFLVisitors::Nodes::Set::Set.new(
484
+ MSFLVisitors::Nodes::Set.new(
162
485
  [
163
486
  MSFLVisitors::Nodes::Filter.new(
164
487
  [
165
488
  MSFLVisitors::Nodes::Containment.new(
166
489
  MSFLVisitors::Nodes::Field.new(:make),
167
- MSFLVisitors::Nodes::Set::Set.new(
490
+ MSFLVisitors::Nodes::Set.new(
168
491
  [
169
492
  MSFLVisitors::Nodes::Word.new("Honda"),
170
493
  MSFLVisitors::Nodes::Word.new("Chevy"),
@@ -187,8 +510,21 @@ describe MSFLVisitors::Visitor do
187
510
  )
188
511
  end
189
512
 
190
- it "returns: '( make == [ \"Honda\", \"Chevy\", \"Volvo\" ] ) & ( value >= 1000 )'" do
191
- expect(result).to eq '( make == [ "Honda", "Chevy", "Volvo" ] ) & ( value >= 1000 )'
513
+ context "when using the TermFilter visitor" do
514
+
515
+ it "returns: '( make == [ \"Honda\" , \"Chevy\" , \"Volvo\" ] ) & ( value >= 1000 )'" do
516
+ expect(result).to eq '( make == [ "Honda" , "Chevy" , "Volvo" ] ) & ( value >= 1000 )'
517
+ end
518
+ end
519
+
520
+ context "when using the Aggregations visitor" do
521
+
522
+ before { visitor.mode = :aggregations }
523
+
524
+ it "returns: { and: [{ terms: { make: [\"Honda\",\"Chevy\",\"Volvo\"]} }, { range: { value: { gte: 1000 } } }] }" do
525
+ expected = { and: [{ terms: { make: ["Honda", "Chevy", "Volvo"]} }, { range: { value: { gte: 1000 } } }] }
526
+ expect(result).to eq expected
527
+ end
192
528
  end
193
529
  end
194
530
  end
@@ -196,18 +532,28 @@ describe MSFLVisitors::Visitor do
196
532
  describe "value nodes" do
197
533
  describe "a Boolean node" do
198
534
 
199
- let(:collector) { Array.new }
200
-
201
535
  let(:node) { MSFLVisitors::Nodes::Boolean.new value }
202
536
 
203
- subject(:result) { node.accept(visitor).first }
537
+ subject(:result) { node.accept visitor }
204
538
 
205
539
  context "with a value of true" do
206
540
 
207
541
  let(:value) { true }
208
542
 
209
- it "returns: true" do
210
- expect(result).to be true
543
+ context "when using the TermFilter visitor" do
544
+
545
+ it "returns: true" do
546
+ expect(result).to eq true
547
+ end
548
+ end
549
+
550
+ context "when using the Aggregations visitor" do
551
+
552
+ before { visitor.mode = :aggregations }
553
+
554
+ it "returns: true" do
555
+ expect(result).to eq true
556
+ end
211
557
  end
212
558
  end
213
559
 
@@ -216,7 +562,16 @@ describe MSFLVisitors::Visitor do
216
562
  let(:value) { false }
217
563
 
218
564
  it "returns: false" do
219
- expect(result).to be false
565
+ expect(result).to eq false
566
+ end
567
+
568
+ context "when using the Aggregations visitor" do
569
+
570
+ before { visitor.mode = :aggregations }
571
+
572
+ it "returns: false" do
573
+ expect(result).to eq false
574
+ end
220
575
  end
221
576
  end
222
577
  end
@@ -230,14 +585,21 @@ describe MSFLVisitors::Visitor do
230
585
  it "is a double quoted literal string" do
231
586
  expect(result).to eq "\"#{word}\""
232
587
  end
588
+
589
+ context "when using the Aggregations visitor" do
590
+
591
+ before { visitor.mode = :aggregations }
592
+
593
+ it "returns: the literal string" do
594
+ expect(result).to eq "#{word}"
595
+ end
596
+ end
233
597
  end
234
598
  end
235
599
 
236
600
  describe "range value nodes" do
237
601
 
238
- let(:collector) { Array.new }
239
-
240
- subject(:result) { node.accept(visitor).first }
602
+ subject(:result) { node.accept visitor }
241
603
 
242
604
  describe "a Date node" do
243
605
 
@@ -246,7 +608,16 @@ describe MSFLVisitors::Visitor do
246
608
  let(:node) { MSFLVisitors::Nodes::Date.new today }
247
609
 
248
610
  it "returns: the date using iso8601 formatting" do
249
- expect(result).to eq today.iso8601
611
+ expect(result).to eq "\"#{today.iso8601}\""
612
+ end
613
+
614
+ context "when using the Aggregations visitor" do
615
+
616
+ before { visitor.mode = :aggregations }
617
+
618
+ it "returns: the date using iso8601 formatting" do
619
+ expect(result).to eq "#{today.iso8601}"
620
+ end
250
621
  end
251
622
  end
252
623
 
@@ -257,7 +628,16 @@ describe MSFLVisitors::Visitor do
257
628
  let(:node) { MSFLVisitors::Nodes::Time.new now }
258
629
 
259
630
  it "returns: the time using iso8601 formatting" do
260
- expect(result).to eq now.iso8601
631
+ expect(result).to eq "\"#{now.iso8601}\""
632
+ end
633
+
634
+ context "when using the Aggregations visitor" do
635
+
636
+ before { visitor.mode = :aggregations }
637
+
638
+ it "returns: the date using iso8601 formatting" do
639
+ expect(result).to eq "#{now.iso8601}"
640
+ end
261
641
  end
262
642
  end
263
643
 
@@ -268,7 +648,16 @@ describe MSFLVisitors::Visitor do
268
648
  let(:node) { MSFLVisitors::Nodes::DateTime.new now }
269
649
 
270
650
  it "returns: the date and time using iso8601 formatting" do
271
- expect(result).to eq now.iso8601
651
+ expect(result).to eq "\"#{now.iso8601}\""
652
+ end
653
+
654
+ context "when using the Aggregations visitor" do
655
+
656
+ before { visitor.mode = :aggregations }
657
+
658
+ it "returns: the date and time using iso8601 formatting" do
659
+ expect(result).to eq "#{now.iso8601}"
660
+ end
272
661
  end
273
662
  end
274
663
 
@@ -278,10 +667,19 @@ describe MSFLVisitors::Visitor do
278
667
 
279
668
  let(:node) { MSFLVisitors::Nodes::Number.new number }
280
669
 
281
- it "returns: the number" do
670
+ it "returns: 123" do
282
671
  expect(result).to eq number
283
672
  end
284
673
 
674
+ context "when using the Aggregations visitor" do
675
+
676
+ before { visitor.mode = :aggregations }
677
+
678
+ it "returns: 123" do
679
+ expect(result).to eq number
680
+ end
681
+ end
682
+
285
683
  context "when the number is a float" do
286
684
 
287
685
  let(:number) { 123.456 }
@@ -289,6 +687,15 @@ describe MSFLVisitors::Visitor do
289
687
  it "returns: the number with the same precision" do
290
688
  expect(result).to eq number
291
689
  end
690
+
691
+ context "when using the Aggregations visitor" do
692
+
693
+ before { visitor.mode = :aggregations }
694
+
695
+ it "returns: the number with the same precision" do
696
+ expect(result).to eq number
697
+ end
698
+ end
292
699
  end
293
700
  end
294
701
  end