#200 and #201
[acts_as_ferret.git] / lib / remote_index.rb
blobe81b4510480fb3215ebe32335603383091d7dec8
1 require 'drb'
2 module ActsAsFerret
4   # This index implementation connects to a remote ferret server instance. It
5   # basically forwards all calls to the remote server.
6   class RemoteIndex < AbstractIndex
8     def initialize(config)
9       super
10       @server = DRbObject.new(nil, config[:remote])
11     end
13     def method_missing(method_name, *args)
14       args.unshift model_class_name
15       handle_drb_error { @server.send(method_name, *args) }
16     end
18     # Proxy any methods that require special return values in case of errors
19     { 
20       :highlight => [] 
21     }.each do |method_name, default_result|
22       define_method method_name do |*args|
23         args.unshift model_class_name
24         handle_drb_error(default_result) { @server.send method_name, *args }
25       end
26     end
28     def find_id_by_contents(q, options = {}, &proc)
29       total_hits, results = handle_drb_error([0, []]) { @server.find_id_by_contents(model_class_name, q, options) }
30       block_given? ? yield_results(total_hits, results, &proc) : [ total_hits, results ]
31     end
33     def id_multi_search(query, models, options, &proc)
34       total_hits, results = handle_drb_error([0, []]) { @server.id_multi_search(model_class_name, query, models, options) }
35       block_given? ? yield_results(total_hits, results, &proc) : [ total_hits, results ]
36     end
38     # add record to index
39     def add(record)
40       handle_drb_error { @server.add record.class.name, record.to_doc }
41     end
42     alias << add
44     private
46     def handle_drb_error(return_value_in_case_of_error = false)
47       yield
48     rescue DRb::DRbConnError => e
49       logger.error "DRb connection error: #{e}"
50       logger.warn e.backtrace.join("\n")
51       raise e if aaf_configuration[:raise_drb_errors]
52       return_value_in_case_of_error
53     end
55     def yield_results(total_hits, results)
56       results.each do |result|
57         yield result[:model], result[:id], result[:score], result[:data]
58       end
59       total_hits
60     end
62     def model_class_name
63       aaf_configuration[:class_name]
64     end
66   end
68 end