groonga-query-log 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/bin/groonga-query-log-analyze +2 -6
- data/bin/groonga-query-log-detect-memory-leak +2 -2
- data/bin/groonga-query-log-extract +2 -7
- data/bin/groonga-query-log-format-regression-test-logs +22 -0
- data/bin/groonga-query-log-replay +2 -2
- data/bin/groonga-query-log-run-regression-test +1 -1
- data/bin/groonga-query-log-verify-server +2 -2
- data/doc/text/news.md +9 -0
- data/lib/groonga/query-log/analyzer.rb +8 -6
- data/lib/groonga/query-log/command/detect-memory-leak.rb +4 -3
- data/lib/groonga/query-log/command/format-regression-test-logs.rb +121 -0
- data/lib/groonga/query-log/command/replay.rb +4 -3
- data/lib/groonga/query-log/command/run-regression-test.rb +7 -5
- data/lib/groonga/query-log/command/verify-server.rb +4 -3
- data/lib/groonga/query-log/extractor.rb +7 -6
- data/lib/groonga/query-log/response-comparer.rb +66 -4
- data/lib/groonga/query-log/version.rb +1 -1
- data/test/test-analyzer.rb +1 -1
- data/test/test-extractor.rb +24 -7
- data/test/test-response-comparer.rb +91 -0
- metadata +23 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb08906bfcd75b268d3a3bed4ba2768e81ab3c9b
|
4
|
+
data.tar.gz: cc8b5b02688f467c69a99bf768e0549dec253dae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6467ae4182b3d7e4c56a2b3652e241a83e9ffb9f969109941ad730ab11c2e957d97b773e4b1fb02b9dddbfaa6ccbe028f0ffacf321f4be3a19042cc0493a68b
|
7
|
+
data.tar.gz: 53d25ad095f97d429b32c5269f73c6d686702f5308bfeed50a79ce214acc81313271c7447a316ac8a615c6ae0ce473e0354ecfe4071cb9c90b3b1e82bbe526d1
|
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
#
|
4
4
|
# Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
|
5
|
+
# Copyright (C) 2014 Kouhei Sutou <kou@clear-code.com>
|
5
6
|
#
|
6
7
|
# This library is free software; you can redistribute it and/or
|
7
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -20,9 +21,4 @@
|
|
20
21
|
require "groonga/query-log"
|
21
22
|
|
22
23
|
analyzer = Groonga::QueryLog::Analyzer.new
|
23
|
-
|
24
|
-
analyzer.run(*ARGV)
|
25
|
-
rescue Groonga::QueryLog::Analyzer::Error
|
26
|
-
$stderr.puts($!.message)
|
27
|
-
exit(false)
|
28
|
-
end
|
24
|
+
exit(analyzer.run(ARGV))
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
#
|
4
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
4
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
5
5
|
#
|
6
6
|
# This library is free software; you can redistribute it and/or
|
7
7
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -20,4 +20,4 @@
|
|
20
20
|
require "groonga/query-log/command/detect-memory-leak"
|
21
21
|
|
22
22
|
detect_memory_leak_command = Groonga::QueryLog::Command::DetectMemoryLeak.new
|
23
|
-
detect_memory_leak_command.run(
|
23
|
+
exit(detect_memory_leak_command.run(ARGV))
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
#
|
4
|
-
# Copyright (C) 2011 Kouhei Sutou <kou@clear-code.com>
|
4
|
+
# Copyright (C) 2011-2014 Kouhei Sutou <kou@clear-code.com>
|
5
5
|
# Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
@@ -20,9 +20,4 @@
|
|
20
20
|
require "groonga/query-log/extractor"
|
21
21
|
|
22
22
|
extracter = Groonga::QueryLog::Extractor.new
|
23
|
-
|
24
|
-
extracter.run(*ARGV)
|
25
|
-
rescue Groonga::QueryLog::Extractor::Error
|
26
|
-
$stderr.puts($!.message)
|
27
|
-
exit(false)
|
28
|
-
end
|
23
|
+
exit(extracter.run(*ARGV))
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (C) 2014 Kouhei Sutou <kou@clear-code.com>
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
require "groonga/query-log/command/format-regression-test-logs"
|
20
|
+
|
21
|
+
command = Groonga::QueryLog::Command::FormatRegressionTestLogs.new
|
22
|
+
exit(command.run(ARGV))
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
#
|
4
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
4
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
5
5
|
#
|
6
6
|
# This library is free software; you can redistribute it and/or
|
7
7
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -20,4 +20,4 @@
|
|
20
20
|
require "groonga/query-log/command/replay"
|
21
21
|
|
22
22
|
replay_command = Groonga::QueryLog::Command::Replay.new
|
23
|
-
replay_command.run(
|
23
|
+
exit(replay_command.run(ARGV))
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
#
|
4
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
4
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
5
5
|
#
|
6
6
|
# This library is free software; you can redistribute it and/or
|
7
7
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -20,4 +20,4 @@
|
|
20
20
|
require "groonga/query-log/command/verify-server"
|
21
21
|
|
22
22
|
verify_server_command = Groonga::QueryLog::Command::VerifyServer.new
|
23
|
-
verify_server_command.run(
|
23
|
+
exit(verify_server_command.run(ARGV))
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 1.0.6: 2014-06-02
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* groonga-query-log-run-regression-test: Supported `output_columns=*`
|
8
|
+
case.
|
9
|
+
* groonga-query-log-format-regression-test-logs: Added a command that
|
10
|
+
formats logs by groonga-query-log-run-regression-test.
|
11
|
+
|
3
12
|
## 1.0.5: 2014-05-12
|
4
13
|
|
5
14
|
### Improvements
|
@@ -57,7 +57,7 @@ module Groonga
|
|
57
57
|
# @param [Array<String>] arguments arguments for
|
58
58
|
# groonga-query-log-analyze. Please execute
|
59
59
|
# "groonga-query-log-analyze --help" or see #setup_options.
|
60
|
-
def run(
|
60
|
+
def run(arguments)
|
61
61
|
log_paths = @option_parser.parse!(arguments)
|
62
62
|
|
63
63
|
stream = @options[:stream]
|
@@ -89,13 +89,15 @@ module Groonga
|
|
89
89
|
|
90
90
|
if stream
|
91
91
|
streamer.finish
|
92
|
-
|
92
|
+
else
|
93
|
+
statistics.replace(full_statistics) unless dynamic_sort
|
94
|
+
|
95
|
+
reporter = create_reporter(statistics)
|
96
|
+
reporter.apply_options(@options)
|
97
|
+
reporter.report
|
93
98
|
end
|
94
|
-
statistics.replace(full_statistics) unless dynamic_sort
|
95
99
|
|
96
|
-
|
97
|
-
reporter.apply_options(@options)
|
98
|
-
reporter.report
|
100
|
+
true
|
99
101
|
end
|
100
102
|
|
101
103
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
#
|
3
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
3
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
4
4
|
#
|
5
5
|
# This library is free software; you can redistribute it and/or
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -28,14 +28,15 @@ module Groonga
|
|
28
28
|
@options = MemoryLeakDetector::Options.new
|
29
29
|
end
|
30
30
|
|
31
|
-
def run(
|
32
|
-
input_paths = create_parser.parse(
|
31
|
+
def run(command_line)
|
32
|
+
input_paths = create_parser.parse(command_line)
|
33
33
|
detector = MemoryLeakDetector.new(@options)
|
34
34
|
input_paths.each do |input_path|
|
35
35
|
File.open(input_path) do |input|
|
36
36
|
detector.detect(input)
|
37
37
|
end
|
38
38
|
end
|
39
|
+
true
|
39
40
|
end
|
40
41
|
|
41
42
|
private
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# Copyright (C) 2014 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
|
+
require "English"
|
18
|
+
require "find"
|
19
|
+
require "tempfile"
|
20
|
+
require "pp"
|
21
|
+
require "optparse"
|
22
|
+
require "json"
|
23
|
+
|
24
|
+
require "groonga/query-log/version"
|
25
|
+
|
26
|
+
module Groonga
|
27
|
+
module QueryLog
|
28
|
+
module Command
|
29
|
+
class FormatRegressionTestLogs
|
30
|
+
def initialize
|
31
|
+
end
|
32
|
+
|
33
|
+
def run(command_line)
|
34
|
+
parser = OptionParser.new
|
35
|
+
parser.banner += " PATH1 PATH2 ..."
|
36
|
+
parser.version = VERSION
|
37
|
+
paths = parser.parse!(command_line)
|
38
|
+
|
39
|
+
if paths.empty?
|
40
|
+
format_log($stdin, "-")
|
41
|
+
else
|
42
|
+
paths.each do |path|
|
43
|
+
if File.directory?(path)
|
44
|
+
Find.find(path) do |sub_path|
|
45
|
+
next unless File.file?(sub_path)
|
46
|
+
File.open(sub_path) do |file|
|
47
|
+
format_log(file, sub_path)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
else
|
51
|
+
File.open(path) do |file|
|
52
|
+
format_log(file, path)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
true
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
def format_log(input, path)
|
62
|
+
command = nil
|
63
|
+
response1 = nil
|
64
|
+
response2 = nil
|
65
|
+
|
66
|
+
input.each_line do |line|
|
67
|
+
unless line.valid_encoding?
|
68
|
+
puts("invalid encoding line")
|
69
|
+
puts("#{path}:#{input.lineno}:#{line}")
|
70
|
+
next
|
71
|
+
end
|
72
|
+
case line
|
73
|
+
when /\Acommand: /
|
74
|
+
command = $POSTMATCH.chomp
|
75
|
+
when /\Aresponse1: /
|
76
|
+
response1 = $POSTMATCH.chomp
|
77
|
+
when /\Aresponse2: /
|
78
|
+
response2 = $POSTMATCH.chomp
|
79
|
+
parse_failed = false
|
80
|
+
begin
|
81
|
+
JSON.parse(response1)
|
82
|
+
rescue JSON::ParserError
|
83
|
+
puts(command)
|
84
|
+
puts("failed to parse response1: #{$!.message}")
|
85
|
+
puts(response1)
|
86
|
+
parse_failed = true
|
87
|
+
end
|
88
|
+
|
89
|
+
begin
|
90
|
+
JSON.parse(response2)
|
91
|
+
rescue JSON::ParserError
|
92
|
+
puts(command)
|
93
|
+
puts("failed to parse response2: #{$!.message}")
|
94
|
+
puts(response2)
|
95
|
+
parse_failed = true
|
96
|
+
end
|
97
|
+
|
98
|
+
next if parse_failed
|
99
|
+
|
100
|
+
next if response1 == response2
|
101
|
+
|
102
|
+
base_name = File.basename(path, ".*")
|
103
|
+
Tempfile.open("response1-#{base_name}") do |response1_file|
|
104
|
+
PP.pp(JSON.parse(response1), response1_file)
|
105
|
+
response1_file.flush
|
106
|
+
Tempfile.open("response2-#{base_name}") do |response2_file|
|
107
|
+
PP.pp(JSON.parse(response2), response2_file)
|
108
|
+
response2_file.flush
|
109
|
+
puts(command)
|
110
|
+
system("diff",
|
111
|
+
"-u",
|
112
|
+
response1_file.path, response2_file.path)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
#
|
3
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
3
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
4
4
|
#
|
5
5
|
# This library is free software; you can redistribute it and/or
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -28,14 +28,15 @@ module Groonga
|
|
28
28
|
@options = Replayer::Options.new
|
29
29
|
end
|
30
30
|
|
31
|
-
def run(
|
32
|
-
input_paths = create_parser.parse(
|
31
|
+
def run(command_line)
|
32
|
+
input_paths = create_parser.parse(command_line)
|
33
33
|
replayer = Replayer.new(@options)
|
34
34
|
input_paths.each do |input_path|
|
35
35
|
File.open(input_path) do |input|
|
36
36
|
replayer.replay(input)
|
37
37
|
end
|
38
38
|
end
|
39
|
+
true
|
39
40
|
end
|
40
41
|
|
41
42
|
private
|
@@ -44,7 +44,7 @@ module Groonga
|
|
44
44
|
@skip_finished_queries = false
|
45
45
|
end
|
46
46
|
|
47
|
-
def run(
|
47
|
+
def run(command_line)
|
48
48
|
option_parser = create_option_parser
|
49
49
|
begin
|
50
50
|
option_parser.parse!(command_line)
|
@@ -299,14 +299,16 @@ module Groonga
|
|
299
299
|
end
|
300
300
|
end
|
301
301
|
|
302
|
-
old_thread.
|
303
|
-
new_thread.
|
302
|
+
old_thread_success = old_thread.value
|
303
|
+
new_thread_success = new_thread.value
|
304
|
+
|
305
|
+
old_thread_success and new_thread_success
|
304
306
|
end
|
305
307
|
|
306
308
|
private
|
307
309
|
def run_test
|
308
310
|
@n_ready_waits -= 1
|
309
|
-
return unless @n_ready_waits.zero?
|
311
|
+
return true unless @n_ready_waits.zero?
|
310
312
|
|
311
313
|
@clone_pids.each do |pid|
|
312
314
|
Process.waitpid(pid)
|
@@ -358,7 +360,7 @@ module Groonga
|
|
358
360
|
query_log_path.to_s,
|
359
361
|
]
|
360
362
|
verify_serer = VerifyServer.new
|
361
|
-
verify_serer.run(
|
363
|
+
verify_serer.run(command_line)
|
362
364
|
end
|
363
365
|
|
364
366
|
def query_log_paths
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
#
|
3
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
3
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
4
4
|
#
|
5
5
|
# This library is free software; you can redistribute it and/or
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -28,8 +28,8 @@ module Groonga
|
|
28
28
|
@options = ServerVerifier::Options.new
|
29
29
|
end
|
30
30
|
|
31
|
-
def run(
|
32
|
-
input_paths = create_parser.parse(
|
31
|
+
def run(command_line)
|
32
|
+
input_paths = create_parser.parse(command_line)
|
33
33
|
verifier = ServerVerifier.new(@options)
|
34
34
|
if input_paths.empty?
|
35
35
|
verifier.verify($stdin)
|
@@ -40,6 +40,7 @@ module Groonga
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
|
+
true
|
43
44
|
end
|
44
45
|
|
45
46
|
private
|
@@ -31,9 +31,6 @@ module Groonga
|
|
31
31
|
class Error < StandardError
|
32
32
|
end
|
33
33
|
|
34
|
-
class NoInputError < Error
|
35
|
-
end
|
36
|
-
|
37
34
|
attr_accessor :options
|
38
35
|
attr_reader :option_parser
|
39
36
|
|
@@ -58,16 +55,18 @@ module Groonga
|
|
58
55
|
# @param [Array<String>] arguments arguments for
|
59
56
|
# groonga-query-log-extract. Please execute
|
60
57
|
# "groonga-query-log-extract --help" or see #setup_options.
|
61
|
-
def run(
|
58
|
+
def run(arguments)
|
62
59
|
begin
|
63
60
|
log_paths = @option_parser.parse!(arguments)
|
64
61
|
rescue OptionParser::ParseError
|
65
|
-
|
62
|
+
$stderr.puts($!.message)
|
63
|
+
return false
|
66
64
|
end
|
67
65
|
|
68
66
|
if log_paths.empty?
|
69
67
|
unless log_via_stdin?
|
70
|
-
|
68
|
+
$stderr.puts("Error: Please specify input log files.")
|
69
|
+
return false
|
71
70
|
end
|
72
71
|
log = $stdin
|
73
72
|
else
|
@@ -81,6 +80,8 @@ module Groonga
|
|
81
80
|
else
|
82
81
|
extract(log, $stdout)
|
83
82
|
end
|
83
|
+
|
84
|
+
true
|
84
85
|
end
|
85
86
|
|
86
87
|
private
|
@@ -57,10 +57,9 @@ module Groonga
|
|
57
57
|
|
58
58
|
def same_select_response?
|
59
59
|
if random_sort?
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
records_result1[0..1] == records_result2[0..1]
|
60
|
+
same_random_sort_response?
|
61
|
+
elsif all_output_columns?
|
62
|
+
same_all_output_columns?
|
64
63
|
else
|
65
64
|
same_response?
|
66
65
|
end
|
@@ -81,6 +80,69 @@ module Groonga
|
|
81
80
|
end
|
82
81
|
normalized_sort_items.include?("_score")
|
83
82
|
end
|
83
|
+
|
84
|
+
def same_random_sort_response?
|
85
|
+
records_result1 = @response1.body[0] || []
|
86
|
+
records_result2 = @response2.body[0] || []
|
87
|
+
return false if records_result1.size != records_result2.size
|
88
|
+
|
89
|
+
n_hits1 = records_result1[0]
|
90
|
+
n_hits2 = records_result2[0]
|
91
|
+
return false if n_hits1 != n_hits2
|
92
|
+
|
93
|
+
columns1 = records_result1[1]
|
94
|
+
columns2 = records_result2[1]
|
95
|
+
if all_output_columns?
|
96
|
+
columns1.sort_by(&:first) == columns2.sort_by(&:first)
|
97
|
+
else
|
98
|
+
columns1 == columns2
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def all_output_columns?
|
103
|
+
output_columns = @command.output_columns
|
104
|
+
output_columns.nil? or
|
105
|
+
/\A\s*\z/ === output_columns or
|
106
|
+
output_columns.split(/\s*,?\s*/).include?("*")
|
107
|
+
end
|
108
|
+
|
109
|
+
def same_all_output_columns?
|
110
|
+
records_result1 = @response1.body[0] || []
|
111
|
+
records_result2 = @response2.body[0] || []
|
112
|
+
return false if records_result1.size != records_result2.size
|
113
|
+
|
114
|
+
n_hits1 = records_result1[0]
|
115
|
+
n_hits2 = records_result2[0]
|
116
|
+
return false if n_hits1 != n_hits2
|
117
|
+
|
118
|
+
columns1 = records_result1[1]
|
119
|
+
columns2 = records_result2[1]
|
120
|
+
return false if columns1.sort_by(&:first) != columns2.sort_by(&:first)
|
121
|
+
|
122
|
+
column_to_index1 = make_column_to_index_map(columns1)
|
123
|
+
column_to_index2 = make_column_to_index_map(columns2)
|
124
|
+
|
125
|
+
records1 = records_result1[2..-1]
|
126
|
+
records2 = records_result2[2..-1]
|
127
|
+
records1.each_with_index do |record1, record_index|
|
128
|
+
record2 = records2[record_index]
|
129
|
+
column_to_index1.each do |name, column_index1|
|
130
|
+
value1 = record1[column_index1]
|
131
|
+
value2 = record2[column_to_index2[name]]
|
132
|
+
return false if value1 != value2
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
true
|
137
|
+
end
|
138
|
+
|
139
|
+
def make_column_to_index_map(columns)
|
140
|
+
map = {}
|
141
|
+
columns.each_with_index do |(name, _), i|
|
142
|
+
map[name] = i
|
143
|
+
end
|
144
|
+
map
|
145
|
+
end
|
84
146
|
end
|
85
147
|
end
|
86
148
|
end
|
data/test/test-analyzer.rb
CHANGED
data/test/test-extractor.rb
CHANGED
@@ -45,9 +45,8 @@ EOC
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def test_no_specified
|
48
|
-
|
49
|
-
|
50
|
-
end
|
48
|
+
assert_equal("Error: Please specify input log files.\n",
|
49
|
+
run_extractor)
|
51
50
|
end
|
52
51
|
end
|
53
52
|
|
@@ -100,10 +99,28 @@ EOC
|
|
100
99
|
|
101
100
|
private
|
102
101
|
def run_extractor(*arguments)
|
103
|
-
Tempfile.open("extract.
|
104
|
-
|
105
|
-
|
106
|
-
|
102
|
+
Tempfile.open("extract.output") do |output|
|
103
|
+
open_error_output do |error|
|
104
|
+
arguments << "--output" << output.path
|
105
|
+
if @extractor.run(arguments)
|
106
|
+
File.read(output.path)
|
107
|
+
else
|
108
|
+
File.read(error.path)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def open_error_output
|
115
|
+
Tempfile.open("extract.error") do |error|
|
116
|
+
error.sync = true
|
117
|
+
original_stderr = $stderr.dup
|
118
|
+
$stderr.reopen(error)
|
119
|
+
begin
|
120
|
+
yield(error)
|
121
|
+
ensure
|
122
|
+
$stderr.reopen(original_stderr)
|
123
|
+
end
|
107
124
|
end
|
108
125
|
end
|
109
126
|
|
@@ -58,19 +58,43 @@ class ResponseComparerTest < Test::Unit::TestCase
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def test_different_order
|
61
|
+
@command["output_columns"] = "_id"
|
61
62
|
assert_true(same?([[[3], [["_id", "UInt32"]], [1], [2], [3]]],
|
62
63
|
[[[3], [["_id", "UInt32"]], [3], [2], [1]]]))
|
63
64
|
end
|
64
65
|
|
65
66
|
def test_different_attributes
|
67
|
+
@command["output_columns"] = "_id, age"
|
66
68
|
assert_false(same?([[[3], [["_id", "UInt32"]], [1], [2], [3]]],
|
67
69
|
[[[3], [["age", "UInt32"]], [1], [2], [3]]]))
|
68
70
|
end
|
69
71
|
|
70
72
|
def test_different_n_records
|
73
|
+
@command["output_columns"] = "_id"
|
71
74
|
assert_false(same?([[[3], [["_id", "UInt32"]], [1], [2]]],
|
72
75
|
[[[3], [["_id", "UInt32"]], [1], [2], [3]]]))
|
73
76
|
end
|
77
|
+
|
78
|
+
def test_all_output_columns
|
79
|
+
assert_true(same?([
|
80
|
+
[
|
81
|
+
[3],
|
82
|
+
[["_id", "UInt32"], ["_key", "ShortText"]],
|
83
|
+
[1, "1"],
|
84
|
+
[2, "2"],
|
85
|
+
[3, "3"],
|
86
|
+
],
|
87
|
+
],
|
88
|
+
[
|
89
|
+
[
|
90
|
+
[3],
|
91
|
+
[["_key", "ShortText"], ["_id", "UInt32"]],
|
92
|
+
["3", 3],
|
93
|
+
["2", 2],
|
94
|
+
["1", 1],
|
95
|
+
],
|
96
|
+
]))
|
97
|
+
end
|
74
98
|
end
|
75
99
|
|
76
100
|
class DetectRandTest < self
|
@@ -138,6 +162,73 @@ class ResponseComparerTest < Test::Unit::TestCase
|
|
138
162
|
end
|
139
163
|
end
|
140
164
|
|
165
|
+
class OutputColumnsTest < self
|
166
|
+
class AllTest < self
|
167
|
+
def setup
|
168
|
+
super
|
169
|
+
@command["output_columns"] = "*"
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_different_order
|
173
|
+
assert_true(same?([
|
174
|
+
[
|
175
|
+
[3],
|
176
|
+
[["_id", "UInt32"], ["_key", "ShortText"]],
|
177
|
+
[1, "1"],
|
178
|
+
[2, "2"],
|
179
|
+
[3, "3"],
|
180
|
+
],
|
181
|
+
],
|
182
|
+
[
|
183
|
+
[
|
184
|
+
[3],
|
185
|
+
[["_key", "ShortText"], ["_id", "UInt32"]],
|
186
|
+
["1", 1],
|
187
|
+
["2", 2],
|
188
|
+
["3", 3],
|
189
|
+
],
|
190
|
+
]))
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_different_record
|
194
|
+
assert_false(same?([
|
195
|
+
[
|
196
|
+
[1],
|
197
|
+
[["_id", "UInt32"], ["_key", "ShortText"]],
|
198
|
+
[1, "1"],
|
199
|
+
],
|
200
|
+
],
|
201
|
+
[
|
202
|
+
[
|
203
|
+
[1],
|
204
|
+
[["_key", "ShortText"], ["_id", "UInt32"]],
|
205
|
+
[2, "2"],
|
206
|
+
],
|
207
|
+
]))
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
class DetectAllTest < self
|
212
|
+
def test_star_only
|
213
|
+
assert_true(all_output_columns?("*"))
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_include_star
|
217
|
+
assert_true(all_output_columns?("_key, _value, *"))
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_default
|
221
|
+
assert_true(all_output_columns?(nil))
|
222
|
+
end
|
223
|
+
|
224
|
+
private
|
225
|
+
def all_output_columns?(output_columns)
|
226
|
+
@command["output_columns"] = output_columns if output_columns
|
227
|
+
comparer([[[0]]], [[[0]]]).send(:all_output_columns?)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
141
232
|
class ErrorTest < self
|
142
233
|
def test_with_location
|
143
234
|
response1_header = [
|
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.0.
|
4
|
+
version: 1.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: groonga-command-parser
|
@@ -154,12 +154,13 @@ description: ''
|
|
154
154
|
email:
|
155
155
|
- kou@clear-code.com
|
156
156
|
executables:
|
157
|
+
- groonga-query-log-format-regression-test-logs
|
158
|
+
- groonga-query-log-verify-server
|
159
|
+
- groonga-query-log-extract
|
157
160
|
- groonga-query-log-run-regression-test
|
158
|
-
- groonga-query-log-analyze
|
159
|
-
- groonga-query-log-detect-memory-leak
|
160
161
|
- groonga-query-log-replay
|
161
|
-
- groonga-query-log-
|
162
|
-
- groonga-query-log-
|
162
|
+
- groonga-query-log-detect-memory-leak
|
163
|
+
- groonga-query-log-analyze
|
163
164
|
extensions: []
|
164
165
|
extra_rdoc_files: []
|
165
166
|
files:
|
@@ -170,6 +171,7 @@ files:
|
|
170
171
|
- bin/groonga-query-log-analyze
|
171
172
|
- bin/groonga-query-log-detect-memory-leak
|
172
173
|
- bin/groonga-query-log-extract
|
174
|
+
- bin/groonga-query-log-format-regression-test-logs
|
173
175
|
- bin/groonga-query-log-replay
|
174
176
|
- bin/groonga-query-log-run-regression-test
|
175
177
|
- bin/groonga-query-log-verify-server
|
@@ -189,6 +191,7 @@ files:
|
|
189
191
|
- lib/groonga/query-log/analyzer/streamer.rb
|
190
192
|
- lib/groonga/query-log/command-line-utils.rb
|
191
193
|
- lib/groonga/query-log/command/detect-memory-leak.rb
|
194
|
+
- lib/groonga/query-log/command/format-regression-test-logs.rb
|
192
195
|
- lib/groonga/query-log/command/replay.rb
|
193
196
|
- lib/groonga/query-log/command/run-regression-test.rb
|
194
197
|
- lib/groonga/query-log/command/verify-server.rb
|
@@ -247,24 +250,24 @@ summary: Groonga-query-log is a collection of library and tools to process [Groo
|
|
247
250
|
as a library. You can analyze your Groonga's queries and test with your Groonga's
|
248
251
|
query log by using groonga-query-log as a tool.
|
249
252
|
test_files:
|
250
|
-
- test/run-test.rb
|
251
|
-
- test/test-extractor.rb
|
252
|
-
- test/command/test-select.rb
|
253
253
|
- test/test-analyzer.rb
|
254
|
-
- test/test-replayer.rb
|
255
254
|
- test/test-parser.rb
|
256
|
-
- test/
|
257
|
-
- test/
|
258
|
-
- test/
|
259
|
-
- test/fixtures/order/start-time.expected
|
260
|
-
- test/fixtures/order/-elapsed.expected
|
261
|
-
- test/fixtures/n_entries.expected
|
255
|
+
- test/groonga-query-log-test-utils.rb
|
256
|
+
- test/test-response-comparer.rb
|
257
|
+
- test/command/test-select.rb
|
262
258
|
- test/fixtures/other-query.log
|
263
|
-
- test/fixtures/reporter/json.expected
|
264
259
|
- test/fixtures/reporter/console.expected
|
265
260
|
- test/fixtures/reporter/html.expected
|
266
|
-
- test/fixtures/
|
261
|
+
- test/fixtures/reporter/json.expected
|
267
262
|
- test/fixtures/query.log
|
268
|
-
- test/
|
269
|
-
- test/
|
263
|
+
- test/fixtures/multi.expected
|
264
|
+
- test/fixtures/no-report-summary.expected
|
265
|
+
- test/fixtures/n_entries.expected
|
266
|
+
- test/fixtures/order/-start-time.expected
|
267
|
+
- test/fixtures/order/elapsed.expected
|
268
|
+
- test/fixtures/order/start-time.expected
|
269
|
+
- test/fixtures/order/-elapsed.expected
|
270
|
+
- test/run-test.rb
|
271
|
+
- test/test-extractor.rb
|
272
|
+
- test/test-replayer.rb
|
270
273
|
has_rdoc:
|