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 +4 -4
- data/lib/msfl_visitors/nodes/match.rb +10 -0
- data/lib/msfl_visitors/nodes/regex.rb +7 -0
- data/lib/msfl_visitors/nodes.rb +2 -0
- data/lib/msfl_visitors/visitor.rb +23 -0
- data/msfl_visitors.gemspec +1 -1
- data/spec/visitors/chewy_term_filter_spec.rb +69 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae62acf6b12fb294d8010a5edfb6a931e8a1d117
|
4
|
+
data.tar.gz: f442b027daf2a25c48743d9b3b427d779fc4e921
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e93bd8a1a9d1071f4a9bb280fbc5b9293c7b5c4912130bdf8d1f58dc9b6895f597a50f9e346ba5c2824fcef0516fd1b26c065e47b38792979cbfb195ef26f65
|
7
|
+
data.tar.gz: c3e2d39332b9f1fefd8536121e682b09865014837cf38d0638fe6397c4f77540b7b50755fbb24edc89d84477e5100ef6bd40f3308bcd0140b9b2c7712de9162a
|
data/lib/msfl_visitors/nodes.rb
CHANGED
@@ -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,
|
data/msfl_visitors.gemspec
CHANGED
@@ -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.
|
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
|