thinking-sphinx 2.1.0 → 3.0.0.pre

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 (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
@@ -1,173 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'ThinkingSphinx::ActiveRecord::HasManyAssociation' do
4
- describe "search method" do
5
- before :each do
6
- Friendship.stub!(:search => true)
7
-
8
- @person = Person.find(:first)
9
- @index = Friendship.sphinx_indexes.first
10
- end
11
-
12
- it "should raise an error if the required attribute doesn't exist" do
13
- @index.stub!(:attributes => [])
14
-
15
- lambda { @person.friendships.search "test" }.should raise_error(RuntimeError)
16
- end
17
-
18
- it "should add a filter for the attribute into a normal search call" do
19
- Friendship.should_receive(:search) do |query, options|
20
- options[:with][:person_id].should == @person.id
21
- end
22
-
23
- @person.friendships.search "test"
24
- end
25
-
26
- it "should add a filter for an aliased attribute into a normal search call" do
27
- @team = CricketTeam.new
28
- @team.stub!(:id => 1)
29
-
30
- Person.should_receive(:search).with do |query, options|
31
- options[:with][:team_id].should == @team.id
32
- end
33
-
34
- @team.people.search "test"
35
- end
36
-
37
- it "should define indexes for the reflection class" do
38
- Friendship.should_receive(:define_indexes)
39
-
40
- @person.friendships.search 'test'
41
- end
42
- end
43
-
44
- describe "facets method" do
45
- before :each do
46
- Friendship.stub!(:facets => true)
47
-
48
- @person = Person.find(:first)
49
- @index = Friendship.sphinx_indexes.first
50
- end
51
-
52
- it "should raise an error if the required attribute doesn't exist" do
53
- @index.stub!(:attributes => [])
54
-
55
- lambda { @person.friendships.facets "test" }.should raise_error(RuntimeError)
56
- end
57
-
58
- it "should add a filter for the attribute into a normal facets call" do
59
- Friendship.should_receive(:facets) do |query, options|
60
- options[:with][:person_id].should == @person.id
61
- end
62
-
63
- @person.friendships.facets "test"
64
- end
65
-
66
- it "should add a filter for an aliased attribute into a normal facets call" do
67
- @team = CricketTeam.new
68
- @team.stub!(:id => 1)
69
-
70
- Person.should_receive(:facets).with do |query, options|
71
- options[:with][:team_id].should == @team.id
72
- end
73
-
74
- @team.people.facets "test"
75
- end
76
-
77
- it "should define indexes for the reflection class" do
78
- Friendship.should_receive(:define_indexes)
79
-
80
- @person.friendships.facets 'test'
81
- end
82
- end
83
-
84
- describe "search method for has_many :through" do
85
- before :each do
86
- Person.stub!(:search => true)
87
-
88
- @person = Person.find(:first)
89
- @index = Person.sphinx_indexes.first
90
- end
91
-
92
- it "should raise an error if the required attribute doesn't exist" do
93
- @index.stub!(:attributes => [])
94
-
95
- lambda { @person.friends.search "test" }.should raise_error(RuntimeError)
96
- end
97
-
98
- it "should add a filter for the attribute into a normal search call" do
99
- Person.should_receive(:search).with do |query, options|
100
- options[:with][:friendly_ids].should == @person.id
101
- end
102
-
103
- @person.friends.search "test"
104
- end
105
-
106
- it "should add a filter for an aliased attribute into a normal search call" do
107
- @team = FootballTeam.new
108
- @team.stub!(:id => 1)
109
-
110
- Person.should_receive(:search).with do |query, options|
111
- options[:with][:football_team_id].should == @team.id
112
- end
113
-
114
- @team.people.search "test"
115
- end
116
- end
117
-
118
- describe "facets method for has_many :through" do
119
- before :each do
120
- Person.stub!(:facets => true)
121
-
122
- @person = Person.find(:first)
123
- @index = Person.sphinx_indexes.first
124
- end
125
-
126
- it "should raise an error if the required attribute doesn't exist" do
127
- @index.stub!(:attributes => [])
128
-
129
- lambda { @person.friends.facets "test" }.should raise_error(RuntimeError)
130
- end
131
-
132
- it "should add a filter for the attribute into a normal facets call" do
133
- Person.should_receive(:facets).with do |query, options|
134
- options[:with][:friendly_ids].should == @person.id
135
- end
136
-
137
- @person.friends.facets "test"
138
- end
139
-
140
- it "should add a filter for an aliased attribute into a normal facets call" do
141
- @team = FootballTeam.new
142
- @team.stub!(:id => 1)
143
-
144
- Person.should_receive(:facets).with do |query, options|
145
- options[:with][:football_team_id].should == @team.id
146
- end
147
-
148
- @team.people.facets "test"
149
- end
150
- end
151
-
152
- describe 'filtering sphinx scopes' do
153
- before :each do
154
- Friendship.stub!(:search => Friendship)
155
-
156
- @person = Person.find(:first)
157
- end
158
-
159
- it "should add a filter for the attribute in a sphinx scope call" do
160
- Friendship.should_receive(:search).with do |options|
161
- options[:with][:person_id].should == @person.id
162
- Friendship
163
- end
164
-
165
- @person.friendships.reverse
166
- end
167
-
168
- it "should pass method_missing onto CollectionProxy" do
169
- Friendship.stub!(:missing_method => true)
170
- @person.friendships.missing_method.should == true
171
- end
172
- end
173
- end
@@ -1,177 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ThinkingSphinx::ActiveRecord::Scopes do
4
- after :each do
5
- Alpha.remove_sphinx_scopes
6
- end
7
-
8
- it "should be included into models with indexes" do
9
- Alpha.included_modules.should include(ThinkingSphinx::ActiveRecord::Scopes)
10
- end
11
-
12
- it "should not be included into models without indexes" do
13
- Gamma.included_modules.should_not include(
14
- ThinkingSphinx::ActiveRecord::Scopes
15
- )
16
- end
17
-
18
- describe '.sphinx_scope' do
19
- before :each do
20
- Alpha.sphinx_scope(:by_name) { |name| {:conditions => {:name => name}} }
21
- end
22
-
23
- it "should define a method on the model" do
24
- Alpha.should respond_to(:by_name)
25
- end
26
- end
27
-
28
- describe '.sphinx_scopes' do
29
- before :each do
30
- Alpha.sphinx_scope(:by_name) { |name| {:conditions => {:name => name}} }
31
- end
32
-
33
- it "should return an array of defined scope names as symbols" do
34
- Alpha.sphinx_scopes.should == [:by_name]
35
- end
36
- end
37
-
38
- describe '.default_sphinx_scope' do
39
- before :each do
40
- Alpha.sphinx_scope(:scope_used_as_default_scope) { {:conditions => {:name => 'name'}} }
41
- Alpha.default_sphinx_scope :scope_used_as_default_scope
42
- end
43
-
44
- it "should return an array of defined scope names as symbols" do
45
- Alpha.sphinx_scopes.should == [:scope_used_as_default_scope]
46
- end
47
-
48
- it "should have a default_sphinx_scope" do
49
- Alpha.has_default_sphinx_scope?.should be_true
50
- end
51
- end
52
-
53
- describe '.remove_sphinx_scopes' do
54
- before :each do
55
- Alpha.sphinx_scope(:by_name) { |name| {:conditions => {:name => name}} }
56
- Alpha.remove_sphinx_scopes
57
- end
58
-
59
- it "should remove sphinx scope methods" do
60
- Alpha.should_not respond_to(:by_name)
61
- end
62
-
63
- it "should empty the list of sphinx scopes" do
64
- Alpha.sphinx_scopes.should be_empty
65
- end
66
- end
67
-
68
- describe '.example_default_scope' do
69
- before :each do
70
- Alpha.sphinx_scope(:foo_scope){ {:conditions => {:name => 'foo'}} }
71
- Alpha.default_sphinx_scope :foo_scope
72
- Alpha.sphinx_scope(:by_name) { |name| {:conditions => {:name => name}} }
73
- Alpha.sphinx_scope(:by_foo) { |foo| {:conditions => {:foo => foo}} }
74
- end
75
-
76
- it "should return a ThinkingSphinx::Search object" do
77
- Alpha.search.should be_a(ThinkingSphinx::Search)
78
- end
79
-
80
- it "should apply the default scope options to the underlying search object" do
81
- search = ThinkingSphinx::Search.new(:classes => [Alpha])
82
- search.search.options[:conditions].should == {:name => 'foo'}
83
- end
84
-
85
- it "should apply the default scope options and scope options to the underlying search object" do
86
- search = ThinkingSphinx::Search.new(:classes => [Alpha])
87
- search.by_foo('foo').search.options[:conditions].should == {:foo => 'foo', :name => 'foo'}
88
- end
89
-
90
- it "should apply the default scope options before other scope options to the underlying search object" do
91
- search = ThinkingSphinx::Search.new(:classes => [Alpha])
92
- search.by_name('bar').search.options[:conditions].should == {:name => 'bar'}
93
- end
94
- end
95
-
96
- describe '.example_scope' do
97
- before :each do
98
- Alpha.sphinx_scope(:by_name) { |name| {:conditions => {:name => name}} }
99
- Alpha.sphinx_scope(:by_foo) { |foo| {:conditions => {:foo => foo}} }
100
- Alpha.sphinx_scope(:with_betas) { {:classes => [Beta]} }
101
- end
102
-
103
- it "should return a ThinkingSphinx::Search object" do
104
- Alpha.by_name('foo').should be_a(ThinkingSphinx::Search)
105
- end
106
-
107
- it "should set the classes option" do
108
- Alpha.by_name('foo').options[:classes].should == [Alpha]
109
- end
110
-
111
- it "should be able to be called on a ThinkingSphinx::Search object" do
112
- search = ThinkingSphinx::Search.new(:classes => [Alpha])
113
- lambda {
114
- search.by_name('foo')
115
- }.should_not raise_error
116
- end
117
-
118
- it "should return the search object it gets called upon" do
119
- search = ThinkingSphinx::Search.new(:classes => [Alpha])
120
- search.by_name('foo').object_id.should == search.object_id
121
- end
122
-
123
- it "should apply the scope options to the underlying search object" do
124
- search = ThinkingSphinx::Search.new(:classes => [Alpha])
125
- search.by_name('foo').options[:conditions].should == {:name => 'foo'}
126
- end
127
-
128
- it "should combine hash option scopes such as :conditions" do
129
- search = ThinkingSphinx::Search.new(:classes => [Alpha])
130
- search.by_name('foo').by_foo('bar').options[:conditions].
131
- should == {:name => 'foo', :foo => 'bar'}
132
- end
133
-
134
- it "should combine array option scopes such as :classes" do
135
- search = ThinkingSphinx::Search.new(:classes => [Alpha])
136
- search.with_betas.options[:classes].should == [Alpha, Beta]
137
- end
138
- end
139
-
140
- describe '.search_count_with_scope' do
141
- before :each do
142
- @config = ThinkingSphinx::Configuration.instance
143
- @client = Riddle::Client.new
144
-
145
- ThinkingSphinx::Connection.stub(:take).and_yield(@client)
146
-
147
- @client.stub!(:query => {:matches => [], :total_found => 43})
148
- Alpha.sphinx_scope(:by_name) { |name| {:conditions => {:name => name}} }
149
- Alpha.sphinx_scope(:ids_only) { {:ids_only => true} }
150
- end
151
-
152
- it "should return the total number of results" do
153
- Alpha.by_name('foo').search_count.should == 43
154
- end
155
-
156
- it "should not make any calls to the database" do
157
- Alpha.should_not_receive(:find)
158
-
159
- Alpha.by_name('foo').search_count
160
- end
161
-
162
- it "should not leave the :ids_only option set and the results populated if it was not set before" do
163
- stored_scope = Alpha.by_name('foo')
164
- stored_scope.search_count
165
- stored_scope.options[:ids_only].should be_false
166
- stored_scope.populated?.should be_false
167
- end
168
-
169
- it "should leave the :ids_only option set and the results populated if it was set before" do
170
- stored_scope = Alpha.by_name('foo').ids_only
171
- stored_scope.search_count
172
- stored_scope.options[:ids_only].should be_true
173
- stored_scope.populated?.should be_true
174
- end
175
- end
176
-
177
- end
@@ -1,573 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ThinkingSphinx::ActiveRecord do
4
- before :each do
5
- @existing_alpha_indexes = Alpha.sphinx_indexes.clone
6
- @existing_beta_indexes = Beta.sphinx_indexes.clone
7
-
8
- Alpha.send :defined_indexes=, false
9
- Beta.send :defined_indexes=, false
10
-
11
- Alpha.sphinx_indexes.clear
12
- Beta.sphinx_indexes.clear
13
- end
14
-
15
- after :each do
16
- Alpha.sphinx_indexes.replace @existing_alpha_indexes
17
- Beta.sphinx_indexes.replace @existing_beta_indexes
18
-
19
- Alpha.send :defined_indexes=, true
20
- Beta.send :defined_indexes=, true
21
-
22
- Alpha.sphinx_index_blocks.clear
23
- Beta.sphinx_index_blocks.clear
24
- end
25
-
26
- describe '.define_index' do
27
- it "should do nothing if indexes are disabled" do
28
- ThinkingSphinx.define_indexes = false
29
- ThinkingSphinx::Index.should_not_receive(:new)
30
-
31
- Alpha.define_index { }
32
- Alpha.define_indexes
33
-
34
- ThinkingSphinx.define_indexes = true
35
- end
36
-
37
- it "should not evaluate the index block automatically" do
38
- lambda {
39
- Alpha.define_index { raise StandardError }
40
- }.should_not raise_error
41
- end
42
-
43
- it "should add the model to the context collection" do
44
- Alpha.define_index { indexes :name }
45
-
46
- ThinkingSphinx.context.indexed_models.should include("Alpha")
47
- end
48
-
49
- it "should die quietly if there is a database error" do
50
- ThinkingSphinx::Index::Builder.stub(:generate).
51
- and_raise(Mysql2::Error.new(''))
52
- Alpha.define_index { indexes :name }
53
-
54
- lambda {
55
- Alpha.define_indexes
56
- }.should_not raise_error
57
- end unless RUBY_PLATFORM == 'java'
58
-
59
- it "should die noisily if there is a non-database error" do
60
- ThinkingSphinx::Index::Builder.stub(:generate) { raise StandardError }
61
- Alpha.define_index { indexes :name }
62
-
63
- lambda {
64
- Alpha.define_indexes
65
- }.should raise_error
66
- end
67
-
68
- it "should set the index's name using the parameter if provided" do
69
- Alpha.define_index('custom') { indexes :name }
70
- Alpha.define_indexes
71
-
72
- Alpha.sphinx_indexes.first.name.should == 'custom'
73
- end
74
-
75
- context 'callbacks' do
76
- it "should add a before_validation callback to define_indexes" do
77
- Alpha.should_receive(:before_validation).with(:define_indexes)
78
-
79
- Alpha.define_index { }
80
- end
81
-
82
- it "should not add a before_validation callback twice" do
83
- Alpha.should_receive(:before_validation).with(:define_indexes).once
84
-
85
- Alpha.define_index { }
86
- Alpha.define_index { }
87
- end
88
-
89
- it "should add a before_destroy callback to define_indexes" do
90
- Alpha.should_receive(:before_destroy).with(:define_indexes)
91
-
92
- Alpha.define_index { }
93
- end
94
-
95
- it "should not add a before_destroy callback twice" do
96
- Alpha.should_receive(:before_destroy).with(:define_indexes).once
97
-
98
- Alpha.define_index { }
99
- Alpha.define_index { }
100
- end
101
-
102
- it "should add a toggle_deleted callback when defined" do
103
- Alpha.should_receive(:after_destroy).with(:toggle_deleted)
104
-
105
- Alpha.define_index { indexes :name }
106
- Alpha.define_indexes
107
- end
108
-
109
- it "should not add toggle_deleted callback more than once" do
110
- Alpha.should_receive(:after_destroy).with(:toggle_deleted).once
111
-
112
- Alpha.define_index { indexes :name }
113
- Alpha.define_index { indexes :name }
114
- Alpha.define_indexes
115
- end
116
-
117
- it "should add a update_attribute_values callback when defined" do
118
- Alpha.should_receive(:after_save).with(:update_attribute_values)
119
-
120
- Alpha.define_index { indexes :name }
121
- Alpha.define_indexes
122
- end
123
-
124
- it "should not add update_attribute_values callback more than once" do
125
- Alpha.should_receive(:after_save).with(:update_attribute_values).once
126
-
127
- Alpha.define_index { indexes :name }
128
- Alpha.define_index { indexes :name }
129
- Alpha.define_indexes
130
- end
131
-
132
- it "should add a toggle_delta callback if deltas are enabled" do
133
- Beta.should_receive(:before_save).with(:toggle_delta)
134
-
135
- Beta.define_index {
136
- indexes :name
137
- set_property :delta => true
138
- }
139
- Beta.define_indexes
140
- end
141
-
142
- it "should not add a toggle_delta callback if deltas are disabled" do
143
- Alpha.should_not_receive(:before_save).with(:toggle_delta)
144
-
145
- Alpha.define_index { indexes :name }
146
- Alpha.define_indexes
147
- end
148
-
149
- it "should add the toggle_delta callback if deltas are disabled in other indexes" do
150
- Beta.should_receive(:before_save).with(:toggle_delta).once
151
-
152
- Beta.define_index { indexes :name }
153
- Beta.define_index('foo') {
154
- indexes :name
155
- set_property :delta => true
156
- }
157
- Beta.define_indexes
158
- end
159
-
160
- it "should only add the toggle_delta callback once" do
161
- Beta.should_receive(:before_save).with(:toggle_delta).once
162
-
163
- Beta.define_index {
164
- indexes :name
165
- set_property :delta => true
166
- }
167
- Beta.define_index {
168
- indexes :name
169
- set_property :delta => true
170
- }
171
- Beta.define_indexes
172
- end
173
-
174
- it "should add an index_delta callback if deltas are enabled" do
175
- Beta.stub!(:after_save => true)
176
- Beta.should_receive(:after_commit).with(:index_delta)
177
-
178
- Beta.define_index {
179
- indexes :name
180
- set_property :delta => true
181
- }
182
- Beta.define_indexes
183
- end
184
-
185
- it "should not add an index_delta callback if deltas are disabled" do
186
- Alpha.should_not_receive(:after_commit).with(:index_delta)
187
-
188
- Alpha.define_index { indexes :name }
189
- Alpha.define_indexes
190
- end
191
-
192
- it "should add the index_delta callback if deltas are disabled in other indexes" do
193
- Beta.stub!(:after_commit => true)
194
- Beta.should_receive(:after_commit).with(:index_delta).once
195
-
196
- Beta.define_index { indexes :name }
197
- Beta.define_index('foo') {
198
- indexes :name
199
- set_property :delta => true
200
- }
201
- Beta.define_indexes
202
- end
203
-
204
- it "should only add the index_delta callback once" do
205
- Beta.stub!(:after_commit => true)
206
- Beta.should_receive(:after_commit).with(:index_delta).once
207
-
208
- Beta.define_index {
209
- indexes :name
210
- set_property :delta => true
211
- }
212
- Beta.define_index {
213
- indexes :name
214
- set_property :delta => true
215
- }
216
- Beta.define_indexes
217
- end
218
- end
219
- end
220
-
221
- describe '.define_indexes' do
222
- it "should process define_index blocks" do
223
- Beta.define_index { indexes :name }
224
- Beta.sphinx_indexes.length.should == 0
225
-
226
- Beta.define_indexes
227
- Beta.sphinx_indexes.length.should == 1
228
- end
229
-
230
- it "should not re-add indexes" do
231
- Beta.define_index { indexes :name }
232
- Beta.define_indexes
233
- Beta.define_indexes
234
-
235
- Beta.sphinx_indexes.length.should == 1
236
- end
237
- end
238
-
239
- describe '.source_of_sphinx_index' do
240
- it "should return self if model defines an index" do
241
- Person.source_of_sphinx_index.should == Person
242
- end
243
-
244
- it "should return the parent if model inherits an index" do
245
- Admin::Person.source_of_sphinx_index.should == Person
246
- end
247
- end
248
-
249
- describe '.to_crc32' do
250
- it "should return an integer" do
251
- Person.to_crc32.should be_a_kind_of(Integer)
252
- end
253
- end
254
-
255
- describe '.to_crc32s' do
256
- it "should return an array" do
257
- Person.to_crc32s.should be_a_kind_of(Array)
258
- end
259
- end
260
-
261
- describe "toggle_deleted method" do
262
- before :each do
263
- ThinkingSphinx.stub!(:sphinx_running? => true)
264
-
265
- @configuration = ThinkingSphinx::Configuration.instance
266
- @configuration.stub!(
267
- :address => "an address",
268
- :port => 123
269
- )
270
- @client = Riddle::Client.new
271
- @client.stub!(:update => true)
272
- @person = Person.find(:first)
273
-
274
- ThinkingSphinx::Connection.stub(:take).and_yield(@client)
275
- Person.sphinx_indexes.each { |index| index.stub!(:delta? => false) }
276
- end
277
-
278
- it "should update the core index's deleted flag if in core index" do
279
- @client.should_receive(:update).with(
280
- "person_core", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
281
- )
282
-
283
- @person.toggle_deleted
284
- end
285
-
286
- it "shouldn't attempt to update the deleted flag if sphinx isn't running" do
287
- ThinkingSphinx.stub!(:sphinx_running? => false)
288
- @client.should_not_receive(:update)
289
-
290
- @person.toggle_deleted
291
- end
292
-
293
- it "should update the delta index's deleted flag if delta indexes are enabled and the instance's delta is true" do
294
- ThinkingSphinx.deltas_enabled = true
295
- Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
296
- @person.delta = true
297
- @client.should_receive(:update).with(
298
- "person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
299
- )
300
-
301
- @person.toggle_deleted
302
- end
303
-
304
- it "should not update the delta index's deleted flag if delta indexes are enabled and the instance's delta is false" do
305
- ThinkingSphinx.deltas_enabled = true
306
- Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
307
- @person.delta = false
308
- @client.should_not_receive(:update).with(
309
- "person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
310
- )
311
-
312
- @person.toggle_deleted
313
- end
314
-
315
- 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
316
- ThinkingSphinx.deltas_enabled = true
317
- Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
318
- @person.delta = 0
319
- @client.should_not_receive(:update).with(
320
- "person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
321
- )
322
-
323
- @person.toggle_deleted
324
- end
325
-
326
- it "shouldn't update the delta index if delta indexes are disabled" do
327
- ThinkingSphinx.deltas_enabled = true
328
- @client.should_not_receive(:update).with(
329
- "person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
330
- )
331
-
332
- @person.toggle_deleted
333
- end
334
-
335
- it "should not update either index if updates are disabled" do
336
- ThinkingSphinx.updates_enabled = false
337
- ThinkingSphinx.deltas_enabled = true
338
- Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
339
- @person.delta = true
340
- @client.should_not_receive(:update)
341
-
342
- @person.toggle_deleted
343
- end
344
- end
345
-
346
- describe "sphinx_indexes in the inheritance chain (STI)" do
347
- it "should hand defined indexes on a class down to its child classes" do
348
- Child.sphinx_indexes.should include(*Person.sphinx_indexes)
349
- end
350
-
351
- it "should allow associations to other STI models" do
352
- source = Child.sphinx_indexes.last.sources.first
353
- sql = source.to_riddle_for_core(0, 0).sql_query
354
- sql.gsub!('$start', '0').gsub!('$end', '100')
355
- lambda {
356
- Child.connection.execute(sql)
357
- }.should_not raise_error(ActiveRecord::StatementInvalid)
358
- end
359
- end
360
-
361
- describe '#sphinx_document_id' do
362
- before :each do
363
- Alpha.define_index { indexes :name }
364
- Beta.define_index { indexes :name }
365
- end
366
-
367
- it "should return values with the expected offset" do
368
- person = Person.find(:first)
369
- model_count = ThinkingSphinx.context.indexed_models.length
370
- Person.stub!(:sphinx_offset => 3)
371
-
372
- (person.id * model_count + 3).should == person.sphinx_document_id
373
- end
374
- end
375
-
376
- describe '#primary_key_for_sphinx' do
377
- before :each do
378
- @person = Person.find(:first)
379
- end
380
-
381
- after :each do
382
- Person.clear_primary_key_for_sphinx
383
- end
384
-
385
- after :each do
386
- Person.set_sphinx_primary_key nil
387
- end
388
-
389
- it "should return the id by default" do
390
- @person.primary_key_for_sphinx.should == @person.id
391
- end
392
-
393
- it "should use the sphinx primary key to determine the value" do
394
- Person.set_sphinx_primary_key :first_name
395
- @person.primary_key_for_sphinx.should == @person.first_name
396
- end
397
-
398
- it "should not use accessor methods but the attributes hash" do
399
- id = @person.id
400
- @person.stub!(:id => 'unique_hash')
401
- @person.primary_key_for_sphinx.should == id
402
- end
403
-
404
- it "should be inherited by subclasses" do
405
- Person.set_sphinx_primary_key :first_name
406
- Parent.superclass.custom_primary_key_for_sphinx?
407
- Parent.primary_key_for_sphinx.should == Person.primary_key_for_sphinx
408
- end
409
- end
410
-
411
- describe '#types_for_sphinx' do
412
- after :each do
413
- Person.set_sphinx_types nil
414
- end
415
-
416
- it "should return nil by default" do
417
- Person.sphinx_types.should == nil
418
- end
419
-
420
- it "should return the specified value" do
421
- Person.set_sphinx_types %w(Person Parent)
422
- Person.sphinx_types.should == %w(Person Parent)
423
- end
424
- end
425
-
426
- describe '.sphinx_index_names' do
427
- it "should return the core index" do
428
- Alpha.define_index { indexes :name }
429
- Alpha.define_indexes
430
- Alpha.sphinx_index_names.should == ['alpha_core']
431
- end
432
-
433
- it "should return the delta index if enabled" do
434
- Beta.define_index {
435
- indexes :name
436
- set_property :delta => true
437
- }
438
- Beta.define_indexes
439
-
440
- Beta.sphinx_index_names.should == ['beta_core', 'beta_delta']
441
- end
442
-
443
- it "should return the superclass with an index definition" do
444
- Parent.sphinx_index_names.should == ['person_core', 'person_delta']
445
- end
446
- end
447
-
448
- describe '.indexed_by_sphinx?' do
449
- it "should return true if there is at least one index on the model" do
450
- Alpha.define_index { indexes :name }
451
- Alpha.define_indexes
452
-
453
- Alpha.should be_indexed_by_sphinx
454
- end
455
-
456
- it "should return false if there are no indexes on the model" do
457
- Gamma.should_not be_indexed_by_sphinx
458
- end
459
- end
460
-
461
- describe '.delta_indexed_by_sphinx?' do
462
- it "should return true if there is at least one delta index on the model" do
463
- Beta.define_index {
464
- indexes :name
465
- set_property :delta => true
466
- }
467
- Beta.define_indexes
468
-
469
- Beta.should be_delta_indexed_by_sphinx
470
- end
471
-
472
- it "should return false if there are no delta indexes on the model" do
473
- Alpha.define_index { indexes :name }
474
- Alpha.define_indexes
475
-
476
- Alpha.should_not be_delta_indexed_by_sphinx
477
- end
478
- end
479
-
480
- describe '.delete_in_index' do
481
- before :each do
482
- @client = stub('client')
483
- ThinkingSphinx.stub!(:sphinx_running? => true)
484
- ThinkingSphinx::Connection.stub(:take).and_yield(@client)
485
- end
486
-
487
- it "should direct the update to the supplied index" do
488
- @client.should_receive(:update) do |index, attributes, values|
489
- index.should == 'custom_index_core'
490
- end
491
-
492
- Alpha.delete_in_index('custom_index_core', 42)
493
- end
494
-
495
- it "should set the sphinx_deleted flag to true" do
496
- @client.should_receive(:update) do |index, attributes, values|
497
- attributes.should == ['sphinx_deleted']
498
- values.should == {42 => [1]}
499
- end
500
-
501
- Alpha.delete_in_index('alpha_core', 42)
502
- end
503
- end
504
-
505
- describe '.core_index_names' do
506
- it "should return each index's core name" do
507
- Alpha.define_index('foo') { indexes :name }
508
- Alpha.define_index('bar') { indexes :name }
509
- Alpha.define_indexes
510
-
511
- Alpha.core_index_names.should == ['foo_core', 'bar_core']
512
- end
513
- end
514
-
515
- describe '.delta_index_names' do
516
- it "should return index delta names, for indexes with deltas enabled" do
517
- Alpha.define_index('foo') { indexes :name }
518
- Alpha.define_index('bar') { indexes :name }
519
- Alpha.define_indexes
520
- Alpha.sphinx_indexes.first.delta_object = stub('delta')
521
-
522
- Alpha.delta_index_names.should == ['foo_delta']
523
- end
524
- end
525
-
526
- describe '.sphinx_offset' do
527
- before :each do
528
- @context = ThinkingSphinx.context
529
- end
530
-
531
- it "should return the index of the model's name in all known indexed models" do
532
- @context.stub!(:indexed_models => ['Alpha', 'Beta'])
533
-
534
- Alpha.sphinx_offset.should == 0
535
- Beta.sphinx_offset.should == 1
536
- end
537
-
538
- it "should ignore classes that have indexed superclasses" do
539
- @context.stub!(:indexed_models => ['Alpha', 'Parent', 'Person'])
540
-
541
- Person.sphinx_offset.should == 1
542
- end
543
-
544
- it "should respect first known indexed parents" do
545
- @context.stub!(:indexed_models => ['Alpha', 'Parent', 'Person'])
546
-
547
- Parent.sphinx_offset.should == 1
548
- end
549
- end
550
-
551
- describe '.has_sphinx_indexes?' do
552
- it "should return true if there are sphinx indexes defined" do
553
- Alpha.sphinx_indexes.replace [stub('index')]
554
- Alpha.sphinx_index_blocks.replace []
555
-
556
- Alpha.should have_sphinx_indexes
557
- end
558
-
559
- it "should return true if there are sphinx index blocks defined" do
560
- Alpha.sphinx_indexes.replace []
561
- Alpha.sphinx_index_blocks.replace [stub('lambda')]
562
-
563
- Alpha.should have_sphinx_indexes
564
- end
565
-
566
- it "should return false if there are no sphinx indexes or blocks" do
567
- Alpha.sphinx_indexes.clear
568
- Alpha.sphinx_index_blocks.clear
569
-
570
- Alpha.should_not have_sphinx_indexes
571
- end
572
- end
573
- end