sunspot 0.10.3 → 0.10.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/VERSION.yml +1 -1
- data/lib/sunspot.rb +27 -0
- data/lib/sunspot/dsl/query.rb +24 -0
- data/lib/sunspot/query/query.rb +6 -2
- data/lib/sunspot/session.rb +21 -7
- data/spec/api/query/adjust_params_spec.rb +37 -0
- data/spec/api/session_spec.rb +53 -1
- metadata +4 -2
data/History.txt
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 0.10.4 2009-10-20
|
2
|
+
* Add adjust_params method, allowing experts to manually edit Solr params
|
3
|
+
* Track adds and deletes separately in session, and expose delete_dirty? method
|
4
|
+
* Allow clients to inject a singleton session proxy
|
5
|
+
|
1
6
|
== 0.10.3 2009-10-15
|
2
7
|
* Contiguous, not continuous
|
3
8
|
* Fail fast if less-than-1 radius passed for local search
|
data/VERSION.yml
CHANGED
data/lib/sunspot.rb
CHANGED
@@ -38,7 +38,16 @@ module Sunspot
|
|
38
38
|
NoSetupError = Class.new(Exception)
|
39
39
|
IllegalSearchError = Class.new(Exception)
|
40
40
|
|
41
|
+
|
41
42
|
class <<self
|
43
|
+
#
|
44
|
+
# Clients can inject a session proxy, allowing them to implement custom
|
45
|
+
# session-management logic while retaining the Sunspot singleton API as
|
46
|
+
# an available interface. The object assigned to this attribute must
|
47
|
+
# respond to all of the public methods of the Sunspot::Session class.
|
48
|
+
#
|
49
|
+
attr_writer :session
|
50
|
+
|
42
51
|
# Configures indexing and search for a given class.
|
43
52
|
#
|
44
53
|
# ==== Parameters
|
@@ -413,6 +422,24 @@ module Sunspot
|
|
413
422
|
session.commit_if_dirty
|
414
423
|
end
|
415
424
|
|
425
|
+
#
|
426
|
+
# True if documents have been removed since the last commit.
|
427
|
+
#
|
428
|
+
# ==== Returns
|
429
|
+
#
|
430
|
+
# Boolean:: Whether there have been any deletes since the last commit
|
431
|
+
#
|
432
|
+
def delete_dirty?
|
433
|
+
session.delete_dirty?
|
434
|
+
end
|
435
|
+
|
436
|
+
#
|
437
|
+
# Sends a commit if the session has deletes since the last commit (see #delete_dirty?).
|
438
|
+
#
|
439
|
+
def commit_if_delete_dirty
|
440
|
+
session.commit_if_delete_dirty
|
441
|
+
end
|
442
|
+
|
416
443
|
# Returns the configuration associated with the singleton session. See
|
417
444
|
# Sunspot::Configuration for details.
|
418
445
|
#
|
data/lib/sunspot/dsl/query.rb
CHANGED
@@ -97,6 +97,30 @@ module Sunspot
|
|
97
97
|
@query.paginate(page, per_page)
|
98
98
|
end
|
99
99
|
|
100
|
+
# <strong>Expert:</strong> Adjust or reset the parameters passed to Solr.
|
101
|
+
# The adjustment will take place just before sending the params to solr,
|
102
|
+
# after Sunspot builds the Solr params based on the methods called in the
|
103
|
+
# DSL.
|
104
|
+
#
|
105
|
+
# Under normal circumstances, using this method should not be necessary;
|
106
|
+
# if you find that it is, please consider submitting a feature request.
|
107
|
+
# Using this method requires knowledge of Sunspot's internal Solr schema
|
108
|
+
# and Solr query representations, which are not part of Sunspot's public
|
109
|
+
# API; they could change at any time. <strong>This method is unsupported
|
110
|
+
# and your mileage may vary.</strong>
|
111
|
+
#
|
112
|
+
# ==== Example
|
113
|
+
#
|
114
|
+
# Sunspot.search(Post) do
|
115
|
+
# adjust_solr_params do |params|
|
116
|
+
# params[:q] += ' AND something_s:more'
|
117
|
+
# end
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
def adjust_solr_params( &block )
|
121
|
+
@query.set_solr_parameter_adjustment( block )
|
122
|
+
end
|
123
|
+
|
100
124
|
#
|
101
125
|
# Scope the search by geographical distance from a given point.
|
102
126
|
# +coordinates+ should either respond to #first and #last (e.g. a
|
data/lib/sunspot/query/query.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
module Sunspot
|
2
2
|
module Query
|
3
3
|
class Query
|
4
|
-
attr_accessor :scope
|
5
|
-
attr_accessor :fulltext
|
4
|
+
attr_accessor :scope, :fulltext, :parameter_adjustment
|
6
5
|
|
7
6
|
def initialize(types)
|
8
7
|
@scope = Scope.new
|
@@ -19,6 +18,10 @@ module Sunspot
|
|
19
18
|
def set_fulltext(keywords)
|
20
19
|
@fulltext = Dismax.new(keywords)
|
21
20
|
end
|
21
|
+
|
22
|
+
def set_solr_parameter_adjustment( block )
|
23
|
+
@parameter_adjustment = block
|
24
|
+
end
|
22
25
|
|
23
26
|
def add_location_restriction(coordinates, radius)
|
24
27
|
@local = Local.new(coordinates, radius)
|
@@ -73,6 +76,7 @@ module Sunspot
|
|
73
76
|
Sunspot::Util.deep_merge!(params, @sort.to_params)
|
74
77
|
Sunspot::Util.deep_merge!(params, @pagination.to_params) if @pagination
|
75
78
|
Sunspot::Util.deep_merge!(params, @local.to_params) if @local
|
79
|
+
@parameter_adjustment.call(params) if @parameter_adjustment
|
76
80
|
params[:q] ||= '*:*'
|
77
81
|
params
|
78
82
|
end
|
data/lib/sunspot/session.rb
CHANGED
@@ -34,7 +34,7 @@ module Sunspot
|
|
34
34
|
yield(@config) if block_given?
|
35
35
|
@connection = connection
|
36
36
|
@master_connection = master_connection
|
37
|
-
@
|
37
|
+
@deletes = @adds = 0
|
38
38
|
end
|
39
39
|
|
40
40
|
#
|
@@ -68,7 +68,7 @@ module Sunspot
|
|
68
68
|
#
|
69
69
|
def index(*objects)
|
70
70
|
objects.flatten!
|
71
|
-
@
|
71
|
+
@adds += objects.length
|
72
72
|
indexer.add(objects)
|
73
73
|
end
|
74
74
|
|
@@ -84,7 +84,7 @@ module Sunspot
|
|
84
84
|
# See Sunspot.commit
|
85
85
|
#
|
86
86
|
def commit
|
87
|
-
@
|
87
|
+
@adds = @deletes = 0
|
88
88
|
master_connection.commit
|
89
89
|
end
|
90
90
|
|
@@ -93,7 +93,7 @@ module Sunspot
|
|
93
93
|
#
|
94
94
|
def remove(*objects)
|
95
95
|
objects.flatten!
|
96
|
-
@
|
96
|
+
@deletes += objects.length
|
97
97
|
for object in objects
|
98
98
|
indexer.remove(object)
|
99
99
|
end
|
@@ -134,10 +134,10 @@ module Sunspot
|
|
134
134
|
def remove_all(*classes)
|
135
135
|
classes.flatten!
|
136
136
|
if classes.empty?
|
137
|
-
@
|
137
|
+
@deletes += 1
|
138
138
|
Indexer.remove_all(master_connection)
|
139
139
|
else
|
140
|
-
@
|
140
|
+
@deletes += classes.length
|
141
141
|
for clazz in classes
|
142
142
|
indexer.remove_all(clazz)
|
143
143
|
end
|
@@ -156,7 +156,7 @@ module Sunspot
|
|
156
156
|
# See Sunspot.dirty?
|
157
157
|
#
|
158
158
|
def dirty?
|
159
|
-
@
|
159
|
+
(@deletes + @adds) > 0
|
160
160
|
end
|
161
161
|
|
162
162
|
#
|
@@ -165,7 +165,21 @@ module Sunspot
|
|
165
165
|
def commit_if_dirty
|
166
166
|
commit if dirty?
|
167
167
|
end
|
168
|
+
|
169
|
+
#
|
170
|
+
# See Sunspot.delete_dirty?
|
171
|
+
#
|
172
|
+
def delete_dirty?
|
173
|
+
@deletes > 0
|
174
|
+
end
|
168
175
|
|
176
|
+
#
|
177
|
+
# See Sunspot.commit_if_delete_dirty
|
178
|
+
#
|
179
|
+
def commit_if_delete_dirty
|
180
|
+
commit if delete_dirty?
|
181
|
+
end
|
182
|
+
|
169
183
|
#
|
170
184
|
# See Sunspot.batch
|
171
185
|
#
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
describe 'typed query' do
|
4
|
+
it "should send query to solr with adjusted parameters (keyword example)" do
|
5
|
+
session.search Post do
|
6
|
+
keywords 'keyword search'
|
7
|
+
adjust_solr_params do |params|
|
8
|
+
params[:q] = 'new search'
|
9
|
+
params[:some] = 'param'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
connection.should have_last_search_with(:q => 'new search')
|
13
|
+
connection.should have_last_search_with(:some => 'param')
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should work, even without another dsl command" do
|
17
|
+
session.search Post do
|
18
|
+
adjust_solr_params do |params|
|
19
|
+
params[:q] = 'napoleon dynamite'
|
20
|
+
params[:qt] = 'complicated'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
connection.should have_last_search_with(:q => 'napoleon dynamite')
|
24
|
+
connection.should have_last_search_with(:qt => 'complicated')
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should be able to extend parameters" do
|
28
|
+
session.search Post do
|
29
|
+
keywords 'keyword search'
|
30
|
+
adjust_solr_params do |params|
|
31
|
+
params[:q] += ' AND something_s:more'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
connection.should have_last_search_with(:q => 'keyword search AND something_s:more')
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/spec/api/session_spec.rb
CHANGED
@@ -118,43 +118,95 @@ describe 'Session' do
|
|
118
118
|
it 'should start out not dirty' do
|
119
119
|
@session.dirty?.should be_false
|
120
120
|
end
|
121
|
+
|
122
|
+
it 'should start out not delete_dirty' do
|
123
|
+
@session.delete_dirty?.should be_false
|
124
|
+
end
|
121
125
|
|
122
126
|
it 'should be dirty after adding an item' do
|
123
127
|
@session.index(Post.new)
|
124
128
|
@session.dirty?.should be_true
|
125
129
|
end
|
130
|
+
|
131
|
+
it 'should be not be delete_dirty after adding an item' do
|
132
|
+
@session.index(Post.new)
|
133
|
+
@session.delete_dirty?.should be_false
|
134
|
+
end
|
126
135
|
|
127
136
|
it 'should be dirty after deleting an item' do
|
128
137
|
@session.remove(Post.new)
|
129
138
|
@session.dirty?.should be_true
|
130
139
|
end
|
131
140
|
|
141
|
+
it 'should be delete_dirty after deleting an item' do
|
142
|
+
@session.remove(Post.new)
|
143
|
+
@session.delete_dirty?.should be_true
|
144
|
+
end
|
145
|
+
|
132
146
|
it 'should be dirty after a remove_all for a class' do
|
133
147
|
@session.remove_all(Post)
|
134
148
|
@session.dirty?.should be_true
|
135
149
|
end
|
136
150
|
|
151
|
+
it 'should be delete_dirty after a remove_all for a class' do
|
152
|
+
@session.remove_all(Post)
|
153
|
+
@session.delete_dirty?.should be_true
|
154
|
+
end
|
155
|
+
|
137
156
|
it 'should be dirty after a global remove_all' do
|
138
157
|
@session.remove_all
|
139
158
|
@session.dirty?.should be_true
|
140
159
|
end
|
141
|
-
|
160
|
+
|
161
|
+
it 'should be delete_dirty after a global remove_all' do
|
162
|
+
@session.remove_all
|
163
|
+
@session.delete_dirty?.should be_true
|
164
|
+
end
|
165
|
+
|
142
166
|
it 'should not be dirty after a commit' do
|
143
167
|
@session.index(Post.new)
|
144
168
|
@session.commit
|
145
169
|
@session.dirty?.should be_false
|
146
170
|
end
|
147
171
|
|
172
|
+
it 'should not be delete_dirty after a commit' do
|
173
|
+
@session.remove(Post.new)
|
174
|
+
@session.commit
|
175
|
+
@session.delete_dirty?.should be_false
|
176
|
+
end
|
177
|
+
|
148
178
|
it 'should not commit when commit_if_dirty called on clean session' do
|
149
179
|
@session.commit_if_dirty
|
150
180
|
connection.should have(0).commits
|
151
181
|
end
|
152
182
|
|
183
|
+
it 'should not commit when commit_if_delete_dirty called on clean session' do
|
184
|
+
@session.commit_if_delete_dirty
|
185
|
+
connection.should have(0).commits
|
186
|
+
end
|
187
|
+
|
153
188
|
it 'should commit when commit_if_dirty called on dirty session' do
|
154
189
|
@session.index(Post.new)
|
155
190
|
@session.commit_if_dirty
|
156
191
|
connection.should have(1).commits
|
157
192
|
end
|
193
|
+
|
194
|
+
it 'should commit when commit_if_delete_dirty called on delete_dirty session' do
|
195
|
+
@session.remove(Post.new)
|
196
|
+
@session.commit_if_delete_dirty
|
197
|
+
connection.should have(1).commits
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context 'session proxy' do
|
202
|
+
it 'should send messages to manually assigned session proxy' do
|
203
|
+
stub_session = stub!('session')
|
204
|
+
Sunspot.session = stub_session
|
205
|
+
post = Post.new
|
206
|
+
stub_session.should_receive(:index).with(post)
|
207
|
+
Sunspot.index(post)
|
208
|
+
Sunspot.reset!
|
209
|
+
end
|
158
210
|
end
|
159
211
|
|
160
212
|
def connection
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sunspot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mat Brown
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2009-10-
|
20
|
+
date: 2009-10-20 00:00:00 -04:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -171,6 +171,7 @@ files:
|
|
171
171
|
- spec/api/indexer/removal_spec.rb
|
172
172
|
- spec/api/indexer/spec_helper.rb
|
173
173
|
- spec/api/indexer_spec.rb
|
174
|
+
- spec/api/query/adjust_params_spec.rb
|
174
175
|
- spec/api/query/connectives_spec.rb
|
175
176
|
- spec/api/query/dsl_spec.rb
|
176
177
|
- spec/api/query/dynamic_fields_spec.rb
|
@@ -301,6 +302,7 @@ test_files:
|
|
301
302
|
- spec/api/query/spec_helper.rb
|
302
303
|
- spec/api/query/faceting_spec.rb
|
303
304
|
- spec/api/query/connectives_spec.rb
|
305
|
+
- spec/api/query/adjust_params_spec.rb
|
304
306
|
- spec/api/query/local_spec.rb
|
305
307
|
- spec/api/query/highlighting_spec.rb
|
306
308
|
- spec/api/query/ordering_pagination_spec.rb
|