[Groonga-commit] groonga/groonga at 3e01aac [master] sharding: extract common code to RangeExpressionBuilder

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Apr 2 16:56:22 JST 2015


Kouhei Sutou	2015-04-02 16:56:22 +0900 (Thu, 02 Apr 2015)

  New Revision: 3e01aac36391f142faa3ea9186bfc8a079235960
  https://github.com/groonga/groonga/commit/3e01aac36391f142faa3ea9186bfc8a079235960

  Message:
    sharding: extract common code to RangeExpressionBuilder

  Added files:
    plugins/sharding/range_expression_builder.rb
  Modified files:
    plugins/sharding.rb
    plugins/sharding/logical_count.rb
    plugins/sharding/logical_range_filter.rb
    plugins/sharding/sources.am

  Modified: plugins/sharding.rb (+1 -0)
===================================================================
--- plugins/sharding.rb    2015-04-02 16:28:54 +0900 (8902d7e)
+++ plugins/sharding.rb    2015-04-02 16:56:22 +0900 (e369c37)
@@ -1,3 +1,4 @@
+require "sharding/range_expression_builder"
 require "sharding/logical_enumerator"
 require "sharding/logical_count"
 require "sharding/logical_range_filter"

  Modified: plugins/sharding/logical_count.rb (+13 -93)
===================================================================
--- plugins/sharding/logical_count.rb    2015-04-02 16:28:54 +0900 (ef993b4)
+++ plugins/sharding/logical_count.rb    2015-04-02 16:56:22 +0900 (21a2706)
@@ -32,77 +32,31 @@ module Groonga
         cover_type = target_range.cover_type(shard_range)
         return 0 if cover_type == :none
 
+        expression_builder = RangeExpressionBuilder.new(shard_key,
+                                                        target_range,
+                                                        filter)
         if cover_type == :all
           if filter.nil?
             return table.size
           else
-            return filtered_count_n_records(table, filter)
-          end
-        end
-
-        use_range_index = false
-        range_index = nil
-        if filter.nil?
-          index_info = shard_key.find_index(Operator::LESS)
-          if index_info
-            range_index = index_info.index
-            use_range_index = true
+            return filtered_count_n_records(table, filter) do |expression|
+              expression_builder.build_all(expression)
+            end
           end
         end
 
         case cover_type
         when :partial_min
-          if use_range_index
-            count_n_records_in_range(range_index,
-                                     target_range.min, target_range.min_border,
-                                     nil, nil)
-          else
-            filtered_count_n_records(table, filter) do |expression|
-              expression.append_object(shard_key, Operator::PUSH, 1)
-              expression.append_operator(Operator::GET_VALUE, 1)
-              expression.append_constant(target_range.min, Operator::PUSH, 1)
-              if target_range.min_border == :include
-                expression.append_operator(Operator::GREATER_EQUAL, 2)
-              else
-                expression.append_operator(Operator::GREATER, 2)
-              end
-            end
+          filtered_count_n_records(table, filter) do |expression|
+            expression_builder.build_partial_min(expression)
           end
         when :partial_max
-          if use_range_index
-            count_n_records_in_range(range_index,
-                                     nil, nil,
-                                     target_range.max, target_range.max_border)
-          else
-            filtered_count_n_records(table, filter) do |expression|
-              expression.append_object(shard_key, Operator::PUSH, 1)
-              expression.append_operator(Operator::GET_VALUE, 1)
-              expression.append_constant(target_range.max, Operator::PUSH, 1)
-              if target_range.max_border == :include
-                expression.append_operator(Operator::LESS_EQUAL, 2)
-              else
-                expression.append_operator(Operator::LESS, 2)
-              end
-            end
+          filtered_count_n_records(table, filter) do |expression|
+            expression_builder.build_partial_max(expression)
           end
         when :partial_min_and_max
-          if use_range_index
-            count_n_records_in_range(range_index,
-                                     target_range.min, target_range.min_border,
-                                     target_range.max, target_range.max_border)
-          else
-            filtered_count_n_records(table, filter) do |expression|
-              expression.append_object(context["between"], Operator::PUSH, 1)
-              expression.append_object(shard_key, Operator::PUSH, 1)
-              expression.append_operator(Operator::GET_VALUE, 1)
-              expression.append_constant(target_range.min, Operator::PUSH, 1)
-              expression.append_constant(target_range.min_border,
-                                         Operator::PUSH, 1)
-              expression.append_constant(target_range.max, Operator::PUSH, 1)
-              expression.append_constant(target_range.max_border,
-                                         Operator::PUSH, 1)
-              expression.append_operator(Operator::CALL, 5)
-            end
+          filtered_count_n_records(table, filter) do |expression|
+            expression_builder.build_partial_min_and_max(expression)
           end
         end
       end
@@ -113,15 +67,7 @@ module Groonga
 
         begin
           expression = Expression.create(table)
-          if block_given?
-            yield(expression)
-            if filter
-              expression.parse(filter)
-              expression.append_operator(Operator::AND, 2)
-            end
-          else
-            expression.parse(filter)
-          end
+          yield(expression)
           filtered_table = table.select(expression)
           filtered_table.size
         ensure
@@ -129,32 +75,6 @@ module Groonga
           expression.close if expression
         end
       end
-
-      def count_n_records_in_range(range_index,
-                                   min, min_border, max, max_border)
-        flags = TableCursorFlags::BY_KEY
-        case min_border
-        when :include
-          flags |= TableCursorFlags::GE
-        when :exclude
-          flags |= TableCursorFlags::GT
-        end
-        case max_border
-        when :include
-          flags |= TableCursorFlags::LE
-        when :exclude
-          flags |= TableCursorFlags::LT
-        end
-
-        TableCursor.open(range_index.table,
-                         :min => min,
-                         :max => max,
-                         :flags => flags) do |table_cursor|
-          IndexCursor.open(table_cursor, range_index) do |index_cursor|
-            index_cursor.count
-          end
-        end
-      end
     end
   end
 end

  Modified: plugins/sharding/logical_range_filter.rb (+12 -60)
===================================================================
--- plugins/sharding/logical_range_filter.rb    2015-04-02 16:28:54 +0900 (8d0192d)
+++ plugins/sharding/logical_range_filter.rb    2015-04-02 16:56:22 +0900 (7461ad4)
@@ -152,6 +152,10 @@ module Groonga
           @target_range =****@conte*****_range
 
           @cover_type = @target_range.cover_type(@shard_range)
+
+          @expression_builder = RangeExpressionBuilder.new(@shard_key,
+                                                           @target_range,
+                                                           @filter)
         end
 
         def execute
@@ -175,7 +179,7 @@ module Groonga
                               nil, nil)
             else
               filter_table do |expression|
-                build_expression_partial_min(expression)
+                @expression_builder.build_partial_min(expression)
               end
             end
           when :partial_max
@@ -185,7 +189,7 @@ module Groonga
                               @target_range.max, @target_range.max_border)
             else
               filter_table do |expression|
-                build_expression_partial_max(expression)
+                @expression_builder.build_partial_max(expression)
               end
             end
           when :partial_min_and_max
@@ -195,65 +199,13 @@ module Groonga
                               @target_range.max, @target_range.max_border)
             else
               filter_table do |expression|
-                build_expression_partial_min_and_max(expression)
+                @expression_builder.build_partial_min_and_max(expression)
               end
             end
           end
         end
 
         private
-        def build_expression_all(expression)
-          expression.parse(@filter)
-        end
-
-        def build_expression_partial_min(expression)
-          expression.append_object(@shard_key, Operator::PUSH, 1)
-          expression.append_operator(Operator::GET_VALUE, 1)
-          expression.append_constant(@target_range.min, Operator::PUSH, 1)
-          if @target_range.min_border == :include
-            expression.append_operator(Operator::GREATER_EQUAL, 2)
-          else
-            expression.append_operator(Operator::GREATER, 2)
-          end
-          if @filter
-            expression.parse(@filter)
-            expression.append_operator(Operator::AND, 2)
-          end
-        end
-
-        def build_expression_partial_max(expression)
-          expression.append_object(@shard_key, Operator::PUSH, 1)
-          expression.append_operator(Operator::GET_VALUE, 1)
-          expression.append_constant(@target_range.max, Operator::PUSH, 1)
-          if @target_range.max_border == :include
-            expression.append_operator(Operator::LESS_EQUAL, 2)
-          else
-            expression.append_operator(Operator::LESS, 2)
-          end
-          if @filter
-            expression.parse(@filter)
-            expression.append_operator(Operator::AND, 2)
-          end
-        end
-
-        def build_expression_partial_min_and_max(expression)
-          between = Groonga::Context.instance["between"]
-          expression.append_object(between, Operator::PUSH, 1)
-          expression.append_object(@shard_key, Operator::PUSH, 1)
-          expression.append_operator(Operator::GET_VALUE, 1)
-          expression.append_constant(@target_range.min, Operator::PUSH, 1)
-          expression.append_constant(@target_range.min_border,
-                                     Operator::PUSH, 1)
-          expression.append_constant(@target_range.max, Operator::PUSH, 1)
-          expression.append_constant(@target_range.max_border,
-                                     Operator::PUSH, 1)
-          expression.append_operator(Operator::CALL, 5)
-          if @filter
-            expression.parse(@filter)
-            expression.append_operator(Operator::AND, 2)
-          end
-        end
-
         def use_range_index?(range_index)
           required_n_records =****@conte*****_offset +****@conte*****_limit
           max_n_records =****@table*****
@@ -271,7 +223,7 @@ module Groonga
           when :all
             if @filter
               create_expression(@table) do |expression|
-                build_expression_all(expression)
+                @expression_builder.build_all(expression)
                 estimated_n_records = expression.estimate_size(@table)
               end
             else
@@ -279,17 +231,17 @@ module Groonga
             end
           when :partial_min
             create_expression(@table) do |expression|
-                build_expression_partial_min(expression)
+              @expression_builder.build_partial_min(expression)
               estimated_n_records = expression.estimate_size(@table)
             end
           when :partial_max
             create_expression(@table) do |expression|
-              build_expression_partial_max(expression)
+              @expression_builder.build_partial_max(expression)
               estimated_n_records = expression.estimate_size(@table)
             end
           when :partial_min_and_max
             create_expression(@table) do |expression|
-              build_expression_partial_min_and_max(expression)
+              @expression_builder.build_partial_min_and_max(expression)
               estimated_n_records = expression.estimate_size(@table)
             end
           end
@@ -322,7 +274,7 @@ module Groonga
                               nil, nil)
             else
               filter_table do |expression|
-                build_expression_all(expression)
+                @expression_builder.build_all(expression)
               end
             end
           end

  Added: plugins/sharding/range_expression_builder.rb (+65 -0) 100644
===================================================================
--- /dev/null
+++ plugins/sharding/range_expression_builder.rb    2015-04-02 16:56:22 +0900 (2e2dd29)
@@ -0,0 +1,65 @@
+module Groonga
+  module Sharding
+    class RangeExpressionBuilder
+      def initialize(key, target_range, filter)
+        @key = key
+        @target_range = target_range
+        @filter = filter
+      end
+
+      def build_all(expression)
+        return if****@filte*****?
+
+        expression.parse(@filter)
+      end
+
+      def build_partial_min(expression)
+        expression.append_object(@key, Operator::PUSH, 1)
+        expression.append_operator(Operator::GET_VALUE, 1)
+        expression.append_constant(@target_range.min, Operator::PUSH, 1)
+        if @target_range.min_border == :include
+          expression.append_operator(Operator::GREATER_EQUAL, 2)
+        else
+          expression.append_operator(Operator::GREATER, 2)
+        end
+        if @filter
+          expression.parse(@filter)
+          expression.append_operator(Operator::AND, 2)
+        end
+      end
+
+      def build_partial_max(expression)
+        expression.append_object(@key, Operator::PUSH, 1)
+        expression.append_operator(Operator::GET_VALUE, 1)
+        expression.append_constant(@target_range.max, Operator::PUSH, 1)
+        if @target_range.max_border == :include
+          expression.append_operator(Operator::LESS_EQUAL, 2)
+        else
+          expression.append_operator(Operator::LESS, 2)
+        end
+        if @filter
+          expression.parse(@filter)
+          expression.append_operator(Operator::AND, 2)
+        end
+      end
+
+      def build_partial_min_and_max(expression)
+        between = Groonga::Context.instance["between"]
+        expression.append_object(between, Operator::PUSH, 1)
+        expression.append_object(@key, Operator::PUSH, 1)
+        expression.append_operator(Operator::GET_VALUE, 1)
+        expression.append_constant(@target_range.min, Operator::PUSH, 1)
+        expression.append_constant(@target_range.min_border,
+                                   Operator::PUSH, 1)
+        expression.append_constant(@target_range.max, Operator::PUSH, 1)
+        expression.append_constant(@target_range.max_border,
+                                   Operator::PUSH, 1)
+        expression.append_operator(Operator::CALL, 5)
+        if @filter
+          expression.parse(@filter)
+          expression.append_operator(Operator::AND, 2)
+        end
+      end
+    end
+  end
+end

  Modified: plugins/sharding/sources.am (+2 -1)
===================================================================
--- plugins/sharding/sources.am    2015-04-02 16:28:54 +0900 (11b5382)
+++ plugins/sharding/sources.am    2015-04-02 16:56:22 +0900 (5defd48)
@@ -1,4 +1,5 @@
 sharding_scripts =				\
 	logical_count.rb			\
 	logical_enumerator.rb			\
-	logical_range_filter.rb
+	logical_range_filter.rb			\
+	range_expression_builder.rb
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index