[Groonga-commit] groonga/groonga at 989500d [master] logical_select: extract as methods

Back to archive index

Kouhei Sutou null+****@clear*****
Tue Jun 30 00:10:30 JST 2015


Kouhei Sutou	2015-06-30 00:10:30 +0900 (Tue, 30 Jun 2015)

  New Revision: 989500d65e82ee9a36183a4b35627bb05decf0be
  https://github.com/groonga/groonga/commit/989500d65e82ee9a36183a4b35627bb05decf0be

  Message:
    logical_select: extract as methods

  Modified files:
    plugins/sharding/logical_select.rb

  Modified: plugins/sharding/logical_select.rb (+71 -56)
===================================================================
--- plugins/sharding/logical_select.rb    2015-06-30 00:10:09 +0900 (693ca1b)
+++ plugins/sharding/logical_select.rb    2015-06-30 00:10:30 +0900 (da6dbe5)
@@ -22,10 +22,6 @@ module Groonga
                ])
 
       def run_body(input)
-        output_columns = input[:output_columns] || "_key, *"
-        drilldown_output_columns = input[:drilldown_output_columns]
-        drilldown_output_columns ||= "_key, _nsubrecs"
-
         enumerator = LogicalEnumerator.new("logical_select", input)
 
         context = ExecuteContext.new(input)
@@ -37,65 +33,79 @@ module Groonga
           drilldowns = context.drilldown.result_sets
           n_results += drilldowns.size
 
-          result_sets = context.result_sets
-          n_hits = 0
-          n_elements = 2 # for N hits and columns
-          result_sets.each do |result_set|
-            n_hits += result_set.size
-            n_elements += result_set.size
+          writer.array("RESULT", n_results) do
+            write_records(writer, context)
+            write_drilldowns(writer, context, drilldowns)
           end
+        ensure
+          context.close
+        end
+      end
 
-          writer.array("RESULT", n_results) do
-            writer.array("RESULTSET", n_elements) do
-              writer.array("NHITS", 1) do
-                writer.write(n_hits)
-              end
-              first_result_set = result_sets.first
-              if first_result_set
-                writer.write_table_columns(first_result_set, output_columns)
-              end
+      private
+      def write_records(writer, context)
+        result_sets = context.result_sets
 
-              current_offset = context.offset
-              current_offset += n_hits if current_offset < 0
-              current_limit = context.limit
-              current_limit += n_hits + 1 if current_limit < 0
-              options = {
-                :offset => current_offset,
-                :limit => current_limit,
-              }
-              result_sets.each do |result_set|
-                if result_set.size > current_offset
-                  writer.write_table_records(result_set, output_columns, options)
-                end
-                if current_offset > 0
-                  current_offset = [current_offset - result_set.size, 0].max
-                end
-                current_limit -= result_set.size
-                break if current_limit <= 0
-                options[:offset] = current_offset
-                options[:limit] = current_limit
-              end
+        n_hits = 0
+        n_elements = 2 # for N hits and columns
+        result_sets.each do |result_set|
+          n_hits += result_set.size
+          n_elements += result_set.size
+        end
+
+        output_columns = context.output_columns
+
+        writer.array("RESULTSET", n_elements) do
+          writer.array("NHITS", 1) do
+            writer.write(n_hits)
+          end
+          first_result_set = result_sets.first
+          if first_result_set
+            writer.write_table_columns(first_result_set, output_columns)
+          end
+
+          current_offset = context.offset
+          current_offset += n_hits if current_offset < 0
+          current_limit = context.limit
+          current_limit += n_hits + 1 if current_limit < 0
+          options = {
+            :offset => current_offset,
+            :limit => current_limit,
+          }
+          result_sets.each do |result_set|
+            if result_set.size > current_offset
+              writer.write_table_records(result_set, output_columns, options)
+            end
+            if current_offset > 0
+              current_offset = [current_offset - result_set.size, 0].max
             end
+            current_limit -= result_set.size
+            break if current_limit <= 0
+            options[:offset] = current_offset
+            options[:limit] = current_limit
+          end
+        end
+      end
 
-            drilldown_options = {
-              :offset => context.drilldown.output_offset,
-              :limit  => context.drilldown.limit,
-            }
-            drilldowns.each do |drilldown|
-              n_drilldown_elements = 2 # for N hits and columns
-              n_drilldown_elements += drilldown.size
-              writer.array("RESULTSET", n_drilldown_elements) do
-                writer.array("NHITS", 1) do
-                  writer.write(drilldown.size)
-                end
-                writer.write_table_columns(drilldown, drilldown_output_columns)
-                writer.write_table_records(drilldown, drilldown_output_columns,
-                                           drilldown_options)
-              end
+      def write_drilldowns(writer, context, drilldowns)
+        output_columns = context.drilldown.output_columns
+
+        options = {
+          :offset => context.drilldown.output_offset,
+          :limit  => context.drilldown.limit,
+        }
+
+        drilldowns.each do |drilldown|
+          n_elements = 2 # for N hits and columns
+          n_elements += drilldown.size
+          writer.array("RESULTSET", n_elements) do
+            writer.array("NHITS", 1) do
+              writer.write(drilldown.size)
             end
+            writer.write_table_columns(drilldown, output_columns)
+            writer.write_table_records(drilldown, output_columns,
+                                       options)
           end
-        ensure
-          context.close
         end
       end
 
@@ -116,6 +126,7 @@ module Groonga
         attr_reader :offset
         attr_reader :limit
         attr_reader :sort_keys
+        attr_reader :output_columns
         attr_reader :result_sets
         attr_reader :drilldown
         def initialize(input)
@@ -125,6 +136,7 @@ module Groonga
           @offset = (@input[:offset] || 0).to_i
           @limit = (@input[:limit] || 10).to_i
           @sort_keys = parse_keys(@input[:sortby])
+          @output_columns = @input[:output_columns] || "_key, *"
 
           @result_sets = []
 
@@ -147,6 +159,7 @@ module Groonga
         attr_reader :offset
         attr_reader :limit
         attr_reader :sort_keys
+        attr_reader :output_columns
         attr_reader :output_offset
         attr_reader :result_sets
         attr_reader :unsorted_result_sets
@@ -156,6 +169,8 @@ module Groonga
           @offset = (@input[:drilldown_offset] || 0).to_i
           @limit = (@input[:drilldown_limit] || 10).to_i
           @sort_keys = parse_keys(@input[:drilldown_sortby])
+          @output_columns = @input[:drilldown_output_columns]
+          @output_columns ||= "_key, _nsubrecs"
 
           if @sort_keys.empty?
             @output_offset = @offset
-------------- next part --------------
HTML����������������������������...
Download 



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