Class: Xapit::AbstractIndexer
- Inherits:
-
Object
- Object
- Xapit::AbstractIndexer
show all
- Defined in:
- lib/xapit/indexers/abstract_indexer.rb
Instance Method Summary
collapse
Constructor Details
Returns a new instance of AbstractIndexer.
3
4
5
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 3
def initialize(blueprint)
@blueprint = blueprint
end
|
Instance Method Details
#add_member(member) ⇒ Object
7
8
9
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 7
def add_member(member)
database.add_document(document_for(member))
end
|
#base_terms(member) ⇒ Object
42
43
44
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 42
def base_terms(member)
["C#{member.class}", "Q#{member.class}-#{member.id}"]
end
|
#document_for(member) ⇒ Object
15
16
17
18
19
20
21
22
23
24
25
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 15
def document_for(member)
document = Xapian::Document.new
document.data = "#{member.class}-#{member.id}"
index_text_attributes(member, document)
index_terms(other_terms(member), document)
values(member).each_with_index do |value, index|
document.add_value(index, value)
end
save_facet_options_for(member)
document
end
|
#facet_terms(member) ⇒ Object
59
60
61
62
63
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 59
def facet_terms(member)
@blueprint.facets.map do |facet|
facet.identifiers_for(member).map { |id| "F#{id}" }
end.flatten
end
|
#facet_values(member) ⇒ Object
98
99
100
101
102
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 98
def facet_values(member)
@blueprint.facets.map do |facet|
facet.identifiers_for(member).join("-")
end
end
|
#field_terms(member) ⇒ Object
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 46
def field_terms(member)
@blueprint.field_attributes.map do |name|
[member.send(name)].flatten.map do |value|
if value.kind_of? Time
value = value.to_i
elsif value.kind_of? Date
value = value.to_time.to_i
end
"X#{name}-#{value.to_s.downcase}"
end
end.flatten
end
|
#field_values(member) ⇒ Object
TODO remove duplication with sortable_values
90
91
92
93
94
95
96
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 90
def field_values(member)
@blueprint.field_attributes.map do |sortable|
value = member.send(sortable)
value = value.first if value.kind_of? Array
Xapit.serialize_value(value)
end
end
|
#index_terms(terms, document) ⇒ Object
27
28
29
30
31
32
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 27
def index_terms(terms, document)
terms.each do |term|
document.add_term(term)
database.add_spelling(term) if Config.spelling?
end
end
|
#index_text_attributes(member, document) ⇒ Object
34
35
36
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 34
def index_text_attributes(member, document)
end
|
#other_terms(member) ⇒ Object
38
39
40
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 38
def other_terms(member)
base_terms(member) + field_terms(member) + facet_terms(member)
end
|
#save_facet_options_for(member) ⇒ Object
104
105
106
107
108
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 104
def save_facet_options_for(member)
@blueprint.facets.each do |facet|
facet.save_facet_options_for(member)
end
end
|
#sortable_values(member) ⇒ Object
81
82
83
84
85
86
87
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 81
def sortable_values(member)
@blueprint.sortable_attributes.map do |sortable|
value = member.send(sortable)
value = value.first if value.kind_of? Array
Xapit.serialize_value(value)
end
end
|
#text_terms(member) ⇒ Object
used primarily by search similar functionality
66
67
68
69
70
71
72
73
74
75
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 66
def text_terms(member) @blueprint.text_attributes.map do |name, options|
content = member.send(name).to_s
if options[:proc]
options[:proc].call(content).reject(&:blank?).map(&:to_s).map(&:downcase)
else
content.scan(/\w+/u).map(&:downcase)
end
end.flatten
end
|
#update_member(member) ⇒ Object
11
12
13
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 11
def update_member(member)
database.replace_document("Q#{member.class}-#{member.id}", document_for(member))
end
|
#values(member) ⇒ Object
77
78
79
|
# File 'lib/xapit/indexers/abstract_indexer.rb', line 77
def values(member)
facet_values(member) + sortable_values(member) + field_values(member)
end
|