[Groonga-commit] groonga/groonga at 5ebfe82 [master] sharding: partially support dynamic column dependency resolver

Back to archive index

Kouhei Sutou null+****@clear*****
Mon May 21 16:29:18 JST 2018


Kouhei Sutou	2018-05-21 16:29:18 +0900 (Mon, 21 May 2018)

  New Revision: 5ebfe820614fe65e457f5c814c8f42601a9c5ad6
  https://github.com/groonga/groonga/commit/5ebfe820614fe65e457f5c814c8f42601a9c5ad6

  Message:
    sharding: partially support dynamic column dependency resolver
    
    TODO:
    
      * More robust "value" parser

  Modified files:
    plugins/sharding/dynamic_columns.rb

  Modified: plugins/sharding/dynamic_columns.rb (+53 -10)
===================================================================
--- plugins/sharding/dynamic_columns.rb    2018-05-21 16:28:43 +0900 (3b1226855)
+++ plugins/sharding/dynamic_columns.rb    2018-05-21 16:29:18 +0900 (9c76f19d2)
@@ -3,9 +3,9 @@ module Groonga
     class DynamicColumns
       class << self
         def parse(input)
-          initial_contexts = []
-          filtered_contexts = []
-          output_contexts = []
+          initial_contexts = {}
+          filtered_contexts = {}
+          output_contexts = {}
           labeled_arguments = LabeledArguments.new(input, /columns?/)
           labeled_arguments.each do |label, arguments|
             contexts = nil
@@ -19,12 +19,12 @@ module Groonga
             else
               next
             end
-            contexts << DynamicColumnExecuteContext.new(label, arguments)
+            contexts[label] = DynamicColumnExecuteContext.new(label, arguments)
           end
 
-          new(initial_contexts,
-              filtered_contexts,
-              output_contexts)
+          new(DynamicColumnExecuteContexts.new(initial_contexts),
+              DynamicColumnExecuteContexts.new(filtered_contexts),
+              DynamicColumnExecuteContexts.new(output_contexts))
         end
       end
 
@@ -49,15 +49,15 @@ module Groonga
       end
 
       def each_initial(&block)
-        @initial_contexts.each(&block)
+        @initial_contexts.tsort_each(&block)
       end
 
       def each_filtered(&block)
-        @filtered_contexts.each(&block)
+        @filtered_contexts.tsort_each(&block)
       end
 
       def each_output(&block)
-        @output_contexts.each(&block)
+        @output_contexts.tsort_each(&block)
       end
 
       def each(&block)
@@ -93,6 +93,49 @@ module Groonga
       end
     end
 
+    class DynamicColumnExecuteContexts
+      include Enumerable
+      include TSort
+
+      def initialize(contexts)
+        @contexts = contexts
+        @dependencies = {}
+        @contexts.each do |label, context|
+          dependencies = []
+          # TODO: Too rough.
+          context.value.split(/[ \(\),]+/).each do |component|
+            depended_context = @contexts[component]
+            dependencies << depended_context if depended_context
+          end
+          context.window_sort_keys.each do |key|
+            depended_context = @contexts[key.gsub(/\A-/, "")]
+            dependencies << depended_context if depended_context
+          end
+          context.window_group_keys.each do |key|
+            depended_context = @contexts[key]
+            dependencies << depended_context if depended_context
+          end
+          @dependencies[label] = dependencies
+        end
+      end
+
+      def empty?
+        @contexts.empty?
+      end
+
+      def each(&block)
+        @contexts.each_value(&block)
+      end
+
+      def tsort_each_node(&block)
+        @contexts.each_value(&block)
+      end
+
+      def tsort_each_child(context, &block)
+        @dependencies[context.label].each(&block)
+      end
+    end
+
     class DynamicColumnExecuteContext
       include KeysParsable
 
-------------- next part --------------
HTML����������������������������...
URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180521/d4f4a877/attachment-0001.htm 



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