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