thinking-sphinx 1.2.13 → 6.0.0

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 (517) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +99 -0
  3. data/.github/actions/test/action.yml +46 -0
  4. data/.github/workflows/ci.yml +75 -0
  5. data/.gitignore +18 -0
  6. data/.travis.yml +36 -0
  7. data/Appraisals +71 -0
  8. data/CHANGELOG.markdown +782 -0
  9. data/Gemfile +18 -0
  10. data/LICENCE +1 -1
  11. data/Procfile.support +2 -0
  12. data/README.textile +91 -136
  13. data/Rakefile +26 -0
  14. data/bin/console +15 -0
  15. data/bin/loadsphinx +99 -0
  16. data/bin/testmatrix +48 -0
  17. data/lib/thinking/sphinx.rb +3 -0
  18. data/lib/thinking-sphinx.rb +3 -0
  19. data/lib/thinking_sphinx/active_record/association.rb +19 -0
  20. data/lib/thinking_sphinx/active_record/association_proxy/attribute_finder.rb +44 -0
  21. data/lib/thinking_sphinx/active_record/association_proxy/attribute_matcher.rb +40 -0
  22. data/lib/thinking_sphinx/active_record/association_proxy.rb +34 -0
  23. data/lib/thinking_sphinx/active_record/attribute/sphinx_presenter.rb +52 -0
  24. data/lib/thinking_sphinx/active_record/attribute/type.rb +106 -0
  25. data/lib/thinking_sphinx/active_record/attribute/values.rb +20 -0
  26. data/lib/thinking_sphinx/active_record/attribute.rb +22 -0
  27. data/lib/thinking_sphinx/active_record/base.rb +91 -0
  28. data/lib/thinking_sphinx/active_record/callbacks/association_delta_callbacks.rb +21 -0
  29. data/lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb +27 -0
  30. data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +66 -0
  31. data/lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb +78 -0
  32. data/lib/thinking_sphinx/active_record/column.rb +44 -0
  33. data/lib/thinking_sphinx/active_record/column_sql_presenter.rb +54 -0
  34. data/lib/thinking_sphinx/active_record/database_adapters/abstract_adapter.rb +19 -0
  35. data/lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb +51 -0
  36. data/lib/thinking_sphinx/active_record/database_adapters/postgresql_adapter.rb +47 -0
  37. data/lib/thinking_sphinx/active_record/database_adapters.rb +59 -0
  38. data/lib/thinking_sphinx/active_record/depolymorph/association_reflection.rb +32 -0
  39. data/lib/thinking_sphinx/active_record/depolymorph/base_reflection.rb +32 -0
  40. data/lib/thinking_sphinx/active_record/depolymorph/conditions_reflection.rb +40 -0
  41. data/lib/thinking_sphinx/active_record/depolymorph/overridden_reflection.rb +50 -0
  42. data/lib/thinking_sphinx/active_record/depolymorph/scoped_reflection.rb +26 -0
  43. data/lib/thinking_sphinx/active_record/field.rb +18 -0
  44. data/lib/thinking_sphinx/active_record/filter_reflection.rb +18 -0
  45. data/lib/thinking_sphinx/active_record/index.rb +71 -0
  46. data/lib/thinking_sphinx/active_record/interpreter.rb +77 -0
  47. data/lib/thinking_sphinx/active_record/join_association.rb +17 -0
  48. data/lib/thinking_sphinx/active_record/log_subscriber.rb +37 -0
  49. data/lib/thinking_sphinx/active_record/polymorpher.rb +64 -0
  50. data/lib/thinking_sphinx/active_record/property.rb +30 -0
  51. data/lib/thinking_sphinx/active_record/property_query.rb +149 -0
  52. data/lib/thinking_sphinx/active_record/property_sql_presenter.rb +89 -0
  53. data/lib/thinking_sphinx/active_record/simple_many_query.rb +37 -0
  54. data/lib/thinking_sphinx/active_record/source_joins.rb +68 -0
  55. data/lib/thinking_sphinx/active_record/sql_builder/clause_builder.rb +29 -0
  56. data/lib/thinking_sphinx/active_record/sql_builder/query.rb +59 -0
  57. data/lib/thinking_sphinx/active_record/sql_builder/statement.rb +147 -0
  58. data/lib/thinking_sphinx/active_record/sql_builder.rb +107 -0
  59. data/lib/thinking_sphinx/active_record/sql_source/template.rb +55 -0
  60. data/lib/thinking_sphinx/active_record/sql_source.rb +173 -0
  61. data/lib/thinking_sphinx/active_record.rb +39 -301
  62. data/lib/thinking_sphinx/attribute_types.rb +72 -0
  63. data/lib/thinking_sphinx/batched_search.rb +28 -0
  64. data/lib/thinking_sphinx/callbacks/appender.rb +63 -0
  65. data/lib/thinking_sphinx/callbacks.rb +44 -0
  66. data/lib/thinking_sphinx/capistrano/v2.rb +60 -0
  67. data/lib/thinking_sphinx/capistrano/v3.rb +104 -0
  68. data/lib/thinking_sphinx/capistrano.rb +10 -0
  69. data/lib/thinking_sphinx/commander.rb +27 -0
  70. data/lib/thinking_sphinx/commands/base.rb +53 -0
  71. data/lib/thinking_sphinx/commands/clear_real_time.rb +22 -0
  72. data/lib/thinking_sphinx/commands/clear_sql.rb +18 -0
  73. data/lib/thinking_sphinx/commands/configure.rb +15 -0
  74. data/lib/thinking_sphinx/commands/index_real_time.rb +15 -0
  75. data/lib/thinking_sphinx/commands/index_sql.rb +25 -0
  76. data/lib/thinking_sphinx/commands/merge.rb +27 -0
  77. data/lib/thinking_sphinx/commands/merge_and_update.rb +57 -0
  78. data/lib/thinking_sphinx/commands/prepare.rb +15 -0
  79. data/lib/thinking_sphinx/commands/rotate.rb +13 -0
  80. data/lib/thinking_sphinx/commands/running.rb +15 -0
  81. data/lib/thinking_sphinx/commands/start_attached.rb +22 -0
  82. data/lib/thinking_sphinx/commands/start_detached.rb +21 -0
  83. data/lib/thinking_sphinx/commands/stop.rb +24 -0
  84. data/lib/thinking_sphinx/commands.rb +20 -0
  85. data/lib/thinking_sphinx/configuration/consistent_ids.rb +35 -0
  86. data/lib/thinking_sphinx/configuration/defaults.rb +7 -0
  87. data/lib/thinking_sphinx/configuration/distributed_indices.rb +31 -0
  88. data/lib/thinking_sphinx/configuration/duplicate_names.rb +36 -0
  89. data/lib/thinking_sphinx/configuration/minimum_fields.rb +36 -0
  90. data/lib/thinking_sphinx/configuration.rb +196 -269
  91. data/lib/thinking_sphinx/connection/client.rb +74 -0
  92. data/lib/thinking_sphinx/connection/jruby.rb +58 -0
  93. data/lib/thinking_sphinx/connection/mri.rb +26 -0
  94. data/lib/thinking_sphinx/connection.rb +73 -0
  95. data/lib/thinking_sphinx/core/field.rb +11 -0
  96. data/lib/thinking_sphinx/core/index.rb +110 -0
  97. data/lib/thinking_sphinx/core/interpreter.rb +25 -0
  98. data/lib/thinking_sphinx/core/property.rb +15 -0
  99. data/lib/thinking_sphinx/core/settings.rb +11 -0
  100. data/lib/thinking_sphinx/core.rb +11 -0
  101. data/lib/thinking_sphinx/deletion.rb +70 -0
  102. data/lib/thinking_sphinx/deltas/default_delta.rb +57 -66
  103. data/lib/thinking_sphinx/deltas/delete_job.rb +27 -0
  104. data/lib/thinking_sphinx/deltas/index_job.rb +28 -0
  105. data/lib/thinking_sphinx/deltas.rb +52 -27
  106. data/lib/thinking_sphinx/distributed/index.rb +46 -0
  107. data/lib/thinking_sphinx/distributed.rb +7 -0
  108. data/lib/thinking_sphinx/errors.rb +96 -0
  109. data/lib/thinking_sphinx/excerpter.rb +36 -19
  110. data/lib/thinking_sphinx/facet.rb +29 -122
  111. data/lib/thinking_sphinx/facet_search.rb +132 -125
  112. data/lib/thinking_sphinx/float_formatter.rb +35 -0
  113. data/lib/thinking_sphinx/frameworks/plain.rb +10 -0
  114. data/lib/thinking_sphinx/frameworks/rails.rb +11 -0
  115. data/lib/thinking_sphinx/frameworks.rb +11 -0
  116. data/lib/thinking_sphinx/guard/file.rb +28 -0
  117. data/lib/thinking_sphinx/guard/files.rb +40 -0
  118. data/lib/thinking_sphinx/guard/none.rb +7 -0
  119. data/lib/thinking_sphinx/guard.rb +9 -0
  120. data/lib/thinking_sphinx/hooks/guard_presence.rb +34 -0
  121. data/lib/thinking_sphinx/index.rb +50 -92
  122. data/lib/thinking_sphinx/index_set.rb +96 -0
  123. data/lib/thinking_sphinx/indexing_strategies/all_at_once.rb +9 -0
  124. data/lib/thinking_sphinx/indexing_strategies/one_at_a_time.rb +16 -0
  125. data/lib/thinking_sphinx/interfaces/base.rb +13 -0
  126. data/lib/thinking_sphinx/interfaces/daemon.rb +27 -0
  127. data/lib/thinking_sphinx/interfaces/real_time.rb +46 -0
  128. data/lib/thinking_sphinx/interfaces/sql.rb +53 -0
  129. data/lib/thinking_sphinx/interfaces.rb +10 -0
  130. data/lib/thinking_sphinx/logger.rb +9 -0
  131. data/lib/thinking_sphinx/masks/group_enumerators_mask.rb +30 -0
  132. data/lib/thinking_sphinx/masks/pagination_mask.rb +63 -0
  133. data/lib/thinking_sphinx/masks/scopes_mask.rb +56 -0
  134. data/lib/thinking_sphinx/masks/weight_enumerator_mask.rb +17 -0
  135. data/lib/thinking_sphinx/masks.rb +10 -0
  136. data/lib/thinking_sphinx/middlewares/active_record_translator.rb +103 -0
  137. data/lib/thinking_sphinx/middlewares/geographer.rb +94 -0
  138. data/lib/thinking_sphinx/middlewares/glazier.rb +52 -0
  139. data/lib/thinking_sphinx/middlewares/ids_only.rb +15 -0
  140. data/lib/thinking_sphinx/middlewares/inquirer.rb +64 -0
  141. data/lib/thinking_sphinx/middlewares/middleware.rb +11 -0
  142. data/lib/thinking_sphinx/middlewares/sphinxql.rb +256 -0
  143. data/lib/thinking_sphinx/middlewares/stale_id_checker.rb +47 -0
  144. data/lib/thinking_sphinx/middlewares/stale_id_filter.rb +48 -0
  145. data/lib/thinking_sphinx/middlewares/valid_options.rb +25 -0
  146. data/lib/thinking_sphinx/middlewares.rb +35 -0
  147. data/lib/thinking_sphinx/panes/attributes_pane.rb +11 -0
  148. data/lib/thinking_sphinx/panes/distance_pane.rb +15 -0
  149. data/lib/thinking_sphinx/panes/excerpts_pane.rb +43 -0
  150. data/lib/thinking_sphinx/panes/weight_pane.rb +11 -0
  151. data/lib/thinking_sphinx/panes.rb +10 -0
  152. data/lib/thinking_sphinx/processor.rb +71 -0
  153. data/lib/thinking_sphinx/query.rb +11 -0
  154. data/lib/thinking_sphinx/railtie.rb +38 -0
  155. data/lib/thinking_sphinx/rake_interface.rb +34 -0
  156. data/lib/thinking_sphinx/real_time/attribute.rb +27 -0
  157. data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +60 -0
  158. data/lib/thinking_sphinx/real_time/field.rb +9 -0
  159. data/lib/thinking_sphinx/real_time/index/template.rb +52 -0
  160. data/lib/thinking_sphinx/real_time/index.rb +102 -0
  161. data/lib/thinking_sphinx/real_time/interpreter.rb +54 -0
  162. data/lib/thinking_sphinx/real_time/populator.rb +46 -0
  163. data/lib/thinking_sphinx/real_time/processor.rb +36 -0
  164. data/lib/thinking_sphinx/real_time/property.rb +21 -0
  165. data/lib/thinking_sphinx/real_time/transcribe_instance.rb +38 -0
  166. data/lib/thinking_sphinx/real_time/transcriber.rb +89 -0
  167. data/lib/thinking_sphinx/real_time/translator.rb +39 -0
  168. data/lib/thinking_sphinx/real_time.rb +40 -0
  169. data/lib/thinking_sphinx/scopes.rb +34 -0
  170. data/lib/thinking_sphinx/search/batch_inquirer.rb +23 -0
  171. data/lib/thinking_sphinx/search/context.rb +31 -0
  172. data/lib/thinking_sphinx/search/glaze.rb +39 -0
  173. data/lib/thinking_sphinx/search/merger.rb +34 -0
  174. data/lib/thinking_sphinx/search/query.rb +33 -0
  175. data/lib/thinking_sphinx/search/stale_ids_exception.rb +15 -0
  176. data/lib/thinking_sphinx/search.rb +166 -704
  177. data/lib/thinking_sphinx/settings.rb +128 -0
  178. data/lib/thinking_sphinx/sinatra.rb +7 -0
  179. data/lib/thinking_sphinx/subscribers/populator_subscriber.rb +48 -0
  180. data/lib/thinking_sphinx/tasks.rb +70 -150
  181. data/lib/thinking_sphinx/test.rb +56 -0
  182. data/lib/thinking_sphinx/utf8.rb +18 -0
  183. data/lib/thinking_sphinx/wildcard.rb +42 -0
  184. data/lib/thinking_sphinx/with_output.rb +13 -0
  185. data/lib/thinking_sphinx.rb +83 -185
  186. data/spec/acceptance/association_scoping_spec.rb +65 -0
  187. data/spec/acceptance/attribute_access_spec.rb +58 -0
  188. data/spec/acceptance/attribute_updates_spec.rb +18 -0
  189. data/spec/acceptance/batch_searching_spec.rb +23 -0
  190. data/spec/acceptance/big_integers_spec.rb +61 -0
  191. data/spec/acceptance/excerpts_spec.rb +50 -0
  192. data/spec/acceptance/facets_spec.rb +141 -0
  193. data/spec/acceptance/geosearching_spec.rb +70 -0
  194. data/spec/acceptance/grouping_by_attributes_spec.rb +79 -0
  195. data/spec/acceptance/index_options_spec.rb +154 -0
  196. data/spec/acceptance/indexing_spec.rb +38 -0
  197. data/spec/acceptance/merging_spec.rb +90 -0
  198. data/spec/acceptance/paginating_search_results_spec.rb +42 -0
  199. data/spec/acceptance/real_time_updates_spec.rb +115 -0
  200. data/spec/acceptance/remove_deleted_records_spec.rb +99 -0
  201. data/spec/acceptance/search_counts_spec.rb +20 -0
  202. data/spec/acceptance/search_for_just_ids_spec.rb +21 -0
  203. data/spec/acceptance/searching_across_models_spec.rb +47 -0
  204. data/spec/acceptance/searching_across_schemas_spec.rb +40 -0
  205. data/spec/acceptance/searching_on_fields_spec.rb +59 -0
  206. data/spec/acceptance/searching_with_filters_spec.rb +159 -0
  207. data/spec/acceptance/searching_with_sti_spec.rb +76 -0
  208. data/spec/acceptance/searching_within_a_model_spec.rb +117 -0
  209. data/spec/acceptance/sorting_search_results_spec.rb +50 -0
  210. data/spec/acceptance/spec_helper.rb +6 -0
  211. data/spec/acceptance/specifying_sql_spec.rb +516 -0
  212. data/spec/acceptance/sphinx_scopes_spec.rb +87 -0
  213. data/spec/acceptance/sql_deltas_spec.rb +78 -0
  214. data/spec/acceptance/support/database_cleaner.rb +13 -0
  215. data/spec/acceptance/support/sphinx_controller.rb +62 -0
  216. data/spec/acceptance/support/sphinx_helpers.rb +45 -0
  217. data/spec/acceptance/suspended_deltas_spec.rb +56 -0
  218. data/spec/fixtures/database.yml +4 -0
  219. data/spec/internal/app/indices/admin_person_index.rb +9 -0
  220. data/spec/internal/app/indices/album_index.rb +9 -0
  221. data/spec/internal/app/indices/animal_index.rb +5 -0
  222. data/spec/internal/app/indices/article_index.rb +31 -0
  223. data/spec/internal/app/indices/bird_index.rb +6 -0
  224. data/spec/internal/app/indices/book_index.rb +11 -0
  225. data/spec/internal/app/indices/car_index.rb +7 -0
  226. data/spec/internal/app/indices/city_index.rb +9 -0
  227. data/spec/internal/app/indices/colour_index.rb +7 -0
  228. data/spec/internal/app/indices/product_index.rb +27 -0
  229. data/spec/internal/app/indices/tee_index.rb +6 -0
  230. data/spec/internal/app/indices/user_index.rb +9 -0
  231. data/spec/internal/app/models/admin/person.rb +9 -0
  232. data/spec/internal/app/models/album.rb +25 -0
  233. data/spec/internal/app/models/animal.rb +5 -0
  234. data/spec/internal/app/models/article.rb +9 -0
  235. data/spec/internal/app/models/bird.rb +5 -0
  236. data/spec/internal/app/models/book.rb +18 -0
  237. data/spec/internal/app/models/car.rb +7 -0
  238. data/spec/internal/app/models/categorisation.rb +15 -0
  239. data/spec/internal/app/models/category.rb +6 -0
  240. data/spec/internal/app/models/city.rb +7 -0
  241. data/spec/internal/app/models/colour.rb +7 -0
  242. data/spec/internal/app/models/event.rb +5 -0
  243. data/spec/internal/app/models/flightless_bird.rb +4 -0
  244. data/spec/internal/app/models/genre.rb +5 -0
  245. data/spec/internal/app/models/hardcover.rb +5 -0
  246. data/spec/internal/app/models/mammal.rb +4 -0
  247. data/spec/internal/app/models/manufacturer.rb +5 -0
  248. data/spec/internal/app/models/product.rb +8 -0
  249. data/spec/internal/app/models/tag.rb +6 -0
  250. data/{features/support → spec/internal/app}/models/tagging.rb +3 -1
  251. data/spec/internal/app/models/tee.rb +10 -0
  252. data/spec/internal/app/models/tweet.rb +5 -0
  253. data/spec/internal/app/models/user.rb +10 -0
  254. data/spec/internal/config/database.yml +17 -0
  255. data/spec/internal/db/schema.rb +115 -0
  256. data/spec/internal/tmp/.gitkeep +0 -0
  257. data/spec/spec_helper.rb +29 -0
  258. data/spec/support/json_column.rb +35 -0
  259. data/spec/support/multi_schema.rb +50 -0
  260. data/spec/support/mysql.rb +25 -0
  261. data/spec/support/sphinx_yaml_helpers.rb +16 -0
  262. data/spec/thinking_sphinx/active_record/association_spec.rb +14 -0
  263. data/spec/thinking_sphinx/active_record/attribute/type_spec.rb +165 -0
  264. data/spec/thinking_sphinx/active_record/base_spec.rb +131 -0
  265. data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +128 -0
  266. data/spec/thinking_sphinx/active_record/callbacks/delta_callbacks_spec.rb +176 -0
  267. data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +91 -0
  268. data/spec/thinking_sphinx/active_record/column_spec.rb +72 -0
  269. data/spec/thinking_sphinx/active_record/column_sql_presenter_spec.rb +39 -0
  270. data/spec/thinking_sphinx/active_record/database_adapters/abstract_adapter_spec.rb +33 -0
  271. data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +70 -0
  272. data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +66 -0
  273. data/spec/thinking_sphinx/active_record/database_adapters_spec.rb +128 -0
  274. data/spec/thinking_sphinx/active_record/field_spec.rb +51 -0
  275. data/spec/thinking_sphinx/active_record/filter_reflection_spec.rb +207 -0
  276. data/spec/thinking_sphinx/active_record/index_spec.rb +220 -0
  277. data/spec/thinking_sphinx/active_record/interpreter_spec.rb +329 -0
  278. data/spec/thinking_sphinx/active_record/polymorpher_spec.rb +87 -0
  279. data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +264 -0
  280. data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +662 -0
  281. data/spec/thinking_sphinx/active_record/sql_source_spec.rb +507 -0
  282. data/spec/thinking_sphinx/attribute_types_spec.rb +52 -0
  283. data/spec/thinking_sphinx/commands/clear_real_time_spec.rb +46 -0
  284. data/spec/thinking_sphinx/commands/clear_sql_spec.rb +52 -0
  285. data/spec/thinking_sphinx/commands/configure_spec.rb +31 -0
  286. data/spec/thinking_sphinx/commands/index_real_time_spec.rb +33 -0
  287. data/spec/thinking_sphinx/commands/index_sql_spec.rb +86 -0
  288. data/spec/thinking_sphinx/commands/merge_and_update_spec.rb +106 -0
  289. data/spec/thinking_sphinx/commands/merge_spec.rb +48 -0
  290. data/spec/thinking_sphinx/commands/prepare_spec.rb +31 -0
  291. data/spec/thinking_sphinx/commands/running_spec.rb +30 -0
  292. data/spec/thinking_sphinx/commands/start_detached_spec.rb +67 -0
  293. data/spec/thinking_sphinx/commands/stop_spec.rb +63 -0
  294. data/spec/thinking_sphinx/configuration/minimum_fields_spec.rb +60 -0
  295. data/spec/thinking_sphinx/configuration_spec.rb +582 -0
  296. data/spec/thinking_sphinx/connection/mri_spec.rb +49 -0
  297. data/spec/thinking_sphinx/connection_spec.rb +87 -0
  298. data/spec/thinking_sphinx/deletion_spec.rb +57 -0
  299. data/spec/thinking_sphinx/deltas/default_delta_spec.rb +123 -0
  300. data/spec/thinking_sphinx/deltas_spec.rb +77 -0
  301. data/spec/thinking_sphinx/errors_spec.rb +103 -0
  302. data/spec/thinking_sphinx/excerpter_spec.rb +53 -0
  303. data/spec/thinking_sphinx/facet_search_spec.rb +133 -0
  304. data/spec/thinking_sphinx/hooks/guard_presence_spec.rb +30 -0
  305. data/spec/thinking_sphinx/index_set_spec.rb +132 -0
  306. data/spec/thinking_sphinx/index_spec.rb +140 -0
  307. data/spec/thinking_sphinx/interfaces/daemon_spec.rb +60 -0
  308. data/spec/thinking_sphinx/interfaces/real_time_spec.rb +109 -0
  309. data/spec/thinking_sphinx/interfaces/sql_spec.rb +122 -0
  310. data/spec/thinking_sphinx/masks/pagination_mask_spec.rb +123 -0
  311. data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +139 -0
  312. data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +180 -0
  313. data/spec/thinking_sphinx/middlewares/geographer_spec.rb +102 -0
  314. data/spec/thinking_sphinx/middlewares/glazier_spec.rb +65 -0
  315. data/spec/thinking_sphinx/middlewares/inquirer_spec.rb +72 -0
  316. data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +401 -0
  317. data/spec/thinking_sphinx/middlewares/stale_id_checker_spec.rb +50 -0
  318. data/spec/thinking_sphinx/middlewares/stale_id_filter_spec.rb +113 -0
  319. data/spec/thinking_sphinx/middlewares/valid_options_spec.rb +51 -0
  320. data/spec/thinking_sphinx/panes/attributes_pane_spec.rb +23 -0
  321. data/spec/thinking_sphinx/panes/distance_pane_spec.rb +43 -0
  322. data/spec/thinking_sphinx/panes/excerpts_pane_spec.rb +53 -0
  323. data/spec/thinking_sphinx/panes/weight_pane_spec.rb +22 -0
  324. data/spec/thinking_sphinx/rake_interface_spec.rb +39 -0
  325. data/spec/thinking_sphinx/real_time/attribute_spec.rb +64 -0
  326. data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +238 -0
  327. data/spec/thinking_sphinx/real_time/field_spec.rb +69 -0
  328. data/spec/thinking_sphinx/real_time/index_spec.rb +230 -0
  329. data/spec/thinking_sphinx/real_time/interpreter_spec.rb +203 -0
  330. data/spec/thinking_sphinx/real_time/transcribe_instance_spec.rb +35 -0
  331. data/spec/thinking_sphinx/real_time/transcriber_spec.rb +109 -0
  332. data/spec/thinking_sphinx/real_time/translator_spec.rb +17 -0
  333. data/spec/thinking_sphinx/scopes_spec.rb +51 -0
  334. data/spec/thinking_sphinx/search/glaze_spec.rb +79 -0
  335. data/spec/thinking_sphinx/search/query_spec.rb +87 -0
  336. data/spec/thinking_sphinx/search_spec.rb +214 -0
  337. data/spec/thinking_sphinx/wildcard_spec.rb +53 -0
  338. data/spec/thinking_sphinx_spec.rb +44 -0
  339. data/thinking-sphinx.gemspec +42 -0
  340. metadata +656 -243
  341. data/VERSION.yml +0 -5
  342. data/features/alternate_primary_key.feature +0 -27
  343. data/features/attribute_transformation.feature +0 -22
  344. data/features/attribute_updates.feature +0 -33
  345. data/features/datetime_deltas.feature +0 -66
  346. data/features/delayed_delta_indexing.feature +0 -37
  347. data/features/deleting_instances.feature +0 -64
  348. data/features/direct_attributes.feature +0 -11
  349. data/features/excerpts.feature +0 -13
  350. data/features/extensible_delta_indexing.feature +0 -9
  351. data/features/facets.feature +0 -76
  352. data/features/facets_across_model.feature +0 -29
  353. data/features/handling_edits.feature +0 -92
  354. data/features/retry_stale_indexes.feature +0 -24
  355. data/features/searching_across_models.feature +0 -20
  356. data/features/searching_by_model.feature +0 -175
  357. data/features/searching_with_find_arguments.feature +0 -56
  358. data/features/sphinx_detection.feature +0 -25
  359. data/features/sphinx_scopes.feature +0 -35
  360. data/features/step_definitions/alpha_steps.rb +0 -3
  361. data/features/step_definitions/beta_steps.rb +0 -7
  362. data/features/step_definitions/common_steps.rb +0 -178
  363. data/features/step_definitions/datetime_delta_steps.rb +0 -15
  364. data/features/step_definitions/delayed_delta_indexing_steps.rb +0 -7
  365. data/features/step_definitions/extensible_delta_indexing_steps.rb +0 -7
  366. data/features/step_definitions/facet_steps.rb +0 -92
  367. data/features/step_definitions/find_arguments_steps.rb +0 -36
  368. data/features/step_definitions/gamma_steps.rb +0 -15
  369. data/features/step_definitions/scope_steps.rb +0 -11
  370. data/features/step_definitions/search_steps.rb +0 -89
  371. data/features/step_definitions/sphinx_steps.rb +0 -31
  372. data/features/sti_searching.feature +0 -14
  373. data/features/support/database.example.yml +0 -3
  374. data/features/support/database.yml +0 -5
  375. data/features/support/db/active_record.rb +0 -40
  376. data/features/support/db/database.yml +0 -5
  377. data/features/support/db/fixtures/alphas.rb +0 -10
  378. data/features/support/db/fixtures/authors.rb +0 -1
  379. data/features/support/db/fixtures/betas.rb +0 -10
  380. data/features/support/db/fixtures/boxes.rb +0 -9
  381. data/features/support/db/fixtures/categories.rb +0 -1
  382. data/features/support/db/fixtures/cats.rb +0 -3
  383. data/features/support/db/fixtures/comments.rb +0 -24
  384. data/features/support/db/fixtures/delayed_betas.rb +0 -10
  385. data/features/support/db/fixtures/developers.rb +0 -29
  386. data/features/support/db/fixtures/dogs.rb +0 -3
  387. data/features/support/db/fixtures/extensible_betas.rb +0 -10
  388. data/features/support/db/fixtures/gammas.rb +0 -10
  389. data/features/support/db/fixtures/people.rb +0 -1001
  390. data/features/support/db/fixtures/posts.rb +0 -6
  391. data/features/support/db/fixtures/robots.rb +0 -14
  392. data/features/support/db/fixtures/tags.rb +0 -27
  393. data/features/support/db/fixtures/thetas.rb +0 -10
  394. data/features/support/db/migrations/create_alphas.rb +0 -7
  395. data/features/support/db/migrations/create_animals.rb +0 -5
  396. data/features/support/db/migrations/create_authors.rb +0 -3
  397. data/features/support/db/migrations/create_authors_posts.rb +0 -6
  398. data/features/support/db/migrations/create_betas.rb +0 -5
  399. data/features/support/db/migrations/create_boxes.rb +0 -5
  400. data/features/support/db/migrations/create_categories.rb +0 -3
  401. data/features/support/db/migrations/create_comments.rb +0 -10
  402. data/features/support/db/migrations/create_delayed_betas.rb +0 -17
  403. data/features/support/db/migrations/create_developers.rb +0 -9
  404. data/features/support/db/migrations/create_extensible_betas.rb +0 -5
  405. data/features/support/db/migrations/create_gammas.rb +0 -3
  406. data/features/support/db/migrations/create_people.rb +0 -13
  407. data/features/support/db/migrations/create_posts.rb +0 -5
  408. data/features/support/db/migrations/create_robots.rb +0 -4
  409. data/features/support/db/migrations/create_taggings.rb +0 -5
  410. data/features/support/db/migrations/create_tags.rb +0 -4
  411. data/features/support/db/migrations/create_thetas.rb +0 -5
  412. data/features/support/db/mysql.rb +0 -3
  413. data/features/support/db/postgresql.rb +0 -3
  414. data/features/support/env.rb +0 -18
  415. data/features/support/lib/generic_delta_handler.rb +0 -8
  416. data/features/support/models/alpha.rb +0 -10
  417. data/features/support/models/animal.rb +0 -5
  418. data/features/support/models/author.rb +0 -3
  419. data/features/support/models/beta.rb +0 -8
  420. data/features/support/models/box.rb +0 -8
  421. data/features/support/models/cat.rb +0 -3
  422. data/features/support/models/category.rb +0 -4
  423. data/features/support/models/comment.rb +0 -10
  424. data/features/support/models/delayed_beta.rb +0 -7
  425. data/features/support/models/developer.rb +0 -16
  426. data/features/support/models/dog.rb +0 -3
  427. data/features/support/models/extensible_beta.rb +0 -9
  428. data/features/support/models/gamma.rb +0 -5
  429. data/features/support/models/person.rb +0 -23
  430. data/features/support/models/post.rb +0 -20
  431. data/features/support/models/robot.rb +0 -12
  432. data/features/support/models/tag.rb +0 -3
  433. data/features/support/models/theta.rb +0 -7
  434. data/features/support/post_database.rb +0 -43
  435. data/lib/cucumber/thinking_sphinx/internal_world.rb +0 -125
  436. data/lib/cucumber/thinking_sphinx/sql_logger.rb +0 -20
  437. data/lib/thinking_sphinx/active_record/attribute_updates.rb +0 -48
  438. data/lib/thinking_sphinx/active_record/delta.rb +0 -87
  439. data/lib/thinking_sphinx/active_record/has_many_association.rb +0 -28
  440. data/lib/thinking_sphinx/active_record/scopes.rb +0 -39
  441. data/lib/thinking_sphinx/adapters/abstract_adapter.rb +0 -42
  442. data/lib/thinking_sphinx/adapters/mysql_adapter.rb +0 -54
  443. data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +0 -143
  444. data/lib/thinking_sphinx/association.rb +0 -164
  445. data/lib/thinking_sphinx/attribute.rb +0 -341
  446. data/lib/thinking_sphinx/class_facet.rb +0 -15
  447. data/lib/thinking_sphinx/core/array.rb +0 -7
  448. data/lib/thinking_sphinx/core/string.rb +0 -15
  449. data/lib/thinking_sphinx/deltas/datetime_delta.rb +0 -50
  450. data/lib/thinking_sphinx/deltas/delayed_delta/delta_job.rb +0 -24
  451. data/lib/thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job.rb +0 -27
  452. data/lib/thinking_sphinx/deltas/delayed_delta/job.rb +0 -26
  453. data/lib/thinking_sphinx/deltas/delayed_delta.rb +0 -30
  454. data/lib/thinking_sphinx/deploy/capistrano.rb +0 -100
  455. data/lib/thinking_sphinx/field.rb +0 -82
  456. data/lib/thinking_sphinx/index/builder.rb +0 -286
  457. data/lib/thinking_sphinx/index/faux_column.rb +0 -110
  458. data/lib/thinking_sphinx/property.rb +0 -162
  459. data/lib/thinking_sphinx/rails_additions.rb +0 -150
  460. data/lib/thinking_sphinx/search_methods.rb +0 -421
  461. data/lib/thinking_sphinx/source/internal_properties.rb +0 -46
  462. data/lib/thinking_sphinx/source/sql.rb +0 -128
  463. data/lib/thinking_sphinx/source.rb +0 -150
  464. data/rails/init.rb +0 -14
  465. data/spec/lib/thinking_sphinx/active_record/delta_spec.rb +0 -130
  466. data/spec/lib/thinking_sphinx/active_record/has_many_association_spec.rb +0 -49
  467. data/spec/lib/thinking_sphinx/active_record/scopes_spec.rb +0 -96
  468. data/spec/lib/thinking_sphinx/active_record_spec.rb +0 -353
  469. data/spec/lib/thinking_sphinx/association_spec.rb +0 -239
  470. data/spec/lib/thinking_sphinx/attribute_spec.rb +0 -507
  471. data/spec/lib/thinking_sphinx/configuration_spec.rb +0 -268
  472. data/spec/lib/thinking_sphinx/core/array_spec.rb +0 -9
  473. data/spec/lib/thinking_sphinx/core/string_spec.rb +0 -9
  474. data/spec/lib/thinking_sphinx/deltas/job_spec.rb +0 -32
  475. data/spec/lib/thinking_sphinx/excerpter_spec.rb +0 -57
  476. data/spec/lib/thinking_sphinx/facet_search_spec.rb +0 -176
  477. data/spec/lib/thinking_sphinx/facet_spec.rb +0 -333
  478. data/spec/lib/thinking_sphinx/field_spec.rb +0 -154
  479. data/spec/lib/thinking_sphinx/index/builder_spec.rb +0 -455
  480. data/spec/lib/thinking_sphinx/index/faux_column_spec.rb +0 -30
  481. data/spec/lib/thinking_sphinx/index_spec.rb +0 -45
  482. data/spec/lib/thinking_sphinx/rails_additions_spec.rb +0 -203
  483. data/spec/lib/thinking_sphinx/search_methods_spec.rb +0 -152
  484. data/spec/lib/thinking_sphinx/search_spec.rb +0 -1101
  485. data/spec/lib/thinking_sphinx/source_spec.rb +0 -227
  486. data/spec/lib/thinking_sphinx_spec.rb +0 -162
  487. data/tasks/distribution.rb +0 -53
  488. data/tasks/rails.rake +0 -1
  489. data/tasks/testing.rb +0 -72
  490. data/vendor/after_commit/LICENSE +0 -20
  491. data/vendor/after_commit/README +0 -16
  492. data/vendor/after_commit/Rakefile +0 -22
  493. data/vendor/after_commit/init.rb +0 -8
  494. data/vendor/after_commit/lib/after_commit/active_record.rb +0 -114
  495. data/vendor/after_commit/lib/after_commit/connection_adapters.rb +0 -103
  496. data/vendor/after_commit/lib/after_commit.rb +0 -45
  497. data/vendor/after_commit/test/after_commit_test.rb +0 -53
  498. data/vendor/delayed_job/lib/delayed/job.rb +0 -251
  499. data/vendor/delayed_job/lib/delayed/message_sending.rb +0 -7
  500. data/vendor/delayed_job/lib/delayed/performable_method.rb +0 -55
  501. data/vendor/delayed_job/lib/delayed/worker.rb +0 -54
  502. data/vendor/riddle/lib/riddle/client/filter.rb +0 -53
  503. data/vendor/riddle/lib/riddle/client/message.rb +0 -66
  504. data/vendor/riddle/lib/riddle/client/response.rb +0 -84
  505. data/vendor/riddle/lib/riddle/client.rb +0 -635
  506. data/vendor/riddle/lib/riddle/configuration/distributed_index.rb +0 -48
  507. data/vendor/riddle/lib/riddle/configuration/index.rb +0 -142
  508. data/vendor/riddle/lib/riddle/configuration/indexer.rb +0 -19
  509. data/vendor/riddle/lib/riddle/configuration/remote_index.rb +0 -17
  510. data/vendor/riddle/lib/riddle/configuration/searchd.rb +0 -25
  511. data/vendor/riddle/lib/riddle/configuration/section.rb +0 -43
  512. data/vendor/riddle/lib/riddle/configuration/source.rb +0 -23
  513. data/vendor/riddle/lib/riddle/configuration/sql_source.rb +0 -34
  514. data/vendor/riddle/lib/riddle/configuration/xml_source.rb +0 -28
  515. data/vendor/riddle/lib/riddle/configuration.rb +0 -33
  516. data/vendor/riddle/lib/riddle/controller.rb +0 -53
  517. data/vendor/riddle/lib/riddle.rb +0 -30
@@ -1,353 +0,0 @@
1
- require 'spec/spec_helper'
2
-
3
- describe ThinkingSphinx::ActiveRecord do
4
- describe '.define_index' do
5
- before :each do
6
- module ::TestModule
7
- class TestModel < ActiveRecord::Base; end
8
- end
9
-
10
- TestModule::TestModel.stub!(
11
- :before_save => true,
12
- :after_commit => true,
13
- :after_destroy => true
14
- )
15
-
16
- @index = ThinkingSphinx::Index.new(TestModule::TestModel)
17
- @index.stub!(:delta? => false)
18
- ThinkingSphinx::Index::Builder.stub!(:generate => @index)
19
- end
20
-
21
- after :each do
22
- # Remove the class so we can redefine it
23
- TestModule.send(:remove_const, :TestModel)
24
-
25
- ThinkingSphinx.indexed_models.delete "TestModule::TestModel"
26
- end
27
-
28
- it "should do nothing if indexes are disabled" do
29
- ThinkingSphinx.define_indexes = false
30
- ThinkingSphinx::Index.should_not_receive(:new)
31
-
32
- TestModule::TestModel.define_index {}
33
-
34
- ThinkingSphinx.define_indexes = true
35
- end
36
-
37
- it "should add a new index to the model" do
38
- TestModule::TestModel.define_index {}
39
-
40
- TestModule::TestModel.sphinx_indexes.length.should == 1
41
- end
42
-
43
- it "should add to ThinkingSphinx.indexed_models if the model doesn't already exist in the array" do
44
- TestModule::TestModel.define_index do; end
45
-
46
- ThinkingSphinx.indexed_models.should include("TestModule::TestModel")
47
- end
48
-
49
- it "shouldn't add to ThinkingSphinx.indexed_models if the model already exists in the array" do
50
- TestModule::TestModel.define_index do; end
51
-
52
- ThinkingSphinx.indexed_models.select { |model|
53
- model == "TestModule::TestModel"
54
- }.length.should == 1
55
-
56
- TestModule::TestModel.define_index do; end
57
-
58
- ThinkingSphinx.indexed_models.select { |model|
59
- model == "TestModule::TestModel"
60
- }.length.should == 1
61
- end
62
-
63
- it "should add before_save and after_commit hooks to the model if delta indexing is enabled" do
64
- @index.stub!(:delta? => true)
65
- TestModule::TestModel.should_receive(:before_save).with(:toggle_delta)
66
- TestModule::TestModel.should_receive(:after_commit).with(:index_delta)
67
-
68
- TestModule::TestModel.define_index do; end
69
- end
70
-
71
- it "should not add before_save and after_commit hooks to the model if delta indexing is disabled" do
72
- TestModule::TestModel.should_not_receive(:before_save).with(:toggle_delta)
73
- TestModule::TestModel.should_not_receive(:after_commit).with(:index_delta)
74
-
75
- TestModule::TestModel.define_index do; end
76
- end
77
-
78
- it "should add an after_destroy hook with delta indexing enabled" do
79
- @index.stub!(:delta? => true)
80
- TestModule::TestModel.should_receive(:after_destroy).with(:toggle_deleted)
81
-
82
- TestModule::TestModel.define_index do; end
83
- end
84
-
85
- it "should add an after_destroy hook with delta indexing disabled" do
86
- TestModule::TestModel.should_receive(:after_destroy).with(:toggle_deleted)
87
-
88
- TestModule::TestModel.define_index do; end
89
- end
90
-
91
- it "should return the new index" do
92
- TestModule::TestModel.define_index.should == @index
93
- end
94
-
95
- it "should die quietly if there is a database error" do
96
- ThinkingSphinx::Index::Builder.stub(:generate) { raise Mysql::Error }
97
-
98
- lambda {
99
- TestModule::TestModel.define_index
100
- }.should_not raise_error
101
- end
102
-
103
- it "should die noisily if there is a non-database error" do
104
- ThinkingSphinx::Index::Builder.stub(:generate) { raise StandardError }
105
-
106
- lambda {
107
- TestModule::TestModel.define_index
108
- }.should raise_error
109
- end
110
- end
111
-
112
- describe "index methods" do
113
- before(:all) do
114
- @person = Person.find(:first)
115
- end
116
-
117
- describe "in_both_indexes?" do
118
- it "should return true if in core and delta indexes" do
119
- @person.should_receive(:in_core_index?).and_return(true)
120
- @person.should_receive(:in_delta_index?).and_return(true)
121
- @person.in_both_indexes?.should be_true
122
- end
123
-
124
- it "should return false if in one index and not the other" do
125
- @person.should_receive(:in_core_index?).and_return(true)
126
- @person.should_receive(:in_delta_index?).and_return(false)
127
- @person.in_both_indexes?.should be_false
128
- end
129
- end
130
-
131
- describe "in_core_index?" do
132
- it "should call in_index? with core" do
133
- @person.should_receive(:in_index?).with('core')
134
- @person.in_core_index?
135
- end
136
- end
137
-
138
- describe "in_delta_index?" do
139
- it "should call in_index? with delta" do
140
- @person.should_receive(:in_index?).with('delta')
141
- @person.in_delta_index?
142
- end
143
- end
144
-
145
- describe "in_index?" do
146
- it "should return true if in the specified index" do
147
- @person.should_receive(:sphinx_document_id).and_return(1)
148
- @person.should_receive(:sphinx_index_name).and_return('person_core')
149
- Person.should_receive(:search_for_id).with(1, 'person_core').and_return(true)
150
-
151
- @person.in_index?('core').should be_true
152
- end
153
- end
154
- end
155
-
156
- describe '.source_of_sphinx_index' do
157
- it "should return self if model defines an index" do
158
- Person.source_of_sphinx_index.should == Person
159
- end
160
-
161
- it "should return the parent if model inherits an index" do
162
- Admin::Person.source_of_sphinx_index.should == Person
163
- end
164
- end
165
-
166
- describe '.to_crc32' do
167
- it "should return an integer" do
168
- Person.to_crc32.should be_a_kind_of(Integer)
169
- end
170
- end
171
-
172
- describe '.to_crc32s' do
173
- it "should return an array" do
174
- Person.to_crc32s.should be_a_kind_of(Array)
175
- end
176
- end
177
-
178
- describe "toggle_deleted method" do
179
- before :each do
180
- ThinkingSphinx.stub!(:sphinx_running? => true)
181
-
182
- @configuration = ThinkingSphinx::Configuration.instance
183
- @configuration.stub!(
184
- :address => "an address",
185
- :port => 123
186
- )
187
- @client = Riddle::Client.new
188
- @client.stub!(:update => true)
189
- @person = Person.find(:first)
190
-
191
- Riddle::Client.stub!(:new => @client)
192
- Person.sphinx_indexes.each { |index| index.stub!(:delta? => false) }
193
- @person.stub!(:in_core_index? => true)
194
- end
195
-
196
- it "should create a client using the Configuration's address and port" do
197
- Riddle::Client.should_receive(:new).with(
198
- @configuration.address, @configuration.port
199
- )
200
-
201
- @person.toggle_deleted
202
- end
203
-
204
- it "should update the core index's deleted flag if in core index" do
205
- @client.should_receive(:update).with(
206
- "person_core", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
207
- )
208
-
209
- @person.toggle_deleted
210
- end
211
-
212
- it "shouldn't update the core index's deleted flag if the record isn't in it" do
213
- @person.stub!(:in_core_index? => false)
214
- @client.should_not_receive(:update).with(
215
- "person_core", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
216
- )
217
-
218
- @person.toggle_deleted
219
- end
220
-
221
- it "shouldn't attempt to update the deleted flag if sphinx isn't running" do
222
- ThinkingSphinx.stub!(:sphinx_running? => false)
223
- @client.should_not_receive(:update)
224
- @person.should_not_receive(:in_core_index?)
225
-
226
- @person.toggle_deleted
227
- end
228
-
229
- it "should update the delta index's deleted flag if delta indexes are enabled and the instance's delta is true" do
230
- ThinkingSphinx.deltas_enabled = true
231
- Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
232
- @person.delta = true
233
- @client.should_receive(:update).with(
234
- "person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
235
- )
236
-
237
- @person.toggle_deleted
238
- end
239
-
240
- it "should not update the delta index's deleted flag if delta indexes are enabled and the instance's delta is false" do
241
- ThinkingSphinx.deltas_enabled = true
242
- Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
243
- @person.delta = false
244
- @client.should_not_receive(:update).with(
245
- "person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
246
- )
247
-
248
- @person.toggle_deleted
249
- end
250
-
251
- it "should not update the delta index's deleted flag if delta indexes are enabled and the instance's delta is equivalent to false" do
252
- ThinkingSphinx.deltas_enabled = true
253
- Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
254
- @person.delta = 0
255
- @client.should_not_receive(:update).with(
256
- "person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
257
- )
258
-
259
- @person.toggle_deleted
260
- end
261
-
262
- it "shouldn't update the delta index if delta indexes are disabled" do
263
- ThinkingSphinx.deltas_enabled = true
264
- @client.should_not_receive(:update).with(
265
- "person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
266
- )
267
-
268
- @person.toggle_deleted
269
- end
270
-
271
- it "should not update either index if updates are disabled" do
272
- ThinkingSphinx.updates_enabled = false
273
- ThinkingSphinx.deltas_enabled = true
274
- Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
275
- @person.delta = true
276
- @client.should_not_receive(:update)
277
-
278
- @person.toggle_deleted
279
- end
280
- end
281
-
282
- describe "sphinx_indexes in the inheritance chain (STI)" do
283
- it "should hand defined indexes on a class down to its child classes" do
284
- Child.sphinx_indexes.should include(*Person.sphinx_indexes)
285
- end
286
-
287
- it "should allow associations to other STI models" do
288
- source = Child.sphinx_indexes.last.sources.first
289
- sql = source.to_riddle_for_core(0, 0).sql_query
290
- sql.gsub!('$start', '0').gsub!('$end', '100')
291
- lambda {
292
- Child.connection.execute(sql)
293
- }.should_not raise_error(ActiveRecord::StatementInvalid)
294
- end
295
- end
296
-
297
- it "should return the sphinx document id as expected" do
298
- person = Person.find(:first)
299
- model_count = ThinkingSphinx.indexed_models.length
300
- offset = ThinkingSphinx.indexed_models.index("Person")
301
-
302
- (person.id * model_count + offset).should == person.sphinx_document_id
303
-
304
- alpha = Alpha.find(:first)
305
- offset = ThinkingSphinx.indexed_models.index("Alpha")
306
-
307
- (alpha.id * model_count + offset).should == alpha.sphinx_document_id
308
-
309
- beta = Beta.find(:first)
310
- offset = ThinkingSphinx.indexed_models.index("Beta")
311
-
312
- (beta.id * model_count + offset).should == beta.sphinx_document_id
313
- end
314
-
315
- describe '#primary_key_for_sphinx' do
316
- before :each do
317
- @person = Person.find(:first)
318
- end
319
-
320
- after :each do
321
- Person.set_sphinx_primary_key nil
322
- end
323
-
324
- it "should return the id by default" do
325
- @person.primary_key_for_sphinx.should == @person.id
326
- end
327
-
328
- it "should use the sphinx primary key to determine the value" do
329
- Person.set_sphinx_primary_key :first_name
330
- @person.primary_key_for_sphinx.should == @person.first_name
331
- end
332
-
333
- it "should not use accessor methods but the attributes hash" do
334
- id = @person.id
335
- @person.stub!(:id => 'unique_hash')
336
- @person.primary_key_for_sphinx.should == id
337
- end
338
- end
339
-
340
- describe '.sphinx_index_names' do
341
- it "should return the core index" do
342
- Alpha.sphinx_index_names.should == ['alpha_core']
343
- end
344
-
345
- it "should return the delta index if enabled" do
346
- Beta.sphinx_index_names.should == ['beta_core', 'beta_delta']
347
- end
348
-
349
- it "should return the superclass with an index definition" do
350
- Parent.sphinx_index_names.should == ['person_core', 'person_delta']
351
- end
352
- end
353
- end
@@ -1,239 +0,0 @@
1
- require 'spec/spec_helper'
2
-
3
- describe ThinkingSphinx::Association do
4
- describe '.children' do
5
- before :each do
6
- @normal_reflection = stub('reflection', :options => {
7
- :polymorphic => false
8
- })
9
- @normal_association = ThinkingSphinx::Association.new(nil, nil)
10
- @poly_reflection = stub('reflection',
11
- :options => {:polymorphic => true},
12
- :macro => :has_many,
13
- :name => 'polly',
14
- :active_record => 'AR'
15
- )
16
- @non_poly_reflection = stub('reflection')
17
-
18
- Person.stub!(:reflect_on_association => @normal_reflection)
19
- ThinkingSphinx::Association.stub!(
20
- :new => @normal_association,
21
- :polymorphic_classes => [Person, Person],
22
- :casted_options => {:casted => :options}
23
- )
24
- ::ActiveRecord::Reflection::AssociationReflection.stub!(
25
- :new => @non_poly_reflection
26
- )
27
- end
28
-
29
- it "should return an empty array if no association exists" do
30
- Person.stub!(:reflect_on_association => nil)
31
-
32
- ThinkingSphinx::Association.children(Person, :assoc).should == []
33
- end
34
-
35
- it "should return a single association instance in an array if assocation isn't polymorphic" do
36
- ThinkingSphinx::Association.children(Person, :assoc).should == [@normal_association]
37
- end
38
-
39
- it "should return multiple association instances for polymorphic associations" do
40
- Person.stub!(:reflect_on_association => @poly_reflection)
41
-
42
- ThinkingSphinx::Association.children(Person, :assoc).should ==
43
- [@normal_association, @normal_association]
44
- end
45
-
46
- it "should generate non-polymorphic 'casted' associations for each polymorphic possibility" do
47
- Person.stub!(:reflect_on_association => @poly_reflection)
48
- ThinkingSphinx::Association.should_receive(:casted_options).with(
49
- Person, @poly_reflection
50
- ).twice
51
- ::ActiveRecord::Reflection::AssociationReflection.should_receive(:new).
52
- with(:has_many, :polly_Person, {:casted => :options}, "AR").twice
53
- ThinkingSphinx::Association.should_receive(:new).with(
54
- nil, @non_poly_reflection
55
- ).twice
56
-
57
- ThinkingSphinx::Association.children(Person, :assoc)
58
- end
59
- end
60
-
61
- describe '#children' do
62
- before :each do
63
- @reflection = stub('reflection', :klass => :klass)
64
- @association = ThinkingSphinx::Association.new(nil, @reflection)
65
- ThinkingSphinx::Association.stub!(:children => :result)
66
- end
67
-
68
- it "should return the children associations for the given association" do
69
- @association.children(:assoc).should == :result
70
- end
71
-
72
- it "should request children for the reflection klass" do
73
- ThinkingSphinx::Association.should_receive(:children).
74
- with(:klass, :assoc, @association)
75
-
76
- @association.children(:assoc)
77
- end
78
- end
79
-
80
- describe '#join_to' do
81
- before :each do
82
- @parent_join = stub('join assoc').as_null_object
83
- @join = stub('join assoc').as_null_object
84
- @parent = ThinkingSphinx::Association.new(nil, nil)
85
- @parent.stub!(:join_to => true, :join => nil)
86
- @base_join = stub('base join', :joins => [:a, :b, :c])
87
- ::ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation.stub!(:new => @join)
88
- end
89
-
90
- it "should call the parent's join_to if parent has no join" do
91
- @assoc = ThinkingSphinx::Association.new(@parent, :ref)
92
- @parent.should_receive(:join_to).with(@base_join)
93
-
94
- @assoc.join_to(@base_join)
95
- end
96
-
97
- it "should not call the parent's join_to if it already has a join" do
98
- @assoc = ThinkingSphinx::Association.new(@parent, :ref)
99
- @parent.stub!(:join => @parent_join)
100
- @parent.should_not_receive(:join_to)
101
-
102
- @assoc.join_to(@base_join)
103
- end
104
-
105
- it "should define the join association with a JoinAssociation instance" do
106
- @assoc = ThinkingSphinx::Association.new(@parent, :ref)
107
-
108
- @assoc.join_to(@base_join).should == @join
109
- @assoc.join.should == @join
110
- end
111
- end
112
-
113
- describe '#to_sql' do
114
- before :each do
115
- @reflection = stub('reflection', :klass => Person)
116
- @association = ThinkingSphinx::Association.new(nil, @reflection)
117
- @parent = stub('parent', :aliased_table_name => "ALIAS TABLE NAME")
118
- @join = stub('join assoc',
119
- :association_join => "full association join SQL",
120
- :parent => @parent
121
- )
122
- @association.join = @join
123
- end
124
-
125
- it "should return the join's association join value" do
126
- @association.to_sql.should == "full association join SQL"
127
- end
128
-
129
- it "should replace ::ts_join_alias:: with the aliased table name" do
130
- @join.stub!(:association_join => "text with ::ts_join_alias:: gone")
131
-
132
- @association.to_sql.should == "text with `ALIAS TABLE NAME` gone"
133
- end
134
- end
135
-
136
- describe '#is_many?' do
137
- before :each do
138
- @parent = stub('assoc', :is_many? => :parent_is_many)
139
- @reflection = stub('reflection', :macro => :has_many)
140
- end
141
-
142
- it "should return true if association is either a has_many or a habtm" do
143
- association = ThinkingSphinx::Association.new(@parent, @reflection)
144
- association.is_many?.should be_true
145
-
146
- @reflection.stub!(:macro => :has_and_belongs_to_many)
147
- association.is_many?.should be_true
148
- end
149
-
150
- it "should return the parent value if not a has many or habtm and there is a parent" do
151
- association = ThinkingSphinx::Association.new(@parent, @reflection)
152
- @reflection.stub!(:macro => :belongs_to)
153
- association.is_many?.should == :parent_is_many
154
- end
155
-
156
- it "should return false if no parent and not a has many or habtm" do
157
- association = ThinkingSphinx::Association.new(nil, @reflection)
158
- @reflection.stub!(:macro => :belongs_to)
159
- association.is_many?.should be_false
160
- end
161
- end
162
-
163
- describe '#ancestors' do
164
- it "should return an array of associations - including all parents" do
165
- parent = stub('assoc', :ancestors => [:all, :ancestors])
166
- association = ThinkingSphinx::Association.new(parent, @reflection)
167
- association.ancestors.should == [:all, :ancestors, association]
168
- end
169
- end
170
-
171
- describe '.polymorphic_classes' do
172
- it "should return all the polymorphic result types as classes" do
173
- Person.connection.stub!(:select_all => [
174
- {"person_type" => "Person"},
175
- {"person_type" => "Friendship"}
176
- ])
177
- ref = stub('ref',
178
- :active_record => Person,
179
- :options => {:foreign_type => "person_type"}
180
- )
181
-
182
- ThinkingSphinx::Association.send(:polymorphic_classes, ref).should == [Person, Friendship]
183
- end
184
- end
185
-
186
- describe '.casted_options' do
187
- before :each do
188
- @options = {
189
- :foreign_key => "thing_id",
190
- :foreign_type => "thing_type",
191
- :polymorphic => true
192
- }
193
- @reflection = stub('assoc reflection', :options => @options)
194
- end
195
-
196
- it "should return a new options set for a specific class" do
197
- ThinkingSphinx::Association.send(:casted_options, Person, @reflection).should == {
198
- :polymorphic => nil,
199
- :class_name => "Person",
200
- :foreign_key => "thing_id",
201
- :foreign_type => "thing_type",
202
- :conditions => "::ts_join_alias::.`thing_type` = 'Person'"
203
- }
204
- end
205
-
206
- it "should append to existing Array of conditions" do
207
- @options[:conditions] = ["first condition"]
208
- ThinkingSphinx::Association.send(:casted_options, Person, @reflection).should == {
209
- :polymorphic => nil,
210
- :class_name => "Person",
211
- :foreign_key => "thing_id",
212
- :foreign_type => "thing_type",
213
- :conditions => ["first condition", "::ts_join_alias::.`thing_type` = 'Person'"]
214
- }
215
- end
216
-
217
- it "should merge to an existing Hash of conditions" do
218
- @options[:conditions] = {"field" => "value"}
219
- ThinkingSphinx::Association.send(:casted_options, Person, @reflection).should == {
220
- :polymorphic => nil,
221
- :class_name => "Person",
222
- :foreign_key => "thing_id",
223
- :foreign_type => "thing_type",
224
- :conditions => {"field" => "value", "thing_type" => "Person"}
225
- }
226
- end
227
-
228
- it "should append to an existing String of conditions" do
229
- @options[:conditions] = "first condition"
230
- ThinkingSphinx::Association.send(:casted_options, Person, @reflection).should == {
231
- :polymorphic => nil,
232
- :class_name => "Person",
233
- :foreign_key => "thing_id",
234
- :foreign_type => "thing_type",
235
- :conditions => "first condition AND ::ts_join_alias::.`thing_type` = 'Person'"
236
- }
237
- end
238
- end
239
- end