thinking-sphinx 2.1.0 → 3.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (352) hide show
  1. data/.gitignore +8 -0
  2. data/.travis.yml +13 -0
  3. data/Appraisals +7 -0
  4. data/Gemfile +10 -0
  5. data/HISTORY +2 -267
  6. data/LICENCE +1 -1
  7. data/README.textile +194 -226
  8. data/Rakefile +24 -0
  9. data/gemfiles/.gitignore +1 -0
  10. data/gemfiles/rails_3_1.gemfile +11 -0
  11. data/gemfiles/rails_3_2.gemfile +11 -0
  12. data/lib/thinking-sphinx.rb +1 -1
  13. data/lib/thinking_sphinx.rb +34 -292
  14. data/lib/thinking_sphinx/active_record.rb +22 -383
  15. data/lib/thinking_sphinx/active_record/association.rb +9 -0
  16. data/lib/thinking_sphinx/active_record/association_proxy.rb +68 -0
  17. data/lib/thinking_sphinx/active_record/associations.rb +68 -0
  18. data/lib/thinking_sphinx/active_record/attribute.rb +20 -0
  19. data/lib/thinking_sphinx/active_record/attribute/sphinx_presenter.rb +32 -0
  20. data/lib/thinking_sphinx/active_record/attribute/type.rb +79 -0
  21. data/lib/thinking_sphinx/active_record/attribute/values.rb +18 -0
  22. data/lib/thinking_sphinx/active_record/base.rb +36 -0
  23. data/lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb +31 -0
  24. data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +55 -0
  25. data/lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb +59 -0
  26. data/lib/thinking_sphinx/active_record/column.rb +30 -0
  27. data/lib/thinking_sphinx/active_record/database_adapters.rb +51 -0
  28. data/lib/thinking_sphinx/active_record/database_adapters/abstract_adapter.rb +13 -0
  29. data/lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb +23 -0
  30. data/lib/thinking_sphinx/active_record/database_adapters/postgresql_adapter.rb +25 -0
  31. data/lib/thinking_sphinx/active_record/field.rb +11 -0
  32. data/lib/thinking_sphinx/active_record/index.rb +55 -0
  33. data/lib/thinking_sphinx/active_record/interpreter.rb +47 -0
  34. data/lib/thinking_sphinx/active_record/log_subscriber.rb +10 -58
  35. data/lib/thinking_sphinx/active_record/property.rb +28 -0
  36. data/lib/thinking_sphinx/active_record/property_sql_presenter.rb +60 -0
  37. data/lib/thinking_sphinx/active_record/sql_builder.rb +159 -0
  38. data/lib/thinking_sphinx/active_record/sql_source.rb +138 -0
  39. data/lib/thinking_sphinx/active_record/sql_source/template.rb +46 -0
  40. data/lib/thinking_sphinx/batched_search.rb +26 -0
  41. data/lib/thinking_sphinx/callbacks.rb +15 -0
  42. data/lib/thinking_sphinx/configuration.rb +80 -331
  43. data/lib/thinking_sphinx/configuration/consistent_ids.rb +31 -0
  44. data/lib/thinking_sphinx/configuration/defaults.rb +5 -0
  45. data/lib/thinking_sphinx/core.rb +6 -0
  46. data/lib/thinking_sphinx/core/index.rb +68 -0
  47. data/lib/thinking_sphinx/core/interpreter.rb +19 -0
  48. data/lib/thinking_sphinx/deltas.rb +35 -26
  49. data/lib/thinking_sphinx/deltas/default_delta.rb +56 -56
  50. data/lib/thinking_sphinx/excerpter.rb +23 -21
  51. data/lib/thinking_sphinx/facet.rb +22 -127
  52. data/lib/thinking_sphinx/facet_search.rb +95 -162
  53. data/lib/thinking_sphinx/index.rb +39 -143
  54. data/lib/thinking_sphinx/index_set.rb +51 -0
  55. data/lib/thinking_sphinx/masks.rb +8 -0
  56. data/lib/thinking_sphinx/masks/group_enumerators_mask.rb +23 -0
  57. data/lib/thinking_sphinx/masks/pagination_mask.rb +60 -0
  58. data/lib/thinking_sphinx/masks/scopes_mask.rb +35 -0
  59. data/lib/thinking_sphinx/masks/weight_enumerator_mask.rb +11 -0
  60. data/lib/thinking_sphinx/middlewares.rb +36 -0
  61. data/lib/thinking_sphinx/middlewares/active_record_translator.rb +73 -0
  62. data/lib/thinking_sphinx/middlewares/geographer.rb +53 -0
  63. data/lib/thinking_sphinx/middlewares/glazier.rb +39 -0
  64. data/lib/thinking_sphinx/middlewares/ids_only.rb +13 -0
  65. data/lib/thinking_sphinx/middlewares/inquirer.rb +62 -0
  66. data/lib/thinking_sphinx/middlewares/middleware.rb +9 -0
  67. data/lib/thinking_sphinx/middlewares/sphinxql.rb +149 -0
  68. data/lib/thinking_sphinx/middlewares/stale_id_checker.rb +45 -0
  69. data/lib/thinking_sphinx/middlewares/stale_id_filter.rb +46 -0
  70. data/lib/thinking_sphinx/panes.rb +8 -0
  71. data/lib/thinking_sphinx/panes/attributes_pane.rb +9 -0
  72. data/lib/thinking_sphinx/panes/distance_pane.rb +13 -0
  73. data/lib/thinking_sphinx/panes/excerpts_pane.rb +37 -0
  74. data/lib/thinking_sphinx/panes/weight_pane.rb +9 -0
  75. data/lib/thinking_sphinx/railtie.rb +6 -40
  76. data/lib/thinking_sphinx/rake_interface.rb +47 -0
  77. data/lib/thinking_sphinx/real_time.rb +11 -0
  78. data/lib/thinking_sphinx/real_time/attribute.rb +5 -0
  79. data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +48 -0
  80. data/lib/thinking_sphinx/real_time/field.rb +3 -0
  81. data/lib/thinking_sphinx/real_time/index.rb +47 -0
  82. data/lib/thinking_sphinx/real_time/index/template.rb +33 -0
  83. data/lib/thinking_sphinx/real_time/interpreter.rb +23 -0
  84. data/lib/thinking_sphinx/real_time/property.rb +16 -0
  85. data/lib/thinking_sphinx/scopes.rb +22 -0
  86. data/lib/thinking_sphinx/search.rb +90 -1028
  87. data/lib/thinking_sphinx/search/batch_inquirer.rb +27 -0
  88. data/lib/thinking_sphinx/search/context.rb +26 -0
  89. data/lib/thinking_sphinx/search/glaze.rb +32 -0
  90. data/lib/thinking_sphinx/search/merger.rb +24 -0
  91. data/lib/thinking_sphinx/search/query.rb +43 -0
  92. data/lib/thinking_sphinx/search/stale_ids_exception.rb +11 -0
  93. data/lib/thinking_sphinx/search/translator.rb +50 -0
  94. data/lib/thinking_sphinx/tasks.rb +22 -125
  95. data/lib/thinking_sphinx/test.rb +9 -19
  96. data/sketchpad.rb +58 -0
  97. data/spec/acceptance/association_scoping_spec.rb +23 -0
  98. data/spec/acceptance/attribute_access_spec.rb +39 -0
  99. data/spec/acceptance/attribute_updates_spec.rb +16 -0
  100. data/spec/acceptance/batch_searching_spec.rb +21 -0
  101. data/spec/acceptance/big_integers_spec.rb +27 -0
  102. data/spec/acceptance/excerpts_spec.rb +14 -0
  103. data/spec/acceptance/facets_spec.rb +122 -0
  104. data/spec/acceptance/geosearching_spec.rb +39 -0
  105. data/spec/acceptance/grouping_by_attributes_spec.rb +77 -0
  106. data/spec/acceptance/paginating_search_results_spec.rb +24 -0
  107. data/spec/acceptance/remove_deleted_records_spec.rb +23 -0
  108. data/spec/acceptance/search_counts_spec.rb +18 -0
  109. data/spec/acceptance/search_for_just_ids_spec.rb +19 -0
  110. data/spec/acceptance/searching_across_models_spec.rb +28 -0
  111. data/spec/acceptance/searching_on_fields_spec.rb +56 -0
  112. data/spec/acceptance/searching_with_filters_spec.rb +109 -0
  113. data/spec/acceptance/searching_with_sti_spec.rb +55 -0
  114. data/spec/acceptance/searching_within_a_model_spec.rb +52 -0
  115. data/spec/acceptance/sorting_search_results_spec.rb +41 -0
  116. data/spec/acceptance/spec_helper.rb +4 -0
  117. data/spec/acceptance/specifying_sql_spec.rb +62 -0
  118. data/spec/acceptance/sphinx_scopes_spec.rb +49 -0
  119. data/spec/acceptance/sql_deltas_spec.rb +43 -0
  120. data/spec/acceptance/support/database_cleaner.rb +11 -0
  121. data/spec/acceptance/support/sphinx_controller.rb +39 -0
  122. data/spec/acceptance/support/sphinx_helpers.rb +24 -0
  123. data/spec/acceptance/suspended_deltas_spec.rb +20 -0
  124. data/spec/internal/.gitignore +1 -0
  125. data/spec/internal/app/indices/animal_index.rb +3 -0
  126. data/spec/internal/app/indices/article_index.rb +24 -0
  127. data/spec/internal/app/indices/book_index.rb +8 -0
  128. data/spec/internal/app/indices/city_index.rb +6 -0
  129. data/spec/internal/app/indices/product_index.rb +3 -0
  130. data/spec/internal/app/indices/tee_index.rb +4 -0
  131. data/spec/internal/app/indices/user_index.rb +5 -0
  132. data/spec/internal/app/models/animal.rb +2 -0
  133. data/spec/internal/app/models/article.rb +5 -0
  134. data/spec/internal/app/models/bird.rb +2 -0
  135. data/spec/internal/app/models/book.rb +11 -0
  136. data/spec/internal/app/models/city.rb +2 -0
  137. data/spec/internal/app/models/colour.rb +3 -0
  138. data/spec/internal/app/models/flightless_bird.rb +2 -0
  139. data/spec/internal/app/models/mammal.rb +2 -0
  140. data/spec/internal/app/models/product.rb +3 -0
  141. data/spec/internal/app/models/tag.rb +4 -0
  142. data/{features/thinking_sphinx → spec/internal/app}/models/tagging.rb +1 -1
  143. data/spec/internal/app/models/tee.rb +3 -0
  144. data/spec/internal/app/models/tweet.rb +3 -0
  145. data/spec/internal/app/models/user.rb +3 -0
  146. data/spec/internal/config/database.yml +5 -0
  147. data/spec/internal/db/schema.rb +65 -0
  148. data/spec/internal/log/.gitignore +1 -0
  149. data/spec/spec_helper.rb +8 -49
  150. data/spec/support/sphinx_yaml_helpers.rb +9 -0
  151. data/spec/thinking_sphinx/active_record/association_spec.rb +12 -0
  152. data/spec/thinking_sphinx/active_record/associations_spec.rb +184 -0
  153. data/spec/thinking_sphinx/active_record/attribute/type_spec.rb +147 -0
  154. data/spec/thinking_sphinx/active_record/base_spec.rb +61 -0
  155. data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +80 -0
  156. data/spec/thinking_sphinx/active_record/callbacks/delta_callbacks_spec.rb +147 -0
  157. data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +69 -0
  158. data/spec/thinking_sphinx/active_record/column_spec.rb +47 -0
  159. data/spec/thinking_sphinx/active_record/database_adapters/abstract_adapter_spec.rb +31 -0
  160. data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +43 -0
  161. data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +45 -0
  162. data/spec/thinking_sphinx/active_record/database_adapters_spec.rb +108 -0
  163. data/spec/thinking_sphinx/active_record/field_spec.rb +36 -0
  164. data/spec/thinking_sphinx/active_record/index_spec.rb +208 -0
  165. data/spec/thinking_sphinx/active_record/interpreter_spec.rb +293 -0
  166. data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +162 -0
  167. data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +666 -0
  168. data/spec/thinking_sphinx/active_record/sql_source_spec.rb +401 -0
  169. data/spec/thinking_sphinx/configuration_spec.rb +264 -171
  170. data/spec/thinking_sphinx/deltas/default_delta_spec.rb +116 -0
  171. data/spec/thinking_sphinx/deltas_spec.rb +58 -0
  172. data/spec/thinking_sphinx/excerpter_spec.rb +40 -38
  173. data/spec/thinking_sphinx/facet_search_spec.rb +49 -151
  174. data/spec/thinking_sphinx/index_set_spec.rb +68 -0
  175. data/spec/thinking_sphinx/index_spec.rb +91 -155
  176. data/spec/thinking_sphinx/masks/pagination_mask_spec.rb +121 -0
  177. data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +68 -0
  178. data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +132 -0
  179. data/spec/thinking_sphinx/middlewares/geographer_spec.rb +89 -0
  180. data/spec/thinking_sphinx/middlewares/glazier_spec.rb +62 -0
  181. data/spec/thinking_sphinx/middlewares/inquirer_spec.rb +55 -0
  182. data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +271 -0
  183. data/spec/thinking_sphinx/middlewares/stale_id_checker_spec.rb +47 -0
  184. data/spec/thinking_sphinx/middlewares/stale_id_filter_spec.rb +91 -0
  185. data/spec/thinking_sphinx/panes/attributes_pane_spec.rb +21 -0
  186. data/spec/thinking_sphinx/panes/distance_pane_spec.rb +41 -0
  187. data/spec/thinking_sphinx/panes/excerpts_pane_spec.rb +53 -0
  188. data/spec/thinking_sphinx/panes/weight_pane_spec.rb +20 -0
  189. data/spec/thinking_sphinx/rake_interface_spec.rb +147 -0
  190. data/spec/thinking_sphinx/real_time/attribute_spec.rb +62 -0
  191. data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +76 -0
  192. data/spec/thinking_sphinx/real_time/field_spec.rb +54 -0
  193. data/spec/thinking_sphinx/real_time/index_spec.rb +154 -0
  194. data/spec/thinking_sphinx/real_time/interpreter_spec.rb +147 -0
  195. data/spec/thinking_sphinx/scopes_spec.rb +38 -0
  196. data/spec/thinking_sphinx/search/glaze_spec.rb +55 -0
  197. data/spec/thinking_sphinx/search/query_spec.rb +46 -0
  198. data/spec/thinking_sphinx/search_spec.rb +65 -1357
  199. data/spec/thinking_sphinx_spec.rb +19 -182
  200. data/thinking-sphinx.gemspec +33 -0
  201. metadata +318 -431
  202. data/features/abstract_inheritance.feature +0 -10
  203. data/features/alternate_primary_key.feature +0 -27
  204. data/features/attribute_transformation.feature +0 -22
  205. data/features/attribute_updates.feature +0 -79
  206. data/features/deleting_instances.feature +0 -70
  207. data/features/direct_attributes.feature +0 -11
  208. data/features/excerpts.feature +0 -21
  209. data/features/extensible_delta_indexing.feature +0 -9
  210. data/features/facets.feature +0 -88
  211. data/features/facets_across_model.feature +0 -29
  212. data/features/field_sorting.feature +0 -18
  213. data/features/handling_edits.feature +0 -97
  214. data/features/retry_stale_indexes.feature +0 -24
  215. data/features/searching_across_models.feature +0 -20
  216. data/features/searching_by_index.feature +0 -41
  217. data/features/searching_by_model.feature +0 -175
  218. data/features/searching_with_find_arguments.feature +0 -56
  219. data/features/sphinx_detection.feature +0 -25
  220. data/features/sphinx_scopes.feature +0 -68
  221. data/features/step_definitions/alpha_steps.rb +0 -16
  222. data/features/step_definitions/beta_steps.rb +0 -7
  223. data/features/step_definitions/common_steps.rb +0 -205
  224. data/features/step_definitions/extensible_delta_indexing_steps.rb +0 -7
  225. data/features/step_definitions/facet_steps.rb +0 -96
  226. data/features/step_definitions/find_arguments_steps.rb +0 -36
  227. data/features/step_definitions/gamma_steps.rb +0 -15
  228. data/features/step_definitions/scope_steps.rb +0 -19
  229. data/features/step_definitions/search_steps.rb +0 -94
  230. data/features/step_definitions/sphinx_steps.rb +0 -35
  231. data/features/sti_searching.feature +0 -19
  232. data/features/support/env.rb +0 -24
  233. data/features/support/lib/generic_delta_handler.rb +0 -8
  234. data/features/thinking_sphinx/database.example.yml +0 -3
  235. data/features/thinking_sphinx/db/.gitignore +0 -1
  236. data/features/thinking_sphinx/db/fixtures/alphas.rb +0 -8
  237. data/features/thinking_sphinx/db/fixtures/authors.rb +0 -1
  238. data/features/thinking_sphinx/db/fixtures/betas.rb +0 -11
  239. data/features/thinking_sphinx/db/fixtures/boxes.rb +0 -9
  240. data/features/thinking_sphinx/db/fixtures/categories.rb +0 -1
  241. data/features/thinking_sphinx/db/fixtures/cats.rb +0 -3
  242. data/features/thinking_sphinx/db/fixtures/comments.rb +0 -24
  243. data/features/thinking_sphinx/db/fixtures/developers.rb +0 -31
  244. data/features/thinking_sphinx/db/fixtures/dogs.rb +0 -3
  245. data/features/thinking_sphinx/db/fixtures/extensible_betas.rb +0 -10
  246. data/features/thinking_sphinx/db/fixtures/foxes.rb +0 -3
  247. data/features/thinking_sphinx/db/fixtures/gammas.rb +0 -10
  248. data/features/thinking_sphinx/db/fixtures/music.rb +0 -4
  249. data/features/thinking_sphinx/db/fixtures/people.rb +0 -1001
  250. data/features/thinking_sphinx/db/fixtures/post_keywords.txt +0 -1
  251. data/features/thinking_sphinx/db/fixtures/posts.rb +0 -10
  252. data/features/thinking_sphinx/db/fixtures/robots.rb +0 -8
  253. data/features/thinking_sphinx/db/fixtures/tags.rb +0 -27
  254. data/features/thinking_sphinx/db/migrations/create_alphas.rb +0 -8
  255. data/features/thinking_sphinx/db/migrations/create_animals.rb +0 -5
  256. data/features/thinking_sphinx/db/migrations/create_authors.rb +0 -3
  257. data/features/thinking_sphinx/db/migrations/create_authors_posts.rb +0 -6
  258. data/features/thinking_sphinx/db/migrations/create_betas.rb +0 -5
  259. data/features/thinking_sphinx/db/migrations/create_boxes.rb +0 -5
  260. data/features/thinking_sphinx/db/migrations/create_categories.rb +0 -3
  261. data/features/thinking_sphinx/db/migrations/create_comments.rb +0 -10
  262. data/features/thinking_sphinx/db/migrations/create_developers.rb +0 -7
  263. data/features/thinking_sphinx/db/migrations/create_extensible_betas.rb +0 -5
  264. data/features/thinking_sphinx/db/migrations/create_gammas.rb +0 -3
  265. data/features/thinking_sphinx/db/migrations/create_genres.rb +0 -3
  266. data/features/thinking_sphinx/db/migrations/create_music.rb +0 -6
  267. data/features/thinking_sphinx/db/migrations/create_people.rb +0 -13
  268. data/features/thinking_sphinx/db/migrations/create_posts.rb +0 -6
  269. data/features/thinking_sphinx/db/migrations/create_robots.rb +0 -4
  270. data/features/thinking_sphinx/db/migrations/create_taggings.rb +0 -5
  271. data/features/thinking_sphinx/db/migrations/create_tags.rb +0 -4
  272. data/features/thinking_sphinx/models/alpha.rb +0 -23
  273. data/features/thinking_sphinx/models/andrew.rb +0 -17
  274. data/features/thinking_sphinx/models/animal.rb +0 -5
  275. data/features/thinking_sphinx/models/author.rb +0 -3
  276. data/features/thinking_sphinx/models/beta.rb +0 -13
  277. data/features/thinking_sphinx/models/box.rb +0 -8
  278. data/features/thinking_sphinx/models/cat.rb +0 -3
  279. data/features/thinking_sphinx/models/category.rb +0 -4
  280. data/features/thinking_sphinx/models/comment.rb +0 -10
  281. data/features/thinking_sphinx/models/developer.rb +0 -21
  282. data/features/thinking_sphinx/models/dog.rb +0 -3
  283. data/features/thinking_sphinx/models/extensible_beta.rb +0 -9
  284. data/features/thinking_sphinx/models/fox.rb +0 -5
  285. data/features/thinking_sphinx/models/gamma.rb +0 -5
  286. data/features/thinking_sphinx/models/genre.rb +0 -3
  287. data/features/thinking_sphinx/models/medium.rb +0 -5
  288. data/features/thinking_sphinx/models/music.rb +0 -10
  289. data/features/thinking_sphinx/models/person.rb +0 -24
  290. data/features/thinking_sphinx/models/post.rb +0 -22
  291. data/features/thinking_sphinx/models/robot.rb +0 -12
  292. data/features/thinking_sphinx/models/tag.rb +0 -3
  293. data/lib/cucumber/thinking_sphinx/external_world.rb +0 -12
  294. data/lib/cucumber/thinking_sphinx/internal_world.rb +0 -137
  295. data/lib/cucumber/thinking_sphinx/sql_logger.rb +0 -28
  296. data/lib/thinking_sphinx/action_controller.rb +0 -31
  297. data/lib/thinking_sphinx/active_record/attribute_updates.rb +0 -54
  298. data/lib/thinking_sphinx/active_record/collection_proxy.rb +0 -47
  299. data/lib/thinking_sphinx/active_record/collection_proxy_with_scopes.rb +0 -27
  300. data/lib/thinking_sphinx/active_record/delta.rb +0 -67
  301. data/lib/thinking_sphinx/active_record/has_many_association.rb +0 -44
  302. data/lib/thinking_sphinx/active_record/has_many_association_with_scopes.rb +0 -21
  303. data/lib/thinking_sphinx/active_record/scopes.rb +0 -110
  304. data/lib/thinking_sphinx/adapters/abstract_adapter.rb +0 -94
  305. data/lib/thinking_sphinx/adapters/mysql_adapter.rb +0 -62
  306. data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +0 -188
  307. data/lib/thinking_sphinx/association.rb +0 -230
  308. data/lib/thinking_sphinx/attribute.rb +0 -405
  309. data/lib/thinking_sphinx/auto_version.rb +0 -40
  310. data/lib/thinking_sphinx/bundled_search.rb +0 -40
  311. data/lib/thinking_sphinx/class_facet.rb +0 -20
  312. data/lib/thinking_sphinx/connection.rb +0 -71
  313. data/lib/thinking_sphinx/context.rb +0 -81
  314. data/lib/thinking_sphinx/core/string.rb +0 -15
  315. data/lib/thinking_sphinx/deltas/delete_job.rb +0 -16
  316. data/lib/thinking_sphinx/deltas/index_job.rb +0 -17
  317. data/lib/thinking_sphinx/deploy/capistrano.rb +0 -99
  318. data/lib/thinking_sphinx/field.rb +0 -98
  319. data/lib/thinking_sphinx/index/builder.rb +0 -315
  320. data/lib/thinking_sphinx/index/faux_column.rb +0 -118
  321. data/lib/thinking_sphinx/join.rb +0 -37
  322. data/lib/thinking_sphinx/property.rb +0 -187
  323. data/lib/thinking_sphinx/search_methods.rb +0 -439
  324. data/lib/thinking_sphinx/sinatra.rb +0 -7
  325. data/lib/thinking_sphinx/source.rb +0 -194
  326. data/lib/thinking_sphinx/source/internal_properties.rb +0 -51
  327. data/lib/thinking_sphinx/source/sql.rb +0 -174
  328. data/spec/fixtures/data.sql +0 -32
  329. data/spec/fixtures/database.yml.default +0 -3
  330. data/spec/fixtures/models.rb +0 -164
  331. data/spec/fixtures/structure.sql +0 -146
  332. data/spec/sphinx_helper.rb +0 -60
  333. data/spec/support/rails.rb +0 -25
  334. data/spec/thinking_sphinx/active_record/delta_spec.rb +0 -123
  335. data/spec/thinking_sphinx/active_record/has_many_association_spec.rb +0 -173
  336. data/spec/thinking_sphinx/active_record/scopes_spec.rb +0 -177
  337. data/spec/thinking_sphinx/active_record_spec.rb +0 -573
  338. data/spec/thinking_sphinx/adapters/abstract_adapter_spec.rb +0 -163
  339. data/spec/thinking_sphinx/association_spec.rb +0 -250
  340. data/spec/thinking_sphinx/attribute_spec.rb +0 -552
  341. data/spec/thinking_sphinx/auto_version_spec.rb +0 -103
  342. data/spec/thinking_sphinx/connection_spec.rb +0 -77
  343. data/spec/thinking_sphinx/context_spec.rb +0 -127
  344. data/spec/thinking_sphinx/core/array_spec.rb +0 -9
  345. data/spec/thinking_sphinx/core/string_spec.rb +0 -9
  346. data/spec/thinking_sphinx/facet_spec.rb +0 -359
  347. data/spec/thinking_sphinx/field_spec.rb +0 -127
  348. data/spec/thinking_sphinx/index/builder_spec.rb +0 -532
  349. data/spec/thinking_sphinx/index/faux_column_spec.rb +0 -36
  350. data/spec/thinking_sphinx/search_methods_spec.rb +0 -156
  351. data/spec/thinking_sphinx/source_spec.rb +0 -267
  352. data/spec/thinking_sphinx/test_spec.rb +0 -20
@@ -0,0 +1,24 @@
1
+ require 'bundler'
2
+ require 'appraisal'
3
+
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ require 'rspec/core/rake_task'
7
+
8
+ RSpec::Core::RakeTask.new
9
+
10
+ namespace :spec do
11
+ desc 'Run unit specs only'
12
+ RSpec::Core::RakeTask.new(:unit) do |task|
13
+ task.pattern = 'spec'
14
+ task.rspec_opts = '--tag "~live"'
15
+ end
16
+
17
+ desc 'Run acceptance specs only'
18
+ RSpec::Core::RakeTask.new(:acceptance) do |task|
19
+ task.pattern = 'spec'
20
+ task.rspec_opts = '--tag "live"'
21
+ end
22
+ end
23
+
24
+ task :default => :spec
@@ -0,0 +1 @@
1
+ *.gemfile.lock
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source :rubygems
4
+
5
+ gem "riddle", "1.5.3"
6
+ gem "combustion", :git=>"git://github.com/pat/combustion.git", :ref=>"45f50e64c3"
7
+ gem "pg", "~> 0.11.0", :platform=>:ruby
8
+ gem "activerecord-jdbcpostgresql-adapter", "~> 1.1.3", :platform=>:jruby
9
+ gem "rails", "~> 3.1.0"
10
+
11
+ gemspec :path=>"../"
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source :rubygems
4
+
5
+ gem "riddle", "1.5.3"
6
+ gem "combustion", :git=>"git://github.com/pat/combustion.git", :ref=>"45f50e64c3"
7
+ gem "pg", "~> 0.11.0", :platform=>:ruby
8
+ gem "activerecord-jdbcpostgresql-adapter", "~> 1.1.3", :platform=>:jruby
9
+ gem "rails", "~> 3.2.0"
10
+
11
+ gemspec :path=>"../"
@@ -1 +1 @@
1
- require 'thinking_sphinx'
1
+ require 'thinking_sphinx'
@@ -1,304 +1,46 @@
1
- require 'thread'
2
- require 'active_record'
3
- require 'innertube'
4
- require 'yaml'
5
1
  require 'riddle'
6
-
7
- require 'thinking_sphinx/auto_version'
8
- require 'thinking_sphinx/core/string'
9
- require 'thinking_sphinx/property'
10
- require 'thinking_sphinx/active_record'
11
- require 'thinking_sphinx/association'
12
- require 'thinking_sphinx/attribute'
13
- require 'thinking_sphinx/bundled_search'
14
- require 'thinking_sphinx/configuration'
15
- require 'thinking_sphinx/connection'
16
- require 'thinking_sphinx/context'
17
- require 'thinking_sphinx/excerpter'
18
- require 'thinking_sphinx/facet'
19
- require 'thinking_sphinx/class_facet'
20
- require 'thinking_sphinx/facet_search'
21
- require 'thinking_sphinx/field'
22
- require 'thinking_sphinx/index'
23
- require 'thinking_sphinx/join'
24
- require 'thinking_sphinx/source'
25
- require 'thinking_sphinx/search'
26
- require 'thinking_sphinx/search_methods'
27
- require 'thinking_sphinx/deltas'
28
-
29
- require 'thinking_sphinx/adapters/abstract_adapter'
30
- require 'thinking_sphinx/adapters/mysql_adapter'
31
- require 'thinking_sphinx/adapters/postgresql_adapter'
32
-
33
- require 'thinking_sphinx/railtie' if defined?(Rails)
2
+ require 'middleware'
3
+ require 'active_record'
34
4
 
35
5
  module ThinkingSphinx
36
- mattr_accessor :database_adapter
37
-
38
- # A ConnectionError will get thrown when a connection to Sphinx can't be
39
- # made.
40
- class ConnectionError < StandardError
41
- end
42
-
43
- # A StaleIdsException is thrown by Collection.instances_from_matches if there
44
- # are records in Sphinx but not in the database, so the search can be retried.
45
- class StaleIdsException < StandardError
46
- attr_accessor :ids
47
- def initialize(ids)
48
- self.ids = ids
49
- end
50
- end
51
-
52
- # A SphinxError occurs when Sphinx responds with an error due to problematic
53
- # queries or indexes.
54
- class SphinxError < RuntimeError
55
- attr_accessor :results
56
- def initialize(message = nil, results = nil)
57
- super(message)
58
- self.results = results
59
- end
60
- end
61
-
62
- # The collection of indexed models. Keep in mind that Rails lazily loads
63
- # its classes, so this may not actually be populated with _all_ the models
64
- # that have Sphinx indexes.
65
- @@sphinx_mutex = Mutex.new
66
- @@context = nil
67
- @@define_indexes = true
68
- @@deltas_enabled = nil
69
- @@updates_enabled = nil
70
- @@suppress_delta_output = false
71
- @@remote_sphinx = false
72
- @@use_group_by_shortcut = nil
73
-
74
- def self.mutex
75
- @@sphinx_mutex
76
- end
77
-
78
- def self.context
79
- if @@context.nil?
80
- mutex.synchronize do
81
- if @@context.nil?
82
- @@context = ThinkingSphinx::Context.new
83
- @@context.prepare
84
- end
85
- end
86
- end
87
-
88
- @@context
89
- end
90
-
91
- def self.reset_context!(context = nil)
92
- mutex.synchronize do
93
- @@context = context
94
- end
95
- end
96
-
97
- def self.unique_id_expression(adapter, offset = nil)
98
- "* #{adapter.cast_to_int context.indexed_models.size} + #{offset || 0}"
99
- end
100
-
101
- # Check if index definition is disabled.
102
- #
103
- def self.define_indexes?
104
- @@define_indexes
105
- end
106
-
107
- # Enable/disable indexes - you may want to do this while migrating data.
108
- #
109
- # ThinkingSphinx.define_indexes = false
110
- #
111
- def self.define_indexes=(value)
112
- mutex.synchronize do
113
- @@define_indexes = value
114
- end
115
- end
116
-
117
- # Check if delta indexing is enabled/disabled.
118
- #
119
- def self.deltas_enabled?
120
- if @@deltas_enabled.nil?
121
- mutex.synchronize do
122
- if @@deltas_enabled.nil?
123
- @@deltas_enabled = (
124
- ThinkingSphinx::Configuration.environment != "test"
125
- )
126
- end
127
- end
128
- end
129
-
130
- @@deltas_enabled && !deltas_suspended?
131
- end
132
-
133
- # Enable/disable delta indexing.
134
- #
135
- # ThinkingSphinx.deltas_enabled = false
136
- #
137
- def self.deltas_enabled=(value)
138
- mutex.synchronize do
139
- @@deltas_enabled = value
140
- end
141
- end
142
-
143
- # Check if delta indexing is suspended.
144
- #
145
- def self.deltas_suspended?
146
- if Thread.current[:thinking_sphinx_deltas_suspended].nil?
147
- Thread.current[:thinking_sphinx_deltas_suspended] = false
148
- end
149
-
150
- Thread.current[:thinking_sphinx_deltas_suspended]
151
- end
152
-
153
- # Suspend/resume delta indexing.
154
- #
155
- # ThinkingSphinx.deltas_suspended = false
156
- #
157
- def self.deltas_suspended=(value)
158
- Thread.current[:thinking_sphinx_deltas_suspended] = value
159
- end
160
-
161
- # Check if updates are enabled. True by default, unless within the test
162
- # environment.
163
- #
164
- def self.updates_enabled?
165
- if @@updates_enabled.nil?
166
- mutex.synchronize do
167
- if @@updates_enabled.nil?
168
- @@updates_enabled = (
169
- ThinkingSphinx::Configuration.environment != "test"
170
- )
171
- end
172
- end
173
- end
174
-
175
- @@updates_enabled
176
- end
177
-
178
- # Enable/disable updates to Sphinx
179
- #
180
- # ThinkingSphinx.updates_enabled = false
181
- #
182
- def self.updates_enabled=(value)
183
- mutex.synchronize do
184
- @@updates_enabled = value
185
- end
186
- end
187
-
188
- def self.suppress_delta_output?
189
- @@suppress_delta_output
190
- end
191
-
192
- def self.suppress_delta_output=(value)
193
- mutex.synchronize do
194
- @@suppress_delta_output = value
195
- end
196
- end
197
-
198
- # Checks to see if MySQL will allow simplistic GROUP BY statements. If not,
199
- # or if not using MySQL, this will return false.
200
- #
201
- def self.use_group_by_shortcut?
202
- if @@use_group_by_shortcut.nil?
203
- mutex.synchronize do
204
- if @@use_group_by_shortcut.nil?
205
- @@use_group_by_shortcut = !!(
206
- mysql? && ::ActiveRecord::Base.connection.select_all(
207
- "SELECT @@global.sql_mode, @@session.sql_mode;"
208
- ).all? { |key, value|
209
- value.nil? || value[/ONLY_FULL_GROUP_BY/].nil?
210
- }
211
- )
212
- end
213
- end
214
- end
215
-
216
- @@use_group_by_shortcut
217
- end
218
-
219
- def self.reset_use_group_by_shortcut
220
- mutex.synchronize do
221
- @@use_group_by_shortcut = nil
222
- end
223
- end
224
-
225
- # An indication of whether Sphinx is running on a remote machine instead of
226
- # the same machine.
227
- #
228
- def self.remote_sphinx?
229
- @@remote_sphinx
230
- end
231
-
232
- # Tells Thinking Sphinx that Sphinx is running on a different machine, and
233
- # thus it can't reliably guess whether it is running or not (ie: the
234
- # #sphinx_running? method), and so just assumes it is.
235
- #
236
- # Useful for multi-machine deployments. Set it in your production.rb file.
237
- #
238
- # ThinkingSphinx.remote_sphinx = true
239
- #
240
- def self.remote_sphinx=(value)
241
- mutex.synchronize do
242
- @@remote_sphinx = value
243
- end
244
- end
245
-
246
- # Check if Sphinx is running. If remote_sphinx is set to true (indicating
247
- # Sphinx is on a different machine), this will always return true, and you
248
- # will have to handle any connection errors yourself.
249
- #
250
- def self.sphinx_running?
251
- remote_sphinx? || sphinx_running_by_pid?
6
+ def self.count(query = '', options = {})
7
+ search(query, options).total_entries
252
8
  end
253
9
 
254
- # Check if Sphinx is actually running, provided the pid is on the same
255
- # machine as this code.
256
- #
257
- def self.sphinx_running_by_pid?
258
- !!sphinx_pid && pid_active?(sphinx_pid)
10
+ def self.facets(query = '', options = {})
11
+ ThinkingSphinx::FacetSearch.new query, options
259
12
  end
260
13
 
261
- def self.sphinx_pid
262
- if File.exists?(ThinkingSphinx::Configuration.instance.pid_file)
263
- File.read(ThinkingSphinx::Configuration.instance.pid_file)[/\d+/]
264
- else
265
- nil
266
- end
14
+ def self.search(query = '', options = {})
15
+ ThinkingSphinx::Search.new query, options
267
16
  end
268
17
 
269
- def self.pid_active?(pid)
270
- !!Process.kill(0, pid.to_i)
271
- rescue Errno::EPERM => e
272
- true
273
- rescue Exception => e
274
- false
275
- end
276
-
277
- def self.microsoft?
278
- RUBY_PLATFORM =~ /mswin/
279
- end
280
-
281
- def self.jruby?
282
- defined?(JRUBY_VERSION)
283
- end
284
-
285
- def self.mysql?
286
- ::ActiveRecord::Base.connection.class.name.demodulize == "MysqlAdapter" ||
287
- ::ActiveRecord::Base.connection.class.name.demodulize == "Mysql2Adapter" ||
288
- ::ActiveRecord::Base.connection.class.name.demodulize == "MysqlplusAdapter" || (
289
- jruby? && ::ActiveRecord::Base.connection.config[:adapter] == "jdbcmysql"
290
- )
291
- end
292
-
293
- def self.rails_3_1?
294
- !!defined?(::ActiveRecord::Associations::CollectionProxy)
295
- end
296
-
297
- def self.before_index_hooks
298
- @before_index_hooks
18
+ def self.search_for_ids(query = '', options = {})
19
+ search = ThinkingSphinx::Search.new query, options
20
+ ThinkingSphinx::Search::Merger.new(search).merge! nil, :ids_only => true
299
21
  end
22
+ end
300
23
 
301
- @before_index_hooks = []
24
+ # Core
25
+ require 'thinking_sphinx/batched_search'
26
+ require 'thinking_sphinx/callbacks'
27
+ require 'thinking_sphinx/core'
28
+ require 'thinking_sphinx/configuration'
29
+ require 'thinking_sphinx/excerpter'
30
+ require 'thinking_sphinx/facet'
31
+ require 'thinking_sphinx/facet_search'
32
+ require 'thinking_sphinx/index'
33
+ require 'thinking_sphinx/index_set'
34
+ require 'thinking_sphinx/masks'
35
+ require 'thinking_sphinx/middlewares'
36
+ require 'thinking_sphinx/panes'
37
+ require 'thinking_sphinx/rake_interface'
38
+ require 'thinking_sphinx/scopes'
39
+ require 'thinking_sphinx/search'
40
+ require 'thinking_sphinx/test'
41
+ # Extended
42
+ require 'thinking_sphinx/active_record'
43
+ require 'thinking_sphinx/deltas'
44
+ require 'thinking_sphinx/real_time'
302
45
 
303
- extend ThinkingSphinx::SearchMethods::ClassMethods
304
- end
46
+ require 'thinking_sphinx/railtie' if defined?(Rails)
@@ -1,386 +1,25 @@
1
- require 'thinking_sphinx/active_record/attribute_updates'
2
- require 'thinking_sphinx/active_record/collection_proxy'
3
- require 'thinking_sphinx/active_record/collection_proxy_with_scopes'
4
- require 'thinking_sphinx/active_record/delta'
5
- require 'thinking_sphinx/active_record/has_many_association'
6
- require 'thinking_sphinx/active_record/log_subscriber'
7
- require 'thinking_sphinx/active_record/has_many_association_with_scopes'
8
- require 'thinking_sphinx/active_record/scopes'
9
-
10
- module ThinkingSphinx
11
- # Core additions to ActiveRecord models - define_index for creating indexes
12
- # for models. If you want to interrogate the index objects created for the
13
- # model, you can use the class-level accessor :sphinx_indexes.
14
- #
15
- module ActiveRecord
16
- def self.included(base)
17
- base.class_eval do
18
- if defined?(class_attribute)
19
- class_attribute :sphinx_indexes, :sphinx_facets
20
- else
21
- class_inheritable_array :sphinx_indexes, :sphinx_facets
22
- end
23
-
24
- extend ThinkingSphinx::ActiveRecord::ClassMethods
25
-
26
- class << self
27
- attr_accessor :sphinx_index_blocks, :sphinx_types
28
-
29
- def set_sphinx_primary_key(attribute)
30
- @sphinx_primary_key_attribute = attribute
31
- end
32
-
33
- def primary_key_for_sphinx
34
- @primary_key_for_sphinx ||= begin
35
- if custom_primary_key_for_sphinx?
36
- @sphinx_primary_key_attribute ||
37
- superclass.primary_key_for_sphinx
38
- else
39
- primary_key || 'id'
40
- end
41
- end
42
- end
43
-
44
- def custom_primary_key_for_sphinx?
45
- (
46
- superclass.respond_to?(:custom_primary_key_for_sphinx?) &&
47
- superclass.custom_primary_key_for_sphinx?
48
- ) || !@sphinx_primary_key_attribute.nil?
49
- end
50
-
51
- def clear_primary_key_for_sphinx
52
- @primary_key_for_sphinx = nil
53
- end
54
-
55
- def sphinx_index_options
56
- sphinx_indexes.last.options
57
- end
58
-
59
- def set_sphinx_types(types)
60
- @sphinx_types = types
61
- end
62
-
63
- # Generate a unique CRC value for the model's name, to use to
64
- # determine which Sphinx documents belong to which AR records.
65
- #
66
- # Really only written for internal use - but hey, if it's useful to
67
- # you in some other way, awesome.
68
- #
69
- def to_crc32
70
- self.name.to_crc32
71
- end
72
-
73
- def to_crc32s
74
- (descendants << self).collect { |klass| klass.to_crc32 }
75
- end
76
-
77
- def sphinx_database_adapter
78
- ThinkingSphinx::AbstractAdapter.detect(self)
79
- end
80
-
81
- def sphinx_name
82
- self.name.underscore.tr(':/\\', '_')
83
- end
84
-
85
- private
86
-
87
- def defined_indexes?
88
- @defined_indexes
89
- end
90
-
91
- def defined_indexes=(value)
92
- @defined_indexes = value
93
- end
94
-
95
- def sphinx_delta?
96
- self.sphinx_indexes.any? { |index| index.delta? }
97
- end
98
- end
99
- end
100
-
101
- if ThinkingSphinx.rails_3_1?
102
- assoc_mixin = ThinkingSphinx::ActiveRecord::CollectionProxy
103
- ::ActiveRecord::Associations::CollectionProxy.send(:include, assoc_mixin)
104
- else
105
- assoc_mixin = ThinkingSphinx::ActiveRecord::HasManyAssociation
106
- ::ActiveRecord::Associations::HasManyAssociation.send(:include, assoc_mixin)
107
- ::ActiveRecord::Associations::HasManyThroughAssociation.send(:include, assoc_mixin)
108
- end
109
- end
110
-
111
- module ClassMethods
112
- # Allows creation of indexes for Sphinx. If you don't do this, there
113
- # isn't much point trying to search (or using this plugin at all,
114
- # really).
115
- #
116
- # An example or two:
117
- #
118
- # define_index
119
- # indexes :id, :as => :model_id
120
- # indexes name
121
- # end
122
- #
123
- # You can also grab fields from associations - multiple levels deep
124
- # if necessary.
125
- #
126
- # define_index do
127
- # indexes tags.name, :as => :tag
128
- # indexes articles.content
129
- # indexes orders.line_items.product.name, :as => :product
130
- # end
131
- #
132
- # And it will automatically concatenate multiple fields:
133
- #
134
- # define_index do
135
- # indexes [author.first_name, author.last_name], :as => :author
136
- # end
137
- #
138
- # The #indexes method is for fields - if you want attributes, use
139
- # #has instead. All the same rules apply - but keep in mind that
140
- # attributes are for sorting, grouping and filtering, not searching.
141
- #
142
- # define_index do
143
- # # fields ...
144
- #
145
- # has created_at, updated_at
146
- # end
147
- #
148
- # One last feature is the delta index. This requires the model to
149
- # have a boolean field named 'delta', and is enabled as follows:
150
- #
151
- # define_index do
152
- # # fields ...
153
- # # attributes ...
154
- #
155
- # set_property :delta => true
156
- # end
157
- #
158
- # Check out the more detailed documentation for each of these methods
159
- # at ThinkingSphinx::Index::Builder.
160
- #
161
- def define_index(name = nil, &block)
162
- self.sphinx_index_blocks ||= []
163
- self.sphinx_indexes ||= []
164
- self.sphinx_facets ||= []
165
-
166
- ThinkingSphinx.context.add_indexed_model self
167
-
168
- if sphinx_index_blocks.empty?
169
- before_validation :define_indexes
170
- before_destroy :define_indexes
171
- end
172
-
173
- self.sphinx_index_blocks << lambda {
174
- add_sphinx_index name, &block
175
- }
176
-
177
- include ThinkingSphinx::ActiveRecord::Scopes
178
- include ThinkingSphinx::SearchMethods
179
- end
180
-
181
- def define_indexes
182
- superclass.define_indexes unless superclass == ::ActiveRecord::Base
183
-
184
- return if sphinx_index_blocks.nil? ||
185
- defined_indexes? ||
186
- !ThinkingSphinx.define_indexes?
187
-
188
- sphinx_index_blocks.each do |block|
189
- block.call
190
- end
191
-
192
- self.defined_indexes = true
193
-
194
- # We want to make sure that if the database doesn't exist, then Thinking
195
- # Sphinx doesn't mind when running non-TS tasks (like db:create, db:drop
196
- # and db:migrate). It's a bit hacky, but I can't think of a better way.
197
- rescue StandardError => err
198
- case err.class.name
199
- when "Mysql::Error", "Mysql2::Error", "Java::JavaSql::SQLException", "ActiveRecord::StatementInvalid"
200
- return
201
- else
202
- raise err
203
- end
204
- end
205
-
206
- def add_sphinx_index(name, &block)
207
- index = ThinkingSphinx::Index::Builder.generate self, name, &block
208
-
209
- unless sphinx_indexes.any? { |i| i.name == index.name }
210
- add_sphinx_callbacks_and_extend(index.delta?)
211
- insert_sphinx_index index
212
- end
213
- end
214
-
215
- def insert_sphinx_index(index)
216
- self.sphinx_indexes += [index]
217
- end
1
+ require 'active_record'
218
2
 
219
- def has_sphinx_indexes?
220
- sphinx_indexes &&
221
- sphinx_index_blocks &&
222
- (sphinx_indexes.length > 0 || sphinx_index_blocks.length > 0)
223
- end
224
-
225
- def indexed_by_sphinx?
226
- sphinx_indexes && sphinx_indexes.length > 0
227
- end
228
-
229
- def delta_indexed_by_sphinx?
230
- sphinx_indexes && sphinx_indexes.any? { |index| index.delta? }
231
- end
232
-
233
- def sphinx_index_names
234
- define_indexes
235
- sphinx_indexes.collect(&:all_names).flatten
236
- end
237
-
238
- def core_index_names
239
- define_indexes
240
- sphinx_indexes.collect(&:core_name)
241
- end
242
-
243
- def delta_index_names
244
- define_indexes
245
- sphinx_indexes.select(&:delta?).collect(&:delta_name)
246
- end
247
-
248
- def to_riddle
249
- define_indexes
250
- sphinx_database_adapter.setup
251
-
252
- local_sphinx_indexes.collect { |index|
253
- index.to_riddle(sphinx_offset)
254
- }.flatten
255
- end
256
-
257
- def source_of_sphinx_index
258
- define_indexes
259
- possible_models = self.sphinx_indexes.collect { |index| index.model }
260
- return self if possible_models.include?(self)
261
-
262
- parent = self.superclass
263
- while !possible_models.include?(parent) && parent != ::ActiveRecord::Base
264
- parent = parent.superclass
265
- end
266
-
267
- return parent
268
- end
269
-
270
- def delete_in_index(index, document_id)
271
- return unless ThinkingSphinx.sphinx_running?
272
-
273
- ThinkingSphinx::Connection.take do |client|
274
- client.update index, ['sphinx_deleted'], {document_id => [1]}
275
- end
276
- rescue Riddle::ConnectionError, Riddle::ResponseError,
277
- ThinkingSphinx::SphinxError, Errno::ETIMEDOUT, Timeout::Error
278
- # Not the end of the world if Sphinx isn't running.
279
- end
280
-
281
- def sphinx_offset
282
- ThinkingSphinx.context.superclass_indexed_models.
283
- index eldest_indexed_ancestor
284
- end
285
-
286
- # Temporarily disable delta indexing inside a block, then perform a
287
- # single rebuild of index at the end.
288
- #
289
- # Useful when performing updates to batches of models to prevent
290
- # the delta index being rebuilt after each individual update.
291
- #
292
- # In the following example, the delta index will only be rebuilt
293
- # once, not 10 times.
294
- #
295
- # SomeModel.suspended_delta do
296
- # 10.times do
297
- # SomeModel.create( ... )
298
- # end
299
- # end
300
- #
301
- def suspended_delta(reindex_after = true, &block)
302
- define_indexes
303
- original_setting = ThinkingSphinx.deltas_suspended?
304
- ThinkingSphinx.deltas_suspended = true
305
- begin
306
- yield
307
- ensure
308
- ThinkingSphinx.deltas_suspended = original_setting
309
- self.index_delta if reindex_after && !original_setting
310
- end
311
- end
312
-
313
- private
314
-
315
- def local_sphinx_indexes
316
- (sphinx_indexes || []).select { |index|
317
- index.model == self
318
- }
319
- end
320
-
321
- def add_sphinx_callbacks_and_extend(delta = false)
322
- unless indexed_by_sphinx?
323
- after_destroy :toggle_deleted
324
-
325
- include ThinkingSphinx::ActiveRecord::AttributeUpdates
326
- end
327
-
328
- if delta && !delta_indexed_by_sphinx?
329
- include ThinkingSphinx::ActiveRecord::Delta
330
-
331
- before_save :toggle_delta
332
- after_commit :index_delta
333
- end
334
- end
335
-
336
- def eldest_indexed_ancestor
337
- ancestors.reverse.detect { |ancestor|
338
- ThinkingSphinx.context.indexed_models.include?(ancestor.name)
339
- }.name
340
- end
341
- end
342
-
343
- attr_accessor :excerpts
344
- attr_accessor :sphinx_attributes
345
- attr_accessor :matching_fields
346
-
347
- def toggle_deleted
348
- return unless ThinkingSphinx.updates_enabled?
349
-
350
- self.class.core_index_names.each do |index_name|
351
- self.class.delete_in_index index_name, self.sphinx_document_id
352
- end
353
- self.class.delta_index_names.each do |index_name|
354
- self.class.delete_in_index index_name, self.sphinx_document_id
355
- end if self.class.delta_indexed_by_sphinx? && toggled_delta?
356
-
357
- rescue ::ThinkingSphinx::ConnectionError
358
- # nothing
359
- end
360
-
361
- # Returns the unique integer id for the object. This method uses the
362
- # attribute hash to get around ActiveRecord always mapping the #id method
363
- # to whatever the real primary key is (which may be a unique string hash).
364
- #
365
- # @return [Integer] Unique record id for the purposes of Sphinx.
366
- #
367
- def primary_key_for_sphinx
368
- read_attribute(self.class.primary_key_for_sphinx)
369
- end
370
-
371
- def sphinx_document_id
372
- primary_key_for_sphinx * ThinkingSphinx.context.indexed_models.size +
373
- self.class.sphinx_offset
374
- end
375
-
376
- private
3
+ module ThinkingSphinx::ActiveRecord
4
+ module Callbacks; end
5
+ end
377
6
 
378
- def sphinx_index_name(suffix)
379
- "#{self.class.source_of_sphinx_index.name.underscore.tr(':/\\', '_')}_#{suffix}"
380
- end
7
+ require 'thinking_sphinx/active_record/property'
8
+ require 'thinking_sphinx/active_record/association'
9
+ require 'thinking_sphinx/active_record/association_proxy'
10
+ require 'thinking_sphinx/active_record/associations'
11
+ require 'thinking_sphinx/active_record/attribute'
12
+ require 'thinking_sphinx/active_record/base'
13
+ require 'thinking_sphinx/active_record/column'
14
+ require 'thinking_sphinx/active_record/database_adapters'
15
+ require 'thinking_sphinx/active_record/field'
16
+ require 'thinking_sphinx/active_record/index'
17
+ require 'thinking_sphinx/active_record/interpreter'
18
+ require 'thinking_sphinx/active_record/log_subscriber'
19
+ require 'thinking_sphinx/active_record/property_sql_presenter'
20
+ require 'thinking_sphinx/active_record/sql_builder'
21
+ require 'thinking_sphinx/active_record/sql_source'
381
22
 
382
- def define_indexes
383
- self.class.define_indexes
384
- end
385
- end
386
- end
23
+ require 'thinking_sphinx/active_record/callbacks/delete_callbacks'
24
+ require 'thinking_sphinx/active_record/callbacks/delta_callbacks'
25
+ require 'thinking_sphinx/active_record/callbacks/update_callbacks'