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.
Files changed (166) hide show
  1. data/.gitignore +12 -0
  2. data/Gemfile +5 -0
  3. data/History.txt +225 -0
  4. data/LICENSE +18 -0
  5. data/Rakefile +15 -0
  6. data/TODO +13 -0
  7. data/VERSION.yml +4 -0
  8. data/bin/sunspot-installer +19 -0
  9. data/installer/config/schema.yml +95 -0
  10. data/lib/light_config.rb +40 -0
  11. data/lib/sunspot.rb +568 -0
  12. data/lib/sunspot/adapters.rb +265 -0
  13. data/lib/sunspot/composite_setup.rb +202 -0
  14. data/lib/sunspot/configuration.rb +46 -0
  15. data/lib/sunspot/data_extractor.rb +50 -0
  16. data/lib/sunspot/dsl.rb +5 -0
  17. data/lib/sunspot/dsl/adjustable.rb +47 -0
  18. data/lib/sunspot/dsl/field_query.rb +279 -0
  19. data/lib/sunspot/dsl/fields.rb +103 -0
  20. data/lib/sunspot/dsl/fulltext.rb +243 -0
  21. data/lib/sunspot/dsl/function.rb +14 -0
  22. data/lib/sunspot/dsl/functional.rb +44 -0
  23. data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
  24. data/lib/sunspot/dsl/paginatable.rb +28 -0
  25. data/lib/sunspot/dsl/query_facet.rb +36 -0
  26. data/lib/sunspot/dsl/restriction.rb +25 -0
  27. data/lib/sunspot/dsl/restriction_with_near.rb +121 -0
  28. data/lib/sunspot/dsl/scope.rb +217 -0
  29. data/lib/sunspot/dsl/search.rb +30 -0
  30. data/lib/sunspot/dsl/standard_query.rb +121 -0
  31. data/lib/sunspot/field.rb +193 -0
  32. data/lib/sunspot/field_factory.rb +129 -0
  33. data/lib/sunspot/indexer.rb +131 -0
  34. data/lib/sunspot/installer.rb +31 -0
  35. data/lib/sunspot/installer/library_installer.rb +45 -0
  36. data/lib/sunspot/installer/schema_builder.rb +219 -0
  37. data/lib/sunspot/installer/solrconfig_updater.rb +76 -0
  38. data/lib/sunspot/installer/task_helper.rb +18 -0
  39. data/lib/sunspot/java.rb +8 -0
  40. data/lib/sunspot/query.rb +11 -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 +36 -0
  45. data/lib/sunspot/query/connective.rb +206 -0
  46. data/lib/sunspot/query/date_field_facet.rb +14 -0
  47. data/lib/sunspot/query/dismax.rb +128 -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/geo.rb +53 -0
  52. data/lib/sunspot/query/highlighting.rb +55 -0
  53. data/lib/sunspot/query/more_like_this.rb +61 -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 +262 -0
  58. data/lib/sunspot/query/scope.rb +9 -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 +16 -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 +335 -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 +150 -0
  71. data/lib/sunspot/search/more_like_this_search.rb +31 -0
  72. data/lib/sunspot/search/paginated_collection.rb +55 -0
  73. data/lib/sunspot/search/query_facet.rb +67 -0
  74. data/lib/sunspot/search/standard_search.rb +21 -0
  75. data/lib/sunspot/session.rb +260 -0
  76. data/lib/sunspot/session_proxy.rb +87 -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 +222 -0
  82. data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +42 -0
  83. data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -0
  84. data/lib/sunspot/setup.rb +350 -0
  85. data/lib/sunspot/text_field_setup.rb +29 -0
  86. data/lib/sunspot/type.rb +372 -0
  87. data/lib/sunspot/util.rb +243 -0
  88. data/lib/sunspot/version.rb +3 -0
  89. data/pduey-sunspot.gemspec +38 -0
  90. data/script/console +10 -0
  91. data/spec/api/adapters_spec.rb +33 -0
  92. data/spec/api/binding_spec.rb +50 -0
  93. data/spec/api/indexer/attributes_spec.rb +149 -0
  94. data/spec/api/indexer/batch_spec.rb +46 -0
  95. data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
  96. data/spec/api/indexer/fixed_fields_spec.rb +57 -0
  97. data/spec/api/indexer/fulltext_spec.rb +43 -0
  98. data/spec/api/indexer/removal_spec.rb +53 -0
  99. data/spec/api/indexer/spec_helper.rb +1 -0
  100. data/spec/api/indexer_spec.rb +14 -0
  101. data/spec/api/query/advanced_manipulation_examples.rb +35 -0
  102. data/spec/api/query/connectives_examples.rb +189 -0
  103. data/spec/api/query/dsl_spec.rb +18 -0
  104. data/spec/api/query/dynamic_fields_examples.rb +165 -0
  105. data/spec/api/query/faceting_examples.rb +397 -0
  106. data/spec/api/query/fulltext_examples.rb +313 -0
  107. data/spec/api/query/function_spec.rb +70 -0
  108. data/spec/api/query/geo_examples.rb +68 -0
  109. data/spec/api/query/highlighting_examples.rb +223 -0
  110. data/spec/api/query/more_like_this_spec.rb +140 -0
  111. data/spec/api/query/ordering_pagination_examples.rb +95 -0
  112. data/spec/api/query/scope_examples.rb +275 -0
  113. data/spec/api/query/spec_helper.rb +1 -0
  114. data/spec/api/query/standard_spec.rb +28 -0
  115. data/spec/api/query/text_field_scoping_examples.rb +30 -0
  116. data/spec/api/query/types_spec.rb +20 -0
  117. data/spec/api/search/dynamic_fields_spec.rb +33 -0
  118. data/spec/api/search/faceting_spec.rb +360 -0
  119. data/spec/api/search/highlighting_spec.rb +69 -0
  120. data/spec/api/search/hits_spec.rb +131 -0
  121. data/spec/api/search/paginated_collection_spec.rb +26 -0
  122. data/spec/api/search/results_spec.rb +66 -0
  123. data/spec/api/search/search_spec.rb +23 -0
  124. data/spec/api/search/spec_helper.rb +1 -0
  125. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
  126. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
  127. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
  128. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
  129. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
  130. data/spec/api/session_proxy/spec_helper.rb +9 -0
  131. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +39 -0
  132. data/spec/api/session_spec.rb +220 -0
  133. data/spec/api/spec_helper.rb +3 -0
  134. data/spec/api/sunspot_spec.rb +18 -0
  135. data/spec/ext.rb +11 -0
  136. data/spec/helpers/indexer_helper.rb +29 -0
  137. data/spec/helpers/query_helper.rb +38 -0
  138. data/spec/helpers/search_helper.rb +80 -0
  139. data/spec/integration/dynamic_fields_spec.rb +57 -0
  140. data/spec/integration/faceting_spec.rb +238 -0
  141. data/spec/integration/highlighting_spec.rb +24 -0
  142. data/spec/integration/indexing_spec.rb +33 -0
  143. data/spec/integration/keyword_search_spec.rb +317 -0
  144. data/spec/integration/local_search_spec.rb +64 -0
  145. data/spec/integration/more_like_this_spec.rb +43 -0
  146. data/spec/integration/scoped_search_spec.rb +354 -0
  147. data/spec/integration/spec_helper.rb +7 -0
  148. data/spec/integration/stored_fields_spec.rb +12 -0
  149. data/spec/integration/test_pagination.rb +32 -0
  150. data/spec/mocks/adapters.rb +32 -0
  151. data/spec/mocks/blog.rb +3 -0
  152. data/spec/mocks/comment.rb +21 -0
  153. data/spec/mocks/connection.rb +126 -0
  154. data/spec/mocks/mock_adapter.rb +30 -0
  155. data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
  156. data/spec/mocks/mock_record.rb +52 -0
  157. data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
  158. data/spec/mocks/photo.rb +11 -0
  159. data/spec/mocks/post.rb +85 -0
  160. data/spec/mocks/super_class.rb +2 -0
  161. data/spec/mocks/user.rb +13 -0
  162. data/spec/spec_helper.rb +28 -0
  163. data/tasks/rdoc.rake +27 -0
  164. data/tasks/schema.rake +19 -0
  165. data/tasks/todo.rake +4 -0
  166. 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