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



38
39
40
# File 'lib/xapit/indexers/abstract_indexer.rb', line 38

def base_terms(member)
  ["C#{member.class}", "Q#{member.class}-#{member.id}"]
end

#document_for(member) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
# File 'lib/xapit/indexers/abstract_indexer.rb', line 11

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



55
56
57
58
59
# File 'lib/xapit/indexers/abstract_indexer.rb', line 55

def facet_terms(member)
  @blueprint.facets.map do |facet|
    facet.identifiers_for(member).map { |id| "F#{id}" }
  end.flatten
end

#facet_values(member) ⇒ Object



83
84
85
86
87
# File 'lib/xapit/indexers/abstract_indexer.rb', line 83

def facet_values(member)
  @blueprint.facets.map do |facet|
    facet.identifiers_for(member).join("-")
  end
end

#field_terms(member) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/xapit/indexers/abstract_indexer.rb', line 42

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

#index_terms(terms, document) ⇒ Object



23
24
25
26
27
28
# File 'lib/xapit/indexers/abstract_indexer.rb', line 23

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



30
31
32
# File 'lib/xapit/indexers/abstract_indexer.rb', line 30

def index_text_attributes(member, document)
  # to be overridden by subclass
end

#other_terms(member) ⇒ Object



34
35
36
# File 'lib/xapit/indexers/abstract_indexer.rb', line 34

def other_terms(member)
  base_terms(member) + field_terms(member) + facet_terms(member)
end

#save_facet_options_for(member) ⇒ Object



89
90
91
92
93
# File 'lib/xapit/indexers/abstract_indexer.rb', line 89

def save_facet_options_for(member)
  @blueprint.facets.each do |facet|
    facet.save_facet_options_for(member)
  end
end

#sortable_values(member) ⇒ Object



77
78
79
80
81
# File 'lib/xapit/indexers/abstract_indexer.rb', line 77

def sortable_values(member)
  @blueprint.sortable_attributes.map do |sortable|
    member.send(sortable).to_s.downcase
  end
end

#text_terms(member) ⇒ Object

used primarily by search similar functionality



62
63
64
65
66
67
68
69
70
71
# File 'lib/xapit/indexers/abstract_indexer.rb', line 62

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

#values(member) ⇒ Object



73
74
75
# File 'lib/xapit/indexers/abstract_indexer.rb', line 73

def values(member)
  facet_values(member) + sortable_values(member)
end