ruben-sunspot 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. data/Gemfile +9 -0
  2. data/Gemfile.lock +22 -0
  3. data/History.txt +198 -0
  4. data/LICENSE +18 -0
  5. data/README.rdoc +244 -0
  6. data/Rakefile +11 -0
  7. data/TODO +13 -0
  8. data/VERSION.yml +4 -0
  9. data/bin/sunspot-installer +19 -0
  10. data/bin/sunspot-solr +74 -0
  11. data/installer/config/schema.yml +95 -0
  12. data/lib/light_config.rb +40 -0
  13. data/lib/sunspot.rb +529 -0
  14. data/lib/sunspot/adapters.rb +265 -0
  15. data/lib/sunspot/composite_setup.rb +202 -0
  16. data/lib/sunspot/configuration.rb +46 -0
  17. data/lib/sunspot/data_extractor.rb +50 -0
  18. data/lib/sunspot/dsl.rb +5 -0
  19. data/lib/sunspot/dsl/adjustable.rb +47 -0
  20. data/lib/sunspot/dsl/field_query.rb +266 -0
  21. data/lib/sunspot/dsl/fields.rb +113 -0
  22. data/lib/sunspot/dsl/fulltext.rb +243 -0
  23. data/lib/sunspot/dsl/function.rb +14 -0
  24. data/lib/sunspot/dsl/functional.rb +41 -0
  25. data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
  26. data/lib/sunspot/dsl/paginatable.rb +28 -0
  27. data/lib/sunspot/dsl/query_facet.rb +36 -0
  28. data/lib/sunspot/dsl/restriction.rb +25 -0
  29. data/lib/sunspot/dsl/scope.rb +229 -0
  30. data/lib/sunspot/dsl/search.rb +30 -0
  31. data/lib/sunspot/dsl/standard_query.rb +125 -0
  32. data/lib/sunspot/field.rb +192 -0
  33. data/lib/sunspot/field_factory.rb +147 -0
  34. data/lib/sunspot/indexer.rb +131 -0
  35. data/lib/sunspot/installer.rb +31 -0
  36. data/lib/sunspot/installer/library_installer.rb +45 -0
  37. data/lib/sunspot/installer/schema_builder.rb +219 -0
  38. data/lib/sunspot/installer/solrconfig_updater.rb +106 -0
  39. data/lib/sunspot/installer/task_helper.rb +18 -0
  40. data/lib/sunspot/query.rb +10 -0
  41. data/lib/sunspot/query/abstract_field_facet.rb +52 -0
  42. data/lib/sunspot/query/boost_query.rb +24 -0
  43. data/lib/sunspot/query/common_query.rb +85 -0
  44. data/lib/sunspot/query/composite_fulltext.rb +31 -0
  45. data/lib/sunspot/query/connective.rb +195 -0
  46. data/lib/sunspot/query/date_field_facet.rb +14 -0
  47. data/lib/sunspot/query/dismax.rb +126 -0
  48. data/lib/sunspot/query/field_facet.rb +41 -0
  49. data/lib/sunspot/query/filter.rb +38 -0
  50. data/lib/sunspot/query/function_query.rb +52 -0
  51. data/lib/sunspot/query/highlighting.rb +55 -0
  52. data/lib/sunspot/query/local.rb +26 -0
  53. data/lib/sunspot/query/more_like_this.rb +60 -0
  54. data/lib/sunspot/query/more_like_this_query.rb +12 -0
  55. data/lib/sunspot/query/pagination.rb +38 -0
  56. data/lib/sunspot/query/query_facet.rb +16 -0
  57. data/lib/sunspot/query/restriction.rb +265 -0
  58. data/lib/sunspot/query/scope.rb +16 -0
  59. data/lib/sunspot/query/sort.rb +95 -0
  60. data/lib/sunspot/query/sort_composite.rb +33 -0
  61. data/lib/sunspot/query/standard_query.rb +20 -0
  62. data/lib/sunspot/query/text_field_boost.rb +17 -0
  63. data/lib/sunspot/schema.rb +151 -0
  64. data/lib/sunspot/search.rb +9 -0
  65. data/lib/sunspot/search/abstract_search.rb +302 -0
  66. data/lib/sunspot/search/date_facet.rb +35 -0
  67. data/lib/sunspot/search/facet_row.rb +27 -0
  68. data/lib/sunspot/search/field_facet.rb +88 -0
  69. data/lib/sunspot/search/highlight.rb +38 -0
  70. data/lib/sunspot/search/hit.rb +136 -0
  71. data/lib/sunspot/search/more_like_this_search.rb +31 -0
  72. data/lib/sunspot/search/query_facet.rb +62 -0
  73. data/lib/sunspot/search/standard_search.rb +21 -0
  74. data/lib/sunspot/server.rb +152 -0
  75. data/lib/sunspot/session.rb +252 -0
  76. data/lib/sunspot/session_proxy.rb +71 -0
  77. data/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
  78. data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
  79. data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
  80. data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
  81. data/lib/sunspot/session_proxy/sharding_session_proxy.rb +215 -0
  82. data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -0
  83. data/lib/sunspot/setup.rb +360 -0
  84. data/lib/sunspot/text_field_setup.rb +29 -0
  85. data/lib/sunspot/type.rb +342 -0
  86. data/lib/sunspot/util.rb +253 -0
  87. data/lib/sunspot/version.rb +3 -0
  88. data/solr/etc/jetty.xml +214 -0
  89. data/solr/etc/webdefault.xml +379 -0
  90. data/solr/lib/jetty-6.1.3.jar +0 -0
  91. data/solr/lib/jetty-util-6.1.3.jar +0 -0
  92. data/solr/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  93. data/solr/lib/jsp-2.1/core-3.1.1.jar +0 -0
  94. data/solr/lib/jsp-2.1/jsp-2.1.jar +0 -0
  95. data/solr/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  96. data/solr/lib/servlet-api-2.5-6.1.3.jar +0 -0
  97. data/solr/solr/conf/admin-extra.html +31 -0
  98. data/solr/solr/conf/elevate.xml +36 -0
  99. data/solr/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  100. data/solr/solr/conf/protwords.txt +21 -0
  101. data/solr/solr/conf/schema.xml +238 -0
  102. data/solr/solr/conf/scripts.conf +24 -0
  103. data/solr/solr/conf/solrconfig.xml +938 -0
  104. data/solr/solr/conf/spellings.txt +2 -0
  105. data/solr/solr/conf/stopwords.txt +58 -0
  106. data/solr/solr/conf/synonyms.txt +31 -0
  107. data/solr/solr/lib/lucene-spatial-2.9.1.jar +0 -0
  108. data/solr/solr/lib/solr-spatial-light-0.0.6.jar +0 -0
  109. data/solr/start.jar +0 -0
  110. data/solr/webapps/solr.war +0 -0
  111. data/spec/api/adapters_spec.rb +33 -0
  112. data/spec/api/binding_spec.rb +38 -0
  113. data/spec/api/indexer/attributes_spec.rb +149 -0
  114. data/spec/api/indexer/batch_spec.rb +46 -0
  115. data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
  116. data/spec/api/indexer/fixed_fields_spec.rb +57 -0
  117. data/spec/api/indexer/fulltext_spec.rb +43 -0
  118. data/spec/api/indexer/removal_spec.rb +53 -0
  119. data/spec/api/indexer/spec_helper.rb +1 -0
  120. data/spec/api/indexer_spec.rb +14 -0
  121. data/spec/api/query/advanced_manipulation_examples.rb +35 -0
  122. data/spec/api/query/connectives_examples.rb +186 -0
  123. data/spec/api/query/dsl_spec.rb +18 -0
  124. data/spec/api/query/dynamic_fields_examples.rb +165 -0
  125. data/spec/api/query/faceting_examples.rb +399 -0
  126. data/spec/api/query/fulltext_examples.rb +315 -0
  127. data/spec/api/query/function_spec.rb +70 -0
  128. data/spec/api/query/highlighting_examples.rb +225 -0
  129. data/spec/api/query/local_examples.rb +38 -0
  130. data/spec/api/query/more_like_this_spec.rb +140 -0
  131. data/spec/api/query/ordering_pagination_examples.rb +97 -0
  132. data/spec/api/query/scope_examples.rb +263 -0
  133. data/spec/api/query/spec_helper.rb +1 -0
  134. data/spec/api/query/standard_spec.rb +28 -0
  135. data/spec/api/query/text_field_scoping_examples.rb +30 -0
  136. data/spec/api/query/types_spec.rb +20 -0
  137. data/spec/api/search/dynamic_fields_spec.rb +33 -0
  138. data/spec/api/search/faceting_spec.rb +356 -0
  139. data/spec/api/search/highlighting_spec.rb +69 -0
  140. data/spec/api/search/hits_spec.rb +149 -0
  141. data/spec/api/search/results_spec.rb +79 -0
  142. data/spec/api/search/search_spec.rb +23 -0
  143. data/spec/api/search/spec_helper.rb +1 -0
  144. data/spec/api/server_spec.rb +91 -0
  145. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
  146. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
  147. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
  148. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
  149. data/spec/api/session_proxy/spec_helper.rb +9 -0
  150. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +50 -0
  151. data/spec/api/session_spec.rb +198 -0
  152. data/spec/api/spec_helper.rb +3 -0
  153. data/spec/api/sunspot_spec.rb +18 -0
  154. data/spec/ext.rb +11 -0
  155. data/spec/helpers/indexer_helper.rb +29 -0
  156. data/spec/helpers/query_helper.rb +38 -0
  157. data/spec/helpers/search_helper.rb +80 -0
  158. data/spec/integration/dynamic_fields_spec.rb +55 -0
  159. data/spec/integration/faceting_spec.rb +238 -0
  160. data/spec/integration/highlighting_spec.rb +22 -0
  161. data/spec/integration/indexing_spec.rb +33 -0
  162. data/spec/integration/keyword_search_spec.rb +317 -0
  163. data/spec/integration/local_search_spec.rb +91 -0
  164. data/spec/integration/more_like_this_spec.rb +43 -0
  165. data/spec/integration/scoped_search_spec.rb +349 -0
  166. data/spec/integration/spec_helper.rb +7 -0
  167. data/spec/integration/stored_fields_spec.rb +10 -0
  168. data/spec/integration/test_pagination.rb +32 -0
  169. data/spec/mocks/adapters.rb +32 -0
  170. data/spec/mocks/blog.rb +3 -0
  171. data/spec/mocks/comment.rb +21 -0
  172. data/spec/mocks/connection.rb +126 -0
  173. data/spec/mocks/mock_adapter.rb +30 -0
  174. data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
  175. data/spec/mocks/mock_record.rb +52 -0
  176. data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
  177. data/spec/mocks/photo.rb +12 -0
  178. data/spec/mocks/post.rb +76 -0
  179. data/spec/mocks/super_class.rb +2 -0
  180. data/spec/mocks/user.rb +8 -0
  181. data/spec/spec_helper.rb +52 -0
  182. data/tasks/gemspec.rake +33 -0
  183. data/tasks/rcov.rake +28 -0
  184. data/tasks/rdoc.rake +27 -0
  185. data/tasks/schema.rake +19 -0
  186. data/tasks/spec.rake +24 -0
  187. data/tasks/todo.rake +4 -0
  188. metadata +356 -0
@@ -0,0 +1,152 @@
1
+ require 'escape'
2
+ require 'set'
3
+ require 'tempfile'
4
+
5
+ module Sunspot
6
+ class Server #:nodoc:
7
+ # Raised if #stop is called but the server is not running
8
+ ServerError = Class.new(RuntimeError)
9
+ AlreadyRunningError = Class.new(ServerError)
10
+ NotRunningError = Class.new(ServerError)
11
+
12
+ # Name of the sunspot executable (shell script)
13
+ SOLR_START_JAR = File.expand_path(
14
+ File.join(File.dirname(__FILE__), '..', '..', 'solr', 'start.jar')
15
+ )
16
+
17
+ LOG_LEVELS = Set['SEVERE', 'WARNING', 'INFO', 'CONFIG', 'FINE', 'FINER', 'FINEST']
18
+
19
+ attr_accessor :min_memory, :max_memory, :port, :solr_data_dir, :solr_home, :log_file
20
+ attr_writer :pid_dir, :pid_file, :log_level, :solr_data_dir, :solr_home, :solr_jar
21
+
22
+ #
23
+ # Start the sunspot-solr server. Bootstrap solr_home first,
24
+ # if neccessary.
25
+ #
26
+ # ==== Returns
27
+ #
28
+ # Boolean:: success
29
+ #
30
+ def start
31
+ if File.exist?(pid_path)
32
+ existing_pid = IO.read(pid_path).to_i
33
+ begin
34
+ Process.kill(0, existing_pid)
35
+ raise(AlreadyRunningError, "Server is already running with PID #{existing_pid}")
36
+ rescue Errno::ESRCH
37
+ STDERR.puts("Removing stale PID file at #{pid_path}")
38
+ FileUtils.rm(pid_path)
39
+ end
40
+ end
41
+ fork do
42
+ pid = fork do
43
+ Process.setsid
44
+ STDIN.reopen('/dev/null')
45
+ STDOUT.reopen('/dev/null', 'a')
46
+ STDERR.reopen(STDOUT)
47
+ run
48
+ end
49
+ FileUtils.mkdir_p(pid_dir)
50
+ File.open(pid_path, 'w') do |file|
51
+ file << pid
52
+ end
53
+ end
54
+ end
55
+
56
+ #
57
+ # Run the sunspot-solr server in the foreground. Boostrap
58
+ # solr_home first, if neccessary.
59
+ #
60
+ # ==== Returns
61
+ #
62
+ # Boolean:: success
63
+ #
64
+ def run
65
+ command = ['java']
66
+ command << "-Xms#{min_memory}" if min_memory
67
+ command << "-Xmx#{max_memory}" if max_memory
68
+ command << "-Djetty.port=#{port}" if port
69
+ command << "-Dsolr.data.dir=#{solr_data_dir}" if solr_data_dir
70
+ command << "-Dsolr.solr.home=#{solr_home}" if solr_home
71
+ command << "-Djava.util.logging.config.file=#{logging_config_path}" if logging_config_path
72
+ command << '-jar' << File.basename(solr_jar)
73
+ FileUtils.cd(File.dirname(solr_jar)) do
74
+ exec(Escape.shell_command(command))
75
+ end
76
+ end
77
+
78
+ #
79
+ # Stop the sunspot-solr server.
80
+ #
81
+ # ==== Returns
82
+ #
83
+ # Boolean:: success
84
+ #
85
+ def stop
86
+ if File.exist?(pid_path)
87
+ pid = IO.read(pid_path).to_i
88
+ begin
89
+ Process.kill('TERM', pid)
90
+ rescue Errno::ESRCH
91
+ raise NotRunningError, "Process with PID #{pid} is no longer running"
92
+ ensure
93
+ FileUtils.rm(pid_path)
94
+ end
95
+ else
96
+ raise NotRunningError, "No PID file at #{pid_path}"
97
+ end
98
+ end
99
+
100
+ def log_level=(level)
101
+ unless LOG_LEVELS.include?(level.to_s.upcase)
102
+ raise(ArgumentError, "#{level} is not a valid log level: Use one of #{LOG_LEVELS.to_a.join(',')}")
103
+ end
104
+ @log_level = level.to_s.upcase
105
+ end
106
+
107
+ def log_level
108
+ @log_level || 'WARNING'
109
+ end
110
+
111
+ def pid_path
112
+ File.join(pid_dir, pid_file)
113
+ end
114
+
115
+ def pid_file
116
+ @pid_file || 'sunspot-solr.pid'
117
+ end
118
+
119
+ def pid_dir
120
+ File.expand_path(@pid_dir || FileUtils.pwd)
121
+ end
122
+
123
+ def solr_data_dir
124
+ File.expand_path(@solr_data_dir || Dir.tmpdir)
125
+ end
126
+
127
+ def solr_home
128
+ File.expand_path(@solr_home || File.join(File.dirname(solr_jar), 'solr'))
129
+ end
130
+
131
+ def solr_jar
132
+ @solr_jar || SOLR_START_JAR
133
+ end
134
+
135
+ private
136
+
137
+ def logging_config_path
138
+ return @logging_config_path if defined?(@logging_config_path)
139
+ @logging_config_path =
140
+ if log_file
141
+ logging_config = Tempfile.new('logging.properties')
142
+ logging_config.puts("handlers = java.util.logging.FileHandler")
143
+ logging_config.puts("java.util.logging.FileHandler.level = #{log_level.to_s.upcase}")
144
+ logging_config.puts("java.util.logging.FileHandler.pattern = #{log_file}")
145
+ logging_config.puts("java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter")
146
+ logging_config.flush
147
+ logging_config.close
148
+ logging_config.path
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,252 @@
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.remove
112
+ #
113
+ def remove(*objects, &block)
114
+ if block
115
+ types = objects
116
+ conjunction = Query::Connective::Conjunction.new
117
+ if types.length == 1
118
+ conjunction.add_restriction(TypeField.instance, Query::Restriction::EqualTo, types.first)
119
+ else
120
+ conjunction.add_restriction(TypeField.instance, Query::Restriction::AnyOf, types)
121
+ end
122
+ dsl = DSL::Scope.new(conjunction, setup_for_types(types))
123
+ Util.instance_eval_or_call(dsl, &block)
124
+ indexer.remove_by_scope(conjunction)
125
+ else
126
+ objects.flatten!
127
+ @deletes += objects.length
128
+ objects.each do |object|
129
+ indexer.remove(object)
130
+ end
131
+ end
132
+ end
133
+
134
+ #
135
+ # See Sunspot.remove!
136
+ #
137
+ def remove!(*objects)
138
+ remove(*objects)
139
+ commit
140
+ end
141
+
142
+ #
143
+ # See Sunspot.remove_by_id
144
+ #
145
+ def remove_by_id(clazz, id)
146
+ class_name =
147
+ if clazz.is_a?(Class)
148
+ clazz.name
149
+ else
150
+ clazz.to_s
151
+ end
152
+ indexer.remove_by_id(class_name, id)
153
+ end
154
+
155
+ #
156
+ # See Sunspot.remove_by_id!
157
+ #
158
+ def remove_by_id!(clazz, id)
159
+ remove_by_id(clazz, id)
160
+ commit
161
+ end
162
+
163
+ #
164
+ # See Sunspot.remove_all
165
+ #
166
+ def remove_all(*classes)
167
+ classes.flatten!
168
+ if classes.empty?
169
+ @deletes += 1
170
+ indexer.remove_all
171
+ else
172
+ @deletes += classes.length
173
+ classes.each { |clazz| indexer.remove_all(clazz) }
174
+ end
175
+ end
176
+
177
+ #
178
+ # See Sunspot.remove_all!
179
+ #
180
+ def remove_all!(*classes)
181
+ remove_all(*classes)
182
+ commit
183
+ end
184
+
185
+ #
186
+ # See Sunspot.dirty?
187
+ #
188
+ def dirty?
189
+ (@deletes + @adds) > 0
190
+ end
191
+
192
+ #
193
+ # See Sunspot.commit_if_dirty
194
+ #
195
+ def commit_if_dirty
196
+ commit if dirty?
197
+ end
198
+
199
+ #
200
+ # See Sunspot.delete_dirty?
201
+ #
202
+ def delete_dirty?
203
+ @deletes > 0
204
+ end
205
+
206
+ #
207
+ # See Sunspot.commit_if_delete_dirty
208
+ #
209
+ def commit_if_delete_dirty
210
+ commit if delete_dirty?
211
+ end
212
+
213
+ #
214
+ # See Sunspot.batch
215
+ #
216
+ def batch
217
+ indexer.start_batch
218
+ yield
219
+ indexer.flush_batch
220
+ end
221
+
222
+ private
223
+
224
+ #
225
+ # Retrieve the Solr connection for this session, creating one if it does not
226
+ # already exist.
227
+ #
228
+ # ==== Returns
229
+ #
230
+ # RSolr::Connection::Base:: The connection for this session
231
+ #
232
+ def connection
233
+ @connection ||=
234
+ self.class.connection_class.connect(:url => config.solr.url)
235
+ end
236
+
237
+ def indexer
238
+ @indexer ||= Indexer.new(connection)
239
+ end
240
+
241
+ def setup_for_types(types)
242
+ if types.empty?
243
+ raise(ArgumentError, "You must specify at least one type to search")
244
+ end
245
+ if types.length == 1
246
+ Setup.for(types.first)
247
+ else
248
+ CompositeSetup.for(types)
249
+ end
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,71 @@
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
+ :ThreadLocalSessionProxy,
32
+ File.join(
33
+ File.dirname(__FILE__),
34
+ 'session_proxy',
35
+ 'thread_local_session_proxy'
36
+ )
37
+ )
38
+ autoload(
39
+ :MasterSlaveSessionProxy,
40
+ File.join(
41
+ File.dirname(__FILE__),
42
+ 'session_proxy',
43
+ 'master_slave_session_proxy'
44
+ )
45
+ )
46
+ autoload(
47
+ :ShardingSessionProxy,
48
+ File.join(
49
+ File.dirname(__FILE__),
50
+ 'session_proxy',
51
+ 'sharding_session_proxy'
52
+ )
53
+ )
54
+ autoload(
55
+ :ClassShardingSessionProxy,
56
+ File.join(
57
+ File.dirname(__FILE__),
58
+ 'session_proxy',
59
+ 'class_sharding_session_proxy'
60
+ )
61
+ )
62
+ autoload(
63
+ :IdShardingSessionProxy,
64
+ File.join(
65
+ File.dirname(__FILE__),
66
+ 'session_proxy',
67
+ 'id_sharding_session_proxy'
68
+ )
69
+ )
70
+ end
71
+ end