lisausa-sunspot 1.2.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 (217) hide show
  1. data/.gitignore +12 -0
  2. data/Gemfile +4 -0
  3. data/History.txt +222 -0
  4. data/LICENSE +18 -0
  5. data/Rakefile +17 -0
  6. data/TODO +13 -0
  7. data/VERSION.yml +4 -0
  8. data/bin/sunspot-installer +19 -0
  9. data/bin/sunspot-solr +74 -0
  10. data/installer/config/schema.yml +95 -0
  11. data/lib/light_config.rb +40 -0
  12. data/lib/sunspot.rb +569 -0
  13. data/lib/sunspot/adapters.rb +265 -0
  14. data/lib/sunspot/composite_setup.rb +202 -0
  15. data/lib/sunspot/configuration.rb +46 -0
  16. data/lib/sunspot/data_extractor.rb +50 -0
  17. data/lib/sunspot/dsl.rb +5 -0
  18. data/lib/sunspot/dsl/adjustable.rb +47 -0
  19. data/lib/sunspot/dsl/field_query.rb +279 -0
  20. data/lib/sunspot/dsl/fields.rb +103 -0
  21. data/lib/sunspot/dsl/fulltext.rb +243 -0
  22. data/lib/sunspot/dsl/function.rb +14 -0
  23. data/lib/sunspot/dsl/functional.rb +44 -0
  24. data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
  25. data/lib/sunspot/dsl/paginatable.rb +28 -0
  26. data/lib/sunspot/dsl/query_facet.rb +36 -0
  27. data/lib/sunspot/dsl/restriction.rb +25 -0
  28. data/lib/sunspot/dsl/restriction_with_near.rb +121 -0
  29. data/lib/sunspot/dsl/scope.rb +217 -0
  30. data/lib/sunspot/dsl/search.rb +30 -0
  31. data/lib/sunspot/dsl/standard_query.rb +121 -0
  32. data/lib/sunspot/field.rb +193 -0
  33. data/lib/sunspot/field_factory.rb +129 -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 +76 -0
  39. data/lib/sunspot/installer/task_helper.rb +18 -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 +67 -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 +293 -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/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/server.rb +152 -0
  76. data/lib/sunspot/session.rb +260 -0
  77. data/lib/sunspot/session_proxy.rb +87 -0
  78. data/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
  79. data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
  80. data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
  81. data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
  82. data/lib/sunspot/session_proxy/sharding_session_proxy.rb +222 -0
  83. data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +42 -0
  84. data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -0
  85. data/lib/sunspot/setup.rb +350 -0
  86. data/lib/sunspot/text_field_setup.rb +29 -0
  87. data/lib/sunspot/type.rb +372 -0
  88. data/lib/sunspot/util.rb +243 -0
  89. data/lib/sunspot/version.rb +3 -0
  90. data/script/console +10 -0
  91. data/solr-1.3/etc/jetty.xml +212 -0
  92. data/solr-1.3/etc/webdefault.xml +379 -0
  93. data/solr-1.3/lib/jetty-6.1.3.jar +0 -0
  94. data/solr-1.3/lib/jetty-util-6.1.3.jar +0 -0
  95. data/solr-1.3/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  96. data/solr-1.3/lib/jsp-2.1/core-3.1.1.jar +0 -0
  97. data/solr-1.3/lib/jsp-2.1/jsp-2.1.jar +0 -0
  98. data/solr-1.3/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  99. data/solr-1.3/lib/servlet-api-2.5-6.1.3.jar +0 -0
  100. data/solr-1.3/solr/conf/elevate.xml +36 -0
  101. data/solr-1.3/solr/conf/protwords.txt +21 -0
  102. data/solr-1.3/solr/conf/schema.xml +64 -0
  103. data/solr-1.3/solr/conf/solrconfig.xml +725 -0
  104. data/solr-1.3/solr/conf/stopwords.txt +57 -0
  105. data/solr-1.3/solr/conf/synonyms.txt +31 -0
  106. data/solr-1.3/solr/lib/geoapi-nogenerics-2.1-M2.jar +0 -0
  107. data/solr-1.3/solr/lib/gt2-referencing-2.3.1.jar +0 -0
  108. data/solr-1.3/solr/lib/jsr108-0.01.jar +0 -0
  109. data/solr-1.3/solr/lib/locallucene.jar +0 -0
  110. data/solr-1.3/solr/lib/localsolr.jar +0 -0
  111. data/solr-1.3/start.jar +0 -0
  112. data/solr-1.3/webapps/solr.war +0 -0
  113. data/solr/README.txt +42 -0
  114. data/solr/etc/jetty.xml +218 -0
  115. data/solr/etc/webdefault.xml +379 -0
  116. data/solr/lib/jetty-6.1.3.jar +0 -0
  117. data/solr/lib/jetty-util-6.1.3.jar +0 -0
  118. data/solr/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  119. data/solr/lib/jsp-2.1/core-3.1.1.jar +0 -0
  120. data/solr/lib/jsp-2.1/jsp-2.1.jar +0 -0
  121. data/solr/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  122. data/solr/lib/servlet-api-2.5-6.1.3.jar +0 -0
  123. data/solr/solr/.gitignore +1 -0
  124. data/solr/solr/README.txt +54 -0
  125. data/solr/solr/conf/admin-extra.html +31 -0
  126. data/solr/solr/conf/elevate.xml +36 -0
  127. data/solr/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  128. data/solr/solr/conf/protwords.txt +21 -0
  129. data/solr/solr/conf/schema.xml +238 -0
  130. data/solr/solr/conf/scripts.conf +24 -0
  131. data/solr/solr/conf/solrconfig.xml +934 -0
  132. data/solr/solr/conf/spellings.txt +2 -0
  133. data/solr/solr/conf/stopwords.txt +58 -0
  134. data/solr/solr/conf/synonyms.txt +31 -0
  135. data/solr/solr/conf/xslt/example.xsl +132 -0
  136. data/solr/solr/conf/xslt/example_atom.xsl +67 -0
  137. data/solr/solr/conf/xslt/example_rss.xsl +66 -0
  138. data/solr/solr/conf/xslt/luke.xsl +337 -0
  139. data/solr/start.jar +0 -0
  140. data/solr/webapps/solr.war +0 -0
  141. data/spec/api/adapters_spec.rb +33 -0
  142. data/spec/api/binding_spec.rb +50 -0
  143. data/spec/api/indexer/attributes_spec.rb +149 -0
  144. data/spec/api/indexer/batch_spec.rb +46 -0
  145. data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
  146. data/spec/api/indexer/fixed_fields_spec.rb +57 -0
  147. data/spec/api/indexer/fulltext_spec.rb +43 -0
  148. data/spec/api/indexer/removal_spec.rb +53 -0
  149. data/spec/api/indexer/spec_helper.rb +1 -0
  150. data/spec/api/indexer_spec.rb +14 -0
  151. data/spec/api/query/advanced_manipulation_examples.rb +35 -0
  152. data/spec/api/query/connectives_examples.rb +189 -0
  153. data/spec/api/query/dsl_spec.rb +18 -0
  154. data/spec/api/query/dynamic_fields_examples.rb +165 -0
  155. data/spec/api/query/faceting_examples.rb +397 -0
  156. data/spec/api/query/fulltext_examples.rb +313 -0
  157. data/spec/api/query/function_spec.rb +70 -0
  158. data/spec/api/query/geo_examples.rb +68 -0
  159. data/spec/api/query/highlighting_examples.rb +223 -0
  160. data/spec/api/query/more_like_this_spec.rb +140 -0
  161. data/spec/api/query/ordering_pagination_examples.rb +95 -0
  162. data/spec/api/query/scope_examples.rb +275 -0
  163. data/spec/api/query/spec_helper.rb +1 -0
  164. data/spec/api/query/standard_spec.rb +28 -0
  165. data/spec/api/query/text_field_scoping_examples.rb +30 -0
  166. data/spec/api/query/types_spec.rb +20 -0
  167. data/spec/api/search/dynamic_fields_spec.rb +33 -0
  168. data/spec/api/search/faceting_spec.rb +360 -0
  169. data/spec/api/search/highlighting_spec.rb +69 -0
  170. data/spec/api/search/hits_spec.rb +120 -0
  171. data/spec/api/search/paginated_collection_spec.rb +26 -0
  172. data/spec/api/search/results_spec.rb +66 -0
  173. data/spec/api/search/search_spec.rb +23 -0
  174. data/spec/api/search/spec_helper.rb +1 -0
  175. data/spec/api/server_spec.rb +91 -0
  176. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
  177. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
  178. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
  179. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
  180. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
  181. data/spec/api/session_proxy/spec_helper.rb +9 -0
  182. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +50 -0
  183. data/spec/api/session_spec.rb +220 -0
  184. data/spec/api/spec_helper.rb +3 -0
  185. data/spec/api/sunspot_spec.rb +18 -0
  186. data/spec/ext.rb +11 -0
  187. data/spec/helpers/indexer_helper.rb +29 -0
  188. data/spec/helpers/query_helper.rb +38 -0
  189. data/spec/helpers/search_helper.rb +80 -0
  190. data/spec/integration/dynamic_fields_spec.rb +55 -0
  191. data/spec/integration/faceting_spec.rb +238 -0
  192. data/spec/integration/highlighting_spec.rb +22 -0
  193. data/spec/integration/indexing_spec.rb +33 -0
  194. data/spec/integration/keyword_search_spec.rb +317 -0
  195. data/spec/integration/local_search_spec.rb +64 -0
  196. data/spec/integration/more_like_this_spec.rb +43 -0
  197. data/spec/integration/scoped_search_spec.rb +354 -0
  198. data/spec/integration/spec_helper.rb +7 -0
  199. data/spec/integration/stored_fields_spec.rb +10 -0
  200. data/spec/integration/test_pagination.rb +32 -0
  201. data/spec/mocks/adapters.rb +32 -0
  202. data/spec/mocks/blog.rb +3 -0
  203. data/spec/mocks/comment.rb +21 -0
  204. data/spec/mocks/connection.rb +126 -0
  205. data/spec/mocks/mock_adapter.rb +30 -0
  206. data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
  207. data/spec/mocks/mock_record.rb +52 -0
  208. data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
  209. data/spec/mocks/photo.rb +11 -0
  210. data/spec/mocks/post.rb +85 -0
  211. data/spec/mocks/super_class.rb +2 -0
  212. data/spec/mocks/user.rb +13 -0
  213. data/spec/spec_helper.rb +30 -0
  214. data/tasks/rdoc.rake +27 -0
  215. data/tasks/schema.rake +19 -0
  216. data/tasks/todo.rake +4 -0
  217. metadata +457 -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,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,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