hotdog 0.26.0 → 0.27.0
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/hotdog/application.rb +61 -7
- data/lib/hotdog/commands/down.rb +3 -3
- data/lib/hotdog/commands/search.rb +9 -1
- data/lib/hotdog/commands/ssh.rb +14 -12
- data/lib/hotdog/commands.rb +54 -36
- data/lib/hotdog/expression/semantics.rb +162 -163
- data/lib/hotdog/version.rb +1 -1
- data/spec/core/commands_spec.rb +21 -0
- data/spec/optimizer/binary_expression_spec.rb +36 -34
- data/spec/optimizer/glob_expression_spec.rb +93 -91
- data/spec/optimizer/regexp_expression_spec.rb +43 -41
- data/spec/optimizer/string_expression_spec.rb +93 -91
- data/spec/optimizer/unary_expression_spec.rb +258 -257
- data/spec/spec_helper.rb +6 -0
- metadata +2 -2
data/lib/hotdog/version.rb
CHANGED
data/spec/core/commands_spec.rb
CHANGED
@@ -24,6 +24,9 @@ describe "commands" do
|
|
24
24
|
cmd.options[:listing] = false
|
25
25
|
cmd.options[:primary_tag] = nil
|
26
26
|
allow(cmd).to receive(:update_db)
|
27
|
+
allow(cmd).to receive(:execute).with("SELECT id FROM hosts WHERE status = ? AND id IN (?, ?, ?);", [Hotdog::STATUS_RUNNING, 1, 2, 3]) {
|
28
|
+
[[1], [2], [3]]
|
29
|
+
}
|
27
30
|
allow(cmd).to receive(:get_hosts_fields).with([1, 2, 3], ["host"])
|
28
31
|
expect(cmd.__send__(:get_hosts, [1, 2, 3], []))
|
29
32
|
end
|
@@ -32,6 +35,9 @@ describe "commands" do
|
|
32
35
|
cmd.options[:listing] = false
|
33
36
|
cmd.options[:primary_tag] = "foo"
|
34
37
|
allow(cmd).to receive(:update_db)
|
38
|
+
allow(cmd).to receive(:execute).with("SELECT id FROM hosts WHERE status = ? AND id IN (?, ?, ?);", [Hotdog::STATUS_RUNNING, 1, 2, 3]) {
|
39
|
+
[[1], [2], [3]]
|
40
|
+
}
|
35
41
|
allow(cmd).to receive(:get_hosts_fields).with([1, 2, 3], ["foo"])
|
36
42
|
expect(cmd.__send__(:get_hosts, [1, 2, 3], []))
|
37
43
|
end
|
@@ -40,6 +46,9 @@ describe "commands" do
|
|
40
46
|
cmd.options[:listing] = false
|
41
47
|
cmd.options[:primary_tag] = nil
|
42
48
|
allow(cmd).to receive(:update_db)
|
49
|
+
allow(cmd).to receive(:execute).with("SELECT id FROM hosts WHERE status = ? AND id IN (?, ?, ?);", [Hotdog::STATUS_RUNNING, 1, 2, 3]) {
|
50
|
+
[[1], [2], [3]]
|
51
|
+
}
|
43
52
|
allow(cmd).to receive(:get_hosts_fields).with([1, 2, 3], ["foo", "bar", "baz"])
|
44
53
|
expect(cmd.__send__(:get_hosts, [1, 2, 3], ["foo", "bar", "baz"]))
|
45
54
|
end
|
@@ -48,6 +57,9 @@ describe "commands" do
|
|
48
57
|
cmd.options[:listing] = true
|
49
58
|
cmd.options[:primary_tag] = nil
|
50
59
|
allow(cmd).to receive(:update_db)
|
60
|
+
allow(cmd).to receive(:execute).with("SELECT id FROM hosts WHERE status = ? AND id IN (?, ?, ?);", [Hotdog::STATUS_RUNNING, 1, 2, 3]) {
|
61
|
+
[[1], [2], [3]]
|
62
|
+
}
|
51
63
|
q1 = [
|
52
64
|
"SELECT DISTINCT tags.name FROM hosts_tags",
|
53
65
|
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
@@ -64,6 +76,9 @@ describe "commands" do
|
|
64
76
|
cmd.options[:listing] = true
|
65
77
|
cmd.options[:primary_tag] = "bar"
|
66
78
|
allow(cmd).to receive(:update_db)
|
79
|
+
allow(cmd).to receive(:execute).with("SELECT id FROM hosts WHERE status = ? AND id IN (?, ?, ?);", [Hotdog::STATUS_RUNNING, 1, 2, 3]) {
|
80
|
+
[[1], [2], [3]]
|
81
|
+
}
|
67
82
|
q1 = [
|
68
83
|
"SELECT DISTINCT tags.name FROM hosts_tags",
|
69
84
|
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
@@ -81,6 +96,9 @@ describe "commands" do
|
|
81
96
|
end
|
82
97
|
|
83
98
|
it "get host fields without host" do
|
99
|
+
allow(cmd).to receive(:execute).with("SELECT id FROM hosts WHERE status = ? AND id IN (?, ?, ?);", [Hotdog::STATUS_RUNNING, 1, 2, 3]) {
|
100
|
+
[[1], [2], [3]]
|
101
|
+
}
|
84
102
|
q1 = [
|
85
103
|
"SELECT LOWER(tags.name), GROUP_CONCAT(tags.value, ',') FROM hosts_tags",
|
86
104
|
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
@@ -100,6 +118,9 @@ describe "commands" do
|
|
100
118
|
end
|
101
119
|
|
102
120
|
it "get host fields with host" do
|
121
|
+
allow(cmd).to receive(:execute).with("SELECT id FROM hosts WHERE status = ? AND id IN (?, ?, ?);", [Hotdog::STATUS_RUNNING, 1, 2, 3]) {
|
122
|
+
[[1], [2], [3]]
|
123
|
+
}
|
103
124
|
q1 = [
|
104
125
|
"SELECT LOWER(tags.name), GROUP_CONCAT(tags.value, ',') FROM hosts_tags",
|
105
126
|
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
@@ -5,43 +5,45 @@ require "hotdog/commands/search"
|
|
5
5
|
require "parslet"
|
6
6
|
|
7
7
|
describe "binary expression" do
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
3.times do |o|
|
9
|
+
it "everything AND x should return x (#{o})" do
|
10
|
+
expr = Hotdog::Expression::BinaryExpressionNode.new("AND", Hotdog::Expression::EverythingNode.new(), Hotdog::Expression::NothingNode.new())
|
11
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
12
|
+
query: "SELECT NULL AS host_id WHERE host_id NOT NULL;",
|
13
|
+
values: [],
|
14
|
+
})
|
15
|
+
end
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
it "nothing AND x should return nothing (#{o})" do
|
18
|
+
expr = Hotdog::Expression::BinaryExpressionNode.new("AND", Hotdog::Expression::NothingNode.new(), Hotdog::Expression::EverythingNode.new())
|
19
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
20
|
+
query: "SELECT NULL AS host_id WHERE host_id NOT NULL;",
|
21
|
+
values: [],
|
22
|
+
})
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
it "everything OR x should return everything (#{o})" do
|
26
|
+
expr = Hotdog::Expression::BinaryExpressionNode.new("OR", Hotdog::Expression::EverythingNode.new(), Hotdog::Expression::NothingNode.new())
|
27
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
28
|
+
query: "SELECT id AS host_id FROM hosts;",
|
29
|
+
values: [],
|
30
|
+
})
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
it "nothing OR x should return x (#{o})" do
|
34
|
+
expr = Hotdog::Expression::BinaryExpressionNode.new("OR", Hotdog::Expression::NothingNode.new(), Hotdog::Expression::EverythingNode.new())
|
35
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
36
|
+
query: "SELECT id AS host_id FROM hosts;",
|
37
|
+
values: [],
|
38
|
+
})
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
it "everything XOR everything should return nothing (#{o})" do
|
42
|
+
expr = Hotdog::Expression::BinaryExpressionNode.new("XOR", Hotdog::Expression::EverythingNode.new(), Hotdog::Expression::EverythingNode.new())
|
43
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
44
|
+
query: "SELECT NULL AS host_id WHERE host_id NOT NULL;",
|
45
|
+
values: [],
|
46
|
+
})
|
47
|
+
end
|
46
48
|
end
|
47
49
|
end
|
@@ -5,101 +5,103 @@ require "hotdog/commands/search"
|
|
5
5
|
require "parslet"
|
6
6
|
|
7
7
|
describe "tag glob expression" do
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
8
|
+
3.times do |o|
|
9
|
+
it "interprets tag glob with host (#{o})" do
|
10
|
+
expr = Hotdog::Expression::GlobHostNode.new("foo*", ":")
|
11
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
12
|
+
tagname_glob: "host",
|
13
|
+
separator: ":",
|
14
|
+
tagvalue_glob: "foo*",
|
15
|
+
fallback: {
|
16
|
+
query: [
|
17
|
+
"SELECT hosts.id AS host_id FROM hosts",
|
18
|
+
"WHERE LOWER(hosts.name) GLOB LOWER(?);",
|
19
|
+
].join(" "),
|
20
|
+
values: ["*foo*"],
|
21
|
+
},
|
22
|
+
})
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
25
|
+
it "interprets tag glob with tagname and tagvalue (#{o})" do
|
26
|
+
expr = Hotdog::Expression::GlobTagNode.new("foo*", "bar*", ":")
|
27
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
28
|
+
tagname_glob: "foo*",
|
29
|
+
separator: ":",
|
30
|
+
tagvalue_glob: "bar*",
|
31
|
+
fallback: {
|
32
|
+
query: [
|
33
|
+
"SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
|
34
|
+
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
35
|
+
"WHERE LOWER(tags.name) GLOB LOWER(?) AND LOWER(tags.value) GLOB LOWER(?);",
|
36
|
+
].join(" "),
|
37
|
+
values: ["*foo*", "*bar*"],
|
38
|
+
},
|
39
|
+
})
|
40
|
+
end
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
42
|
+
it "interprets tag glob with tagname with separator (#{o})" do
|
43
|
+
expr = Hotdog::Expression::GlobTagnameNode.new("foo*", ":")
|
44
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
45
|
+
tagname_glob: "foo*",
|
46
|
+
separator: ":",
|
47
|
+
fallback: {
|
48
|
+
query: [
|
49
|
+
"SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
|
50
|
+
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
51
|
+
"WHERE LOWER(tags.name) GLOB LOWER(?);",
|
52
|
+
].join(" "),
|
53
|
+
values: ["*foo*"],
|
54
|
+
},
|
55
|
+
})
|
56
|
+
end
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
58
|
+
it "interprets tag glob with tagname without separator (#{o})" do
|
59
|
+
expr = Hotdog::Expression::GlobHostOrTagNode.new("foo*", nil)
|
60
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
61
|
+
tagname_glob: "foo*",
|
62
|
+
fallback: {
|
63
|
+
query: [
|
64
|
+
"SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
|
65
|
+
"INNER JOIN hosts ON hosts_tags.host_id = hosts.id",
|
66
|
+
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
67
|
+
"WHERE LOWER(hosts.name) GLOB LOWER(?) OR LOWER(tags.name) GLOB LOWER(?) OR LOWER(tags.value) GLOB LOWER(?);",
|
68
|
+
].join(" "),
|
69
|
+
values: ["*foo*", "*foo*", "*foo*"],
|
70
|
+
},
|
71
|
+
})
|
72
|
+
end
|
72
73
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
74
|
+
it "interprets tag glob with tagvalue with separator (#{o})" do
|
75
|
+
expr = Hotdog::Expression::GlobTagvalueNode.new("foo*", ":")
|
76
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
77
|
+
separator: ":",
|
78
|
+
tagvalue_glob: "foo*",
|
79
|
+
fallback: {
|
80
|
+
query: [
|
81
|
+
"SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
|
82
|
+
"INNER JOIN hosts ON hosts_tags.host_id = hosts.id",
|
83
|
+
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
84
|
+
"WHERE LOWER(hosts.name) GLOB LOWER(?) OR LOWER(tags.value) GLOB LOWER(?);",
|
85
|
+
].join(" "),
|
86
|
+
values: ["*foo*", "*foo*"],
|
87
|
+
},
|
88
|
+
})
|
89
|
+
end
|
89
90
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
91
|
+
it "interprets tag glob with tagvalue without separator (#{o})" do
|
92
|
+
expr = Hotdog::Expression::GlobTagvalueNode.new("foo*", nil)
|
93
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
94
|
+
tagvalue_glob: "foo*",
|
95
|
+
fallback: {
|
96
|
+
query: [
|
97
|
+
"SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
|
98
|
+
"INNER JOIN hosts ON hosts_tags.host_id = hosts.id",
|
99
|
+
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
100
|
+
"WHERE LOWER(hosts.name) GLOB LOWER(?) OR LOWER(tags.value) GLOB LOWER(?);",
|
101
|
+
].join(" "),
|
102
|
+
values: ["*foo*", "*foo*"],
|
103
|
+
}
|
104
|
+
})
|
105
|
+
end
|
104
106
|
end
|
105
107
|
end
|
@@ -5,51 +5,53 @@ require "hotdog/commands/search"
|
|
5
5
|
require "parslet"
|
6
6
|
|
7
7
|
describe "tag regexp expression" do
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
3.times do |o|
|
9
|
+
it "interprets tag regexp with host (#{o})" do
|
10
|
+
expr = Hotdog::Expression::RegexpHostNode.new("foo", ":")
|
11
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
12
|
+
tagname_regexp: "host",
|
13
|
+
separator: ":",
|
14
|
+
tagvalue_regexp: "foo",
|
15
|
+
})
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
18
|
+
it "interprets tag regexp with tagname and tagvalue (#{o})" do
|
19
|
+
expr = Hotdog::Expression::RegexpTagNode.new("foo", "bar", ":")
|
20
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
21
|
+
tagname_regexp: "foo",
|
22
|
+
separator: ":",
|
23
|
+
tagvalue_regexp: "bar",
|
24
|
+
})
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
it "interprets tag regexp with tagname with separator (#{o})" do
|
28
|
+
expr = Hotdog::Expression::RegexpTagnameNode.new("foo", ":")
|
29
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
30
|
+
tagname_regexp: "foo",
|
31
|
+
separator: ":",
|
32
|
+
})
|
33
|
+
end
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
it "interprets tag regexp with tagname without separator (#{o})" do
|
36
|
+
expr = Hotdog::Expression::RegexpHostOrTagNode.new("foo", nil)
|
37
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
38
|
+
tagname_regexp: "foo",
|
39
|
+
})
|
40
|
+
end
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
42
|
+
it "interprets tag regexp with tagvalue with separator (#{o})" do
|
43
|
+
expr = Hotdog::Expression::RegexpTagvalueNode.new("foo", ":")
|
44
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
45
|
+
separator: ":",
|
46
|
+
tagvalue_regexp: "foo",
|
47
|
+
})
|
48
|
+
end
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
it "interprets tag regexp with tagvalue without separator (#{o})" do
|
51
|
+
expr = Hotdog::Expression::RegexpTagvalueNode.new("foo", nil)
|
52
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
53
|
+
tagvalue_regexp: "foo",
|
54
|
+
})
|
55
|
+
end
|
54
56
|
end
|
55
57
|
end
|
@@ -5,101 +5,103 @@ require "hotdog/commands/search"
|
|
5
5
|
require "parslet"
|
6
6
|
|
7
7
|
describe "tag expression" do
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
8
|
+
3.times do |o|
|
9
|
+
it "interprets tag with host (#{o})" do
|
10
|
+
expr = Hotdog::Expression::StringHostNode.new("foo", ":")
|
11
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
12
|
+
tagname: "host",
|
13
|
+
separator: ":",
|
14
|
+
tagvalue: "foo",
|
15
|
+
fallback: {
|
16
|
+
query: [
|
17
|
+
"SELECT hosts.id AS host_id FROM hosts",
|
18
|
+
"WHERE LOWER(hosts.name) GLOB LOWER(?);",
|
19
|
+
].join(" "),
|
20
|
+
values: ["*foo*"],
|
21
|
+
},
|
22
|
+
})
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
25
|
+
it "interprets tag with tagname and tagvalue (#{o})" do
|
26
|
+
expr = Hotdog::Expression::StringTagNode.new("foo", "bar", ":")
|
27
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
28
|
+
tagname: "foo",
|
29
|
+
separator: ":",
|
30
|
+
tagvalue: "bar",
|
31
|
+
fallback: {
|
32
|
+
query: [
|
33
|
+
"SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
|
34
|
+
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
35
|
+
"WHERE LOWER(tags.name) GLOB LOWER(?) AND LOWER(tags.value) GLOB LOWER(?);",
|
36
|
+
].join(" "),
|
37
|
+
values: ["*foo*", "*bar*"],
|
38
|
+
},
|
39
|
+
})
|
40
|
+
end
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
42
|
+
it "interprets tag with tagname with separator (#{o})" do
|
43
|
+
expr = Hotdog::Expression::StringTagnameNode.new("foo", ":")
|
44
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
45
|
+
tagname: "foo",
|
46
|
+
separator: ":",
|
47
|
+
fallback: {
|
48
|
+
query: [
|
49
|
+
"SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
|
50
|
+
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
51
|
+
"WHERE LOWER(tags.name) GLOB LOWER(?);",
|
52
|
+
].join(" "),
|
53
|
+
values: ["*foo*"],
|
54
|
+
}
|
55
|
+
})
|
56
|
+
end
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
58
|
+
it "interprets tag with tagname without separator (#{o})" do
|
59
|
+
expr = Hotdog::Expression::StringHostOrTagNode.new("foo", nil)
|
60
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
61
|
+
tagname: "foo",
|
62
|
+
fallback: {
|
63
|
+
query: [
|
64
|
+
"SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
|
65
|
+
"INNER JOIN hosts ON hosts_tags.host_id = hosts.id",
|
66
|
+
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
67
|
+
"WHERE LOWER(hosts.name) GLOB LOWER(?) OR LOWER(tags.name) GLOB LOWER(?) OR LOWER(tags.value) GLOB LOWER(?);",
|
68
|
+
].join(" "),
|
69
|
+
values: ["*foo*", "*foo*", "*foo*"],
|
70
|
+
},
|
71
|
+
})
|
72
|
+
end
|
72
73
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
74
|
+
it "interprets tag with tagvalue with separator (#{o})" do
|
75
|
+
expr = Hotdog::Expression::StringTagvalueNode.new("foo", ":")
|
76
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
77
|
+
tagvalue: "foo",
|
78
|
+
separator: ":",
|
79
|
+
fallback: {
|
80
|
+
query: [
|
81
|
+
"SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
|
82
|
+
"INNER JOIN hosts ON hosts_tags.host_id = hosts.id",
|
83
|
+
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
84
|
+
"WHERE LOWER(hosts.name) GLOB LOWER(?) OR LOWER(tags.value) GLOB LOWER(?);",
|
85
|
+
].join(" "),
|
86
|
+
values: ["*foo*", "*foo*"],
|
87
|
+
},
|
88
|
+
})
|
89
|
+
end
|
89
90
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
91
|
+
it "interprets tag with tagvalue without separator (#{o})" do
|
92
|
+
expr = Hotdog::Expression::StringTagvalueNode.new("foo", nil)
|
93
|
+
expect(optimize_n(o+1, expr).dump).to eq({
|
94
|
+
tagvalue: "foo",
|
95
|
+
fallback: {
|
96
|
+
query: [
|
97
|
+
"SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
|
98
|
+
"INNER JOIN hosts ON hosts_tags.host_id = hosts.id",
|
99
|
+
"INNER JOIN tags ON hosts_tags.tag_id = tags.id",
|
100
|
+
"WHERE LOWER(hosts.name) GLOB LOWER(?) OR LOWER(tags.value) GLOB LOWER(?);",
|
101
|
+
].join(" "),
|
102
|
+
values: ["*foo*", "*foo*"],
|
103
|
+
},
|
104
|
+
})
|
105
|
+
end
|
104
106
|
end
|
105
107
|
end
|