dusen 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
1
3
|
module Dusen
|
2
4
|
module ActiveRecord
|
3
5
|
class SearchText < ::ActiveRecord::Base
|
@@ -22,14 +24,25 @@ module Dusen
|
|
22
24
|
scoped(:conditions => { :stale => true })
|
23
25
|
end
|
24
26
|
|
25
|
-
def self.
|
27
|
+
def self.synchronize_model(model)
|
26
28
|
invalid_index_records = for_model(model).invalid
|
27
|
-
|
28
|
-
|
29
|
+
source_ids = Util.collect_column(invalid_index_records, :source_id)
|
30
|
+
pending_source_ids = Set.new(source_ids)
|
31
|
+
source_records = Util.append_scope_conditions(model, :id => source_ids)
|
32
|
+
source_records.find_in_batches do |batch|
|
33
|
+
batch.each do |source_record|
|
34
|
+
source_record.index_search_text
|
35
|
+
pending_source_ids.delete(source_record.id)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
if pending_source_ids.present?
|
39
|
+
invalid_index_records.delete_all(:source_id => pending_source_ids.to_a)
|
40
|
+
end
|
41
|
+
true
|
29
42
|
end
|
30
43
|
|
31
44
|
def self.match(model, words)
|
32
|
-
|
45
|
+
synchronize_model(model) if model.search_text?
|
33
46
|
Dusen::Util.append_scope_conditions(
|
34
47
|
model,
|
35
48
|
:id => matching_source_ids(model, words)
|
data/lib/dusen/version.rb
CHANGED
@@ -12,6 +12,14 @@ shared_examples_for 'model with search syntax' do
|
|
12
12
|
subject.search('Abraham').to_a.should == [match]
|
13
13
|
end
|
14
14
|
|
15
|
+
it 'should not find stale text after fields were updated (bugfix)' do
|
16
|
+
match = subject.create!(:name => 'Abraham')
|
17
|
+
no_match = subject.create!(:name => 'Elizabath')
|
18
|
+
match.update_attributes!(:name => 'Johnny')
|
19
|
+
subject.search('Abraham').to_a.should be_empty
|
20
|
+
subject.search('Johnny').to_a.should == [match]
|
21
|
+
end
|
22
|
+
|
15
23
|
it 'should AND multiple words' do
|
16
24
|
match = subject.create!(:name => 'Abraham Lincoln')
|
17
25
|
no_match = subject.create!(:name => 'Abraham')
|
@@ -84,14 +92,31 @@ describe ActiveRecord::Base do
|
|
84
92
|
it 'should be shadowed by a Dusen::ActiveRecord::SearchText, which is created, updated and destroyed with the record' do
|
85
93
|
user = User::WithFulltext.create!(:name => 'name', :email => 'email', :city => 'city')
|
86
94
|
User::WithFulltext.index_search_texts
|
87
|
-
|
95
|
+
|
96
|
+
search_texts = Dusen::ActiveRecord::SearchText.all
|
97
|
+
search_texts.size.should == 1
|
98
|
+
search_texts[0].words.should == 'name email city'
|
99
|
+
search_texts[0].should_not be_stale
|
100
|
+
|
88
101
|
user.reload
|
89
102
|
user.update_attributes!(:email => 'changed_email')
|
103
|
+
|
104
|
+
search_texts = Dusen::ActiveRecord::SearchText.all
|
105
|
+
search_texts.size.should == 1
|
106
|
+
search_texts[0].words.should == 'name email city'
|
107
|
+
search_texts[0].should be_stale
|
108
|
+
|
90
109
|
User::WithFulltext.index_search_texts
|
91
|
-
|
110
|
+
|
111
|
+
search_texts = Dusen::ActiveRecord::SearchText.all
|
112
|
+
search_texts.size.should == 1
|
113
|
+
search_texts[0].words.should == 'name changed_email city'
|
114
|
+
search_texts[0].should_not be_stale
|
115
|
+
|
92
116
|
user.destroy
|
93
|
-
|
94
|
-
Dusen::ActiveRecord::SearchText.
|
117
|
+
|
118
|
+
search_texts = Dusen::ActiveRecord::SearchText.all
|
119
|
+
search_texts.size.should be_zero
|
95
120
|
end
|
96
121
|
|
97
122
|
describe 'indexing fields from associated records' do
|
@@ -20,4 +20,24 @@ describe Dusen::ActiveRecord::SearchText do
|
|
20
20
|
|
21
21
|
end
|
22
22
|
|
23
|
+
describe '.synchronize_model' do
|
24
|
+
|
25
|
+
it 'should refresh stale index records' do
|
26
|
+
user = User::WithFulltext.create!(:name => 'Abraham')
|
27
|
+
user.search_text_record.should be_stale
|
28
|
+
Dusen::ActiveRecord::SearchText.synchronize_model(User::WithFulltext)
|
29
|
+
user.search_text_record(true).should_not be_stale
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should remove index records that no longer map to a model record' do
|
33
|
+
user = User::WithFulltext.create!
|
34
|
+
Dusen::ActiveRecord::SearchText.count.should == 1
|
35
|
+
User::WithFulltext.delete_all
|
36
|
+
Dusen::ActiveRecord::SearchText.count.should == 1
|
37
|
+
Dusen::ActiveRecord::SearchText.synchronize_model(User::WithFulltext)
|
38
|
+
Dusen::ActiveRecord::SearchText.count.should be_zero
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
23
43
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dusen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 1
|
10
|
+
version: 0.4.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Henning Koch
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2013-01-03 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|