[Groonga-commit] droonga/fluent-plugin-droonga at 0559b0c [master] Cleanup needless Keyword, Query, Route, and Subcriber records on unsubscribe

Back to archive index

YUKI Hiroshi null+****@clear*****
Thu Oct 31 15:29:38 JST 2013


YUKI Hiroshi	2013-10-31 15:29:38 +0900 (Thu, 31 Oct 2013)

  New Revision: 0559b0cb705fea16fea4c77f2e34b3273de904b8
  https://github.com/droonga/fluent-plugin-droonga/commit/0559b0cb705fea16fea4c77f2e34b3273de904b8

  Message:
    Cleanup needless Keyword, Query, Route, and Subcriber records on unsubscribe

  Modified files:
    lib/droonga/watcher.rb

  Modified: lib/droonga/watcher.rb (+67 -12)
===================================================================
--- lib/droonga/watcher.rb    2013-10-31 12:49:31 +0900 (e9ebf07)
+++ lib/droonga/watcher.rb    2013-10-31 15:29:38 +0900 (8c15deb)
@@ -29,13 +29,11 @@ module Droonga
       query      = request[:query]
       route      = request[:route]
 
-      query_table = @context["Query"]
       query_record = query_table[query]
       unless query_record
         keywords = pick_keywords([], condition)
         query_record = query_table.add(query, :keywords => keywords)
       end
-      subscriber_table = @context["Subscriber"]
       subscriber_record = subscriber_table[subscriber]
       if subscriber_record
         subscriptions = subscriber_record.subscriptions.collect do |query|
@@ -57,24 +55,25 @@ module Droonga
       subscriber = request[:subscriber]
       query      = request[:query]
 
-      subscriber_table = @context["Subscriber"]
       subscriber_record = subscriber_table[subscriber]
       return unless subscriber_record
 
-      query_table = @context["Query"]
       if query.nil?
-        subscriber_record.delete
+        delete_subscriber(subscriber_record)
       else
         query_record = query_table[query]
         return unless query_record
 
-        subscriptions = subscriber_record.subscriptions.select do |query|
+        subscriptions = subscriber_record.subscriptions
+        new_subscriptions = subscriptions.select do |query|
           query != query_record
         end
-        if subscriptions.empty?
-          subscriber_record.delete
+
+        if new_subscriptions.empty?
+          delete_subscriber(subscriber_record)
         else
-          subscriber_record.subscriptions = subscriptions
+          subscriber_record.subscriptions = new_subscriptions
+          sweep_orphan_queries(subscriptions)
         end
       end
     end
@@ -108,8 +107,8 @@ module Droonga
       trimmed = body.strip
       candidates = {}
       # FIXME scan reports the longest keyword matched only
-      @context["Keyword"].scan(trimmed).each do |keyword, word, start, length|
-        @context["Query"].select do |query|
+      keyword_table.scan(trimmed).each do |keyword, word, start, length|
+        query_table.select do |query|
           query.keywords =~ keyword
         end.each do |record|
           candidates[record.key] ||= []
@@ -168,7 +167,7 @@ module Droonga
     def publish(hits, request)
       routes = {}
       hits.each do |query|
-        @context["Subscriber"].select do |subscriber|
+        subscriber_table.select do |subscriber|
           subscriber.subscriptions =~ query
         end.each do |subscriber|
           routes[subscriber.route.key] ||= []
@@ -179,5 +178,61 @@ module Droonga
         yield(route, subscribers)
       end
     end
+
+    private
+    def subscriber_table
+      @subscriber_table ||= @context["Subscriber"]
+    end
+
+    def query_table
+      @query_table ||= @context["Query"]
+    end
+
+    def keyword_table
+      @keyword_table ||= @context["Keyword"]
+    end
+
+    def delete_subscriber(subscriber)
+      queries = subscriber.subscriptions
+      route = subscriber.route
+      subscriber.delete
+      sweep_orphan_queries(queries)
+      sweep_orphan_route(route)
+    end
+
+    def delete_query(query)
+      keywords = query.keywords
+      query.delete
+      sweep_orphan_keywords(keywords)
+    end
+
+    def sweep_orphan_queries(queries)
+      queries.each do |query|
+        if subscriber_table.select do |subscriber|
+             subscriber.queries @ query
+           end.empty?
+          delete_query(query)
+        end
+      end
+    end
+
+    def sweep_orphan_keywords(keywords)
+      keywords.each do |keyword|
+        if query_table.select do |query|
+             query.keywords @ keyword
+           end.empty?
+          keyword.delete
+        end
+      end
+    end
+
+    def sweep_orphan_route(route)
+      subscriber_table = @contest["Subscriber"]
+      if subscriber_table.select do |subscriber|
+           subscriber.route == route
+         end.empty?
+        route.delete
+      end
+    end
   end
 end
-------------- next part --------------
HTML����������������������������...
Download 



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