msfl_visitors 1.1.0.dev0 → 1.1.0.dev1

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: d23a08894d57a37827597d64aeda4d6ed4061f4f
4
- data.tar.gz: dd4b02c9a63274565773b97de1c781ebc1798913
3
+ metadata.gz: ae62acf6b12fb294d8010a5edfb6a931e8a1d117
4
+ data.tar.gz: f442b027daf2a25c48743d9b3b427d779fc4e921
5
5
  SHA512:
6
- metadata.gz: a4d8f3d100e707424d88a403530e90c60b444d76c36407301831e39b8805aac4822eb8f23c371a9a1af3b9c1c6ba23e968ef6860ecb2344745a6e0225678aa9f
7
- data.tar.gz: 02e5f8a832ad4c141229ea285a536554d3d6af6b5b9f8fcdccc37374cbac77fc78d8a6d3cf305d824c63f40d23e5db6af1ff293ff203cae3cc97261c9d032f40
6
+ metadata.gz: 0e93bd8a1a9d1071f4a9bb280fbc5b9293c7b5c4912130bdf8d1f58dc9b6895f597a50f9e346ba5c2824fcef0516fd1b26c065e47b38792979cbfb195ef26f65
7
+ data.tar.gz: c3e2d39332b9f1fefd8536121e682b09865014837cf38d0638fe6397c4f77540b7b50755fbb24edc89d84477e5100ef6bd40f3308bcd0140b9b2c7712de9162a
@@ -0,0 +1,10 @@
1
+ require_relative 'comparison'
2
+ module MSFLVisitors
3
+ module Nodes
4
+ class Match < Comparison
5
+ def accept(visitor)
6
+ visitor.visit self
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'value'
2
+ module MSFLVisitors
3
+ module Nodes
4
+ class Regex < Value
5
+ end
6
+ end
7
+ end
@@ -19,10 +19,12 @@ require_relative 'nodes/greater_than'
19
19
  require_relative 'nodes/greater_than_equal'
20
20
  require_relative 'nodes/less_than'
21
21
  require_relative 'nodes/less_than_equal'
22
+ require_relative 'nodes/match'
22
23
  require_relative 'nodes/named_value'
23
24
  require_relative 'nodes/number'
24
25
  require_relative 'nodes/partial'
25
26
  require_relative 'nodes/range_value'
27
+ require_relative 'nodes/regex'
26
28
  require_relative 'nodes/set'
27
29
  require_relative 'nodes/time'
28
30
  require_relative 'nodes/value'
@@ -54,18 +54,29 @@ module MSFLVisitors
54
54
  Nodes::Equal => '==',
55
55
  Nodes::LessThan => '<',
56
56
  Nodes::LessThanEqual => '<=',
57
+ Nodes::Match => '=~',
57
58
  }
58
59
 
59
60
  def visit(node)
60
61
  case node
61
62
  when Nodes::Field
62
63
  node.value.to_s
64
+ when Nodes::Regex
65
+ "/#{node.value}/"
63
66
  when Nodes::Word
64
67
  "\"#{node.value}\""
65
68
  when Nodes::Date, Nodes::Time
66
69
  "\"#{node.value.iso8601}\""
67
70
  when Nodes::Number, Nodes::Boolean
68
71
  node.value
72
+
73
+ when Nodes::Match
74
+ if node.right.is_a? Nodes::Set
75
+ regex = node.right.contents.map { |right_child| right_child.value.to_s }.join('|')
76
+ "#{node.left.accept(visitor)} #{BINARY_OPERATORS[node.class]} #{MSFLVisitors::Nodes::Regex.new(regex).accept(visitor)}"
77
+ else
78
+ "#{node.left.accept(visitor)} #{BINARY_OPERATORS[node.class]} #{MSFLVisitors::Nodes::Regex.new(node.right.value.to_s).accept(visitor)}"
79
+ end
69
80
  when Nodes::Containment,
70
81
  Nodes::GreaterThan,
71
82
  Nodes::GreaterThanEqual,
@@ -134,6 +145,15 @@ module MSFLVisitors
134
145
 
135
146
  when Nodes::Equal
136
147
  { agg_field_name: node.left.accept(visitor), operator: :eq, test_value: node.right.accept(visitor) }
148
+
149
+ when Nodes::Match
150
+ if node.right.is_a? Nodes::Set
151
+ regex = node.right.contents.map { |right_child| right_child.value.to_s }.join('|')
152
+ { agg_field_name: node.left.accept(visitor), operator: :match, test_value: MSFLVisitors::Nodes::Regex.new(regex).accept(visitor) }
153
+ else
154
+ { agg_field_name: node.left.accept(visitor), operator: :match, test_value: MSFLVisitors::Nodes::Regex.new(node.right.value.to_s).accept(visitor) }
155
+ end
156
+
137
157
  when Nodes::Field
138
158
  node.value.to_sym
139
159
  when Nodes::Date, Nodes::Time
@@ -143,6 +163,9 @@ module MSFLVisitors
143
163
  Nodes::Boolean,
144
164
  Nodes::Dataset
145
165
  node.value
166
+ when Nodes::Regex
167
+ node.value.to_s
168
+
146
169
  when Nodes::GreaterThan,
147
170
  Nodes::GreaterThanEqual,
148
171
  Nodes::LessThan,
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'msfl_visitors'
3
- s.version = '1.1.0.dev0'
3
+ s.version = '1.1.0.dev1'
4
4
  s.date = '2015-05-28'
5
5
  s.summary = "Convert MSFL to other forms"
6
6
  s.description = "Visitor pattern approach to converting MSFL to other forms."
@@ -196,6 +196,75 @@ describe MSFLVisitors::Visitor do
196
196
  end
197
197
  end
198
198
 
199
+ describe "a Regex node" do
200
+
201
+ let(:node) { MSFLVisitors::Nodes::Regex.new "foobar" }
202
+
203
+ context "when using the TermFilter visitor" do
204
+
205
+ it "results in: '/foobar/'" do
206
+ expect(result).to eq "/foobar/"
207
+ end
208
+ end
209
+
210
+ context "when using the Aggregations visitor" do
211
+
212
+ before { visitor.mode = :aggregations }
213
+
214
+ it "results in: 'foobar'" do
215
+ expect(result).to eq "foobar"
216
+ end
217
+ end
218
+ end
219
+
220
+ describe "a Match node" do
221
+
222
+ let(:node) { MSFLVisitors::Nodes::Match.new left, right }
223
+
224
+ context "when using the TermFilter visitor" do
225
+
226
+ it "results in: 'left =~ /right/'" do
227
+ expect(result).to eq "lhs =~ /rhs/"
228
+ end
229
+ end
230
+
231
+ context "when using the Aggregations visitor" do
232
+
233
+ before { visitor.mode = :aggregations }
234
+
235
+ it "results in: { agg_field_name: :lhs, operator: :match, test_value: \"rhs\" }" do
236
+ expect(result).to eq({agg_field_name: :lhs, operator: :match, test_value: "rhs"})
237
+ end
238
+ end
239
+
240
+ context "when the right hand side is a Set node containing Value nodes" do
241
+
242
+ let(:right) { MSFLVisitors::Nodes::Set.new [foo_node, bar_node, baz_node] }
243
+
244
+ let(:foo_node) { MSFLVisitors::Nodes::Word.new "foo" }
245
+
246
+ let(:bar_node) { MSFLVisitors::Nodes::Word.new "bar" }
247
+
248
+ let(:baz_node) { MSFLVisitors::Nodes::Word.new "baz" }
249
+
250
+ context "when using the TermFilter visitor" do
251
+
252
+ it "results in: 'left =~ /foo|bar|baz/'" do
253
+ expect(result).to eq "lhs =~ /foo|bar|baz/"
254
+ end
255
+ end
256
+
257
+ context "when using the Aggregations visitor" do
258
+
259
+ before { visitor.mode = :aggregations }
260
+
261
+ it "results in: { agg_field_name: :lhs, operator: :match, test_value: \"foo|bar|baz\" }" do
262
+ expect(result).to eq({agg_field_name: :lhs, operator: :match, test_value: "foo|bar|baz"})
263
+ end
264
+ end
265
+ end
266
+ end
267
+
199
268
  describe "an Equal node" do
200
269
 
201
270
  let(:node) { MSFLVisitors::Nodes::Equal.new left, right }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: msfl_visitors
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0.dev0
4
+ version: 1.1.0.dev1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Courtland Caldwell
@@ -135,10 +135,12 @@ files:
135
135
  - lib/msfl_visitors/nodes/iterator.rb
136
136
  - lib/msfl_visitors/nodes/less_than.rb
137
137
  - lib/msfl_visitors/nodes/less_than_equal.rb
138
+ - lib/msfl_visitors/nodes/match.rb
138
139
  - lib/msfl_visitors/nodes/named_value.rb
139
140
  - lib/msfl_visitors/nodes/number.rb
140
141
  - lib/msfl_visitors/nodes/partial.rb
141
142
  - lib/msfl_visitors/nodes/range_value.rb
143
+ - lib/msfl_visitors/nodes/regex.rb
142
144
  - lib/msfl_visitors/nodes/set.rb
143
145
  - lib/msfl_visitors/nodes/time.rb
144
146
  - lib/msfl_visitors/nodes/value.rb