Class: Xapit::AbstractIndexer

Inherits:
Object
  • Object
show all
Defined in:
lib/xapit/indexers/abstract_indexer.rb

Direct Known Subclasses

ClassicIndexer, SimpleIndexer

Instance Method Summary collapse

Constructor Details

#initialize(blueprint) ⇒ AbstractIndexer

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)
  # to be overridden by subclass
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) # REFACTORME some duplicaiton with simple indexer
  @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