msfl_visitors 1.1.0.dev0 → 1.1.0.dev1

Sign up to get free protection for your applications and to get access to all the features.
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