[Groonga-commit] groonga/fluent-plugin-droonga [master] Define QuerySorter class to resolve the dependencies among queries

アーカイブの一覧に戻る

Daijiro MORI null+****@clear*****
Thu Mar 28 23:13:22 JST 2013


Daijiro MORI	2013-03-28 23:13:22 +0900 (Thu, 28 Mar 2013)

  New Revision: 94f4223c8dc14505d8502d3c3d1a63de78692e49
  https://github.com/groonga/fluent-plugin-droonga/commit/94f4223c8dc14505d8502d3c3d1a63de78692e49

  Message:
    Define QuerySorter class to resolve the dependencies among queries

  Modified files:
    lib/droonga/worker.rb

  Modified: lib/droonga/worker.rb (+67 -32)
===================================================================
--- lib/droonga/worker.rb    2013-03-28 16:46:08 +0900 (b8d082e)
+++ lib/droonga/worker.rb    2013-03-28 23:13:22 +0900 (f165c0d)
@@ -16,10 +16,31 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 require "time"
-
+require 'tsort'
 require 'groonga'
 
 module Droonga
+  class QuerySorter
+    include TSort
+    def initialize()
+      @queries = {}
+    end
+
+    def add(name, sources=[])
+      @queries[name] = sources
+    end
+
+    def tsort_each_node(&block)
+      @queries.each_key(&block)
+    end
+
+    def tsort_each_child(node, &block)
+      if @queries[node]
+        @queries[node].each(&block)
+      end
+    end
+  end
+
   class Worker
     def initialize(database, queue_name)
       @context = Groonga::Context.new
@@ -42,44 +63,58 @@ module Droonga
 
     private
     def search(request)
-      result = {}
-      request["queries"].each do |name, query|
-        result[name] = search_query(query)
+      queries = request["queries"]
+      results = {}
+      outputs = {}
+      query_sorter = QuerySorter.new
+      queries.each do |name, query|
+        query_sorter.add(name, [query["source"]])
       end
-      result
+      query_sorter.tsort.each do |name|
+        if queries[name]
+          search_query(name, queries, results, outputs)
+        elsif @context[name]
+          results[name] = @context[name]
+        else
+          raise "undefined source(#{name}) was assigned"
+        end
+      end
+      outputs
     end
 
-    def search_query(query)
+    def search_query(name, queries, results, outputs)
       start_time = Time.now
-      source = @context[query["source"]]
-      offset = query["offset"] || 0
-      limit = query["limit"] || 10
-      columns = source.columns
-      attributes = columns.collect do |column|
-        {
-          "name" => column.local_name,
-          "type" => column.range.name,
-          "vector" => column.vector?,
-        }
-      end
-      column_names = columns.collect(&:local_name)
-      records = source.open_cursor(:offset => offset,
-                                   :limit => limit) do |cursor|
-        cursor.collect do |record|
-          column_names.collect do |name|
-            record[name]
+      query = queries[name]
+      source = results[query["source"]]
+      if query["output"]
+        offset = query["offset"] || 0
+        limit = query["limit"] || 10
+        columns = source.columns
+        attributes = columns.collect do |column|
+          {
+            "name" => column.local_name,
+            "type" => column.range.name,
+            "vector" => column.vector?,
+          }
+        end
+        column_names = columns.collect(&:local_name)
+        records = source.open_cursor(:offset => offset,
+                                     :limit => limit) do |cursor|
+          cursor.collect do |record|
+            column_names.collect do |name|
+              record[name]
+            end
           end
         end
+        elapsed_time = Time.now.to_f - start_time.to_f
+        outputs[name] = {
+          "count" => source.size,
+          "startTime" => start_time.iso8601,
+          "elapsedTime" => elapsed_time,
+          "attributes" => attributes,
+          "records" => records,
+        }
       end
-      elapsed_time = Time.now.to_f - start_time.to_f
-
-      {
-        "count" => source.size,
-        "startTime" => start_time.iso8601,
-        "elapsedTime" => elapsed_time,
-        "attributes" => attributes,
-        "records" => records,
-      }
     end
   end
 end
-------------- next part --------------
HTML����������������������������...
ダウンロード 



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