groonga-query-log 1.3.7 → 1.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/doc/text/news.md +36 -0
- data/lib/groonga-query-log/command/run-regression-test.rb +45 -0
- data/lib/groonga-query-log/command/verify-server.rb +19 -0
- data/lib/groonga-query-log/filter-rewriter.rb +59 -0
- data/lib/groonga-query-log/response-comparer.rb +15 -8
- data/lib/groonga-query-log/server-verifier.rb +58 -4
- data/lib/groonga-query-log/version.rb +1 -1
- data/test/test-filter-rewriter.rb +75 -0
- data/test/test-response-comparer.rb +48 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 661030b254c034e486074270e46e90f9ea593ceea13f1e648f9e7b76fe75bb3c
|
4
|
+
data.tar.gz: c8cae31736b8265e9b160019dbf0c72e0944e4e6113b94ad67a3a897e3bb240a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 821547ca78bda0bc51ea23f12c0f1d72d3bbec079e96ed24884791b355279d9904f5a2a2e03b3f064bc3ca13d519df3be30153effaa530686659bfaf0235780c
|
7
|
+
data.tar.gz: fb253f2e4d5d50c6a4f0cc056b7b270647733d6c4b1f99e85316ac30f41f41944bcdfca74060d166f3f6da2094bf8727db6fafe91214aa4ee59abf33c22708c9
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,41 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 1.3.8: 2018-10-18
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* `groonga-query-log-verify-server`:
|
8
|
+
|
9
|
+
* Changed to flush logs as soon as possible.
|
10
|
+
|
11
|
+
* Added `--vector-not-equal-empty-string` option.
|
12
|
+
|
13
|
+
* Added support an unification for `"null"` and `null` column types.
|
14
|
+
|
15
|
+
* `groonga-query-log-run-regression-test`:
|
16
|
+
|
17
|
+
* Changed to flush logs as soon as possible.
|
18
|
+
|
19
|
+
* Added support for rewriting `vector == ...` with `vector @ ...`.
|
20
|
+
|
21
|
+
* Added support for logging rewriting filters.
|
22
|
+
|
23
|
+
* Added `--vector-not-equal-empty-string` option.
|
24
|
+
|
25
|
+
* Added support an unification for `"null"` and `null` column types.
|
26
|
+
|
27
|
+
### Fixes
|
28
|
+
|
29
|
+
* `groonga-query-log-verify-server`:
|
30
|
+
|
31
|
+
* Fixed a bug that logged contents are removed with `.tar.gz`
|
32
|
+
query log.
|
33
|
+
|
34
|
+
* `groonga-query-log-run-regression-test`:
|
35
|
+
|
36
|
+
* Fixed a bug that logged contents are removed with `.tar.gz`
|
37
|
+
query log.
|
38
|
+
|
3
39
|
## 1.3.7: 2018-09-11
|
4
40
|
|
5
41
|
### Improvements
|
@@ -45,6 +45,9 @@ module GroongaQueryLog
|
|
45
45
|
@skip_finished_queries = false
|
46
46
|
@output_query_log = false
|
47
47
|
@stop_on_failure = false
|
48
|
+
@rewrite_vector_equal = false
|
49
|
+
@rewrite_vector_not_equal_empty_string = false
|
50
|
+
@vector_accessors = []
|
48
51
|
|
49
52
|
@care_order = true
|
50
53
|
@ignored_drilldown_keys = []
|
@@ -151,6 +154,22 @@ module GroongaQueryLog
|
|
151
154
|
"(#{@stop_on_failure})") do |boolean|
|
152
155
|
@stop_on_failure = boolean
|
153
156
|
end
|
157
|
+
parser.on("--[no-]rewrite-vector-equal",
|
158
|
+
"Rewrite 'vector == ...' with 'vector @ ...'",
|
159
|
+
"(#{@rewrite_vector_equal})") do |boolean|
|
160
|
+
@rewrite_vector_equal = boolean
|
161
|
+
end
|
162
|
+
parser.on("--[no-]rewrite-vector-not-equal-empty-string",
|
163
|
+
"Rewrite 'vector != \"\"' with 'false'",
|
164
|
+
"(#{@rewrite_vector_not_equal_empty_string})") do |boolean|
|
165
|
+
@rewrite_vector_not_equal_empty_string = boolean
|
166
|
+
end
|
167
|
+
parser.on("--vector-accessor=ACCESSOR",
|
168
|
+
"Mark ACCESSOR as rewrite vector targets",
|
169
|
+
"You can specify multiple vector accessors by",
|
170
|
+
"specifying this option multiple times") do |accessor|
|
171
|
+
@vector_accessors << accessor
|
172
|
+
end
|
154
173
|
|
155
174
|
parser.separator("")
|
156
175
|
parser.separator("Comparisons:")
|
@@ -208,6 +227,10 @@ module GroongaQueryLog
|
|
208
227
|
:skip_finished_queries => @skip_finished_queries,
|
209
228
|
:ignored_drilldown_keys => @ignored_drilldown_keys,
|
210
229
|
:stop_on_failure => @stop_on_failure,
|
230
|
+
:rewrite_vector_equal => @rewrite_vector_equal,
|
231
|
+
:rewrite_vector_not_equal_empty_string =>
|
232
|
+
@rewrite_vector_not_equal_empty_string,
|
233
|
+
:vector_accessors => @vector_accessors,
|
211
234
|
:target_command_names => @target_command_names,
|
212
235
|
:read_timeout => @read_timeout,
|
213
236
|
}
|
@@ -228,7 +251,16 @@ module GroongaQueryLog
|
|
228
251
|
server_options)
|
229
252
|
end
|
230
253
|
|
254
|
+
module Loggable
|
255
|
+
def puts(*args)
|
256
|
+
$stdout.puts(*args)
|
257
|
+
$stdout.flush
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
231
261
|
class GroongaServer
|
262
|
+
include Loggable
|
263
|
+
|
232
264
|
attr_reader :host, :port
|
233
265
|
def initialize(groonga, groonga_options, database_path, options)
|
234
266
|
@input_directory = options[:input_directory] || Pathname.new(".")
|
@@ -369,6 +401,8 @@ module GroongaQueryLog
|
|
369
401
|
end
|
370
402
|
|
371
403
|
class Tester
|
404
|
+
include Loggable
|
405
|
+
|
372
406
|
def initialize(old, new, options)
|
373
407
|
@old = old
|
374
408
|
@new = new
|
@@ -473,6 +507,17 @@ module GroongaQueryLog
|
|
473
507
|
if @stop_on_failure
|
474
508
|
command_line << "--stop-on-failure"
|
475
509
|
end
|
510
|
+
if @options[:rewrite_vector_equal]
|
511
|
+
command_line << "--rewrite-vector-equal"
|
512
|
+
end
|
513
|
+
if @options[:rewrite_vector_not_equal_empty_string]
|
514
|
+
command_line << "--rewrite-vector-not-equal-empty-string"
|
515
|
+
end
|
516
|
+
vector_accessors = @options[:vector_accessors] || []
|
517
|
+
vector_accessors.each do |vector_accessor|
|
518
|
+
command_line << "--vector-accessor"
|
519
|
+
command_line << vector_accessor
|
520
|
+
end
|
476
521
|
if @options[:target_command_names]
|
477
522
|
command_line << "--target-command-names"
|
478
523
|
command_line << @options[:target_command_names].join(",")
|
@@ -201,6 +201,25 @@ module GroongaQueryLog
|
|
201
201
|
@options.stop_on_failure = boolean
|
202
202
|
end
|
203
203
|
|
204
|
+
parser.on("--[no-]rewrite-vector-equal",
|
205
|
+
"Rewrite 'vector == ...' with 'vector @ ...'",
|
206
|
+
"(#{@options.rewrite_vector_equal?})") do |boolean|
|
207
|
+
@options.rewrite_vector_equal = boolean
|
208
|
+
end
|
209
|
+
|
210
|
+
parser.on("--[no-]rewrite-vector-not-equal-empty-string",
|
211
|
+
"Rewrite 'vector != \"\"' with 'false'",
|
212
|
+
"(#{@options.rewrite_vector_not_equal_empty_string?})") do |boolean|
|
213
|
+
@options.rewrite_vector_not_equal_empty_string = boolean
|
214
|
+
end
|
215
|
+
|
216
|
+
parser.on("--vector-accessor=ACCESSOR",
|
217
|
+
"Mark ACCESSOR as rewrite vector targets",
|
218
|
+
"You can specify multiple vector accessors by",
|
219
|
+
"specifying this option multiple times") do |accessor|
|
220
|
+
@options.vector_accessors << accessor
|
221
|
+
end
|
222
|
+
|
204
223
|
parser.separator("Debug options:")
|
205
224
|
parser.separator("")
|
206
225
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Copyright (C) 2018 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
module GroongaQueryLog
|
18
|
+
class FilterRewriter
|
19
|
+
def initialize(filter, options={})
|
20
|
+
@filter = filter
|
21
|
+
@options = options
|
22
|
+
@vector_accessors = @options[:vector_accessors] || []
|
23
|
+
end
|
24
|
+
|
25
|
+
def rewrite
|
26
|
+
rewritten = @filter
|
27
|
+
if @options[:rewrite_vector_equal]
|
28
|
+
rewritten = rewrite_vector_equal(rewritten)
|
29
|
+
end
|
30
|
+
if @options[:rewrite_vector_not_equal_empty_string]
|
31
|
+
rewritten = rewrite_vector_not_equal_empty_string(rewritten)
|
32
|
+
end
|
33
|
+
rewritten
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def rewrite_vector_equal(filter)
|
38
|
+
filter.gsub(/([a-zA-Z0-9_.]+) *==/) do |matched|
|
39
|
+
variable = $1
|
40
|
+
if @vector_accessors.include?(variable)
|
41
|
+
"#{variable} @"
|
42
|
+
else
|
43
|
+
matched
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def rewrite_vector_not_equal_empty_string(filter)
|
49
|
+
filter.gsub(/([a-zA-Z0-9_.]+) *!= *(?:''|"")/) do |matched|
|
50
|
+
variable = $1
|
51
|
+
if @vector_accessors.include?(variable)
|
52
|
+
"false"
|
53
|
+
else
|
54
|
+
matched
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -113,8 +113,8 @@ module GroongaQueryLog
|
|
113
113
|
n_hits2 = records_result2[0]
|
114
114
|
return false if n_hits1 != n_hits2
|
115
115
|
|
116
|
-
columns1 = records_result1[1]
|
117
|
-
columns2 = records_result2[1]
|
116
|
+
columns1 = normalize_columns(records_result1[1])
|
117
|
+
columns2 = normalize_columns(records_result2[1])
|
118
118
|
if all_output_columns?
|
119
119
|
columns1.sort_by(&:first) == columns2.sort_by(&:first)
|
120
120
|
else
|
@@ -137,8 +137,8 @@ module GroongaQueryLog
|
|
137
137
|
n_hits2 = records_result2[0]
|
138
138
|
return false if n_hits1 != n_hits2
|
139
139
|
|
140
|
-
columns1 = records_result1[1]
|
141
|
-
columns2 = records_result2[1]
|
140
|
+
columns1 = normalize_columns(records_result1[1])
|
141
|
+
columns2 = normalize_columns(records_result2[1])
|
142
142
|
records1 = records_result1[2..-1]
|
143
143
|
records2 = records_result2[2..-1]
|
144
144
|
|
@@ -185,8 +185,8 @@ module GroongaQueryLog
|
|
185
185
|
n_hits2 = records_result2[0]
|
186
186
|
return false if n_hits1 != n_hits2
|
187
187
|
|
188
|
-
columns1 = records_result1[1]
|
189
|
-
columns2 = records_result2[1]
|
188
|
+
columns1 = normalize_columns(records_result1[1])
|
189
|
+
columns2 = normalize_columns(records_result2[1])
|
190
190
|
return false if columns1.sort_by(&:first) != columns2.sort_by(&:first)
|
191
191
|
|
192
192
|
column_to_index1 = make_column_to_index_map(columns1)
|
@@ -223,8 +223,8 @@ module GroongaQueryLog
|
|
223
223
|
n_hits2 = record_set2[0]
|
224
224
|
return false if n_hits1 != n_hits2
|
225
225
|
|
226
|
-
columns1 = record_set1[1]
|
227
|
-
columns2 = record_set2[1]
|
226
|
+
columns1 = normalize_columns(record_set1[1])
|
227
|
+
columns2 = normalize_columns(record_set2[1])
|
228
228
|
return false if columns1 != columns2
|
229
229
|
|
230
230
|
records1 = record_set1[2..-1]
|
@@ -282,6 +282,13 @@ module GroongaQueryLog
|
|
282
282
|
true
|
283
283
|
end
|
284
284
|
|
285
|
+
def normalize_columns(columns)
|
286
|
+
columns.collect do |name, type|
|
287
|
+
type = nil if type == "null"
|
288
|
+
[name, type]
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
285
292
|
def normalize_value(value, column)
|
286
293
|
type = column[1]
|
287
294
|
case type
|
@@ -19,6 +19,7 @@ require "thread"
|
|
19
19
|
|
20
20
|
require "groonga/client"
|
21
21
|
|
22
|
+
require "groonga-query-log/filter-rewriter"
|
22
23
|
require "groonga-query-log/parser"
|
23
24
|
require "groonga-query-log/response-comparer"
|
24
25
|
|
@@ -118,7 +119,7 @@ module GroongaQueryLog
|
|
118
119
|
|
119
120
|
def run_reporter
|
120
121
|
Thread.new do
|
121
|
-
@options.
|
122
|
+
@options.open_output do |output|
|
122
123
|
loop do
|
123
124
|
result = @different_results.pop
|
124
125
|
break if result.nil?
|
@@ -135,6 +136,8 @@ module GroongaQueryLog
|
|
135
136
|
def verify_command(groonga1_client, groonga2_client, command)
|
136
137
|
command["cache"] = "no" if @options.disable_cache?
|
137
138
|
command["output_type"] = "json"
|
139
|
+
rewrite_filter(command, "filter")
|
140
|
+
rewrite_filter(command, "scorer")
|
138
141
|
response1 = groonga1_client.execute(command)
|
139
142
|
response2 = groonga2_client.execute(command)
|
140
143
|
compare_options = {
|
@@ -148,6 +151,21 @@ module GroongaQueryLog
|
|
148
151
|
end
|
149
152
|
end
|
150
153
|
|
154
|
+
def rewrite_filter(command, name)
|
155
|
+
target = command[name]
|
156
|
+
return if target.nil?
|
157
|
+
return unless @options.need_filter_rewrite?
|
158
|
+
|
159
|
+
rewriter = FilterRewriter.new(target, @options.to_filter_rewriter_options)
|
160
|
+
rewritten_target = rewriter.rewrite
|
161
|
+
return if target == rewritten_target
|
162
|
+
|
163
|
+
$stderr.puts("Rewritten #{name}")
|
164
|
+
$stderr.puts(" Before: #{target}")
|
165
|
+
$stderr.puts(" After: #{rewritten_target}")
|
166
|
+
command[name] = rewritten_target
|
167
|
+
end
|
168
|
+
|
151
169
|
def report_result(output, result)
|
152
170
|
@same = false
|
153
171
|
command, response1, response2 = result
|
@@ -155,6 +173,7 @@ module GroongaQueryLog
|
|
155
173
|
output.puts("command: #{command_source}")
|
156
174
|
output.puts("response1: #{response1.body.to_json}")
|
157
175
|
output.puts("response2: #{response2.body.to_json}")
|
176
|
+
output.flush
|
158
177
|
end
|
159
178
|
|
160
179
|
def log_client_error(error)
|
@@ -181,6 +200,9 @@ module GroongaQueryLog
|
|
181
200
|
attr_writer :verify_cache
|
182
201
|
attr_accessor :ignored_drilldown_keys
|
183
202
|
attr_writer :stop_on_failure
|
203
|
+
attr_writer :rewrite_vector_equal
|
204
|
+
attr_writer :rewrite_vector_not_equal_empty_string
|
205
|
+
attr_accessor :vector_accessors
|
184
206
|
def initialize
|
185
207
|
@groonga1 = GroongaOptions.new
|
186
208
|
@groonga2 = GroongaOptions.new
|
@@ -188,6 +210,7 @@ module GroongaQueryLog
|
|
188
210
|
@request_queue_size = nil
|
189
211
|
@disable_cache = false
|
190
212
|
@output_path = nil
|
213
|
+
@output_opened = false
|
191
214
|
@target_command_names = [
|
192
215
|
"io_flush",
|
193
216
|
"logical_count",
|
@@ -203,6 +226,9 @@ module GroongaQueryLog
|
|
203
226
|
@verify_cache = false
|
204
227
|
@ignored_drilldown_keys = []
|
205
228
|
@stop_on_failure = false
|
229
|
+
@rewrite_vector_equal = false
|
230
|
+
@rewrite_vector_not_equal_empty_string = false
|
231
|
+
@vector_accessors = []
|
206
232
|
end
|
207
233
|
|
208
234
|
def request_queue_size
|
@@ -221,6 +247,14 @@ module GroongaQueryLog
|
|
221
247
|
@stop_on_failure
|
222
248
|
end
|
223
249
|
|
250
|
+
def rewrite_vector_equal?
|
251
|
+
@rewrite_vector_equal
|
252
|
+
end
|
253
|
+
|
254
|
+
def rewrite_vector_not_equal_empty_string?
|
255
|
+
@rewrite_vector_not_equal_empty_string
|
256
|
+
end
|
257
|
+
|
224
258
|
def target_command_name?(name)
|
225
259
|
return false if name.nil?
|
226
260
|
|
@@ -231,14 +265,34 @@ module GroongaQueryLog
|
|
231
265
|
end
|
232
266
|
end
|
233
267
|
|
234
|
-
def
|
268
|
+
def open_output(&block)
|
235
269
|
if @output_path
|
236
|
-
|
237
|
-
|
270
|
+
if @output_opened
|
271
|
+
mode = "a"
|
272
|
+
else
|
273
|
+
FileUtils.mkdir_p(File.dirname(@output_path))
|
274
|
+
mode = "w"
|
275
|
+
@output_opened = true
|
276
|
+
end
|
277
|
+
File.open(@output_path, mode, &block)
|
238
278
|
else
|
239
279
|
yield($stdout)
|
240
280
|
end
|
241
281
|
end
|
282
|
+
|
283
|
+
def need_filter_rewrite?
|
284
|
+
rewrite_vector_equal? or
|
285
|
+
rewrite_vector_not_equal_empty_string?
|
286
|
+
end
|
287
|
+
|
288
|
+
def to_filter_rewriter_options
|
289
|
+
{
|
290
|
+
:rewrite_vector_equal => rewrite_vector_equal?,
|
291
|
+
:rewrite_vector_not_equal_empty_string =>
|
292
|
+
rewrite_vector_not_equal_empty_string?,
|
293
|
+
:vector_accessors => vector_accessors,
|
294
|
+
}
|
295
|
+
end
|
242
296
|
end
|
243
297
|
|
244
298
|
class GroongaOptions
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# Copyright (C) 2018 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
class FilterRewriterTest < Test::Unit::TestCase
|
18
|
+
private
|
19
|
+
def rewrite(filter, options)
|
20
|
+
rewriter = GroongaQueryLog::FilterRewriter.new(filter, options)
|
21
|
+
rewriter.rewrite
|
22
|
+
end
|
23
|
+
|
24
|
+
class VectorEqualTest < self
|
25
|
+
def rewrite(filter, vector_accessors)
|
26
|
+
super(filter,
|
27
|
+
:rewrite_vector_equal => true,
|
28
|
+
:vector_accessors => vector_accessors)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_not_target_accessor
|
32
|
+
assert_equal("vector == \"value\"",
|
33
|
+
rewrite("vector == \"value\"",
|
34
|
+
["nonexistent"]))
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_parenthesis
|
38
|
+
assert_equal("((vector @ \"value\"))",
|
39
|
+
rewrite("((vector == \"value\"))",
|
40
|
+
["vector"]))
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_under_score
|
44
|
+
assert_equal("vector_column @ \"value\"",
|
45
|
+
rewrite("vector_column == \"value\"",
|
46
|
+
["vector_column"]))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class VectorNotEqualEmptyStringTest < self
|
51
|
+
def rewrite(filter, vector_accessors)
|
52
|
+
super(filter,
|
53
|
+
:rewrite_vector_not_equal_empty_string => true,
|
54
|
+
:vector_accessors => vector_accessors)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_not_target_accessor
|
58
|
+
assert_equal("vector != \"\"",
|
59
|
+
rewrite("vector != \"\"",
|
60
|
+
["nonexistent"]))
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_parenthesis
|
64
|
+
assert_equal("((false))",
|
65
|
+
rewrite("((vector != \"\"))",
|
66
|
+
["vector"]))
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_under_score
|
70
|
+
assert_equal("false",
|
71
|
+
rewrite("vector_column != \"\"",
|
72
|
+
["vector_column"]))
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -363,6 +363,54 @@ class ResponseComparerTest < Test::Unit::TestCase
|
|
363
363
|
end
|
364
364
|
end
|
365
365
|
|
366
|
+
class ColumnType < self
|
367
|
+
class Null < self
|
368
|
+
def create_response(type)
|
369
|
+
[
|
370
|
+
[
|
371
|
+
[1],
|
372
|
+
[["snippet_html", type]],
|
373
|
+
["...snippet..."],
|
374
|
+
]
|
375
|
+
]
|
376
|
+
end
|
377
|
+
|
378
|
+
def test_all_output_columns
|
379
|
+
response1 = create_response("null")
|
380
|
+
response2 = create_response(nil)
|
381
|
+
assert do
|
382
|
+
same?(response1, response2)
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_unary_minus_output_column
|
387
|
+
@command["output_columns"] = "-value, snippet_html(body)"
|
388
|
+
response1 = create_response("null")
|
389
|
+
response2 = create_response(nil)
|
390
|
+
assert do
|
391
|
+
same?(response1, response2)
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
def test_specific_output_column
|
396
|
+
@command["output_columns"] = "snippet_html(body)"
|
397
|
+
response1 = create_response("null")
|
398
|
+
response2 = create_response(nil)
|
399
|
+
assert do
|
400
|
+
same?(response1, response2)
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
def test_not_care_order
|
405
|
+
response1 = create_response("null")
|
406
|
+
response2 = create_response(nil)
|
407
|
+
assert do
|
408
|
+
same?(response1, response2, care_order: false)
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
366
414
|
class DrilldownTest < self
|
367
415
|
def create_response(drilldown)
|
368
416
|
[
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: groonga-query-log
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: groonga-command-parser
|
@@ -224,6 +224,7 @@ files:
|
|
224
224
|
- lib/groonga-query-log/command/run-regression-test.rb
|
225
225
|
- lib/groonga-query-log/command/show-running-queries.rb
|
226
226
|
- lib/groonga-query-log/command/verify-server.rb
|
227
|
+
- lib/groonga-query-log/filter-rewriter.rb
|
227
228
|
- lib/groonga-query-log/incompatibility-detector.rb
|
228
229
|
- lib/groonga-query-log/memory-leak-detector.rb
|
229
230
|
- lib/groonga-query-log/parser.rb
|
@@ -289,6 +290,7 @@ files:
|
|
289
290
|
- test/fixtures/target-tables.expected
|
290
291
|
- test/helper.rb
|
291
292
|
- test/run-test.rb
|
293
|
+
- test/test-filter-rewriter.rb
|
292
294
|
- test/test-incompatibility-detector.rb
|
293
295
|
- test/test-parser.rb
|
294
296
|
- test/test-replayer.rb
|
@@ -321,6 +323,7 @@ summary: Groonga-query-log is a collection of library and tools to process [Groo
|
|
321
323
|
as a library. You can analyze your Groonga's queries and test with your Groonga's
|
322
324
|
query log by using groonga-query-log as a tool.
|
323
325
|
test_files:
|
326
|
+
- test/test-filter-rewriter.rb
|
324
327
|
- test/fixtures/multi.expected
|
325
328
|
- test/fixtures/target-tables.expected
|
326
329
|
- test/fixtures/target-commands.expected
|