plunk 0.2.11 → 0.3.1
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/AUTHORS +1 -0
- data/Gemfile.lock +1 -1
- data/lib/plunk.rb +6 -1
- data/lib/plunk/helper.rb +55 -0
- data/lib/plunk/parser.rb +70 -48
- data/lib/plunk/result_set.rb +4 -49
- data/lib/plunk/transformer.rb +33 -114
- data/plunk.gemspec +9 -9
- data/spec/basic_spec.rb +30 -8
- data/spec/boolean_spec.rb +73 -27
- data/spec/chained_search_spec.rb +36 -44
- data/spec/field_value_spec.rb +28 -29
- data/spec/last_spec.rb +52 -49
- data/spec/nested_search_spec.rb +7 -7
- data/spec/regexp_spec.rb +16 -12
- data/spec/shared/dummy_client.rb +14 -0
- data/spec/spec_helper.rb +7 -2
- metadata +55 -15
data/plunk.gemspec
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "plunk"
|
3
|
-
s.version = "0.
|
4
|
-
s.add_runtime_dependency "json"
|
5
|
-
s.add_runtime_dependency "parslet"
|
6
|
-
s.add_runtime_dependency "elasticsearch"
|
7
|
-
s.add_runtime_dependency "activesupport"
|
8
|
-
s.add_development_dependency "rspec"
|
9
|
-
s.add_development_dependency "timecop"
|
3
|
+
s.version = "0.3.1"
|
4
|
+
s.add_runtime_dependency "json", "~> 1.8", ">= 1.8.0"
|
5
|
+
s.add_runtime_dependency "parslet", "~> 1.5", ">= 1.5.0"
|
6
|
+
s.add_runtime_dependency "elasticsearch", "~> 0.4", ">= 0.4.3"
|
7
|
+
s.add_runtime_dependency "activesupport", "~> 4.0", ">= 4.0.0"
|
8
|
+
s.add_development_dependency "rspec", "~> 2.0", ">= 2.14.1"
|
9
|
+
s.add_development_dependency "timecop", "~> 0.7", ">= 0.7.1"
|
10
10
|
s.summary = "Elasticsearch query language"
|
11
11
|
s.description = "Human-friendly query language for Elasticsearch"
|
12
|
-
s.authors = ["Ram Mehta", "Jamil Bou Kheir"]
|
13
|
-
s.email = ["ram.mehta@gmail.com", "jamil@elbii.com"]
|
12
|
+
s.authors = ["Ram Mehta", "Jamil Bou Kheir", "Roman Heinrich"]
|
13
|
+
s.email = ["ram.mehta@gmail.com", "jamil@elbii.com", "roman.heinrich@gmail.com"]
|
14
14
|
s.files = `git ls-files`.split("\n")
|
15
15
|
s.homepage = "https://github.com/elbii/plunk"
|
16
16
|
s.license = "MIT"
|
data/spec/basic_spec.rb
CHANGED
@@ -1,17 +1,39 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'basic searches' do
|
4
|
+
def basic_builder(expected)
|
5
|
+
{
|
6
|
+
query: {
|
7
|
+
filtered: {
|
8
|
+
filter: {
|
9
|
+
query: {
|
10
|
+
query_string: {
|
11
|
+
query: expected
|
12
|
+
}
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
4
20
|
it 'should parse bar' do
|
5
|
-
result =
|
6
|
-
result.
|
7
|
-
|
8
|
-
|
21
|
+
result = Plunk.search 'bar'
|
22
|
+
result.should eq(basic_builder('bar'))
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should parse bar ' do
|
26
|
+
result = Plunk.search 'bar '
|
27
|
+
result.should eq(basic_builder('bar'))
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should parse (bar) ' do
|
31
|
+
result = Plunk.search '(bar) '
|
32
|
+
result.should eq(basic_builder('bar'))
|
9
33
|
end
|
10
34
|
|
11
35
|
it 'should parse bar ' do
|
12
|
-
result =
|
13
|
-
result.
|
14
|
-
query: 'bar'
|
15
|
-
}}}}})
|
36
|
+
result = Plunk.search ' bar '
|
37
|
+
result.should eq(basic_builder('bar'))
|
16
38
|
end
|
17
39
|
end
|
data/spec/boolean_spec.rb
CHANGED
@@ -1,42 +1,88 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'boolean searches' do
|
4
|
+
|
4
5
|
it 'should parse (foo OR bar)' do
|
5
|
-
result =
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
result = Plunk.search '(foo OR bar)'
|
7
|
+
expected = Plunk::Helper.filter_builder({
|
8
|
+
or: [
|
9
|
+
Plunk::Helper.query_builder('foo'),
|
10
|
+
Plunk::Helper.query_builder('bar')
|
11
|
+
]
|
12
|
+
})
|
13
|
+
expect(result).to eq(expected)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should parse (foo | bar)' do
|
17
|
+
result = Plunk.search '(foo | bar)'
|
18
|
+
expected = Plunk::Helper.filter_builder({
|
19
|
+
or: [
|
20
|
+
Plunk::Helper.query_builder('foo'),
|
21
|
+
Plunk::Helper.query_builder('bar')
|
22
|
+
]
|
23
|
+
})
|
24
|
+
expect(result).to eq(expected)
|
9
25
|
end
|
10
26
|
|
11
27
|
it 'should parse (foo OR (bar AND baz))' do
|
12
|
-
result =
|
13
|
-
|
14
|
-
|
15
|
-
|
28
|
+
result = Plunk.search '(foo OR (bar AND baz))'
|
29
|
+
expected = Plunk::Helper.filter_builder({
|
30
|
+
or: [
|
31
|
+
Plunk::Helper.query_builder('foo'),
|
32
|
+
{
|
33
|
+
and: [
|
34
|
+
Plunk::Helper.query_builder('bar'),
|
35
|
+
Plunk::Helper.query_builder('baz')
|
36
|
+
]
|
37
|
+
}
|
38
|
+
]
|
39
|
+
})
|
40
|
+
expect(result).to eq(expected)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should parse (foo=bar OR foo=bar)' do
|
44
|
+
result = Plunk.search '(foo=bar OR foo=bar)'
|
45
|
+
expected = Plunk::Helper.filter_builder({
|
46
|
+
or: [
|
47
|
+
Plunk::Helper.query_builder('foo:bar'),
|
48
|
+
Plunk::Helper.query_builder('foo:bar')
|
49
|
+
]
|
50
|
+
})
|
51
|
+
expect(result).to eq(expected)
|
16
52
|
end
|
17
53
|
|
18
|
-
|
19
|
-
result =
|
20
|
-
|
21
|
-
|
22
|
-
|
54
|
+
it 'should parse foo=bar OR baz=fez' do
|
55
|
+
result = Plunk.search 'foo=bar OR baz=fez'
|
56
|
+
expected = Plunk::Helper.filter_builder({
|
57
|
+
or: [
|
58
|
+
Plunk::Helper.query_builder('foo:bar'),
|
59
|
+
Plunk::Helper.query_builder('baz:fez')
|
60
|
+
]
|
61
|
+
})
|
62
|
+
expect(result).to eq(expected)
|
23
63
|
end
|
24
64
|
|
25
|
-
|
26
|
-
result =
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
65
|
+
it 'should parse (foo=bar AND baz=fez) OR ham=cheese' do
|
66
|
+
result = Plunk.search '(foo=bar AND baz=fez) OR ham=cheese'
|
67
|
+
expected = Plunk::Helper.filter_builder({
|
68
|
+
or: [
|
69
|
+
{
|
70
|
+
and: [
|
71
|
+
Plunk::Helper.query_builder('foo:bar'),
|
72
|
+
Plunk::Helper.query_builder('baz:fez')
|
73
|
+
]
|
74
|
+
},
|
75
|
+
Plunk::Helper.query_builder('ham:cheese')
|
76
|
+
]
|
77
|
+
})
|
78
|
+
expect(result).to eq(expected)
|
32
79
|
end
|
33
80
|
|
34
|
-
|
35
|
-
result =
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
}}})
|
81
|
+
it 'should parse NOT foo=bar' do
|
82
|
+
result = Plunk.search 'NOT foo=bar'
|
83
|
+
expected = Plunk::Helper.filter_builder({
|
84
|
+
not: Plunk::Helper.query_builder('foo:bar')
|
85
|
+
})
|
86
|
+
expect(result).to eq(expected)
|
41
87
|
end
|
42
88
|
end
|
data/spec/chained_search_spec.rb
CHANGED
@@ -6,51 +6,43 @@ describe 'chained searches' do
|
|
6
6
|
include_context "time stubs"
|
7
7
|
include_context "plunk stubs"
|
8
8
|
|
9
|
-
it 'should parse last 24h foo_type=bar baz="fez" host=27.224.123.110' do
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
and: [
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
{query:{query_string: {
|
28
|
-
query: 'host:27.224.123.110'
|
29
|
-
}}}
|
30
|
-
]}}}})
|
9
|
+
it 'should parse last 24h & foo_type=bar & baz="fez" & host=27.224.123.110' do
|
10
|
+
result = Plunk.search 'last 24h & foo_type=bar & baz="fez" & host=27.224.123.110'
|
11
|
+
expected = Plunk::Helper.filter_builder({
|
12
|
+
and: [
|
13
|
+
Plunk::Helper.range_builder(
|
14
|
+
(@time - 24.hours).utc.to_datetime.iso8601(3),
|
15
|
+
@time.utc.to_datetime.iso8601(3)
|
16
|
+
),
|
17
|
+
{ and: [
|
18
|
+
Plunk::Helper.query_builder('foo_type:bar'),
|
19
|
+
{ and: [
|
20
|
+
Plunk::Helper.query_builder('baz:"fez"'),
|
21
|
+
Plunk::Helper.query_builder('host:27.224.123.110')
|
22
|
+
]}
|
23
|
+
]}
|
24
|
+
]
|
25
|
+
})
|
26
|
+
expect(result).to eq(expected)
|
31
27
|
end
|
32
28
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
and: [
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
{query:{query_string: {
|
52
|
-
query: 'host:27.224.123.110'
|
53
|
-
}}}
|
54
|
-
]}}}})
|
29
|
+
it 'should parse last 24h & (foo_type=bar AND baz="fez" AND host=27.224.123.110)' do
|
30
|
+
result = Plunk.search 'last 24h & (foo_type=bar AND baz="fez" AND host=27.224.123.110)'
|
31
|
+
expected = Plunk::Helper.filter_builder({
|
32
|
+
and: [
|
33
|
+
Plunk::Helper.range_builder(
|
34
|
+
(@time - 24.hours).utc.to_datetime.iso8601(3),
|
35
|
+
@time.utc.to_datetime.iso8601(3)
|
36
|
+
),
|
37
|
+
{ and: [
|
38
|
+
Plunk::Helper.query_builder('foo_type:bar'),
|
39
|
+
{ and: [
|
40
|
+
Plunk::Helper.query_builder('baz:"fez"'),
|
41
|
+
Plunk::Helper.query_builder('host:27.224.123.110')
|
42
|
+
]}
|
43
|
+
]}
|
44
|
+
]
|
45
|
+
})
|
46
|
+
expect(result).to eq(expected)
|
55
47
|
end
|
56
48
|
end
|
data/spec/field_value_spec.rb
CHANGED
@@ -1,45 +1,44 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'field / value searches' do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
|
5
|
+
it 'should parse _foo.@bar=baz' do
|
6
|
+
result = Plunk.search '_foo.@bar=baz'
|
7
|
+
expected = Plunk::Helper.filter_builder(
|
8
|
+
Plunk::Helper.query_builder('_foo.@bar:baz')
|
9
|
+
)
|
10
|
+
expect(result).to eq(expected)
|
9
11
|
end
|
10
12
|
|
11
|
-
it 'should parse
|
12
|
-
result =
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
it 'should parse _foo.@bar=(baz)' do
|
14
|
+
result = Plunk.search '_foo.@bar=(baz)'
|
15
|
+
expected = Plunk::Helper.filter_builder(
|
16
|
+
Plunk::Helper.query_builder('_foo.@bar:(baz)')
|
17
|
+
)
|
18
|
+
expect(result).to eq(expected)
|
16
19
|
end
|
17
20
|
|
18
21
|
it 'should parse _foo.@fields.@bar="bar baz"' do
|
19
|
-
result =
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
result = Plunk.search '_foo.@fields.@bar="bar baz"'
|
23
|
+
expected = Plunk::Helper.filter_builder(
|
24
|
+
Plunk::Helper.query_builder('_foo.@fields.@bar:"bar baz"')
|
25
|
+
)
|
26
|
+
expect(result).to eq(expected)
|
23
27
|
end
|
24
28
|
|
25
29
|
it 'should parse _foo-barcr@5Y_+f!3*(name=bar' do
|
26
|
-
result =
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
+
result = Plunk.search '_foo-barcr@5Y_+f!3*(name=bar'
|
31
|
+
expected = Plunk::Helper.filter_builder(
|
32
|
+
Plunk::Helper.query_builder('_foo-barcr@5Y_+f!3*(name:bar')
|
33
|
+
)
|
34
|
+
expect(result).to eq(expected)
|
30
35
|
end
|
31
36
|
|
32
37
|
it 'should parse foo=bar-baz' do
|
33
|
-
result =
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
it 'should parse foo=(NOT bar)' do
|
40
|
-
result = @transformer.apply @parser.parse 'foo=(NOT bar)'
|
41
|
-
expect(result.query).to eq({query:{filtered:{query:{query_string:{
|
42
|
-
query: 'foo:(NOT bar)'
|
43
|
-
}}}}})
|
38
|
+
result = Plunk.search 'foo=bar-baz'
|
39
|
+
expected = Plunk::Helper.filter_builder(
|
40
|
+
Plunk::Helper.query_builder('foo:bar-baz')
|
41
|
+
)
|
42
|
+
expect(result).to eq(expected)
|
44
43
|
end
|
45
44
|
end
|
data/spec/last_spec.rb
CHANGED
@@ -7,68 +7,71 @@ describe 'the last command' do
|
|
7
7
|
include_context "plunk stubs"
|
8
8
|
|
9
9
|
it 'should parse last 24h' do
|
10
|
-
result =
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
result = Plunk.search 'last 24h'
|
11
|
+
expected = Plunk::Helper.filter_builder(
|
12
|
+
Plunk::Helper.range_builder(
|
13
|
+
(@time - 24.hours).utc.to_datetime.iso8601(3),
|
14
|
+
@time.utc.to_datetime.iso8601(3)
|
15
|
+
)
|
16
|
+
)
|
17
|
+
expect(result).to eq(expected)
|
17
18
|
end
|
18
19
|
|
19
20
|
it 'should parse last 24d' do
|
20
|
-
result =
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
result = Plunk.search 'last 24d'
|
22
|
+
expected = Plunk::Helper.filter_builder(
|
23
|
+
Plunk::Helper.range_builder(
|
24
|
+
(@time - 24.days).utc.to_datetime.iso8601(3),
|
25
|
+
@time.utc.to_datetime.iso8601(3)
|
26
|
+
)
|
27
|
+
)
|
28
|
+
expect(result).to eq(expected)
|
27
29
|
end
|
28
30
|
|
29
31
|
it 'should parse last 24w' do
|
30
|
-
result =
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
result = Plunk.search 'last 24w'
|
33
|
+
expected = Plunk::Helper.filter_builder(
|
34
|
+
Plunk::Helper.range_builder(
|
35
|
+
(@time - 24.weeks).utc.to_datetime.iso8601(3),
|
36
|
+
@time.utc.to_datetime.iso8601(3)
|
37
|
+
)
|
38
|
+
)
|
39
|
+
expect(result).to eq(expected)
|
37
40
|
end
|
38
41
|
|
39
42
|
it 'should parse last 24s' do
|
40
|
-
result =
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
result = Plunk.search 'last 24s'
|
44
|
+
expected = Plunk::Helper.filter_builder(
|
45
|
+
Plunk::Helper.range_builder(
|
46
|
+
(@time - 24.seconds).utc.to_datetime.iso8601(3),
|
47
|
+
@time.utc.to_datetime.iso8601(3)
|
48
|
+
)
|
49
|
+
)
|
50
|
+
expect(result).to eq(expected)
|
47
51
|
end
|
48
52
|
|
49
53
|
it 'should parse last 24m' do
|
50
|
-
result =
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
result = Plunk.search 'last 24m'
|
55
|
+
expected = Plunk::Helper.filter_builder(
|
56
|
+
Plunk::Helper.range_builder(
|
57
|
+
(@time - 24.minutes).utc.to_datetime.iso8601(3),
|
58
|
+
@time.utc.to_datetime.iso8601(3)
|
59
|
+
)
|
60
|
+
)
|
61
|
+
expect(result).to eq(expected)
|
57
62
|
end
|
58
63
|
|
59
|
-
it 'should parse last 1h @fields.foo.@field=bar' do
|
60
|
-
result =
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
lte: @time.utc.to_datetime.iso8601(3)
|
72
|
-
}}]}}}}.to_s)
|
64
|
+
it 'should parse last 1h & @fields.foo.@field=bar' do
|
65
|
+
result = Plunk.search 'last 1h & @fields.foo.@field=bar'
|
66
|
+
expected = Plunk::Helper.filter_builder(
|
67
|
+
and: [
|
68
|
+
Plunk::Helper.range_builder(
|
69
|
+
(@time - 1.hour).utc.to_datetime.iso8601(3),
|
70
|
+
@time.utc.to_datetime.iso8601(3)
|
71
|
+
),
|
72
|
+
Plunk::Helper.query_builder('@fields.foo.@field:bar')
|
73
|
+
]
|
74
|
+
)
|
75
|
+
expect(result).to eq(expected)
|
73
76
|
end
|
74
77
|
end
|