Kouhei Sutou 2018-11-07 12:35:29 +0900 (Wed, 07 Nov 2018) Revision: 18dc25bfbec5db2124647a602e06487d6153eab0 https://github.com/groonga/groonga-query-log/commit/18dc25bfbec5db2124647a602e06487d6153eab0 Message: Support writing nullable reference number Modified files: lib/groonga-query-log/command/run-regression-test.rb lib/groonga-query-log/command/verify-server.rb lib/groonga-query-log/filter-rewriter.rb lib/groonga-query-log/server-verifier.rb test/test-filter-rewriter.rb Modified: lib/groonga-query-log/command/run-regression-test.rb (+30 -3) =================================================================== --- lib/groonga-query-log/command/run-regression-test.rb 2018-11-07 11:56:36 +0900 (24c1892) +++ lib/groonga-query-log/command/run-regression-test.rb 2018-11-07 12:35:29 +0900 (06624dd) @@ -48,6 +48,8 @@ module GroongaQueryLog @rewrite_vector_equal = false @rewrite_vector_not_equal_empty_string = false @vector_accessors = [] + @rewrite_nullable_reference_number = false + @nullable_reference_number_accessors = [] @care_order = true @ignored_drilldown_keys = [] @@ -172,6 +174,19 @@ module GroongaQueryLog "specifying this option multiple times") do |accessor| @vector_accessors << accessor end + parser.on("--[no-]rewrite-nullable-reference-number", + "Rewrite 'nullable_reference.number' with " + + "with '(nullable_reference._key == null ? 0 : " + + "nullable_reference.number)'", + "(#{@rewrite_nullable_reference_number})") do |boolean| + @rewrite_nullable_reference_number = boolean + end + parser.on("--nullable-reference-number-accessor=ACCESSOR", + "Mark ACCESSOR as rewrite nullable reference number targets", + "You can specify multiple accessors by", + "specifying this option multiple times") do |accessor| + @nullable_reference_number_accessors << accessor + end parser.separator("") parser.separator("Comparisons:") @@ -233,6 +248,10 @@ module GroongaQueryLog :rewrite_vector_not_equal_empty_string => @rewrite_vector_not_equal_empty_string, :vector_accessors => @vector_accessors, + :rewrite_nullable_reference_number => + @rewrite_nullable_reference_number, + :nullable_reference_number_accessors => + @nullable_reference_number_accessors, :target_command_names => @target_command_names, :read_timeout => @read_timeout, } @@ -515,10 +534,18 @@ module GroongaQueryLog if @options[:rewrite_vector_not_equal_empty_string] command_line << "--rewrite-vector-not-equal-empty-string" end - vector_accessors = @options[:vector_accessors] || [] - vector_accessors.each do |vector_accessor| + accessors = @options[:vector_accessors] || [] + accessors.each do |accessor| command_line << "--vector-accessor" - command_line << vector_accessor + command_line << accessor + end + if @options[:rewrite_nullable_reference_number] + command_line << "--rewrite-nullable-reference-number" + end + accessors = @options[:nullable_reference_number_accessors] || [] + accessors.each do |accessor| + command_line << "--nullable-reference-number-accessor" + command_line << accessor end if @options[:target_command_names] command_line << "--target-command-names" Modified: lib/groonga-query-log/command/verify-server.rb (+16 -1) =================================================================== --- lib/groonga-query-log/command/verify-server.rb 2018-11-07 11:56:36 +0900 (6416c0b) +++ lib/groonga-query-log/command/verify-server.rb 2018-11-07 12:35:29 +0900 (a6ee4e8) @@ -217,11 +217,26 @@ module GroongaQueryLog parser.on("--vector-accessor=ACCESSOR", "Mark ACCESSOR as rewrite vector targets", - "You can specify multiple vector accessors by", + "You can specify multiple accessors by", "specifying this option multiple times") do |accessor| @options.vector_accessors << accessor end + parser.on("--[no-]rewrite-nullable-reference-number", + "Rewrite 'nullable_reference.number' with " + + "with '(nullable_reference._key == null ? 0 : " + + "nullable_reference.number)'", + "(#{@options.rewrite_nullable_reference_number?})") do |boolean| + @options.rewrite_nullable_reference_number = boolean + end + + parser.on("--nullable-reference-number-accessor=ACCESSOR", + "Mark ACCESSOR as rewrite nullable reference number targets", + "You can specify multiple accessors by", + "specifying this option multiple times") do |accessor| + @options.nullable_reference_number_accessors << accessor + end + parser.separator("Debug options:") parser.separator("") Modified: lib/groonga-query-log/filter-rewriter.rb (+17 -0) =================================================================== --- lib/groonga-query-log/filter-rewriter.rb 2018-11-07 11:56:36 +0900 (e413150) +++ lib/groonga-query-log/filter-rewriter.rb 2018-11-07 12:35:29 +0900 (fd1cf9e) @@ -20,6 +20,8 @@ module GroongaQueryLog @filter = filter @options = options @vector_accessors = @options[:vector_accessors] || [] + @nullable_reference_number_accessors = + @options[:nullable_reference_number_accessors] || [] end def rewrite @@ -30,6 +32,9 @@ module GroongaQueryLog if @options[:rewrite_vector_not_equal_empty_string] rewritten = rewrite_vector_not_equal_empty_string(rewritten) end + if @options[:rewrite_nullable_reference_number] + rewritten = rewrite_nullable_reference_number(rewritten) + end rewritten end @@ -60,5 +65,17 @@ module GroongaQueryLog replaced end end + + def rewrite_nullable_reference_number(filter) + filter.gsub(/([a-zA-Z0-9_.]+)/) do |matched| + accessor = $1 + if @nullable_reference_number_accessors.include?(accessor) + sub_accessor = accessor.split(".")[0..-2].join(".") + "(#{sub_accessor}._key == null ? 0 : #{accessor})" + else + matched + end + end + end end end Modified: lib/groonga-query-log/server-verifier.rb (+14 -1) =================================================================== --- lib/groonga-query-log/server-verifier.rb 2018-11-07 11:56:36 +0900 (8b89848) +++ lib/groonga-query-log/server-verifier.rb 2018-11-07 12:35:29 +0900 (1c906e8) @@ -221,6 +221,8 @@ module GroongaQueryLog attr_writer :rewrite_vector_equal attr_writer :rewrite_vector_not_equal_empty_string attr_accessor :vector_accessors + attr_writer :rewrite_nullable_reference_number + attr_accessor :nullable_reference_number_accessors def initialize @groonga1 = GroongaOptions.new @groonga2 = GroongaOptions.new @@ -247,6 +249,8 @@ module GroongaQueryLog @rewrite_vector_equal = false @rewrite_vector_not_equal_empty_string = false @vector_accessors = [] + @rewrite_nullable_reference_number = false + @nullable_reference_number_accessors = [] end def request_queue_size @@ -273,6 +277,10 @@ module GroongaQueryLog @rewrite_vector_not_equal_empty_string end + def rewrite_nullable_reference_number? + @rewrite_nullable_reference_number + end + def target_command_name?(name) return false if name.nil? @@ -300,7 +308,8 @@ module GroongaQueryLog def need_filter_rewrite? rewrite_vector_equal? or - rewrite_vector_not_equal_empty_string? + rewrite_vector_not_equal_empty_string? or + rewrite_nullable_reference_number? end def to_filter_rewriter_options @@ -309,6 +318,10 @@ module GroongaQueryLog :rewrite_vector_not_equal_empty_string => rewrite_vector_not_equal_empty_string?, :vector_accessors => vector_accessors, + :rewrite_nullable_reference_number => + rewrite_nullable_reference_number?, + :nullable_reference_number_accessors => + nullable_reference_number_accessors, } end end Modified: test/test-filter-rewriter.rb (+26 -0) =================================================================== --- test/test-filter-rewriter.rb 2018-11-07 11:56:36 +0900 (d3885d4) +++ test/test-filter-rewriter.rb 2018-11-07 12:35:29 +0900 (49a964d) @@ -84,4 +84,30 @@ class FilterRewriterTest < Test::Unit::TestCase ["reference.vector"])) end end + + class NullableReferenceNumberTest < self + def rewrite(filter, accessors) + super(filter, + :rewrite_nullable_reference_number => true, + :nullable_reference_number_accessors => accessors) + end + + def test_not_target_accessor + assert_equal("reference.number < 1000", + rewrite("reference.number < 1000", + ["nonexistent"])) + end + + def test_parenthesis + assert_equal("(((reference._key == null ? 0 : reference.number)) < 1000)", + rewrite("((reference.number) < 1000)", + ["reference.number"])) + end + + def test_under_score + assert_equal("(ref_column._key == null ? 0 : ref_column.number) < 1000", + rewrite("ref_column.number < 1000", + ["ref_column.number"])) + end + end end -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20181107/51d98b3a/attachment-0001.html>