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
@@ -0,0 +1,147 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::Callbacks::DeltaCallbacks do
4
+ let(:callbacks) {
5
+ ThinkingSphinx::ActiveRecord::Callbacks::DeltaCallbacks.new instance
6
+ }
7
+ let(:instance) { double('instance', :delta? => true) }
8
+ let(:config) { double('config') }
9
+ let(:processor) {
10
+ double('processor', :toggled? => true, :index => true, :delete => true)
11
+ }
12
+
13
+ before :each do
14
+ ThinkingSphinx::Configuration.stub :instance => config
15
+ end
16
+
17
+ [:after_commit, :before_save].each do |callback|
18
+ describe ".#{callback}" do
19
+ let(:callbacks) { double('callbacks', callback => nil) }
20
+
21
+ before :each do
22
+ ThinkingSphinx::ActiveRecord::Callbacks::DeltaCallbacks.
23
+ stub :new => callbacks
24
+ end
25
+
26
+ it "builds an object from the instance" do
27
+ ThinkingSphinx::ActiveRecord::Callbacks::DeltaCallbacks.
28
+ should_receive(:new).with(instance).and_return(callbacks)
29
+
30
+ ThinkingSphinx::ActiveRecord::Callbacks::DeltaCallbacks.
31
+ send(callback, instance)
32
+ end
33
+
34
+ it "invokes #{callback} on the object" do
35
+ callbacks.should_receive(callback)
36
+
37
+ ThinkingSphinx::ActiveRecord::Callbacks::DeltaCallbacks.
38
+ send(callback, instance)
39
+ end
40
+ end
41
+ end
42
+
43
+ describe '#after_commit' do
44
+ let(:index) {
45
+ double('index', :delta? => false, :delta_processor => processor)
46
+ }
47
+
48
+ before :each do
49
+ config.stub :indices_for_references => [index]
50
+ end
51
+
52
+ context 'without delta indices' do
53
+ it "does not fire a delta index when no delta indices" do
54
+ processor.should_not_receive(:index)
55
+
56
+ callbacks.after_commit
57
+ end
58
+
59
+ it "does not delete the instance from any index" do
60
+ processor.should_not_receive(:delete)
61
+
62
+ callbacks.after_commit
63
+ end
64
+ end
65
+
66
+ context 'with delta indices' do
67
+ let(:core_index) { double('index', :delta? => false, :name => 'foo_core',
68
+ :delta_processor => processor) }
69
+ let(:delta_index) { double('index', :delta? => true, :name => 'foo_delta',
70
+ :delta_processor => processor) }
71
+
72
+ before :each do
73
+ ThinkingSphinx::Deltas.stub :suspended? => false
74
+
75
+ config.stub :indices_for_references => [core_index, delta_index]
76
+ end
77
+
78
+ it "only indexes delta indices" do
79
+ processor.should_receive(:index).with(delta_index)
80
+
81
+ callbacks.after_commit
82
+ end
83
+
84
+ it "does not process delta indices when deltas are suspended" do
85
+ ThinkingSphinx::Deltas.stub :suspended? => true
86
+
87
+ processor.should_not_receive(:index)
88
+
89
+ callbacks.after_commit
90
+ end
91
+
92
+ it "deletes the instance from the core index" do
93
+ processor.should_receive(:delete).with(core_index, instance)
94
+
95
+ callbacks.after_commit
96
+ end
97
+
98
+ it "does not index if model's delta flag is not true" do
99
+ processor.stub :toggled? => false
100
+
101
+ processor.should_not_receive(:index)
102
+
103
+ callbacks.after_commit
104
+ end
105
+
106
+ it "does not delete if model's delta flag is not true" do
107
+ processor.stub :toggled? => false
108
+
109
+ processor.should_not_receive(:delete)
110
+
111
+ callbacks.after_commit
112
+ end
113
+
114
+ it "does not delete when deltas are suspended" do
115
+ ThinkingSphinx::Deltas.stub :suspended? => true
116
+
117
+ processor.should_not_receive(:delete)
118
+
119
+ callbacks.after_commit
120
+ end
121
+ end
122
+ end
123
+
124
+ describe '#before_save' do
125
+ let(:index) {
126
+ double('index', :delta? => true, :delta_processor => processor)
127
+ }
128
+
129
+ before :each do
130
+ config.stub :indices_for_references => [index]
131
+ end
132
+
133
+ it "sets delta to true if there are delta indices" do
134
+ processor.should_receive(:toggle).with(instance)
135
+
136
+ callbacks.before_save
137
+ end
138
+
139
+ it "does not try to set delta to true if there are no delta indices" do
140
+ index.stub :delta? => false
141
+
142
+ processor.should_not_receive(:toggle)
143
+
144
+ callbacks.before_save
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,69 @@
1
+ module ThinkingSphinx
2
+ module ActiveRecord
3
+ module Callbacks; end
4
+ end
5
+ end
6
+
7
+ require 'active_support/core_ext/string/inflections'
8
+ require 'mysql2/error'
9
+ require 'thinking_sphinx/callbacks'
10
+ require 'thinking_sphinx/active_record/callbacks/update_callbacks'
11
+
12
+ describe ThinkingSphinx::ActiveRecord::Callbacks::UpdateCallbacks do
13
+ describe '#after_update' do
14
+ let(:callbacks) {
15
+ ThinkingSphinx::ActiveRecord::Callbacks::UpdateCallbacks.new instance }
16
+ let(:instance) { double('instance', :class => klass, :id => 2) }
17
+ let(:klass) { double(:name => 'Article') }
18
+ let(:configuration) { double('configuration', :connection => connection,
19
+ :settings => {'attribute_updates' => true},
20
+ :indices_for_references => [index]) }
21
+ let(:connection) { double('connection', :query => '') }
22
+ let(:index) { double('index', :name => 'article_core',
23
+ :sources => [source], :document_id_for_key => 3) }
24
+ let(:source) { double('source', :attributes => []) }
25
+
26
+ before :each do
27
+ stub_const 'ThinkingSphinx::Configuration',
28
+ double(:instance => configuration)
29
+ stub_const 'Riddle::Query', double(:update => 'SphinxQL')
30
+
31
+ source.attributes.replace([
32
+ double(:name => 'foo', :updateable? => true,
33
+ :columns => [double(:__name => 'foo_column')]),
34
+ double(:name => 'bar', :updateable? => true, :value_for => 7,
35
+ :columns => [double(:__name => 'bar_column')]),
36
+ double(:name => 'baz', :updateable? => false)
37
+ ])
38
+
39
+ instance.stub :changed => ['bar_column', 'baz'], :bar_column => 7
40
+ end
41
+
42
+ it "does not send any updates to Sphinx if updates are disabled" do
43
+ configuration.settings['attribute_updates'] = false
44
+
45
+ connection.should_not_receive(:query)
46
+
47
+ callbacks.after_update
48
+ end
49
+
50
+ it "builds an update query with only updateable attributes that have changed" do
51
+ Riddle::Query.should_receive(:update).
52
+ with('article_core', 3, 'bar' => 7).and_return('SphinxQL')
53
+
54
+ callbacks.after_update
55
+ end
56
+
57
+ it "sends the update query through to Sphinx" do
58
+ connection.should_receive(:query).with('SphinxQL')
59
+
60
+ callbacks.after_update
61
+ end
62
+
63
+ it "doesn't care if the update fails at Sphinx's end" do
64
+ connection.stub(:query).and_raise(Mysql2::Error.new(''))
65
+
66
+ lambda { callbacks.after_update }.should_not raise_error
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::Column do
4
+ describe '#__name' do
5
+ it "returns the top item" do
6
+ column = ThinkingSphinx::ActiveRecord::Column.new(:content)
7
+ column.__name.should == :content
8
+ end
9
+ end
10
+
11
+ describe '#__stack' do
12
+ it "returns all but the top item" do
13
+ column = ThinkingSphinx::ActiveRecord::Column.new(:users, :posts, :id)
14
+ column.__stack.should == [:users, :posts]
15
+ end
16
+ end
17
+
18
+ describe '#method_missing' do
19
+ let(:column) { ThinkingSphinx::ActiveRecord::Column.new(:user) }
20
+
21
+ it "shifts the current name to the stack" do
22
+ column.email
23
+ column.__stack.should == [:user]
24
+ end
25
+
26
+ it "adds the new method call as the name" do
27
+ column.email
28
+ column.__name.should == :email
29
+ end
30
+
31
+ it "returns itself" do
32
+ column.email.should == column
33
+ end
34
+ end
35
+
36
+ describe '#string?' do
37
+ it "is true when the name is a string" do
38
+ column = ThinkingSphinx::ActiveRecord::Column.new('content')
39
+ column.should be_a_string
40
+ end
41
+
42
+ it "is false when the name is a symbol" do
43
+ column = ThinkingSphinx::ActiveRecord::Column.new(:content)
44
+ column.should_not be_a_string
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::DatabaseAdapters::AbstractAdapter do
4
+ let(:adapter) {
5
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters::AbstractAdapter.new model
6
+ }
7
+ let(:model) { double('model', :connection => connection) }
8
+ let(:connection) { double('connection') }
9
+
10
+ describe '#quote' do
11
+ it "uses the model's connection to quote columns" do
12
+ connection.should_receive(:quote_column_name).with('foo')
13
+
14
+ adapter.quote 'foo'
15
+ end
16
+
17
+ it "returns the quoted value" do
18
+ connection.stub :quote_column_name => '"foo"'
19
+
20
+ adapter.quote('foo').should == '"foo"'
21
+ end
22
+ end
23
+
24
+ describe '#quoted_table_name' do
25
+ it "passes the method through to the model" do
26
+ model.should_receive(:quoted_table_name).and_return('"articles"')
27
+
28
+ adapter.quoted_table_name.should == '"articles"'
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::DatabaseAdapters::MySQLAdapter do
4
+ let(:adapter) {
5
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters::MySQLAdapter.new(model)
6
+ }
7
+ let(:model) { double('model') }
8
+
9
+ it "returns 1 for true" do
10
+ adapter.boolean_value(true).should == 1
11
+ end
12
+
13
+ it "returns 0 for false" do
14
+ adapter.boolean_value(false).should == 0
15
+ end
16
+
17
+ describe '#cast_to_timestamp' do
18
+ it "converts to unix timestamps" do
19
+ adapter.cast_to_timestamp('created_at').
20
+ should == 'UNIX_TIMESTAMP(created_at)'
21
+ end
22
+ end
23
+
24
+ describe '#concatenate' do
25
+ it "concatenates with the given separator" do
26
+ adapter.concatenate('foo, bar, baz', ',').
27
+ should == "CONCAT_WS(',', foo, bar, baz)"
28
+ end
29
+ end
30
+
31
+ describe '#convert_nulls' do
32
+ it "translates arguments to an IFNULL SQL call" do
33
+ adapter.convert_nulls('id', 5).should == 'IFNULL(id, 5)'
34
+ end
35
+ end
36
+
37
+ describe '#group_concatenate' do
38
+ it "group concatenates the clause with the given separator" do
39
+ adapter.group_concatenate('foo', ',').
40
+ should == "GROUP_CONCAT(foo SEPARATOR ',')"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::DatabaseAdapters::PostgreSQLAdapter do
4
+ let(:adapter) {
5
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters::PostgreSQLAdapter.new(model)
6
+ }
7
+ let(:model) { double('model') }
8
+
9
+ describe '#boolean_value' do
10
+ it "returns 'TRUE' for true" do
11
+ adapter.boolean_value(true).should == 'TRUE'
12
+ end
13
+
14
+ it "returns 'FALSE' for false" do
15
+ adapter.boolean_value(false).should == 'FALSE'
16
+ end
17
+ end
18
+
19
+ describe '#cast_to_timestamp' do
20
+ it "converts to unix timestamps" do
21
+ adapter.cast_to_timestamp('created_at').
22
+ should == 'extract(epoch from created_at)::int'
23
+ end
24
+ end
25
+
26
+ describe '#concatenate' do
27
+ it "concatenates with the given separator" do
28
+ adapter.concatenate('foo, bar, baz', ',').
29
+ should == "COALESCE(foo, '') || ',' || COALESCE(bar, '') || ',' || COALESCE(baz, '')"
30
+ end
31
+ end
32
+
33
+ describe '#convert_nulls' do
34
+ it "translates arguments to a COALESCE SQL call" do
35
+ adapter.convert_nulls('id', 5).should == 'COALESCE(id, 5)'
36
+ end
37
+ end
38
+
39
+ describe '#group_concatenate' do
40
+ it "group concatenates the clause with the given separator" do
41
+ adapter.group_concatenate('foo', ',').
42
+ should == "array_to_string(array_agg(foo), ',')"
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::DatabaseAdapters do
4
+ let(:model) { double('model') }
5
+
6
+ describe '.adapter_for' do
7
+ it "returns a MysqlAdapter object for :mysql" do
8
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.
9
+ stub(:adapter_type_for => :mysql)
10
+
11
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.adapter_for(model).
12
+ should be_a(
13
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters::MySQLAdapter
14
+ )
15
+ end
16
+
17
+ it "returns a PostgreSQLAdapter object for :postgresql" do
18
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.
19
+ stub(:adapter_type_for => :postgresql)
20
+
21
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.adapter_for(model).
22
+ should be_a(
23
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters::PostgreSQLAdapter
24
+ )
25
+ end
26
+
27
+ it "instantiates using the default adapter if one is provided" do
28
+ adapter_class = double('adapter class')
29
+ adapter_instance = double('adapter instance')
30
+
31
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.default = adapter_class
32
+ adapter_class.stub!(:new => adapter_instance)
33
+
34
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.adapter_for(model).
35
+ should == adapter_instance
36
+
37
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.default = nil
38
+ end
39
+
40
+ it "raises an exception for other responses" do
41
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.
42
+ stub(:adapter_type_for => :sqlite)
43
+
44
+ lambda {
45
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.adapter_for(model)
46
+ }.should raise_error
47
+ end
48
+ end
49
+
50
+ describe '.adapter_type_for' do
51
+ let(:klass) { double('connection class') }
52
+ let(:connection) { double('connection', :class => klass) }
53
+ let(:model) { double('model', :connection => connection) }
54
+
55
+ it "translates a normal MySQL adapter" do
56
+ klass.stub(:name => 'ActiveRecord::ConnectionAdapters::MysqlAdapter')
57
+
58
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.
59
+ adapter_type_for(model).should == :mysql
60
+ end
61
+
62
+ it "translates a MySQL2 adapter" do
63
+ klass.stub(:name => 'ActiveRecord::ConnectionAdapters::Mysql2Adapter')
64
+
65
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.
66
+ adapter_type_for(model).should == :mysql
67
+ end
68
+
69
+ it "translates a normal PostgreSQL adapter" do
70
+ klass.stub(:name => 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter')
71
+
72
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.
73
+ adapter_type_for(model).should == :postgresql
74
+ end
75
+
76
+ it "translates a JDBC MySQL adapter to MySQL" do
77
+ klass.stub(:name => 'ActiveRecord::ConnectionAdapters::JdbcAdapter')
78
+ connection.stub(:config => {:adapter => 'jdbcmysql'})
79
+
80
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.
81
+ adapter_type_for(model).should == :mysql
82
+ end
83
+
84
+ it "translates a JDBC PostgreSQL adapter to PostgreSQL" do
85
+ klass.stub(:name => 'ActiveRecord::ConnectionAdapters::JdbcAdapter')
86
+ connection.stub(:config => {:adapter => 'jdbcpostgresql'})
87
+
88
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.
89
+ adapter_type_for(model).should == :postgresql
90
+ end
91
+
92
+ it "returns other JDBC adapters without translation" do
93
+ klass.stub(:name => 'ActiveRecord::ConnectionAdapters::JdbcAdapter')
94
+ connection.stub(:config => {:adapter => 'jdbcmssql'})
95
+
96
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.
97
+ adapter_type_for(model).should == 'jdbcmssql'
98
+ end
99
+
100
+ it "returns other unknown adapters without translation" do
101
+ klass.stub(:name => 'ActiveRecord::ConnectionAdapters::FooAdapter')
102
+
103
+ ThinkingSphinx::ActiveRecord::DatabaseAdapters.
104
+ adapter_type_for(model).
105
+ should == 'ActiveRecord::ConnectionAdapters::FooAdapter'
106
+ end
107
+ end
108
+ end