sunspot_solr 2.0.0.pre.120720 → 2.0.0.pre.120924

Sign up to get free protection for your applications and to get access to all the features.
Files changed (293) hide show
  1. data/.gitignore +11 -0
  2. data/.travis.yml +35 -0
  3. data/README.md +863 -0
  4. data/Rakefile +37 -0
  5. data/ci/travis.sh +67 -0
  6. data/sunspot/.gitignore +13 -0
  7. data/sunspot/Gemfile +5 -0
  8. data/sunspot/History.txt +258 -0
  9. data/sunspot/LICENSE +18 -0
  10. data/sunspot/Rakefile +13 -0
  11. data/sunspot/TODO +13 -0
  12. data/sunspot/lib/light_config.rb +40 -0
  13. data/sunspot/lib/sunspot.rb +579 -0
  14. data/sunspot/lib/sunspot/adapters.rb +349 -0
  15. data/sunspot/lib/sunspot/batcher.rb +62 -0
  16. data/sunspot/lib/sunspot/class_set.rb +23 -0
  17. data/sunspot/lib/sunspot/composite_setup.rb +202 -0
  18. data/sunspot/lib/sunspot/configuration.rb +53 -0
  19. data/sunspot/lib/sunspot/data_extractor.rb +50 -0
  20. data/sunspot/lib/sunspot/dsl.rb +5 -0
  21. data/sunspot/lib/sunspot/dsl/adjustable.rb +47 -0
  22. data/sunspot/lib/sunspot/dsl/field_group.rb +57 -0
  23. data/sunspot/lib/sunspot/dsl/field_query.rb +345 -0
  24. data/sunspot/lib/sunspot/dsl/fields.rb +103 -0
  25. data/sunspot/lib/sunspot/dsl/fulltext.rb +243 -0
  26. data/sunspot/lib/sunspot/dsl/function.rb +27 -0
  27. data/sunspot/lib/sunspot/dsl/functional.rb +44 -0
  28. data/sunspot/lib/sunspot/dsl/more_like_this_query.rb +56 -0
  29. data/sunspot/lib/sunspot/dsl/paginatable.rb +32 -0
  30. data/sunspot/lib/sunspot/dsl/query_facet.rb +36 -0
  31. data/sunspot/lib/sunspot/dsl/restriction.rb +25 -0
  32. data/sunspot/lib/sunspot/dsl/restriction_with_near.rb +160 -0
  33. data/sunspot/lib/sunspot/dsl/scope.rb +214 -0
  34. data/sunspot/lib/sunspot/dsl/search.rb +30 -0
  35. data/sunspot/lib/sunspot/dsl/standard_query.rb +122 -0
  36. data/sunspot/lib/sunspot/field.rb +193 -0
  37. data/sunspot/lib/sunspot/field_factory.rb +129 -0
  38. data/sunspot/lib/sunspot/indexer.rb +136 -0
  39. data/sunspot/lib/sunspot/query.rb +11 -0
  40. data/sunspot/lib/sunspot/query/abstract_field_facet.rb +55 -0
  41. data/sunspot/lib/sunspot/query/bbox.rb +15 -0
  42. data/sunspot/lib/sunspot/query/boost_query.rb +24 -0
  43. data/sunspot/lib/sunspot/query/common_query.rb +96 -0
  44. data/sunspot/lib/sunspot/query/composite_fulltext.rb +36 -0
  45. data/sunspot/lib/sunspot/query/connective.rb +206 -0
  46. data/sunspot/lib/sunspot/query/date_field_facet.rb +14 -0
  47. data/sunspot/lib/sunspot/query/dismax.rb +132 -0
  48. data/sunspot/lib/sunspot/query/field_facet.rb +41 -0
  49. data/sunspot/lib/sunspot/query/field_group.rb +37 -0
  50. data/sunspot/lib/sunspot/query/filter.rb +38 -0
  51. data/sunspot/lib/sunspot/query/function_query.rb +52 -0
  52. data/sunspot/lib/sunspot/query/geo.rb +53 -0
  53. data/sunspot/lib/sunspot/query/geofilt.rb +16 -0
  54. data/sunspot/lib/sunspot/query/highlighting.rb +62 -0
  55. data/sunspot/lib/sunspot/query/more_like_this.rb +61 -0
  56. data/sunspot/lib/sunspot/query/more_like_this_query.rb +12 -0
  57. data/sunspot/lib/sunspot/query/pagination.rb +42 -0
  58. data/sunspot/lib/sunspot/query/query_facet.rb +53 -0
  59. data/sunspot/lib/sunspot/query/range_facet.rb +15 -0
  60. data/sunspot/lib/sunspot/query/restriction.rb +308 -0
  61. data/sunspot/lib/sunspot/query/scope.rb +9 -0
  62. data/sunspot/lib/sunspot/query/sort.rb +109 -0
  63. data/sunspot/lib/sunspot/query/sort_composite.rb +34 -0
  64. data/sunspot/lib/sunspot/query/standard_query.rb +16 -0
  65. data/sunspot/lib/sunspot/query/text_field_boost.rb +17 -0
  66. data/sunspot/lib/sunspot/schema.rb +151 -0
  67. data/sunspot/lib/sunspot/search.rb +9 -0
  68. data/sunspot/lib/sunspot/search/abstract_search.rb +286 -0
  69. data/sunspot/lib/sunspot/search/date_facet.rb +35 -0
  70. data/sunspot/lib/sunspot/search/facet_row.rb +27 -0
  71. data/sunspot/lib/sunspot/search/field_facet.rb +88 -0
  72. data/sunspot/lib/sunspot/search/field_group.rb +70 -0
  73. data/sunspot/lib/sunspot/search/group.rb +54 -0
  74. data/sunspot/lib/sunspot/search/highlight.rb +38 -0
  75. data/sunspot/lib/sunspot/search/hit.rb +150 -0
  76. data/sunspot/lib/sunspot/search/hit_enumerable.rb +68 -0
  77. data/sunspot/lib/sunspot/search/more_like_this_search.rb +31 -0
  78. data/sunspot/lib/sunspot/search/paginated_collection.rb +57 -0
  79. data/sunspot/lib/sunspot/search/query_facet.rb +67 -0
  80. data/sunspot/lib/sunspot/search/range_facet.rb +37 -0
  81. data/sunspot/lib/sunspot/search/standard_search.rb +21 -0
  82. data/sunspot/lib/sunspot/session.rb +262 -0
  83. data/sunspot/lib/sunspot/session_proxy.rb +95 -0
  84. data/sunspot/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
  85. data/sunspot/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
  86. data/sunspot/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
  87. data/sunspot/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
  88. data/sunspot/lib/sunspot/session_proxy/retry_5xx_session_proxy.rb +67 -0
  89. data/sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb +222 -0
  90. data/sunspot/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +42 -0
  91. data/sunspot/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -0
  92. data/sunspot/lib/sunspot/setup.rb +350 -0
  93. data/sunspot/lib/sunspot/text_field_setup.rb +29 -0
  94. data/sunspot/lib/sunspot/type.rb +393 -0
  95. data/sunspot/lib/sunspot/util.rb +252 -0
  96. data/sunspot/lib/sunspot/version.rb +3 -0
  97. data/sunspot/script/console +10 -0
  98. data/sunspot/spec/api/adapters_spec.rb +68 -0
  99. data/sunspot/spec/api/batcher_spec.rb +112 -0
  100. data/sunspot/spec/api/binding_spec.rb +50 -0
  101. data/sunspot/spec/api/class_set_spec.rb +24 -0
  102. data/sunspot/spec/api/hit_enumerable_spec.rb +47 -0
  103. data/sunspot/spec/api/indexer/attributes_spec.rb +149 -0
  104. data/sunspot/spec/api/indexer/batch_spec.rb +72 -0
  105. data/sunspot/spec/api/indexer/dynamic_fields_spec.rb +42 -0
  106. data/sunspot/spec/api/indexer/fixed_fields_spec.rb +57 -0
  107. data/sunspot/spec/api/indexer/fulltext_spec.rb +43 -0
  108. data/sunspot/spec/api/indexer/removal_spec.rb +53 -0
  109. data/sunspot/spec/api/indexer/spec_helper.rb +1 -0
  110. data/sunspot/spec/api/indexer_spec.rb +14 -0
  111. data/sunspot/spec/api/query/advanced_manipulation_examples.rb +35 -0
  112. data/sunspot/spec/api/query/connectives_examples.rb +201 -0
  113. data/sunspot/spec/api/query/dsl_spec.rb +18 -0
  114. data/sunspot/spec/api/query/dynamic_fields_examples.rb +165 -0
  115. data/sunspot/spec/api/query/faceting_examples.rb +497 -0
  116. data/sunspot/spec/api/query/fulltext_examples.rb +313 -0
  117. data/sunspot/spec/api/query/function_spec.rb +79 -0
  118. data/sunspot/spec/api/query/geo_examples.rb +68 -0
  119. data/sunspot/spec/api/query/group_spec.rb +32 -0
  120. data/sunspot/spec/api/query/highlighting_examples.rb +245 -0
  121. data/sunspot/spec/api/query/more_like_this_spec.rb +140 -0
  122. data/sunspot/spec/api/query/ordering_pagination_examples.rb +116 -0
  123. data/sunspot/spec/api/query/scope_examples.rb +275 -0
  124. data/sunspot/spec/api/query/spatial_examples.rb +27 -0
  125. data/sunspot/spec/api/query/spec_helper.rb +1 -0
  126. data/sunspot/spec/api/query/standard_spec.rb +29 -0
  127. data/sunspot/spec/api/query/text_field_scoping_examples.rb +30 -0
  128. data/sunspot/spec/api/query/types_spec.rb +20 -0
  129. data/sunspot/spec/api/search/dynamic_fields_spec.rb +33 -0
  130. data/sunspot/spec/api/search/faceting_spec.rb +360 -0
  131. data/sunspot/spec/api/search/highlighting_spec.rb +69 -0
  132. data/sunspot/spec/api/search/hits_spec.rb +147 -0
  133. data/sunspot/spec/api/search/paginated_collection_spec.rb +36 -0
  134. data/sunspot/spec/api/search/results_spec.rb +72 -0
  135. data/sunspot/spec/api/search/search_spec.rb +23 -0
  136. data/sunspot/spec/api/search/spec_helper.rb +1 -0
  137. data/sunspot/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
  138. data/sunspot/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
  139. data/sunspot/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
  140. data/sunspot/spec/api/session_proxy/retry_5xx_session_proxy_spec.rb +78 -0
  141. data/sunspot/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
  142. data/sunspot/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
  143. data/sunspot/spec/api/session_proxy/spec_helper.rb +9 -0
  144. data/sunspot/spec/api/session_proxy/thread_local_session_proxy_spec.rb +39 -0
  145. data/sunspot/spec/api/session_spec.rb +232 -0
  146. data/sunspot/spec/api/spec_helper.rb +3 -0
  147. data/sunspot/spec/api/sunspot_spec.rb +29 -0
  148. data/sunspot/spec/ext.rb +11 -0
  149. data/sunspot/spec/helpers/indexer_helper.rb +17 -0
  150. data/sunspot/spec/helpers/integration_helper.rb +8 -0
  151. data/sunspot/spec/helpers/mock_session_helper.rb +13 -0
  152. data/sunspot/spec/helpers/query_helper.rb +26 -0
  153. data/sunspot/spec/helpers/search_helper.rb +68 -0
  154. data/sunspot/spec/integration/dynamic_fields_spec.rb +57 -0
  155. data/sunspot/spec/integration/faceting_spec.rb +330 -0
  156. data/sunspot/spec/integration/field_grouping_spec.rb +100 -0
  157. data/sunspot/spec/integration/geospatial_spec.rb +96 -0
  158. data/sunspot/spec/integration/highlighting_spec.rb +44 -0
  159. data/sunspot/spec/integration/indexing_spec.rb +55 -0
  160. data/sunspot/spec/integration/keyword_search_spec.rb +317 -0
  161. data/sunspot/spec/integration/local_search_spec.rb +64 -0
  162. data/sunspot/spec/integration/more_like_this_spec.rb +43 -0
  163. data/sunspot/spec/integration/scoped_search_spec.rb +386 -0
  164. data/sunspot/spec/integration/stored_fields_spec.rb +12 -0
  165. data/sunspot/spec/integration/test_pagination.rb +43 -0
  166. data/sunspot/spec/integration/unicode_spec.rb +15 -0
  167. data/sunspot/spec/mocks/adapters.rb +33 -0
  168. data/sunspot/spec/mocks/blog.rb +3 -0
  169. data/sunspot/spec/mocks/comment.rb +21 -0
  170. data/sunspot/spec/mocks/connection.rb +126 -0
  171. data/sunspot/spec/mocks/mock_adapter.rb +30 -0
  172. data/sunspot/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
  173. data/sunspot/spec/mocks/mock_record.rb +52 -0
  174. data/sunspot/spec/mocks/mock_sharding_session_proxy.rb +15 -0
  175. data/sunspot/spec/mocks/photo.rb +11 -0
  176. data/sunspot/spec/mocks/post.rb +86 -0
  177. data/sunspot/spec/mocks/super_class.rb +2 -0
  178. data/sunspot/spec/mocks/user.rb +13 -0
  179. data/sunspot/spec/spec_helper.rb +40 -0
  180. data/sunspot/sunspot.gemspec +37 -0
  181. data/sunspot/tasks/rdoc.rake +27 -0
  182. data/sunspot/tasks/schema.rake +19 -0
  183. data/sunspot/tasks/todo.rake +4 -0
  184. data/sunspot_rails/.gitignore +7 -0
  185. data/sunspot_rails/.rspec +1 -0
  186. data/sunspot_rails/History.txt +74 -0
  187. data/sunspot_rails/LICENSE +18 -0
  188. data/sunspot_rails/MIT-LICENSE +20 -0
  189. data/sunspot_rails/README.rdoc +265 -0
  190. data/sunspot_rails/Rakefile +17 -0
  191. data/sunspot_rails/TODO +8 -0
  192. data/sunspot_rails/dev_tasks/rdoc.rake +24 -0
  193. data/sunspot_rails/dev_tasks/release.rake +4 -0
  194. data/sunspot_rails/dev_tasks/spec.rake +107 -0
  195. data/sunspot_rails/dev_tasks/todo.rake +4 -0
  196. data/sunspot_rails/gemfiles/rails-2.3.14 +12 -0
  197. data/sunspot_rails/gemfiles/rails-3.0.15 +12 -0
  198. data/sunspot_rails/gemfiles/rails-3.1.6 +12 -0
  199. data/sunspot_rails/gemfiles/rails-3.2.6 +12 -0
  200. data/sunspot_rails/generators/sunspot/sunspot_generator.rb +9 -0
  201. data/sunspot_rails/generators/sunspot/templates/sunspot.yml +20 -0
  202. data/sunspot_rails/install.rb +1 -0
  203. data/sunspot_rails/lib/generators/sunspot_rails.rb +9 -0
  204. data/sunspot_rails/lib/generators/sunspot_rails/install/install_generator.rb +13 -0
  205. data/sunspot_rails/lib/generators/sunspot_rails/install/templates/config/sunspot.yml +19 -0
  206. data/sunspot_rails/lib/sunspot/rails.rb +69 -0
  207. data/sunspot_rails/lib/sunspot/rails/adapters.rb +88 -0
  208. data/sunspot_rails/lib/sunspot/rails/configuration.rb +352 -0
  209. data/sunspot_rails/lib/sunspot/rails/init.rb +5 -0
  210. data/sunspot_rails/lib/sunspot/rails/log_subscriber.rb +45 -0
  211. data/sunspot_rails/lib/sunspot/rails/railtie.rb +41 -0
  212. data/sunspot_rails/lib/sunspot/rails/railties/controller_runtime.rb +36 -0
  213. data/sunspot_rails/lib/sunspot/rails/request_lifecycle.rb +36 -0
  214. data/sunspot_rails/lib/sunspot/rails/searchable.rb +495 -0
  215. data/sunspot_rails/lib/sunspot/rails/server.rb +106 -0
  216. data/sunspot_rails/lib/sunspot/rails/solr_instrumentation.rb +19 -0
  217. data/sunspot_rails/lib/sunspot/rails/solr_logging.rb +62 -0
  218. data/sunspot_rails/lib/sunspot/rails/spec_helper.rb +26 -0
  219. data/sunspot_rails/lib/sunspot/rails/stub_session_proxy.rb +146 -0
  220. data/sunspot_rails/lib/sunspot/rails/tasks.rb +94 -0
  221. data/sunspot_rails/lib/sunspot_rails.rb +12 -0
  222. data/sunspot_rails/spec/configuration_spec.rb +209 -0
  223. data/sunspot_rails/spec/model_lifecycle_spec.rb +63 -0
  224. data/sunspot_rails/spec/model_spec.rb +601 -0
  225. data/sunspot_rails/spec/rails_template/app/controllers/application_controller.rb +10 -0
  226. data/sunspot_rails/spec/rails_template/app/controllers/posts_controller.rb +6 -0
  227. data/sunspot_rails/spec/rails_template/app/models/author.rb +10 -0
  228. data/sunspot_rails/spec/rails_template/app/models/blog.rb +14 -0
  229. data/sunspot_rails/spec/rails_template/app/models/location.rb +3 -0
  230. data/sunspot_rails/spec/rails_template/app/models/photo_post.rb +2 -0
  231. data/sunspot_rails/spec/rails_template/app/models/post.rb +13 -0
  232. data/sunspot_rails/spec/rails_template/app/models/post_with_auto.rb +12 -0
  233. data/sunspot_rails/spec/rails_template/app/models/post_with_default_scope.rb +13 -0
  234. data/sunspot_rails/spec/rails_template/config/boot.rb +127 -0
  235. data/sunspot_rails/spec/rails_template/config/preinitializer.rb +22 -0
  236. data/sunspot_rails/spec/rails_template/config/routes.rb +9 -0
  237. data/sunspot_rails/spec/rails_template/config/sunspot.yml +24 -0
  238. data/sunspot_rails/spec/rails_template/db/schema.rb +27 -0
  239. data/sunspot_rails/spec/request_lifecycle_spec.rb +61 -0
  240. data/sunspot_rails/spec/schema.rb +27 -0
  241. data/sunspot_rails/spec/searchable_spec.rb +12 -0
  242. data/sunspot_rails/spec/server_spec.rb +33 -0
  243. data/sunspot_rails/spec/session_spec.rb +57 -0
  244. data/sunspot_rails/spec/shared_examples/indexed_after_save.rb +8 -0
  245. data/sunspot_rails/spec/shared_examples/not_indexed_after_save.rb +8 -0
  246. data/sunspot_rails/spec/spec_helper.rb +48 -0
  247. data/sunspot_rails/spec/stub_session_proxy_spec.rb +122 -0
  248. data/sunspot_rails/sunspot_rails.gemspec +43 -0
  249. data/{Gemfile → sunspot_solr/Gemfile} +0 -0
  250. data/{README.rdoc → sunspot_solr/README.rdoc} +0 -0
  251. data/{bin → sunspot_solr/bin}/sunspot-installer +0 -0
  252. data/{bin → sunspot_solr/bin}/sunspot-solr +0 -0
  253. data/{lib → sunspot_solr/lib}/sunspot/solr/installer.rb +0 -0
  254. data/{lib → sunspot_solr/lib}/sunspot/solr/installer/config_installer.rb +0 -0
  255. data/{lib → sunspot_solr/lib}/sunspot/solr/installer/task_helper.rb +0 -0
  256. data/{lib → sunspot_solr/lib}/sunspot/solr/java.rb +0 -0
  257. data/{lib → sunspot_solr/lib}/sunspot/solr/railtie.rb +0 -0
  258. data/{lib → sunspot_solr/lib}/sunspot/solr/server.rb +1 -2
  259. data/{lib → sunspot_solr/lib}/sunspot/solr/tasks.rb +0 -0
  260. data/{lib → sunspot_solr/lib}/sunspot_solr.rb +0 -0
  261. data/{solr → sunspot_solr/solr}/README.txt +0 -0
  262. data/{solr → sunspot_solr/solr}/etc/jetty.xml +0 -0
  263. data/{solr → sunspot_solr/solr}/etc/webdefault.xml +0 -0
  264. data/{solr → sunspot_solr/solr}/lib/jetty-6.1.26-patched-JETTY-1340.jar +0 -0
  265. data/{solr → sunspot_solr/solr}/lib/jetty-util-6.1.26-patched-JETTY-1340.jar +0 -0
  266. data/{solr → sunspot_solr/solr}/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  267. data/{solr → sunspot_solr/solr}/lib/jsp-2.1/core-3.1.1.jar +0 -0
  268. data/{solr → sunspot_solr/solr}/lib/jsp-2.1/jsp-2.1.jar +0 -0
  269. data/{solr → sunspot_solr/solr}/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  270. data/{solr → sunspot_solr/solr}/lib/servlet-api-2.5-20081211.jar +0 -0
  271. data/{solr → sunspot_solr/solr}/solr/.gitignore +0 -0
  272. data/{solr → sunspot_solr/solr}/solr/README.txt +0 -0
  273. data/{solr → sunspot_solr/solr}/solr/conf/admin-extra.html +0 -0
  274. data/{solr → sunspot_solr/solr}/solr/conf/elevate.xml +0 -0
  275. data/{solr → sunspot_solr/solr}/solr/conf/mapping-ISOLatin1Accent.txt +0 -0
  276. data/{solr → sunspot_solr/solr}/solr/conf/protwords.txt +0 -0
  277. data/{solr → sunspot_solr/solr}/solr/conf/schema.xml +0 -0
  278. data/{solr → sunspot_solr/solr}/solr/conf/scripts.conf +0 -0
  279. data/{solr → sunspot_solr/solr}/solr/conf/solrconfig.xml +0 -0
  280. data/{solr → sunspot_solr/solr}/solr/conf/spellings.txt +0 -0
  281. data/{solr → sunspot_solr/solr}/solr/conf/stopwords.txt +0 -0
  282. data/{solr → sunspot_solr/solr}/solr/conf/synonyms.txt +0 -0
  283. data/{solr → sunspot_solr/solr}/solr/conf/xslt/example.xsl +0 -0
  284. data/{solr → sunspot_solr/solr}/solr/conf/xslt/example_atom.xsl +0 -0
  285. data/{solr → sunspot_solr/solr}/solr/conf/xslt/example_rss.xsl +0 -0
  286. data/{solr → sunspot_solr/solr}/solr/conf/xslt/luke.xsl +0 -0
  287. data/{solr → sunspot_solr/solr}/start.jar +0 -0
  288. data/{solr → sunspot_solr/solr}/webapps/solr.war +0 -0
  289. data/{spec → sunspot_solr/spec}/server_spec.rb +0 -0
  290. data/{spec → sunspot_solr/spec}/spec_helper.rb +0 -0
  291. data/{sunspot_solr.gemspec → sunspot_solr/sunspot_solr.gemspec} +0 -0
  292. data/tools/gem_tasks.rb +69 -0
  293. metadata +340 -110
@@ -0,0 +1,352 @@
1
+ require 'erb'
2
+
3
+ module Sunspot #:nodoc:
4
+ module Rails #:nodoc:
5
+ #
6
+ # Sunspot::Rails is configured via the config/sunspot.yml file, which
7
+ # contains properties keyed by environment name. A sample sunspot.yml file
8
+ # would look like:
9
+ #
10
+ # development:
11
+ # solr:
12
+ # hostname: localhost
13
+ # port: 8982
14
+ # min_memory: 512M
15
+ # max_memory: 1G
16
+ # solr_jar: /some/path/solr15/start.jar
17
+ # bind_address: 0.0.0.0
18
+ # disabled: false
19
+ # test:
20
+ # solr:
21
+ # hostname: localhost
22
+ # port: 8983
23
+ # log_level: OFF
24
+ # open_timeout: 0.5
25
+ # read_timeout: 2
26
+ # production:
27
+ # solr:
28
+ # hostname: localhost
29
+ # port: 8983
30
+ # path: /solr/myindex
31
+ # log_level: WARNING
32
+ # solr_home: /some/path
33
+ # open_timeout: 0.5
34
+ # read_timeout: 2
35
+ # master_solr:
36
+ # hostname: localhost
37
+ # port: 8982
38
+ # path: /solr
39
+ # auto_commit_after_request: true
40
+ #
41
+ # Sunspot::Rails uses the configuration to set up the Solr connection, as
42
+ # well as for starting Solr with the appropriate port using the
43
+ # <code>rake sunspot:solr:start</code> task.
44
+ #
45
+ # If the <code>master_solr</code> configuration is present, Sunspot will use
46
+ # the Solr instance specified here for all write operations, and the Solr
47
+ # configured under <code>solr</code> for all read operations.
48
+ #
49
+ class Configuration
50
+ attr_writer :user_configuration
51
+ #
52
+ # The host name at which to connect to Solr. Default 'localhost'.
53
+ #
54
+ # ==== Returns
55
+ #
56
+ # String:: host name
57
+ #
58
+ def hostname
59
+ unless defined?(@hostname)
60
+ @hostname = solr_url.host if solr_url
61
+ @hostname ||= user_configuration_from_key('solr', 'hostname')
62
+ @hostname ||= default_hostname
63
+ end
64
+ @hostname
65
+ end
66
+
67
+ #
68
+ # The port at which to connect to Solr.
69
+ # Defaults to 8981 in test, 8982 in development and 8983 in production.
70
+ #
71
+ # ==== Returns
72
+ #
73
+ # Integer:: port
74
+ #
75
+ def port
76
+ unless defined?(@port)
77
+ @port = solr_url.port if solr_url
78
+ @port ||= user_configuration_from_key('solr', 'port')
79
+ @port ||= default_port
80
+ @port = @port.to_i
81
+ end
82
+ @port
83
+ end
84
+
85
+ #
86
+ # The url path to the Solr servlet (useful if you are running multicore).
87
+ # Default '/solr'.
88
+ #
89
+ # ==== Returns
90
+ #
91
+ # String:: path
92
+ #
93
+ def path
94
+ unless defined?(@path)
95
+ @path = solr_url.path if solr_url
96
+ @path ||= user_configuration_from_key('solr', 'path')
97
+ @path ||= default_path
98
+ end
99
+ @path
100
+ end
101
+
102
+ #
103
+ # The host name at which to connect to the master Solr instance. Defaults
104
+ # to the 'hostname' configuration option.
105
+ #
106
+ # ==== Returns
107
+ #
108
+ # String:: host name
109
+ #
110
+ def master_hostname
111
+ @master_hostname ||= (user_configuration_from_key('master_solr', 'hostname') || hostname)
112
+ end
113
+
114
+ #
115
+ # The port at which to connect to the master Solr instance. Defaults to
116
+ # the 'port' configuration option.
117
+ #
118
+ # ==== Returns
119
+ #
120
+ # Integer:: port
121
+ #
122
+ def master_port
123
+ @master_port ||= (user_configuration_from_key('master_solr', 'port') || port).to_i
124
+ end
125
+
126
+ #
127
+ # The path to the master Solr servlet (useful if you are running multicore).
128
+ # Defaults to the value of the 'path' configuration option.
129
+ #
130
+ # ==== Returns
131
+ #
132
+ # String:: path
133
+ #
134
+ def master_path
135
+ @master_path ||= (user_configuration_from_key('master_solr', 'path') || path)
136
+ end
137
+
138
+ #
139
+ # True if there is a master Solr instance configured, otherwise false.
140
+ #
141
+ # ==== Returns
142
+ #
143
+ # Boolean:: bool
144
+ #
145
+ def has_master?
146
+ @has_master = !!user_configuration_from_key('master_solr')
147
+ end
148
+
149
+ #
150
+ # The default log_level that should be passed to solr. You can
151
+ # change the individual log_levels in the solr admin interface.
152
+ # Default 'INFO'.
153
+ #
154
+ # ==== Returns
155
+ #
156
+ # String:: log_level
157
+ #
158
+ def log_level
159
+ @log_level ||= (user_configuration_from_key('solr', 'log_level') || 'INFO')
160
+ end
161
+
162
+ #
163
+ # Should the solr index receive a commit after each http-request.
164
+ # Default true
165
+ #
166
+ # ==== Returns
167
+ #
168
+ # Boolean: auto_commit_after_request?
169
+ #
170
+ def auto_commit_after_request?
171
+ @auto_commit_after_request ||=
172
+ user_configuration_from_key('auto_commit_after_request') != false
173
+ end
174
+
175
+ #
176
+ # As for #auto_commit_after_request? but only for deletes
177
+ # Default false
178
+ #
179
+ # ==== Returns
180
+ #
181
+ # Boolean: auto_commit_after_delete_request?
182
+ #
183
+ def auto_commit_after_delete_request?
184
+ @auto_commit_after_delete_request ||=
185
+ (user_configuration_from_key('auto_commit_after_delete_request') || false)
186
+ end
187
+
188
+
189
+ #
190
+ # The log directory for solr logfiles
191
+ #
192
+ # ==== Returns
193
+ #
194
+ # String:: log_dir
195
+ #
196
+ def log_file
197
+ @log_file ||= (user_configuration_from_key('solr', 'log_file') || default_log_file_location )
198
+ end
199
+
200
+ def data_path
201
+ @data_path ||= user_configuration_from_key('solr', 'data_path') || File.join(::Rails.root, 'solr', 'data', ::Rails.env)
202
+ end
203
+
204
+ def pid_dir
205
+ @pid_dir ||= user_configuration_from_key('solr', 'pid_dir') || File.join(::Rails.root, 'solr', 'pids', ::Rails.env)
206
+ end
207
+
208
+
209
+ #
210
+ # The solr home directory. Sunspot::Rails expects this directory
211
+ # to contain a config, data and pids directory. See
212
+ # Sunspot::Rails::Server.bootstrap for more information.
213
+ #
214
+ # ==== Returns
215
+ #
216
+ # String:: solr_home
217
+ #
218
+ def solr_home
219
+ @solr_home ||=
220
+ if user_configuration_from_key('solr', 'solr_home')
221
+ user_configuration_from_key('solr', 'solr_home')
222
+ else
223
+ File.join(::Rails.root, 'solr')
224
+ end
225
+ end
226
+
227
+ #
228
+ # Solr start jar
229
+ #
230
+ def solr_jar
231
+ @solr_jar ||= user_configuration_from_key('solr', 'solr_jar')
232
+ end
233
+
234
+ #
235
+ # Minimum java heap size for Solr instance
236
+ #
237
+ def min_memory
238
+ @min_memory ||= user_configuration_from_key('solr', 'min_memory')
239
+ end
240
+
241
+ #
242
+ # Maximum java heap size for Solr instance
243
+ #
244
+ def max_memory
245
+ @max_memory ||= user_configuration_from_key('solr', 'max_memory')
246
+ end
247
+
248
+ #
249
+ # Interface on which to run Solr
250
+ #
251
+ def bind_address
252
+ @bind_address ||= user_configuration_from_key('solr', 'bind_address')
253
+ end
254
+
255
+ def read_timeout
256
+ @read_timeout ||= user_configuration_from_key('solr', 'read_timeout')
257
+ end
258
+
259
+ def open_timeout
260
+ @open_timeout ||= user_configuration_from_key('solr', 'open_timeout')
261
+ end
262
+
263
+ #
264
+ # Whether or not to disable Solr.
265
+ # Defaults to false.
266
+ #
267
+ def disabled?
268
+ @disabled ||= (user_configuration_from_key('disabled') || false)
269
+ end
270
+
271
+ private
272
+
273
+ #
274
+ # Logging in rails_root/log as solr_<environment>.log as a
275
+ # default.
276
+ #
277
+ # ===== Returns
278
+ #
279
+ # String:: default_log_file_location
280
+ #
281
+ def default_log_file_location
282
+ File.join(::Rails.root, 'log', "solr_" + ::Rails.env + ".log")
283
+ end
284
+
285
+ #
286
+ # return a specific key from the user configuration in config/sunspot.yml
287
+ #
288
+ # ==== Returns
289
+ #
290
+ # Mixed:: requested_key or nil
291
+ #
292
+ def user_configuration_from_key( *keys )
293
+ keys.inject(user_configuration) do |hash, key|
294
+ hash[key] if hash
295
+ end
296
+ end
297
+
298
+ #
299
+ # Memoized hash of configuration options for the current Rails environment
300
+ # as specified in config/sunspot.yml
301
+ #
302
+ # ==== Returns
303
+ #
304
+ # Hash:: configuration options for current environment
305
+ #
306
+ def user_configuration
307
+ @user_configuration ||=
308
+ begin
309
+ path = File.join(::Rails.root, 'config', 'sunspot.yml')
310
+ if File.exist?(path)
311
+ File.open(path) do |file|
312
+ processed = ERB.new(file.read).result
313
+ YAML.load(processed)[::Rails.env]
314
+ end
315
+ else
316
+ {}
317
+ end
318
+ end
319
+ end
320
+
321
+ protected
322
+
323
+ #
324
+ # When a specific hostname, port and path aren't provided in the
325
+ # sunspot.yml file, look for a key named 'url', then check the
326
+ # environment, then fall back to a sensible localhost default.
327
+ #
328
+
329
+ def solr_url
330
+ if ENV['SOLR_URL'] || ENV['WEBSOLR_URL']
331
+ URI.parse(ENV['SOLR_URL'] || ENV['WEBSOLR_URL'])
332
+ end
333
+ end
334
+
335
+ def default_hostname
336
+ 'localhost'
337
+ end
338
+
339
+ def default_port
340
+ { 'test' => 8981,
341
+ 'development' => 8982,
342
+ 'production' => 8983
343
+ }[::Rails.env] || 8983
344
+ end
345
+
346
+ def default_path
347
+ '/solr'
348
+ end
349
+
350
+ end
351
+ end
352
+ end
@@ -0,0 +1,5 @@
1
+ Sunspot.session = Sunspot::Rails.build_session
2
+ Sunspot::Adapters::InstanceAdapter.register(Sunspot::Rails::Adapters::ActiveRecordInstanceAdapter, ActiveRecord::Base)
3
+ Sunspot::Adapters::DataAccessor.register(Sunspot::Rails::Adapters::ActiveRecordDataAccessor, ActiveRecord::Base)
4
+ ActiveRecord::Base.module_eval { include(Sunspot::Rails::Searchable) }
5
+ ActionController::Base.module_eval { include(Sunspot::Rails::RequestLifecycle) }
@@ -0,0 +1,45 @@
1
+ module Sunspot
2
+ module Rails
3
+ class LogSubscriber < ActiveSupport::LogSubscriber
4
+ def self.runtime=(value)
5
+ Thread.current["sorl_runtime"] = value
6
+ end
7
+
8
+ def self.runtime
9
+ Thread.current["sorl_runtime"] ||= 0
10
+ end
11
+
12
+ def self.reset_runtime
13
+ rt, self.runtime = runtime, 0
14
+ rt
15
+ end
16
+
17
+ def self.logger=(logger)
18
+ @logger = logger
19
+ end
20
+
21
+ def self.logger
22
+ @logger
23
+ end
24
+
25
+ def logger
26
+ self.class.logger || ::Rails.logger
27
+ end
28
+
29
+ def request(event)
30
+ self.class.runtime += event.duration
31
+ return unless logger.debug?
32
+
33
+ name = '%s (%.1fms)' % ["SOLR Request", event.duration]
34
+
35
+ # produces: path=/select parameters={fq: ["type:Tag"], q: rossi, fl: * score, qf: tag_name_text, defType: dismax, start: 0, rows: 20}
36
+ parameters = event.payload[:parameters].map { |k, v| "#{k}: #{color(v, BOLD, true)}" }.join(', ')
37
+ request = "path=#{event.payload[:path]} parameters={#{parameters}}"
38
+
39
+ debug " #{color(name, GREEN, true)} [ #{request} ]"
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ Sunspot::Rails::LogSubscriber.attach_to :rsolr
@@ -0,0 +1,41 @@
1
+ module Sunspot
2
+ module Rails
3
+ class Railtie < ::Rails::Railtie
4
+ initializer 'sunspot_rails.init', :before=> :load_config_initializers do
5
+ Sunspot.session = Sunspot::Rails.build_session
6
+ ActiveSupport.on_load(:active_record) do
7
+ Sunspot::Adapters::InstanceAdapter.register(Sunspot::Rails::Adapters::ActiveRecordInstanceAdapter, ActiveRecord::Base)
8
+ Sunspot::Adapters::DataAccessor.register(Sunspot::Rails::Adapters::ActiveRecordDataAccessor, ActiveRecord::Base)
9
+ include(Sunspot::Rails::Searchable)
10
+ end
11
+ ActiveSupport.on_load(:action_controller) do
12
+ include(Sunspot::Rails::RequestLifecycle)
13
+ end
14
+ require 'sunspot/rails/log_subscriber'
15
+ RSolr::Connection.module_eval{ include Sunspot::Rails::SolrInstrumentation }
16
+ end
17
+
18
+ # Expose database runtime to controller for logging.
19
+ initializer "sunspot_rails.log_runtime" do |app|
20
+ require "sunspot/rails/railties/controller_runtime"
21
+ ActiveSupport.on_load(:action_controller) do
22
+ include Sunspot::Rails::Railties::ControllerRuntime
23
+ end
24
+ end
25
+
26
+ rake_tasks do
27
+ load 'sunspot/rails/tasks.rb'
28
+ end
29
+
30
+ generators do
31
+ load "generators/sunspot_rails.rb"
32
+ end
33
+
34
+ # When loading console, make it output to STDERR.
35
+ console do
36
+ Sunspot::Rails::LogSubscriber.logger = Logger.new(STDERR)
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,36 @@
1
+ module Sunspot
2
+ module Rails
3
+ module Railties
4
+ module ControllerRuntime
5
+ extend ActiveSupport::Concern
6
+
7
+ protected
8
+
9
+ attr_internal :solr_runtime
10
+
11
+ def cleanup_view_runtime
12
+ # TODO only if solr is connected? if not call to super
13
+
14
+ solr_rt_before_render = Sunspot::Rails::LogSubscriber.reset_runtime
15
+ runtime = super
16
+ solr_rt_after_render = Sunspot::Rails::LogSubscriber.reset_runtime
17
+ self.solr_runtime = solr_rt_before_render + solr_rt_after_render
18
+ runtime - solr_rt_after_render
19
+ end
20
+
21
+ def append_info_to_payload(payload)
22
+ super
23
+ payload[:solr_runtime] = solr_runtime
24
+ end
25
+
26
+ module ClassMethods
27
+ def log_process_action(payload)
28
+ messages, solr_runtime = super, payload[:solr_runtime]
29
+ messages << ("Solr: %.1fms" % solr_runtime.to_f) if solr_runtime
30
+ messages
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end