Class: Dusen::ActiveRecord::SearchText
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Dusen::ActiveRecord::SearchText
- Defined in:
- lib/dusen/active_record/search_text.rb
Class Method Summary collapse
- .for_model(model) ⇒ Object
- .invalid ⇒ Object
- .match(model, phrases) ⇒ Object
- .matching_source_ids(model, phrases) ⇒ Object
- .synchronize_model(model) ⇒ Object
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 |
.invalid ⇒ Object
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 |