pduey-sunspot 1.2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +12 -0
- data/Gemfile +5 -0
- data/History.txt +225 -0
- data/LICENSE +18 -0
- data/Rakefile +15 -0
- data/TODO +13 -0
- data/VERSION.yml +4 -0
- data/bin/sunspot-installer +19 -0
- data/installer/config/schema.yml +95 -0
- data/lib/light_config.rb +40 -0
- data/lib/sunspot.rb +568 -0
- data/lib/sunspot/adapters.rb +265 -0
- data/lib/sunspot/composite_setup.rb +202 -0
- data/lib/sunspot/configuration.rb +46 -0
- data/lib/sunspot/data_extractor.rb +50 -0
- data/lib/sunspot/dsl.rb +5 -0
- data/lib/sunspot/dsl/adjustable.rb +47 -0
- data/lib/sunspot/dsl/field_query.rb +279 -0
- data/lib/sunspot/dsl/fields.rb +103 -0
- data/lib/sunspot/dsl/fulltext.rb +243 -0
- data/lib/sunspot/dsl/function.rb +14 -0
- data/lib/sunspot/dsl/functional.rb +44 -0
- data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
- data/lib/sunspot/dsl/paginatable.rb +28 -0
- data/lib/sunspot/dsl/query_facet.rb +36 -0
- data/lib/sunspot/dsl/restriction.rb +25 -0
- data/lib/sunspot/dsl/restriction_with_near.rb +121 -0
- data/lib/sunspot/dsl/scope.rb +217 -0
- data/lib/sunspot/dsl/search.rb +30 -0
- data/lib/sunspot/dsl/standard_query.rb +121 -0
- data/lib/sunspot/field.rb +193 -0
- data/lib/sunspot/field_factory.rb +129 -0
- data/lib/sunspot/indexer.rb +131 -0
- data/lib/sunspot/installer.rb +31 -0
- data/lib/sunspot/installer/library_installer.rb +45 -0
- data/lib/sunspot/installer/schema_builder.rb +219 -0
- data/lib/sunspot/installer/solrconfig_updater.rb +76 -0
- data/lib/sunspot/installer/task_helper.rb +18 -0
- data/lib/sunspot/java.rb +8 -0
- data/lib/sunspot/query.rb +11 -0
- data/lib/sunspot/query/abstract_field_facet.rb +52 -0
- data/lib/sunspot/query/boost_query.rb +24 -0
- data/lib/sunspot/query/common_query.rb +85 -0
- data/lib/sunspot/query/composite_fulltext.rb +36 -0
- data/lib/sunspot/query/connective.rb +206 -0
- data/lib/sunspot/query/date_field_facet.rb +14 -0
- data/lib/sunspot/query/dismax.rb +128 -0
- data/lib/sunspot/query/field_facet.rb +41 -0
- data/lib/sunspot/query/filter.rb +38 -0
- data/lib/sunspot/query/function_query.rb +52 -0
- data/lib/sunspot/query/geo.rb +53 -0
- data/lib/sunspot/query/highlighting.rb +55 -0
- data/lib/sunspot/query/more_like_this.rb +61 -0
- data/lib/sunspot/query/more_like_this_query.rb +12 -0
- data/lib/sunspot/query/pagination.rb +38 -0
- data/lib/sunspot/query/query_facet.rb +16 -0
- data/lib/sunspot/query/restriction.rb +262 -0
- data/lib/sunspot/query/scope.rb +9 -0
- data/lib/sunspot/query/sort.rb +95 -0
- data/lib/sunspot/query/sort_composite.rb +33 -0
- data/lib/sunspot/query/standard_query.rb +16 -0
- data/lib/sunspot/query/text_field_boost.rb +17 -0
- data/lib/sunspot/schema.rb +151 -0
- data/lib/sunspot/search.rb +9 -0
- data/lib/sunspot/search/abstract_search.rb +335 -0
- data/lib/sunspot/search/date_facet.rb +35 -0
- data/lib/sunspot/search/facet_row.rb +27 -0
- data/lib/sunspot/search/field_facet.rb +88 -0
- data/lib/sunspot/search/highlight.rb +38 -0
- data/lib/sunspot/search/hit.rb +150 -0
- data/lib/sunspot/search/more_like_this_search.rb +31 -0
- data/lib/sunspot/search/paginated_collection.rb +55 -0
- data/lib/sunspot/search/query_facet.rb +67 -0
- data/lib/sunspot/search/standard_search.rb +21 -0
- data/lib/sunspot/session.rb +260 -0
- data/lib/sunspot/session_proxy.rb +87 -0
- data/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
- data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
- data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
- data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
- data/lib/sunspot/session_proxy/sharding_session_proxy.rb +222 -0
- data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +42 -0
- data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -0
- data/lib/sunspot/setup.rb +350 -0
- data/lib/sunspot/text_field_setup.rb +29 -0
- data/lib/sunspot/type.rb +372 -0
- data/lib/sunspot/util.rb +243 -0
- data/lib/sunspot/version.rb +3 -0
- data/pduey-sunspot.gemspec +38 -0
- data/script/console +10 -0
- data/spec/api/adapters_spec.rb +33 -0
- data/spec/api/binding_spec.rb +50 -0
- data/spec/api/indexer/attributes_spec.rb +149 -0
- data/spec/api/indexer/batch_spec.rb +46 -0
- data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
- data/spec/api/indexer/fixed_fields_spec.rb +57 -0
- data/spec/api/indexer/fulltext_spec.rb +43 -0
- data/spec/api/indexer/removal_spec.rb +53 -0
- data/spec/api/indexer/spec_helper.rb +1 -0
- data/spec/api/indexer_spec.rb +14 -0
- data/spec/api/query/advanced_manipulation_examples.rb +35 -0
- data/spec/api/query/connectives_examples.rb +189 -0
- data/spec/api/query/dsl_spec.rb +18 -0
- data/spec/api/query/dynamic_fields_examples.rb +165 -0
- data/spec/api/query/faceting_examples.rb +397 -0
- data/spec/api/query/fulltext_examples.rb +313 -0
- data/spec/api/query/function_spec.rb +70 -0
- data/spec/api/query/geo_examples.rb +68 -0
- data/spec/api/query/highlighting_examples.rb +223 -0
- data/spec/api/query/more_like_this_spec.rb +140 -0
- data/spec/api/query/ordering_pagination_examples.rb +95 -0
- data/spec/api/query/scope_examples.rb +275 -0
- data/spec/api/query/spec_helper.rb +1 -0
- data/spec/api/query/standard_spec.rb +28 -0
- data/spec/api/query/text_field_scoping_examples.rb +30 -0
- data/spec/api/query/types_spec.rb +20 -0
- data/spec/api/search/dynamic_fields_spec.rb +33 -0
- data/spec/api/search/faceting_spec.rb +360 -0
- data/spec/api/search/highlighting_spec.rb +69 -0
- data/spec/api/search/hits_spec.rb +131 -0
- data/spec/api/search/paginated_collection_spec.rb +26 -0
- data/spec/api/search/results_spec.rb +66 -0
- data/spec/api/search/search_spec.rb +23 -0
- data/spec/api/search/spec_helper.rb +1 -0
- data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
- data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
- data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
- data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
- data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
- data/spec/api/session_proxy/spec_helper.rb +9 -0
- data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +39 -0
- data/spec/api/session_spec.rb +220 -0
- data/spec/api/spec_helper.rb +3 -0
- data/spec/api/sunspot_spec.rb +18 -0
- data/spec/ext.rb +11 -0
- data/spec/helpers/indexer_helper.rb +29 -0
- data/spec/helpers/query_helper.rb +38 -0
- data/spec/helpers/search_helper.rb +80 -0
- data/spec/integration/dynamic_fields_spec.rb +57 -0
- data/spec/integration/faceting_spec.rb +238 -0
- data/spec/integration/highlighting_spec.rb +24 -0
- data/spec/integration/indexing_spec.rb +33 -0
- data/spec/integration/keyword_search_spec.rb +317 -0
- data/spec/integration/local_search_spec.rb +64 -0
- data/spec/integration/more_like_this_spec.rb +43 -0
- data/spec/integration/scoped_search_spec.rb +354 -0
- data/spec/integration/spec_helper.rb +7 -0
- data/spec/integration/stored_fields_spec.rb +12 -0
- data/spec/integration/test_pagination.rb +32 -0
- data/spec/mocks/adapters.rb +32 -0
- data/spec/mocks/blog.rb +3 -0
- data/spec/mocks/comment.rb +21 -0
- data/spec/mocks/connection.rb +126 -0
- data/spec/mocks/mock_adapter.rb +30 -0
- data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
- data/spec/mocks/mock_record.rb +52 -0
- data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
- data/spec/mocks/photo.rb +11 -0
- data/spec/mocks/post.rb +85 -0
- data/spec/mocks/super_class.rb +2 -0
- data/spec/mocks/user.rb +13 -0
- data/spec/spec_helper.rb +28 -0
- data/tasks/rdoc.rake +27 -0
- data/tasks/schema.rake +19 -0
- data/tasks/todo.rake +4 -0
- metadata +369 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Sunspot
|
|
2
|
+
module Search
|
|
3
|
+
#
|
|
4
|
+
# This class encapsulates the results of a Solr search. It provides access
|
|
5
|
+
# to search results, total result count, facets, and pagination information.
|
|
6
|
+
# Instances of Search are returned by the Sunspot.search and
|
|
7
|
+
# Sunspot.new_search methods.
|
|
8
|
+
#
|
|
9
|
+
class StandardSearch < AbstractSearch
|
|
10
|
+
def request_handler
|
|
11
|
+
super || :select
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def dsl
|
|
17
|
+
DSL::Search.new(self, @setup)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
module Sunspot
|
|
2
|
+
#
|
|
3
|
+
# A Sunspot session encapsulates a connection to Solr and a set of
|
|
4
|
+
# configuration choices. Though users of Sunspot may manually instantiate
|
|
5
|
+
# Session objects, in the general case it's easier to use the singleton
|
|
6
|
+
# stored in the Sunspot module. Since the Sunspot module provides all of
|
|
7
|
+
# the instance methods of Session as class methods, they are not documented
|
|
8
|
+
# again here.
|
|
9
|
+
#
|
|
10
|
+
class Session
|
|
11
|
+
class <<self
|
|
12
|
+
attr_writer :connection_class #:nodoc:
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# For testing purposes
|
|
16
|
+
#
|
|
17
|
+
def connection_class #:nodoc:
|
|
18
|
+
@connection_class ||= RSolr
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
# Sunspot::Configuration object for this session
|
|
24
|
+
#
|
|
25
|
+
attr_reader :config
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Sessions are initialized with a Sunspot configuration and a Solr
|
|
29
|
+
# connection. Usually you will want to stick with the default arguments
|
|
30
|
+
# when instantiating your own sessions.
|
|
31
|
+
#
|
|
32
|
+
def initialize(config = Configuration.build, connection = nil)
|
|
33
|
+
@config = config
|
|
34
|
+
yield(@config) if block_given?
|
|
35
|
+
@connection = connection
|
|
36
|
+
@deletes = @adds = 0
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
#
|
|
40
|
+
# See Sunspot.new_search
|
|
41
|
+
#
|
|
42
|
+
def new_search(*types, &block)
|
|
43
|
+
types.flatten!
|
|
44
|
+
search = Search::StandardSearch.new(
|
|
45
|
+
connection,
|
|
46
|
+
setup_for_types(types),
|
|
47
|
+
Query::StandardQuery.new(types),
|
|
48
|
+
@config
|
|
49
|
+
)
|
|
50
|
+
search.build(&block) if block
|
|
51
|
+
search
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
#
|
|
55
|
+
# See Sunspot.search
|
|
56
|
+
#
|
|
57
|
+
def search(*types, &block)
|
|
58
|
+
search = new_search(*types, &block)
|
|
59
|
+
search.execute
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# See Sunspot.new_more_like_this
|
|
64
|
+
#
|
|
65
|
+
def new_more_like_this(object, *types, &block)
|
|
66
|
+
types[0] ||= object.class
|
|
67
|
+
mlt = Search::MoreLikeThisSearch.new(
|
|
68
|
+
connection,
|
|
69
|
+
setup_for_types(types),
|
|
70
|
+
Query::MoreLikeThisQuery.new(object, types),
|
|
71
|
+
@config
|
|
72
|
+
)
|
|
73
|
+
mlt.build(&block) if block
|
|
74
|
+
mlt
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
#
|
|
78
|
+
# See Sunspot.more_like_this
|
|
79
|
+
#
|
|
80
|
+
def more_like_this(object, *types, &block)
|
|
81
|
+
mlt = new_more_like_this(object, *types, &block)
|
|
82
|
+
mlt.execute
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
#
|
|
86
|
+
# See Sunspot.index
|
|
87
|
+
#
|
|
88
|
+
def index(*objects)
|
|
89
|
+
objects.flatten!
|
|
90
|
+
@adds += objects.length
|
|
91
|
+
indexer.add(objects)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
#
|
|
95
|
+
# See Sunspot.index!
|
|
96
|
+
#
|
|
97
|
+
def index!(*objects)
|
|
98
|
+
index(*objects)
|
|
99
|
+
commit
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
#
|
|
103
|
+
# See Sunspot.commit
|
|
104
|
+
#
|
|
105
|
+
def commit
|
|
106
|
+
@adds = @deletes = 0
|
|
107
|
+
connection.commit
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
#
|
|
111
|
+
# See Sunspot.optimize
|
|
112
|
+
#
|
|
113
|
+
def optimize
|
|
114
|
+
@adds = @deletes = 0
|
|
115
|
+
connection.optimize
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
#
|
|
119
|
+
# See Sunspot.remove
|
|
120
|
+
#
|
|
121
|
+
def remove(*objects, &block)
|
|
122
|
+
if block
|
|
123
|
+
types = objects
|
|
124
|
+
conjunction = Query::Connective::Conjunction.new
|
|
125
|
+
if types.length == 1
|
|
126
|
+
conjunction.add_positive_restriction(TypeField.instance, Query::Restriction::EqualTo, types.first)
|
|
127
|
+
else
|
|
128
|
+
conjunction.add_positive_restriction(TypeField.instance, Query::Restriction::AnyOf, types)
|
|
129
|
+
end
|
|
130
|
+
dsl = DSL::Scope.new(conjunction, setup_for_types(types))
|
|
131
|
+
Util.instance_eval_or_call(dsl, &block)
|
|
132
|
+
indexer.remove_by_scope(conjunction)
|
|
133
|
+
else
|
|
134
|
+
objects.flatten!
|
|
135
|
+
@deletes += objects.length
|
|
136
|
+
objects.each do |object|
|
|
137
|
+
indexer.remove(object)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
#
|
|
143
|
+
# See Sunspot.remove!
|
|
144
|
+
#
|
|
145
|
+
def remove!(*objects)
|
|
146
|
+
remove(*objects)
|
|
147
|
+
commit
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
#
|
|
151
|
+
# See Sunspot.remove_by_id
|
|
152
|
+
#
|
|
153
|
+
def remove_by_id(clazz, id)
|
|
154
|
+
class_name =
|
|
155
|
+
if clazz.is_a?(Class)
|
|
156
|
+
clazz.name
|
|
157
|
+
else
|
|
158
|
+
clazz.to_s
|
|
159
|
+
end
|
|
160
|
+
indexer.remove_by_id(class_name, id)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
#
|
|
164
|
+
# See Sunspot.remove_by_id!
|
|
165
|
+
#
|
|
166
|
+
def remove_by_id!(clazz, id)
|
|
167
|
+
remove_by_id(clazz, id)
|
|
168
|
+
commit
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
#
|
|
172
|
+
# See Sunspot.remove_all
|
|
173
|
+
#
|
|
174
|
+
def remove_all(*classes)
|
|
175
|
+
classes.flatten!
|
|
176
|
+
if classes.empty?
|
|
177
|
+
@deletes += 1
|
|
178
|
+
indexer.remove_all
|
|
179
|
+
else
|
|
180
|
+
@deletes += classes.length
|
|
181
|
+
classes.each { |clazz| indexer.remove_all(clazz) }
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
#
|
|
186
|
+
# See Sunspot.remove_all!
|
|
187
|
+
#
|
|
188
|
+
def remove_all!(*classes)
|
|
189
|
+
remove_all(*classes)
|
|
190
|
+
commit
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
#
|
|
194
|
+
# See Sunspot.dirty?
|
|
195
|
+
#
|
|
196
|
+
def dirty?
|
|
197
|
+
(@deletes + @adds) > 0
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
#
|
|
201
|
+
# See Sunspot.commit_if_dirty
|
|
202
|
+
#
|
|
203
|
+
def commit_if_dirty
|
|
204
|
+
commit if dirty?
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
#
|
|
208
|
+
# See Sunspot.delete_dirty?
|
|
209
|
+
#
|
|
210
|
+
def delete_dirty?
|
|
211
|
+
@deletes > 0
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
#
|
|
215
|
+
# See Sunspot.commit_if_delete_dirty
|
|
216
|
+
#
|
|
217
|
+
def commit_if_delete_dirty
|
|
218
|
+
commit if delete_dirty?
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
#
|
|
222
|
+
# See Sunspot.batch
|
|
223
|
+
#
|
|
224
|
+
def batch
|
|
225
|
+
indexer.start_batch
|
|
226
|
+
yield
|
|
227
|
+
indexer.flush_batch
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
private
|
|
231
|
+
|
|
232
|
+
#
|
|
233
|
+
# Retrieve the Solr connection for this session, creating one if it does not
|
|
234
|
+
# already exist.
|
|
235
|
+
#
|
|
236
|
+
# ==== Returns
|
|
237
|
+
#
|
|
238
|
+
# RSolr::Connection::Base:: The connection for this session
|
|
239
|
+
#
|
|
240
|
+
def connection
|
|
241
|
+
@connection ||=
|
|
242
|
+
self.class.connection_class.connect(:url => config.solr.url)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def indexer
|
|
246
|
+
@indexer ||= Indexer.new(connection)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def setup_for_types(types)
|
|
250
|
+
if types.empty?
|
|
251
|
+
raise(ArgumentError, "You must specify at least one type to search")
|
|
252
|
+
end
|
|
253
|
+
if types.length == 1
|
|
254
|
+
Setup.for(types.first)
|
|
255
|
+
else
|
|
256
|
+
CompositeSetup.for(types)
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
module Sunspot
|
|
2
|
+
#
|
|
3
|
+
# This module contains several Session Proxy implementations, which can be
|
|
4
|
+
# used to decorate one or more Session objects and add extra functionality.
|
|
5
|
+
# The user can also implement their own Session Proxy classes; a Session Proxy
|
|
6
|
+
# must simply implement the same public API as the Sunspot::Session class.
|
|
7
|
+
#
|
|
8
|
+
# When implementing a session proxy, some methods of Session may not be
|
|
9
|
+
# practical, or even logical, to implement. In this case, the method should
|
|
10
|
+
# raise a Sunspot::SessionProxy::NotSupportedError (several methods in the
|
|
11
|
+
# built-in session proxies raise this error).
|
|
12
|
+
#
|
|
13
|
+
# To use a session proxy in normal Sunspot usage, you can use the
|
|
14
|
+
# Sunspot.session= method, which will cause Sunspot to delegate all of its
|
|
15
|
+
# session-related class methods (most of them) to the proxy. Session proxies
|
|
16
|
+
# can also easily be chained, although the details of chaining depend on the
|
|
17
|
+
# proxy implementation.
|
|
18
|
+
#
|
|
19
|
+
# ===== Example: Chain a MasterSlaveSessionProxy with a ThreadLocalSessionProxy
|
|
20
|
+
#
|
|
21
|
+
# master_session = Sunspot::SessionProxy::ThreadLocalSessionProxy.new
|
|
22
|
+
# slave_session = Sunspot::SessionProxy::ThreadLocalSessionProxy.new
|
|
23
|
+
# master_session.config.solr.url = 'http://master-solr.local:9080/solr'
|
|
24
|
+
# slave_session.config.solr.url = 'http://slave-solr.local:9080/solr'
|
|
25
|
+
# Sunspot.session = Sunspot::SessionProxy::MasterSlaveSessionProxy.new(master_session, slave_session)
|
|
26
|
+
#
|
|
27
|
+
module SessionProxy
|
|
28
|
+
NotSupportedError = Class.new(StandardError)
|
|
29
|
+
|
|
30
|
+
autoload(
|
|
31
|
+
:AbstractSessionProxy,
|
|
32
|
+
File.join(
|
|
33
|
+
File.dirname(__FILE__),
|
|
34
|
+
'session_proxy',
|
|
35
|
+
'abstract_session_proxy'
|
|
36
|
+
)
|
|
37
|
+
)
|
|
38
|
+
autoload(
|
|
39
|
+
:ThreadLocalSessionProxy,
|
|
40
|
+
File.join(
|
|
41
|
+
File.dirname(__FILE__),
|
|
42
|
+
'session_proxy',
|
|
43
|
+
'thread_local_session_proxy'
|
|
44
|
+
)
|
|
45
|
+
)
|
|
46
|
+
autoload(
|
|
47
|
+
:MasterSlaveSessionProxy,
|
|
48
|
+
File.join(
|
|
49
|
+
File.dirname(__FILE__),
|
|
50
|
+
'session_proxy',
|
|
51
|
+
'master_slave_session_proxy'
|
|
52
|
+
)
|
|
53
|
+
)
|
|
54
|
+
autoload(
|
|
55
|
+
:ShardingSessionProxy,
|
|
56
|
+
File.join(
|
|
57
|
+
File.dirname(__FILE__),
|
|
58
|
+
'session_proxy',
|
|
59
|
+
'sharding_session_proxy'
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
autoload(
|
|
63
|
+
:ClassShardingSessionProxy,
|
|
64
|
+
File.join(
|
|
65
|
+
File.dirname(__FILE__),
|
|
66
|
+
'session_proxy',
|
|
67
|
+
'class_sharding_session_proxy'
|
|
68
|
+
)
|
|
69
|
+
)
|
|
70
|
+
autoload(
|
|
71
|
+
:IdShardingSessionProxy,
|
|
72
|
+
File.join(
|
|
73
|
+
File.dirname(__FILE__),
|
|
74
|
+
'session_proxy',
|
|
75
|
+
'id_sharding_session_proxy'
|
|
76
|
+
)
|
|
77
|
+
)
|
|
78
|
+
autoload(
|
|
79
|
+
:SilentFailSessionProxy,
|
|
80
|
+
File.join(
|
|
81
|
+
File.dirname(__FILE__),
|
|
82
|
+
'session_proxy',
|
|
83
|
+
'silent_fail_session_proxy'
|
|
84
|
+
)
|
|
85
|
+
)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Sunspot
|
|
2
|
+
module SessionProxy
|
|
3
|
+
class AbstractSessionProxy #:nodoc:
|
|
4
|
+
class <<self
|
|
5
|
+
def delegate(*args)
|
|
6
|
+
options = Util.extract_options_from(args)
|
|
7
|
+
delegate = options[:to]
|
|
8
|
+
args.each do |method|
|
|
9
|
+
module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
|
10
|
+
def #{method}(*args, &block)
|
|
11
|
+
#{delegate}.#{method}(*args, &block)
|
|
12
|
+
end
|
|
13
|
+
RUBY
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def not_supported(*methods)
|
|
18
|
+
methods.each do |method|
|
|
19
|
+
module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
|
20
|
+
def #{method}(*args, &block)
|
|
21
|
+
raise NotSupportedError, "#{name} does not support #{method.inspect}"
|
|
22
|
+
end
|
|
23
|
+
RUBY
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module Sunspot
|
|
2
|
+
module SessionProxy
|
|
3
|
+
#
|
|
4
|
+
# An abstract subclass of ShardingSessionProxy that shards by class.
|
|
5
|
+
# Concrete subclasses should not override the #session_for method, but
|
|
6
|
+
# should instead implement the #session_for_class method. They must also
|
|
7
|
+
# still implement the #all_sessions method.
|
|
8
|
+
#
|
|
9
|
+
# Unlike its parent class, ClassShardingSessionProxy implements
|
|
10
|
+
# #remove_by_id and all flavors of #remove_all.
|
|
11
|
+
#
|
|
12
|
+
class ClassShardingSessionProxy < ShardingSessionProxy
|
|
13
|
+
#
|
|
14
|
+
# Remove the Session object pointing at the shard that indexes the given
|
|
15
|
+
# class.
|
|
16
|
+
#
|
|
17
|
+
# <strong>Concrete subclasses must implement this method.</strong>
|
|
18
|
+
#
|
|
19
|
+
def session_for_class(clazz)
|
|
20
|
+
raise NotImplementedError
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
# See Sunspot.remove_by_id
|
|
25
|
+
#
|
|
26
|
+
def remove_by_id(clazz, id)
|
|
27
|
+
session_for_class(clazz).remove_by_id(clazz, id)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# See Sunspot.remove_by_id!
|
|
32
|
+
#
|
|
33
|
+
def remove_by_id!(clazz, id)
|
|
34
|
+
session_for_class(clazz).remove_by_id!(clazz, id)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# See Sunspot.remove_all
|
|
39
|
+
#
|
|
40
|
+
def remove_all(clazz = nil)
|
|
41
|
+
if clazz
|
|
42
|
+
session_for_class(clazz).remove_all(clazz)
|
|
43
|
+
else
|
|
44
|
+
all_sessions.each { |session| session.remove_all }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# See Sunspot.remove_all!
|
|
50
|
+
#
|
|
51
|
+
def remove_all!(clazz = nil)
|
|
52
|
+
if clazz
|
|
53
|
+
session_for_class(clazz).remove_all!(clazz)
|
|
54
|
+
else
|
|
55
|
+
all_sessions.each { |session| session.remove_all! }
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def session_for(object)
|
|
62
|
+
session_for_class(object.class)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|