[Groonga-commit] groonga/fluent-plugin-droonga [master] Support "condition" parameter

Back to archive index

Daijiro MORI null+****@clear*****
Tue Apr 2 15:35:40 JST 2013


Daijiro MORI	2013-04-02 15:35:40 +0900 (Tue, 02 Apr 2013)

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

  Message:
    Support "condition" parameter

  Modified files:
    lib/droonga/plugin/handler_search.rb

  Modified: lib/droonga/plugin/handler_search.rb (+70 -13)
===================================================================
--- lib/droonga/plugin/handler_search.rb    2013-04-01 15:18:14 +0900 (7f8e368)
+++ lib/droonga/plugin/handler_search.rb    2013-04-02 15:35:40 +0900 (e1e8910)
@@ -45,22 +45,80 @@ module Droonga
       outputs
     end
 
-    def search_query(name, queries, results, outputs)
-      start_time = Time.now
-      query = queries[name]
-      source = results[query["source"]]
-      if query["query"]
-        options = query["options"] || {}
-        if query["matchTo"]
+    def parseCondition(source, expression, condition)
+      if condition.is_a? String
+        expression.parse(condition, :syntax => :script)
+      elsif condition.is_a? Hash
+        options = {}
+        if condition["matchTo"]
           matchTo = Groonga::Expression.new(context: @context)
           matchTo.define_variable(:domain => source)
-          matchTo.parse(query["matchTo"], :syntax => :script)
+          matchTo.parse(condition["matchTo"], :syntax => :script)
           options[:default_column] = matchTo
         end
-        query_expression = Groonga::Expression.new(context: @context)
-        query_expression.define_variable(:domain => source)
-        query_expression.parse(query["query"], options)
-        results[name] = source.select(query_expression)
+        if condition["query"]
+          options[:syntax] = :query
+          if condition["default_operator"]
+            case condition["default_operator"]
+            when "||"
+              options[:default_operator] = Groonga::Operator::OR
+            when "&&"
+              options[:default_operator] = Groonga::Operator::AND
+            when "-"
+              options[:default_operator] = Groonga::Operator::BUT
+            else
+              raise "undefined operator assigned #{condition["default_operator"]}"
+            end
+          end
+          if condition["allow_pragma"]
+            options[:allow_pragma] = true
+          end
+          if condition["allow_column"]
+            options[:allow_column] = true
+          end
+          expression.parse(condition["query"], options)
+        elsif condition["script"]
+          # "script" is ignored when "query" is also assigned.
+          options[:syntax] = :script
+          if condition["allow_update"]
+            options[:allow_update] = true
+          end
+          expression.parse(condition["script"], options)
+        else
+          raise "neither 'query' nor 'script' assigned in #{condition.inspect}"
+        end
+      elsif condition.is_a? Array
+        case condition[0]
+        when "||"
+          operator = Groonga::Operator::OR
+        when "&&"
+          operator = Groonga::Operator::AND
+        when "-"
+          operator = Groonga::Operator::BUT
+        else
+          raise "undefined operator assigned #{condition[0]}"
+        end
+        if condition[1]
+          parseCondition(source, expression, condition[1])
+        end
+        condition[2..-1].each do |element|
+          parseCondition(source, expression, element)
+          expression.append_operation(operator, 2)
+        end
+      else
+        raise "unacceptable object #{condition.inspect} assigned"
+      end
+    end
+
+    def search_query(name, queries, results, outputs)
+      start_time = Time.now
+      query = queries[name]
+      source = results[query["source"]]
+      if query["condition"]
+        expression = Groonga::Expression.new(context: @context)
+        expression.define_variable(:domain => source)
+        parseCondition(source, expression, query["condition"])
+        results[name] = source.select(expression)
       else
         results[name] = source
       end
@@ -88,7 +146,6 @@ module Droonga
               cursor.collect do |record|
                 values = {}
                 attrs.collect do |attr|
-                  $log.info attr[:source]
                   values[attr[:label]] = record[attr[:source]]
                 end
                 values
-------------- next part --------------
HTML����������������������������...
Download 



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