[Groonga-commit] groonga/groonga-query-log at 18dc25b [master] Support writing nullable reference number

アーカイブの一覧に戻る
Kouhei Sutou null+****@clear*****
Wed Nov 7 12:35:29 JST 2018


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>


More information about the Groonga-commit mailing list
アーカイブの一覧に戻る