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