Skip to content

Commit

Permalink
Post output messages from inside the handler
Browse files Browse the repository at this point in the history
  • Loading branch information
daijiro committed Apr 17, 2013
1 parent 738d815 commit c9a4dda
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 29 deletions.
4 changes: 4 additions & 0 deletions lib/droonga/handler.rb
Expand Up @@ -52,6 +52,10 @@ def initialize(worker)
@context = @worker.context
end

def post(body, destination=nil)
@worker.post(body, destination)
end

def shutdown
end

Expand Down
34 changes: 17 additions & 17 deletions lib/droonga/plugin/handler_search.rb
Expand Up @@ -39,25 +39,25 @@ def initialize(name)
def search(request)
queries = request["queries"]
outputs = {}
return outputs if queries.nil?

query_sorter = QuerySorter.new
queries.each do |name, query|
query_sorter.add(name, [query["source"]])
end
results = {}
query_sorter.tsort.each do |name|
if queries[name]
searcher = QuerySearcher.new(@context, queries[name])
results[name] = searcher.search(results)
outputs[name] = searcher.format if searcher.need_output?
elsif @context[name]
results[name] = @context[name]
else
raise UndefinedSourceError.new(name)
if queries
query_sorter = QuerySorter.new
queries.each do |name, query|
query_sorter.add(name, [query["source"]])
end
results = {}
query_sorter.tsort.each do |name|
if queries[name]
searcher = QuerySearcher.new(@context, queries[name])
results[name] = searcher.search(results)
outputs[name] = searcher.format if searcher.need_output?
elsif @context[name]
results[name] = @context[name]
else
raise UndefinedSourceError.new(name)
end
end
end
outputs
post(outputs)
end

class QuerySorter
Expand Down
21 changes: 12 additions & 9 deletions lib/droonga/worker.rb
Expand Up @@ -70,24 +70,27 @@ def add_handler(name)
@handlers << plugin.instantiate(self)
end

def process_message(envelope)
@envelope = envelope
command = envelope["type"]
handler = find_handler(command)
return unless handler
result = handler.handle(command, envelope["body"])
output = get_output
def post(body, destination=nil)
output = get_output(destination)
if output
response = {
inReplyTo: envelope["id"],
statusCode: 200,
type: (envelope["type"] || "") + ".result",
body: result
body: body
}
output.post("message", response)
end
end

def process_message(envelope)
@envelope = envelope
command = envelope["type"]
handler = find_handler(command)
return unless handler
handler.handle(command, envelope["body"])
end

private
def post_message(envelope)
message = envelope.to_msgpack
Expand Down Expand Up @@ -161,7 +164,7 @@ def find_handler(command)
end
end

def get_output
def get_output(destination)
receiver = @envelope["replyTo"]
return nil unless receiver
unless receiver =~ /\A(.*):(\d+)\/(.*?)(\?.+)?\z/
Expand Down
12 changes: 9 additions & 3 deletions test/plugin/test_handler_search.rb
Expand Up @@ -16,11 +16,15 @@
require "droonga/plugin/handler_search"

class Worker
attr_reader :context
attr_reader :context, :body

def initialize()
@context = Groonga::Context.default
end

def post(body, destination=nil)
@body = body
end
end

class SearchHandlerTest < Test::Unit::TestCase
Expand All @@ -46,15 +50,17 @@ def teardown_database
end

def setup_handler
@handler = Droonga::SearchHandler.new(Worker.new)
@worker = Worker.new
@handler = Droonga::SearchHandler.new(@worker)
end

def teardown_handler
@handler = nil
end

def search(request)
normalize_result_set(@handler.search(request))
@handler.search(request)
normalize_result_set(@worker.body)
end

def normalize_result_set(result_set)
Expand Down

0 comments on commit c9a4dda

Please sign in to comment.