groonga-query-log 1.0.8 → 1.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 445e8c02baa8178322d2b5149f9f57026d483803
4
- data.tar.gz: a94bf3aa467173b32823c496217e6aa97ad44a4b
3
+ metadata.gz: 0419d5711633814c977ad580360a83a79452e0d6
4
+ data.tar.gz: eebf8ea3c3c40a6282c97a373cdc9f57069ad3f0
5
5
  SHA512:
6
- metadata.gz: 45c1b525c23c3efecc23fd3ed0f0ac003009c67d0e98af01799d68d7e984e51debc3fcd8484753f0e35a4853eff69f9470a2c90217ead4c20807544074ef5ce7
7
- data.tar.gz: 9f4d57caaa380448aefd533753d9aac19f49f83eb57ce7934ef7343ae1c0450e7b7fcdcbfded01c221fb56d39dcc0869668b5a8afe63eb88e8147ae65b6a15d4
6
+ metadata.gz: 50d316f1fc627b6fd6e7f0bd86e78800b591a9e36a7753a4b2fdd75a1e24f3ffd571b0110cface8befb1b584900241918f37915c99d51b2454d2da6b61a22338
7
+ data.tar.gz: 4a5a0545f91800ad90a3d82916c9eb18904105911352c8ea15ae52ddeda1272160543cf17c707b6c20a11a3c28eab68ce0122c708cb84077512eea607401b41c
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Copyright (C) 2013-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/check-command-version-compatibility"
20
+
21
+ command = Groonga::QueryLog::Command::CheckCommandVersionCompatibility.new
22
+ exit(command.run(ARGV))
data/doc/text/news.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # News
2
2
 
3
+ ## 1.0.9: 2014-09-09
4
+
5
+ ### Improvements
6
+
7
+ * groonga-query-log-check-command-version-incompatibility: Added.
8
+ It parses commands in passed query logs and reports incompatible
9
+ items in target command version.
10
+
3
11
  ## 1.0.8: 2014-07-23
4
12
 
5
13
  ### Improvements
@@ -22,3 +22,4 @@ require "groonga/query-log/extractor"
22
22
  require "groonga/query-log/parser"
23
23
  require "groonga/query-log/replayer"
24
24
  require "groonga/query-log/server-verifier"
25
+ require "groonga/query-log/command-version-compatibility-checker"
@@ -0,0 +1,100 @@
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 "groonga/query-log/incompatibility-detector"
18
+
19
+ module Groonga
20
+ module QueryLog
21
+ class CommandVersionCompatibilityChecker
22
+ def initialize(options)
23
+ @options = options
24
+ @incompatibility_detector = @options.create_incompatibility_detector
25
+ @output = $stdout
26
+ @nth_item = 1
27
+ end
28
+
29
+ def start
30
+ original_output = @output
31
+ result = nil
32
+ @options.create_output do |output|
33
+ @output = output
34
+ result = yield
35
+ end
36
+ result
37
+ ensure
38
+ @output = original_output
39
+ end
40
+
41
+ def check(input)
42
+ compatible = true
43
+ parser = Parser.new
44
+ parser.parse(input) do |statistic|
45
+ incompatibles = @incompatibility_detector.detect(statistic)
46
+ next if incompatibles.empty?
47
+ compatible = false
48
+ incompatibles.each do |incompatible|
49
+ report_incompatible(statistic, incompatible)
50
+ end
51
+ end
52
+ compatible
53
+ end
54
+
55
+ private
56
+ def report_incompatible(statistic, incompatible)
57
+ nth_item = @nth_item
58
+ @nth_item += 1
59
+ version = @incompatibility_detector.version
60
+ start_time = statistic.start_time.strftime("%Y-%m-%d %H:%M:%S.%6N")
61
+ @output.puts("#{nth_item}: version#{version}: #{incompatible}")
62
+ @output.puts(" %s" % start_time)
63
+ @output.puts(" #{statistic.raw_command}")
64
+ @output.puts(" Parameters:")
65
+ statistic.command.arguments.each do |key, value|
66
+ @output.puts(" <#{key}>: <#{value}>")
67
+ end
68
+ end
69
+
70
+ class Options
71
+ attr_accessor :target_version
72
+ attr_accessor :output_path
73
+ def initialize
74
+ @target_version = 2
75
+ @output_path = nil
76
+ end
77
+
78
+ def create_incompatibility_detector
79
+ case @target_version
80
+ when 1
81
+ IncompatibilityDetector::Version1.new
82
+ when 2
83
+ IncompatibilityDetector::Version2.new
84
+ else
85
+ raise ArgumentError, "Unsupported version: #{@target_version}"
86
+ end
87
+ end
88
+
89
+ def create_output(&block)
90
+ if @output_path
91
+ FileUtils.mkdir_p(File.dirname(@output_path))
92
+ File.open(@output_path, "w", &block)
93
+ else
94
+ yield($stdout)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,71 @@
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 "optparse"
18
+
19
+ require "groonga/query-log"
20
+
21
+ module Groonga
22
+ module QueryLog
23
+ module Command
24
+ class CheckCommandVersionCompatibility
25
+ def initialize
26
+ @options = CommandVersionCompatibilityChecker::Options.new
27
+ end
28
+
29
+ def run(command_line)
30
+ input_paths = create_parser.parse(command_line)
31
+ checker = CommandVersionCompatibilityChecker.new(@options)
32
+ checker.start do
33
+ compatible = true
34
+ if input_paths.empty?
35
+ compatible = false unless checker.check($stdin)
36
+ else
37
+ input_paths.each do |input_path|
38
+ File.open(input_path) do |input|
39
+ compatible = false unless checker.check(input)
40
+ end
41
+ end
42
+ end
43
+ compatible
44
+ end
45
+ end
46
+
47
+ private
48
+ def create_parser
49
+ parser = OptionParser.new
50
+ parser.version = VERSION
51
+ parser.banner += " QUERY_LOG1 QUERY_LOG2 ..."
52
+
53
+ parser.separator("")
54
+ parser.separator("Options:")
55
+
56
+ parser.on("--target-version=VERSION", Integer,
57
+ "Check incompatibility against command version VERSION",
58
+ "[#{@options.target_version}]") do |version|
59
+ @options.target_version = version
60
+ end
61
+
62
+ parser.on("--output=PATH",
63
+ "Output results to PATH",
64
+ "[stdout]") do |path|
65
+ @options.output_path = path
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,98 @@
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 "fileutils"
18
+
19
+ require "groonga/query-log/parser"
20
+
21
+ module Groonga
22
+ module QueryLog
23
+ class IncompatibilityDetector
24
+ attr_reader :version
25
+ def initialize(version)
26
+ @version = version
27
+ end
28
+
29
+ private
30
+ def build_message(command, parameter, description, value)
31
+ components = [
32
+ command,
33
+ parameter,
34
+ description,
35
+ "<#{value}>",
36
+ ]
37
+ components.join(": ")
38
+ end
39
+
40
+ class Version1 < self
41
+ def initialize
42
+ super(1)
43
+ end
44
+
45
+ def detect(statistic)
46
+ []
47
+ end
48
+ end
49
+
50
+ class Version2 < self
51
+ def initialize
52
+ super(2)
53
+ end
54
+
55
+ def detect(statistic)
56
+ case statistic.command.name
57
+ when "select"
58
+ detect_select(statistic)
59
+ else
60
+ []
61
+ end
62
+ end
63
+
64
+ private
65
+ def detect_select(statistic)
66
+ command = statistic.command
67
+ incompatibles = []
68
+ space_delimiter_unacceptable_parameters = ["output_columns"]
69
+ space_delimiter_unacceptable_parameters.each do |parameter|
70
+ value = command[parameter]
71
+ if space_delimiter?(value)
72
+ description = "space is used as delimiter"
73
+ message = build_message("select", parameter, description, value)
74
+ incompatibles << message
75
+ end
76
+ end
77
+ incompatibles
78
+ end
79
+
80
+ def space_delimiter?(string)
81
+ return false if string.nil?
82
+ return false if have_function_call?(string)
83
+ return false if have_comma?(string)
84
+
85
+ string.strip.split(/\s+/).size > 1
86
+ end
87
+
88
+ def have_function_call?(string)
89
+ string.include?("(")
90
+ end
91
+
92
+ def have_comma?(string)
93
+ string.include?(",")
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -18,6 +18,6 @@
18
18
 
19
19
  module Groonga
20
20
  module QueryLog
21
- VERSION = "1.0.8"
21
+ VERSION = "1.0.9"
22
22
  end
23
23
  end
@@ -0,0 +1,63 @@
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
+ class IncompatibilityDetectorTest < Test::Unit::TestCase
18
+ def detect(command)
19
+ query_log = <<-LOG
20
+ 2012-12-12 17:39:17.628846|0x7fff786aa2b0|>#{command}
21
+ 2012-12-12 17:39:17.630052|0x7fff786aa2b0|<000000001217140 rc=0
22
+ LOG
23
+ statistic = parse_query_log(query_log)
24
+ @detector.detect(statistic)
25
+ end
26
+
27
+ def parse_query_log(query_log)
28
+ parser = Groonga::QueryLog::Parser.new
29
+ parser.parse(query_log) do |statistic|
30
+ return statistic
31
+ end
32
+ end
33
+
34
+ sub_test_case("version1") do
35
+ def setup
36
+ @detector = Groonga::QueryLog::IncompatibilityDetector::Version1.new
37
+ end
38
+ end
39
+
40
+ sub_test_case("version2") do
41
+ def setup
42
+ @detector = Groonga::QueryLog::IncompatibilityDetector::Version2.new
43
+ end
44
+
45
+ sub_test_case("select") do
46
+ sub_test_case("output_columns") do
47
+ def test_space_delimiter
48
+ message =
49
+ "select: output_columns: space is used as delimiter: <_id _key>"
50
+ assert_equal([message], detect("select --output_columns '_id _key'"))
51
+ end
52
+
53
+ def test_comma_delimiter
54
+ assert_equal([], detect("select --output_columns '_id, _key'"))
55
+ end
56
+
57
+ def test_one_element
58
+ assert_equal([], detect("select --output_columns '_id'"))
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
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.8
4
+ version: 1.0.9
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-07-23 00:00:00.000000000 Z
11
+ date: 2014-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: groonga-command-parser
@@ -158,6 +158,7 @@ executables:
158
158
  - groonga-query-log-verify-server
159
159
  - groonga-query-log-extract
160
160
  - groonga-query-log-run-regression-test
161
+ - groonga-query-log-check-command-version-compatibility
161
162
  - groonga-query-log-replay
162
163
  - groonga-query-log-show-running-queries
163
164
  - groonga-query-log-detect-memory-leak
@@ -170,6 +171,7 @@ files:
170
171
  - README.md
171
172
  - Rakefile
172
173
  - bin/groonga-query-log-analyze
174
+ - bin/groonga-query-log-check-command-version-compatibility
173
175
  - bin/groonga-query-log-detect-memory-leak
174
176
  - bin/groonga-query-log-extract
175
177
  - bin/groonga-query-log-format-regression-test-logs
@@ -193,6 +195,8 @@ files:
193
195
  - lib/groonga/query-log/analyzer/statistic.rb
194
196
  - lib/groonga/query-log/analyzer/streamer.rb
195
197
  - lib/groonga/query-log/command-line-utils.rb
198
+ - lib/groonga/query-log/command-version-compatibility-checker.rb
199
+ - lib/groonga/query-log/command/check-command-version-compatibility.rb
196
200
  - lib/groonga/query-log/command/detect-memory-leak.rb
197
201
  - lib/groonga/query-log/command/format-regression-test-logs.rb
198
202
  - lib/groonga/query-log/command/replay.rb
@@ -200,6 +204,7 @@ files:
200
204
  - lib/groonga/query-log/command/show-running-queries.rb
201
205
  - lib/groonga/query-log/command/verify-server.rb
202
206
  - lib/groonga/query-log/extractor.rb
207
+ - lib/groonga/query-log/incompatibility-detector.rb
203
208
  - lib/groonga/query-log/memory-leak-detector.rb
204
209
  - lib/groonga/query-log/parser.rb
205
210
  - lib/groonga/query-log/replayer.rb
@@ -224,6 +229,7 @@ files:
224
229
  - test/run-test.rb
225
230
  - test/test-analyzer.rb
226
231
  - test/test-extractor.rb
232
+ - test/test-incompatibility-detector.rb
227
233
  - test/test-parser.rb
228
234
  - test/test-replayer.rb
229
235
  - test/test-response-comparer.rb
@@ -274,6 +280,7 @@ test_files:
274
280
  - test/fixtures/order/start-time.expected
275
281
  - test/fixtures/order/-elapsed.expected
276
282
  - test/run-test.rb
283
+ - test/test-incompatibility-detector.rb
277
284
  - test/test-extractor.rb
278
285
  - test/test-replayer.rb
279
286
  has_rdoc: