Class: Dusen::ActiveRecord::SearchText

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
lib/dusen/active_record/search_text.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.for_model(model) ⇒ Object



20
21
22
# File 'lib/dusen/active_record/search_text.rb', line 20

def self.for_model(model)
  Util.append_scope_conditions(scoped({}), :source_type => model.name)
end

.invalidObject



24
25
26
# File 'lib/dusen/active_record/search_text.rb', line 24

def self.invalid
  scoped(:conditions => { :stale => true })
end

.match(model, phrases) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/dusen/active_record/search_text.rb', line 45

def self.match(model, phrases)
  synchronize_model(model) if model.search_text?
  Dusen::Util.append_scope_conditions(
    model,
    :id => matching_source_ids(model, phrases)
  )
end

.matching_source_ids(model, phrases) ⇒ Object



53
54
55
56
57
58
59
60
61
# File 'lib/dusen/active_record/search_text.rb', line 53

def self.matching_source_ids(model, phrases)
  phrases = phrases.collect { |phrase| Util.normalize_word_boundaries(phrase) }
  conditions = [
    'MATCH (words) AGAINST (? IN BOOLEAN MODE)',
    Dusen::Util.boolean_fulltext_query(phrases)
  ]
  matching_texts = Dusen::Util.append_scope_conditions(for_model(model), conditions)
  matching_texts.collect_column(:source_id)
end

.synchronize_model(model) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/dusen/active_record/search_text.rb', line 28

def self.synchronize_model(model)
  model = model.origin_class
  invalid_index_records = for_model(model).invalid
  source_ids = invalid_index_records.collect_column(:source_id)
  pending_source_ids = Set.new(source_ids)
  model.find_in_batches(:conditions => { :id => source_ids } ) do |batch|
    batch.each do |source_record|
      source_record.index_search_text
      pending_source_ids.delete(source_record.id)
    end
  end
  if pending_source_ids.present?
    invalid_index_records.delete_all(:source_id => pending_source_ids.to_a)
  end
  true
end

Instance Method Details

#invalidate!Object



16
17
18
# File 'lib/dusen/active_record/search_text.rb', line 16

def invalidate!
  update_attributes!(:stale => true)
end

#update_words!(text) ⇒ Object



11
12
13
14
# File 'lib/dusen/active_record/search_text.rb', line 11

def update_words!(text)
  text = Util.normalize_word_boundaries(text)
  update_attributes!(:words => text, :stale => false)
end