hotdog 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/hotdog/commands/search.rb +25 -5
- data/lib/hotdog/commands.rb +62 -29
- data/lib/hotdog/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 551436c6cb264d187db243f60da58a14f38cb820
|
4
|
+
data.tar.gz: f68bd1dd186fa326af8541b9ea3ae4ae95075d44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f85d09c3f08d2cce6fec0d9d73654e86b2ac6fa8abaa6b2682047f8b4daeeedb6985dc7a0f4613bee2076caf43ecf8e0df129f45023d986b14b306ee971a2a38
|
7
|
+
data.tar.gz: 2e983f2f1508ea69872aa58758ee2a7cfca55e3dcbcba2b612f26e8b543fb8b87a0b849b0d5ef198fb4919c1622c5f2f90bdeb38d73f0ea5ead1e23ad987c11c
|
@@ -242,16 +242,24 @@ module Hotdog
|
|
242
242
|
case @op
|
243
243
|
when :AND
|
244
244
|
left_values = @left.evaluate(environment)
|
245
|
+
environment.logger.debug("lhs: #{left_values.length} value(s)")
|
245
246
|
if left_values.empty?
|
246
247
|
[]
|
247
248
|
else
|
248
249
|
right_values = @right.evaluate(environment)
|
249
|
-
(
|
250
|
+
environment.logger.debug("rhs: #{right_values.length} value(s)")
|
251
|
+
(left_values & right_values).tap do |values|
|
252
|
+
environment.logger.debug("lhs AND rhs: #{values.length} value(s)")
|
253
|
+
end
|
250
254
|
end
|
251
255
|
when :OR
|
252
256
|
left_values = @left.evaluate(environment)
|
257
|
+
environment.logger.debug("lhs: #{left_values.length} value(s)")
|
253
258
|
right_values = @right.evaluate(environment)
|
254
|
-
(
|
259
|
+
environment.logger.debug("rhs: #{right_values.length} value(s)")
|
260
|
+
(left_values | right_values).uniq.tap do |values|
|
261
|
+
environment.logger.debug("lhs OR rhs: #{values.length} value(s)")
|
262
|
+
end
|
255
263
|
else
|
256
264
|
[]
|
257
265
|
end
|
@@ -288,11 +296,23 @@ module Hotdog
|
|
288
296
|
def evaluate(environment, options={})
|
289
297
|
case @op
|
290
298
|
when :NOT
|
291
|
-
values = @expression.evaluate(environment)
|
299
|
+
values = @expression.evaluate(environment).sort
|
300
|
+
environment.logger.debug("expr: #{values.length} value(s)")
|
292
301
|
if values.empty?
|
293
|
-
environment.execute("SELECT
|
302
|
+
environment.execute("SELECT id FROM hosts").map { |row| row.first }.tap do |values|
|
303
|
+
environment.logger.debug("NOT expr: #{values.length} value(s)")
|
304
|
+
end
|
294
305
|
else
|
295
|
-
|
306
|
+
# workaround for "too many terms in compound SELECT"
|
307
|
+
min, max = environment.execute("SELECT MIN(id), MAX(id) FROM hosts ORDER BY id LIMIT 1").first.to_a
|
308
|
+
slice = 200
|
309
|
+
(min / slice).upto(max / slice).map { |i|
|
310
|
+
range = (slice*i)...(slice*(i+1))
|
311
|
+
selected = values.select { |n| range === n }
|
312
|
+
environment.execute("SELECT id FROM hosts WHERE ? <= id AND id < ? AND id NOT IN (%s)" % selected.map { "?" }.join(", "), [range.first, range.last] + selected).map { |row| row.first }
|
313
|
+
}.reduce(:+).tap do |values|
|
314
|
+
environment.logger.debug("NOT expr: #{values.length} value(s)")
|
315
|
+
end
|
296
316
|
end
|
297
317
|
else
|
298
318
|
[]
|
data/lib/hotdog/commands.rb
CHANGED
@@ -11,6 +11,7 @@ module Hotdog
|
|
11
11
|
PERSISTENT_DB = "persistent.db"
|
12
12
|
MASK_DATABASE = 0xffff0000
|
13
13
|
MASK_QUERY = 0x0000ffff
|
14
|
+
MAX_TERMS = 200
|
14
15
|
|
15
16
|
def initialize(application)
|
16
17
|
@application = application
|
@@ -82,7 +83,11 @@ module Hotdog
|
|
82
83
|
if fields == fields_without_host
|
83
84
|
host_names = {}
|
84
85
|
else
|
85
|
-
host_names = Hash[
|
86
|
+
host_names = Hash[
|
87
|
+
host_ids.each_slice(MAX_TERMS).map { |host_ids|
|
88
|
+
execute("SELECT id, name FROM hosts WHERE id IN (%s)" % host_ids.map { "?" }.join(", "), host_ids).map { |row| row.to_a }
|
89
|
+
}.reduce(:+)
|
90
|
+
]
|
86
91
|
end
|
87
92
|
q1 = []
|
88
93
|
q1 << "SELECT tags.name, GROUP_CONCAT(tags.value, ',') FROM hosts_tags"
|
@@ -91,7 +96,11 @@ module Hotdog
|
|
91
96
|
q1 << "WHERE hosts_tags.host_id = ? AND tags.name IN (%s)"
|
92
97
|
q1 << "GROUP BY tags.name;"
|
93
98
|
result = host_ids.map { |host_id|
|
94
|
-
tag_values = Hash[
|
99
|
+
tag_values = Hash[
|
100
|
+
fields_without_host.each_slice(MAX_TERMS).map { |fields_without_host|
|
101
|
+
execute(q1.join(" ") % fields_without_host.map { "?" }.join(", "), [host_id] + fields_without_host).map { |row| row.to_a }
|
102
|
+
}.reduce(:+)
|
103
|
+
]
|
95
104
|
fields.map { |tag_name|
|
96
105
|
if tag_name == "host"
|
97
106
|
host_names.fetch(host_id, "")
|
@@ -111,15 +120,23 @@ module Hotdog
|
|
111
120
|
fields = [
|
112
121
|
@options[:primary_tag],
|
113
122
|
"host",
|
114
|
-
] +
|
115
|
-
|
116
|
-
|
123
|
+
] + host_ids.each_slice(MAX_TERMS).map { |host_ids|
|
124
|
+
execute(q1.join(" ") % host_ids.map { "?" }.join(", "), host_ids).map { |row| row.first }.reject { |tag_name|
|
125
|
+
tag_name == @options[:primary_tag]
|
126
|
+
}
|
127
|
+
}.reduce(:+)
|
117
128
|
else
|
118
129
|
fields = [
|
119
130
|
"host",
|
120
|
-
] +
|
131
|
+
] + host_ids.each_slice(MAX_TERMS).map { |host_ids|
|
132
|
+
execute(q1.join(" ") % host_ids.map { "?" }.join(", "), host_ids).map { |row| row.first }
|
133
|
+
}.reduce(:+)
|
121
134
|
end
|
122
|
-
host_names = Hash[
|
135
|
+
host_names = Hash[
|
136
|
+
host_ids.each_slice(MAX_TERMS).map { |host_ids|
|
137
|
+
execute("SELECT id, name FROM hosts WHERE id IN (%s)" % host_ids.map { "?" }.join(", "), host_ids).map { |row| row.to_a }
|
138
|
+
}.reduce(:+)
|
139
|
+
]
|
123
140
|
q2 = []
|
124
141
|
q2 << "SELECT tags.name, GROUP_CONCAT(tags.value, ',') FROM hosts_tags"
|
125
142
|
q2 << "INNER JOIN tags ON hosts_tags.tag_id = tags.id"
|
@@ -127,7 +144,11 @@ module Hotdog
|
|
127
144
|
q2 << "GROUP BY tags.name;"
|
128
145
|
fields_without_host = fields.reject { |tag_name| tag_name == "host" }
|
129
146
|
result = host_ids.map { |host_id|
|
130
|
-
tag_values = Hash[
|
147
|
+
tag_values = Hash[
|
148
|
+
fields_without_host.each_slice(MAX_TERMS).map { |fields_without_host|
|
149
|
+
execute(q2.join(" ") % fields_without_host.map { "?" }.join(", "), [host_id] + fields_without_host).map { |row| row.to_a }
|
150
|
+
}.reduce(:+)
|
151
|
+
]
|
131
152
|
fields.map { |tag_name|
|
132
153
|
if tag_name == "host"
|
133
154
|
host_names.fetch(host_id, "")
|
@@ -145,11 +166,15 @@ module Hotdog
|
|
145
166
|
q1 << "INNER JOIN hosts ON hosts_tags.host_id = hosts.id"
|
146
167
|
q1 << "INNER JOIN tags ON hosts_tags.tag_id = tags.id"
|
147
168
|
q1 << "WHERE hosts_tags.host_id IN (%s) AND tags.name = ?;"
|
148
|
-
result =
|
169
|
+
result = host_ids.each_slice(MAX_TERMS).map { |host_ids|
|
170
|
+
execute(q1.join(" ") % host_ids.map { "?" }.join(", "), host_ids + [@options[:primary_tag]]).map { |row| row.to_a }
|
171
|
+
}.reduce(:+)
|
149
172
|
[result, fields]
|
150
173
|
else
|
151
174
|
fields = ["host"]
|
152
|
-
result =
|
175
|
+
result = host_ids.each_slice(MAX_TERMS).map { |host_ids|
|
176
|
+
execute("SELECT name FROM hosts WHERE id IN (%s)" % host_ids.map { "?" }.join(", "), host_ids).map { |row| row.to_a }
|
177
|
+
}.reduce(:+)
|
153
178
|
[result, fields]
|
154
179
|
end
|
155
180
|
end
|
@@ -195,24 +220,26 @@ module Hotdog
|
|
195
220
|
|
196
221
|
all_tags = get_all_tags()
|
197
222
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
223
|
+
memory_db.transaction do
|
224
|
+
known_tags = all_tags.keys.map { |tag| split_tag(tag) }.uniq
|
225
|
+
known_tags.each_slice(MAX_TERMS) do |known_tags|
|
226
|
+
prepare(memory_db, "INSERT OR IGNORE INTO tags (name, value) VALUES %s" % known_tags.map { "(?, ?)" }.join(", ")).execute(known_tags)
|
227
|
+
end
|
202
228
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
229
|
+
known_hosts = all_tags.values.reduce(:+).uniq
|
230
|
+
known_hosts.each_slice(MAX_TERMS) do |known_hosts|
|
231
|
+
prepare(memory_db, "INSERT OR IGNORE INTO hosts (name) VALUES %s" % known_hosts.map { "(?)" }.join(", ")).execute(known_hosts)
|
232
|
+
end
|
207
233
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
234
|
+
all_tags.each do |tag, hosts|
|
235
|
+
q = []
|
236
|
+
q << "INSERT OR REPLACE INTO hosts_tags (host_id, tag_id)"
|
237
|
+
q << "SELECT host.id, tag.id FROM"
|
238
|
+
q << "( SELECT id FROM hosts WHERE name IN (%s) ) AS host,"
|
239
|
+
q << "( SELECT id FROM tags WHERE name = ? AND value = ? LIMIT 1 ) AS tag;"
|
240
|
+
hosts.each_slice(MAX_TERMS) do |hosts|
|
241
|
+
prepare(memory_db, q.join(" ") % hosts.map { "?" }.join(", ")).execute(hosts + split_tag(tag))
|
242
|
+
end
|
216
243
|
end
|
217
244
|
end
|
218
245
|
|
@@ -265,13 +292,19 @@ module Hotdog
|
|
265
292
|
create_table_hosts_tags(dst)
|
266
293
|
|
267
294
|
hosts = prepare(src, "SELECT id, name FROM hosts").execute().to_a
|
268
|
-
|
295
|
+
hosts.each_slice(MAX_TERMS) do |hosts|
|
296
|
+
prepare(dst, "INSERT INTO hosts (id, name) VALUES %s" % hosts.map { "(?, ?)" }.join(", ")).execute(hosts)
|
297
|
+
end
|
269
298
|
|
270
299
|
tags = prepare(src, "SELECT id, name, value FROM tags").execute().to_a
|
271
|
-
|
300
|
+
tags.each_slice(MAX_TERMS) do |tags|
|
301
|
+
prepare(dst, "INSERT INTO tags (id, name, value) VALUES %s" % tags.map { "(?, ?, ?)" }.join(", ")).execute(tags)
|
302
|
+
end
|
272
303
|
|
273
304
|
hosts_tags = prepare(src, "SELECT host_id, tag_id FROM hosts_tags").to_a
|
274
|
-
|
305
|
+
hosts_tags.each_slice(MAX_TERMS) do |hosts_tags|
|
306
|
+
prepare(dst, "INSERT INTO hosts_tags (host_id, tag_id) VALUES %s" % hosts_tags.map { "(?, ?)" }.join(", ")).execute(hosts_tags)
|
307
|
+
end
|
275
308
|
|
276
309
|
create_index_hosts(dst)
|
277
310
|
create_index_tags(dst)
|
data/lib/hotdog/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hotdog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yamashita Yuu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|