outoftime-sunspot 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -0
- data/TODO +6 -1
- data/VERSION.yml +1 -1
- data/lib/sunspot/indexer.rb +13 -5
- data/lib/sunspot/session.rb +10 -2
- data/spec/api/indexer_spec.rb +36 -21
- data/spec/mocks/comment.rb +1 -1
- metadata +2 -2
data/README.rdoc
CHANGED
data/TODO
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
=== 0.9 ===
|
2
|
+
* Descriptive error messages during indexing
|
3
|
+
* Date type
|
4
|
+
* High-endian fields
|
5
|
+
* Add omitNorms to typed fields
|
2
6
|
* Instantiated facets!
|
3
7
|
* Direct access to adapter
|
4
|
-
*
|
8
|
+
* sunspot-configure-solr
|
5
9
|
* Switch to RSolr
|
10
|
+
* Facet by type (?)
|
6
11
|
* Query-based faceting (?)
|
data/VERSION.yml
CHANGED
data/lib/sunspot/indexer.rb
CHANGED
@@ -19,11 +19,7 @@ module Sunspot
|
|
19
19
|
# model<Object>:: the model to index
|
20
20
|
#
|
21
21
|
def add(model)
|
22
|
-
|
23
|
-
for field in @setup.all_fields
|
24
|
-
hash.merge!(field.pairs_for(model))
|
25
|
-
end
|
26
|
-
@connection.add(hash)
|
22
|
+
@connection.add(Array(model).map { |m| prepare(m) })
|
27
23
|
end
|
28
24
|
|
29
25
|
#
|
@@ -42,6 +38,17 @@ module Sunspot
|
|
42
38
|
|
43
39
|
protected
|
44
40
|
|
41
|
+
#
|
42
|
+
# Convert documents into hash of indexed properties
|
43
|
+
#
|
44
|
+
def prepare(model)
|
45
|
+
hash = static_hash_for(model)
|
46
|
+
for field in @setup.all_fields
|
47
|
+
hash.merge!(field.pairs_for(model))
|
48
|
+
end
|
49
|
+
hash
|
50
|
+
end
|
51
|
+
|
45
52
|
#
|
46
53
|
# All indexed documents index and store the +id+ and +type+ fields.
|
47
54
|
# This method constructs the document hash containing those key-value
|
@@ -52,6 +59,7 @@ module Sunspot
|
|
52
59
|
:type => Util.superclasses_for(model.class).map { |clazz| clazz.name }}
|
53
60
|
end
|
54
61
|
|
62
|
+
|
55
63
|
class <<self
|
56
64
|
#
|
57
65
|
# Delete all documents from the Solr index
|
data/lib/sunspot/session.rb
CHANGED
@@ -44,11 +44,19 @@ module Sunspot
|
|
44
44
|
#
|
45
45
|
# See Sunspot.index
|
46
46
|
#
|
47
|
+
#--
|
48
|
+
# FIXME The fact that we have to break this out by class and index each
|
49
|
+
# class separately is artificial, imposed by the fact that indexers
|
50
|
+
# are initialized with a particular setup, and are responsible for
|
51
|
+
# sending add messages to Solr. It might be worth considering a
|
52
|
+
# singleton indexer (per session) and have the indexer itself find
|
53
|
+
# the appropriate setup to use for each object.
|
54
|
+
#
|
47
55
|
def index(*objects)
|
48
56
|
objects.flatten!
|
49
57
|
@updates += objects.length
|
50
|
-
|
51
|
-
indexer_for(
|
58
|
+
objects.group_by { |object| object.class }.each_pair do |clazz, objs|
|
59
|
+
indexer_for(objs.first).add(objs)
|
52
60
|
end
|
53
61
|
end
|
54
62
|
|
data/spec/api/indexer_spec.rb
CHANGED
@@ -3,86 +3,101 @@ require File.join(File.dirname(__FILE__), 'spec_helper')
|
|
3
3
|
describe 'indexer' do
|
4
4
|
describe 'when indexing an object' do
|
5
5
|
it 'should index id and type' do
|
6
|
-
connection.should_receive(:add).with(hash_including(:id => "Post #{post.id}", :type => ['Post', 'BaseClass']))
|
6
|
+
connection.should_receive(:add).with([hash_including(:id => "Post #{post.id}", :type => ['Post', 'BaseClass'])])
|
7
7
|
session.index post
|
8
8
|
end
|
9
9
|
|
10
|
+
it 'should index the array of objects supplied' do
|
11
|
+
posts = Array.new(2) { Post.new }
|
12
|
+
connection.should_receive(:add).with([hash_including(:id => "Post #{posts.first.id}", :type => ['Post', 'BaseClass']),
|
13
|
+
hash_including(:id => "Post #{posts.last.id}", :type => ['Post', 'BaseClass'])])
|
14
|
+
session.index posts
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should index an array containing more than one type of object' do
|
18
|
+
post1, comment, post2 = objects = [Post.new, Comment.new, Post.new]
|
19
|
+
connection.should_receive(:add).with([hash_including(:id => "Post #{post1.id}", :type => ['Post', 'BaseClass']),
|
20
|
+
hash_including(:id => "Post #{post2.id}", :type => ['Post', 'BaseClass'])])
|
21
|
+
connection.should_receive(:add).with([hash_including(:id => "Comment #{comment.id}", :type => ['Comment', 'BaseClass'])])
|
22
|
+
session.index objects
|
23
|
+
end
|
24
|
+
|
10
25
|
it 'should index text' do
|
11
26
|
post :title => 'A Title', :body => 'A Post'
|
12
|
-
connection.should_receive(:add).with(hash_including(:title_text => 'A Title', :body_text => 'A Post'))
|
27
|
+
connection.should_receive(:add).with([hash_including(:title_text => 'A Title', :body_text => 'A Post')])
|
13
28
|
session.index post
|
14
29
|
end
|
15
30
|
|
16
31
|
it 'should index text via a virtual field' do
|
17
32
|
post :title => 'backwards'
|
18
|
-
connection.should_receive(:add).with(hash_including(:backwards_title_text => 'backwards'.reverse))
|
19
|
-
session.index
|
33
|
+
connection.should_receive(:add).with([hash_including(:backwards_title_text => 'backwards'.reverse)])
|
34
|
+
session.index post
|
20
35
|
end
|
21
36
|
|
22
37
|
it 'should correctly index a string attribute field' do
|
23
38
|
post :title => 'A Title'
|
24
|
-
connection.should_receive(:add).with(hash_including(:title_s => 'A Title'))
|
39
|
+
connection.should_receive(:add).with([hash_including(:title_s => 'A Title')])
|
25
40
|
session.index post
|
26
41
|
end
|
27
42
|
|
28
43
|
it 'should correctly index an integer attribute field' do
|
29
44
|
post :blog_id => 4
|
30
|
-
connection.should_receive(:add).with(hash_including(:blog_id_i => '4'))
|
45
|
+
connection.should_receive(:add).with([hash_including(:blog_id_i => '4')])
|
31
46
|
session.index post
|
32
47
|
end
|
33
48
|
|
34
49
|
it 'should correctly index a float attribute field' do
|
35
50
|
post :ratings_average => 2.23
|
36
|
-
connection.should_receive(:add).with(hash_including(:average_rating_f => '2.23'))
|
51
|
+
connection.should_receive(:add).with([hash_including(:average_rating_f => '2.23')])
|
37
52
|
session.index post
|
38
53
|
end
|
39
54
|
|
40
55
|
it 'should allow indexing by a multiple-value field' do
|
41
56
|
post :category_ids => [3, 14]
|
42
|
-
connection.should_receive(:add).with(hash_including(:category_ids_im => ['3', '14']))
|
57
|
+
connection.should_receive(:add).with([hash_including(:category_ids_im => ['3', '14'])])
|
43
58
|
session.index post
|
44
59
|
end
|
45
60
|
|
46
61
|
it 'should correctly index a time field' do
|
47
62
|
post :published_at => Time.parse('1983-07-08 05:00:00 -0400')
|
48
|
-
connection.should_receive(:add).with(hash_including(:published_at_d => '1983-07-08T09:00:00Z'))
|
63
|
+
connection.should_receive(:add).with([hash_including(:published_at_d => '1983-07-08T09:00:00Z')])
|
49
64
|
session.index post
|
50
65
|
end
|
51
66
|
|
52
67
|
it 'should correctly index a boolean field' do
|
53
68
|
post :featured => true
|
54
|
-
connection.should_receive(:add).with(hash_including(:featured_b => 'true'))
|
69
|
+
connection.should_receive(:add).with([hash_including(:featured_b => 'true')])
|
55
70
|
session.index post
|
56
71
|
end
|
57
72
|
|
58
73
|
it 'should correctly index a false boolean field' do
|
59
74
|
post :featured => false
|
60
|
-
connection.should_receive(:add).with(hash_including(:featured_b => 'false'))
|
75
|
+
connection.should_receive(:add).with([hash_including(:featured_b => 'false')])
|
61
76
|
session.index post
|
62
77
|
end
|
63
78
|
|
64
79
|
it 'should not index a nil boolean field' do
|
65
80
|
post
|
66
|
-
connection.should_receive(:add).with(hash_not_including(:featured_b))
|
81
|
+
connection.should_receive(:add).with([hash_not_including(:featured_b)])
|
67
82
|
session.index post
|
68
83
|
end
|
69
84
|
|
70
85
|
it 'should correctly index a virtual field' do
|
71
86
|
post :title => 'The Blog Post'
|
72
|
-
connection.should_receive(:add).with(hash_including(:sort_title_s => 'blog post'))
|
87
|
+
connection.should_receive(:add).with([hash_including(:sort_title_s => 'blog post')])
|
73
88
|
session.index post
|
74
89
|
end
|
75
90
|
|
76
91
|
it 'should correctly index an external virtual field' do
|
77
92
|
post :category_ids => [1, 2, 3]
|
78
|
-
connection.should_receive(:add).with(hash_including(:primary_category_id_i => '1'))
|
93
|
+
connection.should_receive(:add).with([hash_including(:primary_category_id_i => '1')])
|
79
94
|
session.index post
|
80
95
|
end
|
81
96
|
|
82
97
|
it 'should correctly index a field that is defined on a superclass' do
|
83
98
|
Sunspot.setup(BaseClass) { string :author_name }
|
84
99
|
post :author_name => 'Mat Brown'
|
85
|
-
connection.should_receive(:add).with(hash_including(:author_name_s => 'Mat Brown'))
|
100
|
+
connection.should_receive(:add).with([hash_including(:author_name_s => 'Mat Brown')])
|
86
101
|
session.index post
|
87
102
|
end
|
88
103
|
|
@@ -124,37 +139,37 @@ describe 'indexer' do
|
|
124
139
|
describe 'dynamic fields' do
|
125
140
|
it 'should index string data' do
|
126
141
|
post(:custom_string => { :test => 'string' })
|
127
|
-
connection.should_receive(:add).with(hash_including(:"custom_string:test_s" => 'string'))
|
142
|
+
connection.should_receive(:add).with([hash_including(:"custom_string:test_s" => 'string')])
|
128
143
|
session.index(post)
|
129
144
|
end
|
130
145
|
|
131
146
|
it 'should index integer data with virtual accessor' do
|
132
147
|
post(:category_ids => [1, 2])
|
133
|
-
connection.should_receive(:add).with(hash_including(:"custom_integer:1_i" => '1', :"custom_integer:2_i" => '1'))
|
148
|
+
connection.should_receive(:add).with([hash_including(:"custom_integer:1_i" => '1', :"custom_integer:2_i" => '1')])
|
134
149
|
session.index(post)
|
135
150
|
end
|
136
151
|
|
137
152
|
it 'should index float data' do
|
138
153
|
post(:custom_fl => { :test => 1.5 })
|
139
|
-
connection.should_receive(:add).with(hash_including(:"custom_float:test_fm" => '1.5'))
|
154
|
+
connection.should_receive(:add).with([hash_including(:"custom_float:test_fm" => '1.5')])
|
140
155
|
session.index(post)
|
141
156
|
end
|
142
157
|
|
143
158
|
it 'should index time data' do
|
144
159
|
post(:custom_time => { :test => Time.parse('2009-05-18 18:05:00 -0400') })
|
145
|
-
connection.should_receive(:add).with(hash_including(:"custom_time:test_d" => '2009-05-18T22:05:00Z'))
|
160
|
+
connection.should_receive(:add).with([hash_including(:"custom_time:test_d" => '2009-05-18T22:05:00Z')])
|
146
161
|
session.index(post)
|
147
162
|
end
|
148
163
|
|
149
164
|
it 'should index boolean data' do
|
150
165
|
post(:custom_boolean => { :test => false })
|
151
|
-
connection.should_receive(:add).with(hash_including(:"custom_boolean:test_b" => 'false'))
|
166
|
+
connection.should_receive(:add).with([hash_including(:"custom_boolean:test_b" => 'false')])
|
152
167
|
session.index(post)
|
153
168
|
end
|
154
169
|
|
155
170
|
it 'should index multiple values for a field' do
|
156
171
|
post(:custom_fl => { :test => [1.0, 2.1, 3.2] })
|
157
|
-
connection.should_receive(:add).with(hash_including(:"custom_float:test_fm" => %w(1.0 2.1 3.2)))
|
172
|
+
connection.should_receive(:add).with([hash_including(:"custom_float:test_fm" => %w(1.0 2.1 3.2))])
|
158
173
|
session.index(post)
|
159
174
|
end
|
160
175
|
end
|
data/spec/mocks/comment.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: outoftime-sunspot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mat Brown
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-06-03 00:00:00 -07:00
|
13
13
|
default_executable: sunspot-solr
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|