sunspot 2.0.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/Appraisals +7 -0
- data/Gemfile +0 -2
- data/History.txt +10 -0
- data/lib/sunspot.rb +55 -17
- data/lib/sunspot/adapters.rb +68 -18
- data/lib/sunspot/batcher.rb +1 -1
- data/lib/sunspot/configuration.rb +4 -2
- data/lib/sunspot/data_extractor.rb +36 -6
- data/lib/sunspot/dsl.rb +4 -3
- data/lib/sunspot/dsl/adjustable.rb +2 -2
- data/lib/sunspot/dsl/field_query.rb +69 -16
- data/lib/sunspot/dsl/field_stats.rb +25 -0
- data/lib/sunspot/dsl/fields.rb +28 -8
- data/lib/sunspot/dsl/fulltext.rb +9 -1
- data/lib/sunspot/dsl/group.rb +118 -0
- data/lib/sunspot/dsl/paginatable.rb +4 -1
- data/lib/sunspot/dsl/scope.rb +19 -10
- data/lib/sunspot/dsl/search.rb +1 -1
- data/lib/sunspot/dsl/spellcheckable.rb +14 -0
- data/lib/sunspot/dsl/standard_query.rb +63 -35
- data/lib/sunspot/field.rb +76 -4
- data/lib/sunspot/field_factory.rb +60 -11
- data/lib/sunspot/indexer.rb +70 -18
- data/lib/sunspot/query.rb +5 -4
- data/lib/sunspot/query/abstract_field_facet.rb +0 -2
- data/lib/sunspot/query/abstract_fulltext.rb +76 -0
- data/lib/sunspot/query/abstract_json_field_facet.rb +70 -0
- data/lib/sunspot/query/bbox.rb +5 -1
- data/lib/sunspot/query/common_query.rb +31 -6
- data/lib/sunspot/query/composite_fulltext.rb +58 -8
- data/lib/sunspot/query/date_field_json_facet.rb +25 -0
- data/lib/sunspot/query/dismax.rb +25 -71
- data/lib/sunspot/query/field_json_facet.rb +19 -0
- data/lib/sunspot/query/field_list.rb +15 -0
- data/lib/sunspot/query/field_stats.rb +61 -0
- data/lib/sunspot/query/function_query.rb +1 -2
- data/lib/sunspot/query/geo.rb +1 -1
- data/lib/sunspot/query/geofilt.rb +8 -3
- data/lib/sunspot/query/group.rb +46 -0
- data/lib/sunspot/query/group_query.rb +17 -0
- data/lib/sunspot/query/join.rb +88 -0
- data/lib/sunspot/query/more_like_this.rb +1 -1
- data/lib/sunspot/query/pagination.rb +12 -4
- data/lib/sunspot/query/range_json_facet.rb +28 -0
- data/lib/sunspot/query/restriction.rb +99 -13
- data/lib/sunspot/query/sort.rb +41 -0
- data/lib/sunspot/query/sort_composite.rb +7 -0
- data/lib/sunspot/query/spellcheck.rb +19 -0
- data/lib/sunspot/query/standard_query.rb +24 -2
- data/lib/sunspot/query/text_field_boost.rb +1 -3
- data/lib/sunspot/schema.rb +12 -3
- data/lib/sunspot/search.rb +4 -2
- data/lib/sunspot/search/abstract_search.rb +93 -43
- data/lib/sunspot/search/cursor_paginated_collection.rb +32 -0
- data/lib/sunspot/search/field_facet.rb +4 -4
- data/lib/sunspot/search/field_json_facet.rb +33 -0
- data/lib/sunspot/search/field_stats.rb +21 -0
- data/lib/sunspot/search/hit.rb +6 -1
- data/lib/sunspot/search/hit_enumerable.rb +4 -1
- data/lib/sunspot/search/json_facet_row.rb +40 -0
- data/lib/sunspot/search/json_facet_stats.rb +23 -0
- data/lib/sunspot/search/paginated_collection.rb +1 -0
- data/lib/sunspot/search/query_group.rb +74 -0
- data/lib/sunspot/search/standard_search.rb +70 -3
- data/lib/sunspot/search/stats_facet.rb +25 -0
- data/lib/sunspot/search/stats_json_row.rb +82 -0
- data/lib/sunspot/search/stats_row.rb +68 -0
- data/lib/sunspot/session.rb +62 -37
- data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +6 -4
- data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +16 -8
- data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +2 -2
- data/lib/sunspot/session_proxy/retry_5xx_session_proxy.rb +1 -1
- data/lib/sunspot/session_proxy/sharding_session_proxy.rb +4 -2
- data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +1 -1
- data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +6 -4
- data/lib/sunspot/setup.rb +42 -0
- data/lib/sunspot/type.rb +20 -0
- data/lib/sunspot/util.rb +78 -14
- data/lib/sunspot/version.rb +1 -1
- data/spec/api/adapters_spec.rb +40 -15
- data/spec/api/batcher_spec.rb +15 -15
- data/spec/api/binding_spec.rb +3 -3
- data/spec/api/class_set_spec.rb +6 -6
- data/spec/api/data_extractor_spec.rb +39 -0
- data/spec/api/hit_enumerable_spec.rb +32 -9
- data/spec/api/indexer/attributes_spec.rb +35 -30
- data/spec/api/indexer/batch_spec.rb +8 -7
- data/spec/api/indexer/dynamic_fields_spec.rb +8 -8
- data/spec/api/indexer/fixed_fields_spec.rb +16 -11
- data/spec/api/indexer/fulltext_spec.rb +8 -8
- data/spec/api/indexer/removal_spec.rb +24 -14
- data/spec/api/indexer_spec.rb +2 -2
- data/spec/api/query/advanced_manipulation_examples.rb +3 -3
- data/spec/api/query/connectives_examples.rb +26 -14
- data/spec/api/query/dsl_spec.rb +24 -6
- data/spec/api/query/dynamic_fields_examples.rb +18 -18
- data/spec/api/query/faceting_examples.rb +80 -61
- data/spec/api/query/fulltext_examples.rb +194 -40
- data/spec/api/query/function_spec.rb +116 -13
- data/spec/api/query/geo_examples.rb +8 -12
- data/spec/api/query/group_spec.rb +27 -5
- data/spec/api/query/highlighting_examples.rb +26 -26
- data/spec/api/query/join_spec.rb +19 -0
- data/spec/api/query/more_like_this_spec.rb +40 -27
- data/spec/api/query/ordering_pagination_examples.rb +37 -23
- data/spec/api/query/scope_examples.rb +39 -39
- data/spec/api/query/spatial_examples.rb +3 -3
- data/spec/api/query/spellcheck_examples.rb +20 -0
- data/spec/api/query/standard_spec.rb +3 -1
- data/spec/api/query/stats_examples.rb +66 -0
- data/spec/api/query/text_field_scoping_examples.rb +5 -5
- data/spec/api/query/types_spec.rb +4 -4
- data/spec/api/search/cursor_paginated_collection_spec.rb +35 -0
- data/spec/api/search/dynamic_fields_spec.rb +4 -4
- data/spec/api/search/faceting_spec.rb +55 -52
- data/spec/api/search/highlighting_spec.rb +7 -7
- data/spec/api/search/hits_spec.rb +43 -29
- data/spec/api/search/paginated_collection_spec.rb +19 -18
- data/spec/api/search/results_spec.rb +13 -13
- data/spec/api/search/search_spec.rb +3 -3
- data/spec/api/search/stats_spec.rb +94 -0
- data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +23 -16
- data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +16 -4
- data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +10 -6
- data/spec/api/session_proxy/retry_5xx_session_proxy_spec.rb +11 -11
- data/spec/api/session_proxy/sharding_session_proxy_spec.rb +15 -14
- data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +3 -3
- data/spec/api/session_proxy/spec_helper.rb +1 -1
- data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +40 -26
- data/spec/api/session_spec.rb +78 -38
- data/spec/api/sunspot_spec.rb +7 -4
- data/spec/helpers/integration_helper.rb +11 -1
- data/spec/helpers/query_helper.rb +1 -1
- data/spec/helpers/search_helper.rb +30 -0
- data/spec/integration/atomic_updates_spec.rb +58 -0
- data/spec/integration/dynamic_fields_spec.rb +31 -20
- data/spec/integration/faceting_spec.rb +252 -39
- data/spec/integration/field_grouping_spec.rb +47 -15
- data/spec/integration/field_lists_spec.rb +57 -0
- data/spec/integration/geospatial_spec.rb +34 -8
- data/spec/integration/highlighting_spec.rb +8 -8
- data/spec/integration/indexing_spec.rb +7 -6
- data/spec/integration/join_spec.rb +45 -0
- data/spec/integration/keyword_search_spec.rb +68 -38
- data/spec/integration/local_search_spec.rb +4 -4
- data/spec/integration/more_like_this_spec.rb +7 -7
- data/spec/integration/scoped_search_spec.rb +193 -74
- data/spec/integration/spellcheck_spec.rb +119 -0
- data/spec/integration/stats_spec.rb +88 -0
- data/spec/integration/stored_fields_spec.rb +1 -1
- data/spec/integration/test_pagination.rb +4 -4
- data/spec/integration/unicode_spec.rb +1 -1
- data/spec/mocks/adapters.rb +36 -0
- data/spec/mocks/connection.rb +5 -3
- data/spec/mocks/photo.rb +32 -1
- data/spec/mocks/post.rb +18 -3
- data/spec/spec_helper.rb +13 -8
- data/sunspot.gemspec +6 -4
- data/tasks/rdoc.rake +22 -14
- metadata +101 -44
- data/lib/sunspot/dsl/field_group.rb +0 -57
- data/lib/sunspot/query/field_group.rb +0 -37
@@ -0,0 +1,68 @@
|
|
1
|
+
module Sunspot
|
2
|
+
module Search
|
3
|
+
class StatsRow
|
4
|
+
attr_reader :data, :value
|
5
|
+
attr_writer :instance #:nodoc:
|
6
|
+
|
7
|
+
def initialize(data, facet = nil, value = nil) #:nodoc:
|
8
|
+
@data, @facet, @value = data, facet, value
|
9
|
+
@facet_fields = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def min
|
13
|
+
data['min']
|
14
|
+
end
|
15
|
+
|
16
|
+
def max
|
17
|
+
data['max']
|
18
|
+
end
|
19
|
+
|
20
|
+
def count
|
21
|
+
data['count']
|
22
|
+
end
|
23
|
+
|
24
|
+
def sum
|
25
|
+
data['sum']
|
26
|
+
end
|
27
|
+
|
28
|
+
def missing
|
29
|
+
data['missing']
|
30
|
+
end
|
31
|
+
|
32
|
+
def sum_of_squares
|
33
|
+
data['sumOfSquares']
|
34
|
+
end
|
35
|
+
|
36
|
+
def mean
|
37
|
+
data['mean']
|
38
|
+
end
|
39
|
+
|
40
|
+
def standard_deviation
|
41
|
+
data['stddev']
|
42
|
+
end
|
43
|
+
|
44
|
+
def facet name
|
45
|
+
facets.find { |facet| facet.field.name == name.to_sym }
|
46
|
+
end
|
47
|
+
|
48
|
+
def facets
|
49
|
+
@facets ||= @facet_fields.map do |field|
|
50
|
+
StatsFacet.new(field, data['facets'][field.indexed_name])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def instance
|
55
|
+
if !defined?(@instance)
|
56
|
+
@facet.populate_instances
|
57
|
+
end
|
58
|
+
@instance
|
59
|
+
end
|
60
|
+
|
61
|
+
def inspect
|
62
|
+
"<Sunspot::Search::StatsRow:#{value.inspect} min=#{min} max=#{max}"\
|
63
|
+
" count=#{self.count} sum=#{sum} missing=#{missing} sum_of_squares=#{sum_of_squares}"\
|
64
|
+
" mean=#{mean} standard_deviation=#{standard_deviation}>"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/sunspot/session.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Sunspot
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# A Sunspot session encapsulates a connection to Solr and a set of
|
4
4
|
# configuration choices. Though users of Sunspot may manually instantiate
|
5
5
|
# Session objects, in the general case it's easier to use the singleton
|
@@ -10,8 +10,8 @@ module Sunspot
|
|
10
10
|
class Session
|
11
11
|
class <<self
|
12
12
|
attr_writer :connection_class #:nodoc:
|
13
|
-
|
14
|
-
#
|
13
|
+
|
14
|
+
#
|
15
15
|
# For testing purposes
|
16
16
|
#
|
17
17
|
def connection_class #:nodoc:
|
@@ -19,12 +19,12 @@ module Sunspot
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
#
|
22
|
+
#
|
23
23
|
# Sunspot::Configuration object for this session
|
24
24
|
#
|
25
25
|
attr_reader :config
|
26
26
|
|
27
|
-
#
|
27
|
+
#
|
28
28
|
# Sessions are initialized with a Sunspot configuration and a Solr
|
29
29
|
# connection. Usually you will want to stick with the default arguments
|
30
30
|
# when instantiating your own sessions.
|
@@ -36,7 +36,7 @@ module Sunspot
|
|
36
36
|
@deletes = @adds = 0
|
37
37
|
end
|
38
38
|
|
39
|
-
#
|
39
|
+
#
|
40
40
|
# See Sunspot.new_search
|
41
41
|
#
|
42
42
|
def new_search(*types, &block)
|
@@ -59,7 +59,7 @@ module Sunspot
|
|
59
59
|
search.execute
|
60
60
|
end
|
61
61
|
|
62
|
-
#
|
62
|
+
#
|
63
63
|
# See Sunspot.new_more_like_this
|
64
64
|
#
|
65
65
|
def new_more_like_this(object, *types, &block)
|
@@ -91,7 +91,7 @@ module Sunspot
|
|
91
91
|
indexer.add(objects)
|
92
92
|
end
|
93
93
|
|
94
|
-
#
|
94
|
+
#
|
95
95
|
# See Sunspot.index!
|
96
96
|
#
|
97
97
|
def index!(*objects)
|
@@ -99,12 +99,28 @@ module Sunspot
|
|
99
99
|
commit
|
100
100
|
end
|
101
101
|
|
102
|
+
#
|
103
|
+
# See Sunspot.atomic_update
|
104
|
+
#
|
105
|
+
def atomic_update(clazz, updates = {})
|
106
|
+
@adds += updates.keys.length
|
107
|
+
indexer.add_atomic_update(clazz, updates)
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# See Sunspot.atomic_update!
|
112
|
+
#
|
113
|
+
def atomic_update!(clazz, updates = {})
|
114
|
+
atomic_update(clazz, updates)
|
115
|
+
commit
|
116
|
+
end
|
117
|
+
|
102
118
|
#
|
103
119
|
# See Sunspot.commit
|
104
120
|
#
|
105
|
-
def commit
|
121
|
+
def commit(soft_commit = false)
|
106
122
|
@adds = @deletes = 0
|
107
|
-
connection.commit
|
123
|
+
connection.commit :commit_attributes => {:softCommit => soft_commit}
|
108
124
|
end
|
109
125
|
|
110
126
|
#
|
@@ -115,7 +131,7 @@ module Sunspot
|
|
115
131
|
connection.optimize
|
116
132
|
end
|
117
133
|
|
118
|
-
#
|
134
|
+
#
|
119
135
|
# See Sunspot.remove
|
120
136
|
#
|
121
137
|
def remove(*objects, &block)
|
@@ -139,32 +155,32 @@ module Sunspot
|
|
139
155
|
end
|
140
156
|
end
|
141
157
|
|
142
|
-
#
|
158
|
+
#
|
143
159
|
# See Sunspot.remove!
|
144
160
|
#
|
145
|
-
def remove!(*objects)
|
146
|
-
remove(*objects)
|
161
|
+
def remove!(*objects, &block)
|
162
|
+
remove(*objects, &block)
|
147
163
|
commit
|
148
164
|
end
|
149
165
|
|
150
|
-
#
|
166
|
+
#
|
151
167
|
# See Sunspot.remove_by_id
|
152
168
|
#
|
153
|
-
def remove_by_id(clazz,
|
169
|
+
def remove_by_id(clazz, *ids)
|
154
170
|
class_name =
|
155
171
|
if clazz.is_a?(Class)
|
156
172
|
clazz.name
|
157
173
|
else
|
158
174
|
clazz.to_s
|
159
175
|
end
|
160
|
-
indexer.remove_by_id(class_name,
|
176
|
+
indexer.remove_by_id(class_name, ids)
|
161
177
|
end
|
162
178
|
|
163
|
-
#
|
179
|
+
#
|
164
180
|
# See Sunspot.remove_by_id!
|
165
181
|
#
|
166
|
-
def remove_by_id!(clazz,
|
167
|
-
remove_by_id(clazz,
|
182
|
+
def remove_by_id!(clazz, *ids)
|
183
|
+
remove_by_id(clazz, ids)
|
168
184
|
commit
|
169
185
|
end
|
170
186
|
|
@@ -182,7 +198,7 @@ module Sunspot
|
|
182
198
|
end
|
183
199
|
end
|
184
200
|
|
185
|
-
#
|
201
|
+
#
|
186
202
|
# See Sunspot.remove_all!
|
187
203
|
#
|
188
204
|
def remove_all!(*classes)
|
@@ -190,35 +206,35 @@ module Sunspot
|
|
190
206
|
commit
|
191
207
|
end
|
192
208
|
|
193
|
-
#
|
209
|
+
#
|
194
210
|
# See Sunspot.dirty?
|
195
211
|
#
|
196
212
|
def dirty?
|
197
213
|
(@deletes + @adds) > 0
|
198
214
|
end
|
199
215
|
|
200
|
-
#
|
216
|
+
#
|
201
217
|
# See Sunspot.commit_if_dirty
|
202
218
|
#
|
203
|
-
def commit_if_dirty
|
204
|
-
commit if dirty?
|
219
|
+
def commit_if_dirty(soft_commit = false)
|
220
|
+
commit soft_commit if dirty?
|
205
221
|
end
|
206
|
-
|
207
|
-
#
|
222
|
+
|
223
|
+
#
|
208
224
|
# See Sunspot.delete_dirty?
|
209
225
|
#
|
210
226
|
def delete_dirty?
|
211
227
|
@deletes > 0
|
212
228
|
end
|
213
229
|
|
214
|
-
#
|
230
|
+
#
|
215
231
|
# See Sunspot.commit_if_delete_dirty
|
216
232
|
#
|
217
|
-
def commit_if_delete_dirty
|
218
|
-
commit if delete_dirty?
|
233
|
+
def commit_if_delete_dirty(soft_commit = false)
|
234
|
+
commit soft_commit if delete_dirty?
|
219
235
|
end
|
220
|
-
|
221
|
-
#
|
236
|
+
|
237
|
+
#
|
222
238
|
# See Sunspot.batch
|
223
239
|
#
|
224
240
|
def batch
|
@@ -229,7 +245,7 @@ module Sunspot
|
|
229
245
|
|
230
246
|
private
|
231
247
|
|
232
|
-
#
|
248
|
+
#
|
233
249
|
# Retrieve the Solr connection for this session, creating one if it does not
|
234
250
|
# already exist.
|
235
251
|
#
|
@@ -238,10 +254,13 @@ module Sunspot
|
|
238
254
|
# RSolr::Connection::Base:: The connection for this session
|
239
255
|
#
|
240
256
|
def connection
|
241
|
-
@connection ||=
|
242
|
-
|
243
|
-
|
244
|
-
|
257
|
+
@connection ||= self.class.connection_class.connect(
|
258
|
+
url: config.solr.url,
|
259
|
+
read_timeout: config.solr.read_timeout,
|
260
|
+
open_timeout: config.solr.open_timeout,
|
261
|
+
proxy: config.solr.proxy,
|
262
|
+
update_format: update_format_generator
|
263
|
+
)
|
245
264
|
end
|
246
265
|
|
247
266
|
def indexer
|
@@ -258,5 +277,11 @@ module Sunspot
|
|
258
277
|
CompositeSetup.for(types)
|
259
278
|
end
|
260
279
|
end
|
280
|
+
|
281
|
+
def update_format_generator
|
282
|
+
if config.solr.update_format && RSolr.version.to_i > 1
|
283
|
+
config.solr.update_format.downcase.to_sym == :json ? RSolr::JSON::Generator : RSolr::Xml::Generator
|
284
|
+
end
|
285
|
+
end
|
261
286
|
end
|
262
287
|
end
|
@@ -23,15 +23,17 @@ module Sunspot
|
|
23
23
|
#
|
24
24
|
# See Sunspot.remove_by_id
|
25
25
|
#
|
26
|
-
def remove_by_id(clazz,
|
27
|
-
|
26
|
+
def remove_by_id(clazz, *ids)
|
27
|
+
ids.flatten!
|
28
|
+
session_for_class(clazz).remove_by_id(clazz, ids)
|
28
29
|
end
|
29
30
|
|
30
31
|
#
|
31
32
|
# See Sunspot.remove_by_id!
|
32
33
|
#
|
33
|
-
def remove_by_id!(clazz,
|
34
|
-
|
34
|
+
def remove_by_id!(clazz, *ids)
|
35
|
+
ids.flatten!
|
36
|
+
session_for_class(clazz).remove_by_id!(clazz, ids)
|
35
37
|
end
|
36
38
|
|
37
39
|
#
|
@@ -45,23 +45,31 @@ module Sunspot
|
|
45
45
|
#
|
46
46
|
# See Sunspot.remove_by_id
|
47
47
|
#
|
48
|
-
def remove_by_id(clazz,
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
def remove_by_id(clazz, *ids)
|
49
|
+
ids.flatten!
|
50
|
+
ids_by_session(clazz, ids).each do |session, ids|
|
51
|
+
session.remove_by_id(clazz, ids)
|
52
|
+
end
|
52
53
|
end
|
53
54
|
|
54
55
|
#
|
55
56
|
# See Sunspot.remove_by_id!
|
56
57
|
#
|
57
|
-
def remove_by_id!(clazz,
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
def remove_by_id!(clazz, *ids)
|
59
|
+
ids.flatten!
|
60
|
+
ids_by_session(clazz, ids).each do |session, ids|
|
61
|
+
session.remove_by_id!(clazz, ids)
|
62
|
+
end
|
61
63
|
end
|
62
64
|
|
63
65
|
private
|
64
66
|
|
67
|
+
def ids_by_session(clazz, ids)
|
68
|
+
ids.group_by do |id|
|
69
|
+
session_for_index_id(Adapters::InstanceAdapter.index_id_for(clazz, id))
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
65
73
|
def session_for_index_id(index_id)
|
66
74
|
@sessions[id_hash(index_id) % @sessions.length]
|
67
75
|
end
|
@@ -19,8 +19,8 @@ module Sunspot
|
|
19
19
|
|
20
20
|
delegate :batch, :commit, :commit_if_delete_dirty, :commit_if_dirty,
|
21
21
|
:config, :delete_dirty?, :dirty?, :index, :index!, :optimize, :remove,
|
22
|
-
:remove!, :remove_all, :remove_all!, :remove_by_id,
|
23
|
-
:
|
22
|
+
:remove!, :remove_all, :remove_all!, :remove_by_id, :remove_by_id!,
|
23
|
+
:atomic_update, :atomic_update!, :to => :master_session
|
24
24
|
delegate :new_search, :search, :new_more_like_this, :more_like_this, :to => :slave_session
|
25
25
|
|
26
26
|
def initialize(master_session, slave_session)
|
@@ -59,7 +59,7 @@ module Sunspot
|
|
59
59
|
|
60
60
|
delegate :batch, :commit, :commit_if_dirty, :commit_if_delete_dirty,
|
61
61
|
:dirty?, :index!, :index, :optimize, :remove!, :remove, :remove_all!,
|
62
|
-
:remove_all, :remove_by_id!, :remove_by_id,
|
62
|
+
:remove_all, :remove_by_id!, :remove_by_id, :atomic_update, :atomic_update!,
|
63
63
|
:to => :retry_handler
|
64
64
|
|
65
65
|
end
|
@@ -27,9 +27,11 @@ module Sunspot
|
|
27
27
|
# * remove_by_id!
|
28
28
|
# * remove_all with an argument
|
29
29
|
# * remove_all! with an argument
|
30
|
+
# * atomic_update with arguments
|
31
|
+
# * atomic_update! with arguments
|
30
32
|
#
|
31
33
|
class ShardingSessionProxy < AbstractSessionProxy
|
32
|
-
not_supported :batch, :config, :remove_by_id, :remove_by_id!
|
34
|
+
not_supported :batch, :config, :remove_by_id, :remove_by_id!, :atomic_update, :atomic_update!
|
33
35
|
|
34
36
|
#
|
35
37
|
# +search_session+ is the session that should be used for searching.
|
@@ -70,7 +72,7 @@ module Sunspot
|
|
70
72
|
using_sharded_session(objects) { |session, group| session.index!(group) }
|
71
73
|
end
|
72
74
|
|
73
|
-
#
|
75
|
+
#
|
74
76
|
# See Sunspot.remove
|
75
77
|
#
|
76
78
|
def remove(*objects)
|
@@ -22,7 +22,7 @@ module Sunspot
|
|
22
22
|
SUPPORTED_METHODS = [
|
23
23
|
:batch, :commit, :commit_if_dirty, :commit_if_delete_dirty, :dirty?,
|
24
24
|
:index!, :index, :optimize, :remove!, :remove, :remove_all!, :remove_all,
|
25
|
-
:remove_by_id!, :remove_by_id
|
25
|
+
:remove_by_id!, :remove_by_id, :atomic_update, :atomic_update!
|
26
26
|
]
|
27
27
|
|
28
28
|
SUPPORTED_METHODS.each do |method|
|
@@ -3,7 +3,7 @@ require File.join(File.dirname(__FILE__), 'abstract_session_proxy')
|
|
3
3
|
|
4
4
|
module Sunspot
|
5
5
|
module SessionProxy
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# This class implements a session proxy that creates a different Session
|
8
8
|
# object for each thread. Any multithreaded application should use this
|
9
9
|
# proxy.
|
@@ -17,14 +17,16 @@ module Sunspot
|
|
17
17
|
attr_reader :config
|
18
18
|
@@next_id = 0
|
19
19
|
|
20
|
-
delegate :batch, :commit, :commit_if_delete_dirty, :commit_if_dirty, :delete_dirty?, :dirty?, :index, :index!,
|
20
|
+
delegate :batch, :commit, :commit_if_delete_dirty, :commit_if_dirty, :delete_dirty?, :dirty?, :index, :index!,
|
21
|
+
:new_search, :optimize, :remove, :remove!, :remove_all, :remove_all!, :remove_by_id, :remove_by_id!,
|
22
|
+
:search, :more_like_this, :new_more_like_this, :atomic_update, :atomic_update!, :to => :session
|
21
23
|
|
22
|
-
#
|
24
|
+
#
|
23
25
|
# Optionally pass an existing Sunspot::Configuration object. If none is
|
24
26
|
# passed, a default configuration is used; it can then be modified using
|
25
27
|
# the #config attribute.
|
26
28
|
#
|
27
|
-
def initialize(config = Sunspot::Configuration.
|
29
|
+
def initialize(config = Sunspot::Configuration.build)
|
28
30
|
@config = config
|
29
31
|
ObjectSpace.define_finalizer(self, FINALIZER)
|
30
32
|
end
|
data/lib/sunspot/setup.rb
CHANGED
@@ -15,6 +15,7 @@ module Sunspot
|
|
15
15
|
@more_like_this_field_factories_cache = Hash.new { |h, k| h[k] = [] }
|
16
16
|
@dsl = DSL::Fields.new(self)
|
17
17
|
@document_boost_extractor = nil
|
18
|
+
@id_prefix_extractor = nil
|
18
19
|
add_field_factory(:class, Type::ClassType.instance)
|
19
20
|
end
|
20
21
|
|
@@ -38,6 +39,17 @@ module Sunspot
|
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
42
|
+
def add_join_field_factory(name, type, options = {}, &block)
|
43
|
+
field_factory = FieldFactory::Join.new(name, type, options, &block)
|
44
|
+
@field_factories[field_factory.signature] = field_factory
|
45
|
+
|
46
|
+
if type.is_a?(Type::TextType)
|
47
|
+
@text_field_factories_cache[field_factory.name] = field_factory
|
48
|
+
else
|
49
|
+
@field_factories_cache[field_factory.name] = field_factory
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
41
53
|
#
|
42
54
|
# Add field_factories for fulltext search
|
43
55
|
#
|
@@ -50,6 +62,7 @@ module Sunspot
|
|
50
62
|
field_factory = FieldFactory::Static.new(name, Type::TextType.instance, options, &block)
|
51
63
|
@text_field_factories[name] = field_factory
|
52
64
|
@text_field_factories_cache[field_factory.name] = field_factory
|
65
|
+
@field_factories_cache[field_factory.name] = field_factory
|
53
66
|
if stored
|
54
67
|
@stored_field_factories_cache[field_factory.name] << field_factory
|
55
68
|
end
|
@@ -70,6 +83,7 @@ module Sunspot
|
|
70
83
|
field_factory = FieldFactory::Dynamic.new(name, type, options, &block)
|
71
84
|
@dynamic_field_factories[field_factory.signature] = field_factory
|
72
85
|
@dynamic_field_factories_cache[field_factory.name] = field_factory
|
86
|
+
@field_factories_cache[field_factory.name] = field_factory
|
73
87
|
if stored
|
74
88
|
@stored_field_factories_cache[field_factory.name] << field_factory
|
75
89
|
end
|
@@ -96,6 +110,24 @@ module Sunspot
|
|
96
110
|
end
|
97
111
|
end
|
98
112
|
|
113
|
+
#
|
114
|
+
# Add id prefix for compositeId router
|
115
|
+
#
|
116
|
+
def add_id_prefix(attr_name, &block)
|
117
|
+
@id_prefix_extractor =
|
118
|
+
case attr_name
|
119
|
+
when Symbol
|
120
|
+
DataExtractor::AttributeExtractor.new(attr_name)
|
121
|
+
when String
|
122
|
+
DataExtractor::Constant.new(attr_name)
|
123
|
+
when nil
|
124
|
+
DataExtractor::BlockExtractor.new(&block) if block_given?
|
125
|
+
else
|
126
|
+
raise ArgumentError,
|
127
|
+
"The ID prefix has to be either a Symbol, a String or a Proc"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
99
131
|
#
|
100
132
|
# Builder method for evaluating the setup DSL
|
101
133
|
#
|
@@ -260,6 +292,16 @@ module Sunspot
|
|
260
292
|
end
|
261
293
|
end
|
262
294
|
|
295
|
+
def id_prefix_for(model)
|
296
|
+
if @id_prefix_extractor
|
297
|
+
value = @id_prefix_extractor.value_for(model)
|
298
|
+
|
299
|
+
if value.is_a?(String) and value.size > 0
|
300
|
+
value[-1] == "!" ? value : "#{value}!"
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
263
305
|
protected
|
264
306
|
|
265
307
|
#
|