multi_index.rb
2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
module ActsAsFerret #:nodoc:
# this class is not threadsafe
class MultiIndex
def initialize(model_classes, options = {})
@model_classes = model_classes
# ensure all models indexes exist
@model_classes.each { |m| m.aaf_index.ensure_index_exists }
default_fields = @model_classes.inject([]) do |fields, c|
fields + [ c.aaf_configuration[:ferret][:default_field] ].flatten
end
@options = {
:default_field => default_fields
}.update(options)
end
def search(query, options={})
#puts "querystring: #{query.to_s}"
query = process_query(query)
#puts "parsed query: #{query.to_s}"
searcher.search(query, options)
end
def search_each(query, options = {}, &block)
query = process_query(query)
searcher.search_each(query, options, &block)
end
# checks if all our sub-searchers still are up to date
def latest?
return false unless @reader
# segfaults with 0.10.4 --> TODO report as bug @reader.latest?
@sub_readers.each do |r|
return false unless r.latest?
end
true
end
def searcher
ensure_searcher
@searcher
end
def doc(i)
searcher[i]
end
alias :[] :doc
def query_parser
@query_parser ||= Ferret::QueryParser.new(@options)
end
def process_query(query)
query = query_parser.parse(query) if query.is_a?(String)
return query
end
def close
@searcher.close if @searcher
@reader.close if @reader
end
protected
def ensure_searcher
unless latest?
@sub_readers = @model_classes.map { |clazz|
begin
reader = Ferret::Index::IndexReader.new(clazz.aaf_configuration[:index_dir])
rescue Exception
raise "error opening #{clazz.aaf_configuration[:index_dir]}: #{$!}"
end
}
close
@reader = Ferret::Index::IndexReader.new(@sub_readers)
@searcher = Ferret::Search::Searcher.new(@reader)
end
end
end # of class MultiIndex
end