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,184 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::Associations do
4
+ JoinDependency = ::ActiveRecord::Associations::JoinDependency
5
+
6
+ let(:associations) { ThinkingSphinx::ActiveRecord::Associations.new model }
7
+ let(:model) { model_double 'articles' }
8
+ let(:base) {
9
+ double('base', :active_record => model, :join_base => join_base)
10
+ }
11
+ let(:join_base) { double('join base') }
12
+ let(:join) { join_double 'users' }
13
+ let(:sub_join) { join_double 'posts' }
14
+
15
+ def join_double(table_alias)
16
+ double 'join',
17
+ :join_type= => nil,
18
+ :aliased_table_name => table_alias,
19
+ :reflection => double('reflection')
20
+ end
21
+
22
+ def model_double(table_name = nil)
23
+ double 'model', :quoted_table_name => table_name, :reflections => {}
24
+ end
25
+
26
+ before :each do
27
+ JoinDependency.stub :new => base
28
+ JoinDependency::JoinAssociation.stub(:new).and_return(join, sub_join)
29
+ model.reflections[:user] = join.reflection
30
+
31
+ join.stub :active_record => model_double
32
+ join.active_record.reflections[:posts] = sub_join.reflection
33
+ end
34
+
35
+ describe '#add_join_to' do
36
+ it "adds just one join for a stack with a single association" do
37
+ JoinDependency::JoinAssociation.unstub :new
38
+ JoinDependency::JoinAssociation.should_receive(:new).
39
+ with(join.reflection, base, join_base).once.and_return(join)
40
+
41
+ associations.add_join_to([:user])
42
+ end
43
+
44
+ it "does not duplicate joins when given the same stack twice" do
45
+ JoinDependency::JoinAssociation.unstub :new
46
+ JoinDependency::JoinAssociation.should_receive(:new).once.and_return(join)
47
+
48
+ associations.add_join_to([:user])
49
+ associations.add_join_to([:user])
50
+ end
51
+
52
+ context 'multiple joins' do
53
+ it "adds two joins for a stack with two associations" do
54
+ JoinDependency::JoinAssociation.unstub :new
55
+ JoinDependency::JoinAssociation.should_receive(:new).
56
+ with(join.reflection, base, join_base).once.and_return(join)
57
+ JoinDependency::JoinAssociation.should_receive(:new).
58
+ with(sub_join.reflection, base, join).once.and_return(sub_join)
59
+
60
+ associations.add_join_to([:user, :posts])
61
+ end
62
+
63
+ it "extends upon existing joins when given stacks where parts are already mapped" do
64
+ JoinDependency::JoinAssociation.unstub :new
65
+ JoinDependency::JoinAssociation.should_receive(:new).twice.
66
+ and_return(join, sub_join)
67
+
68
+ associations.add_join_to([:user])
69
+ associations.add_join_to([:user, :posts])
70
+ end
71
+ end
72
+ end
73
+
74
+ describe '#aggregate_for?' do
75
+ it "is false when the stack is empty" do
76
+ associations.aggregate_for?([]).should be_false
77
+ end
78
+
79
+ it "is true when a reflection is a has_many" do
80
+ join.reflection.stub!(:macro => :has_many)
81
+
82
+ associations.aggregate_for?([:user]).should be_true
83
+ end
84
+
85
+ it "is true when a reflection is a has_and_belongs_to_many" do
86
+ join.reflection.stub!(:macro => :has_and_belongs_to_many)
87
+
88
+ associations.aggregate_for?([:user]).should be_true
89
+ end
90
+
91
+ it "is false when a reflection is a belongs_to" do
92
+ join.reflection.stub!(:macro => :belongs_to)
93
+
94
+ associations.aggregate_for?([:user]).should be_false
95
+ end
96
+
97
+ it "is false when a reflection is a has_one" do
98
+ join.reflection.stub!(:macro => :has_one)
99
+
100
+ associations.aggregate_for?([:user]).should be_false
101
+ end
102
+
103
+ it "is true when one level is aggregate" do
104
+ join.reflection.stub!(:macro => :belongs_to)
105
+ sub_join.reflection.stub!(:macro => :has_many)
106
+
107
+ associations.aggregate_for?([:user, :posts]).should be_true
108
+ end
109
+
110
+ it "is true when both levels are aggregates" do
111
+ join.reflection.stub!(:macro => :has_many)
112
+ sub_join.reflection.stub!(:macro => :has_many)
113
+
114
+ associations.aggregate_for?([:user, :posts]).should be_true
115
+ end
116
+
117
+ it "is false when both levels are not aggregates" do
118
+ join.reflection.stub!(:macro => :belongs_to)
119
+ sub_join.reflection.stub!(:macro => :belongs_to)
120
+
121
+ associations.aggregate_for?([:user, :posts]).should be_false
122
+ end
123
+ end
124
+
125
+ describe '#alias_for' do
126
+ it "returns the model's table name when no stack is given" do
127
+ associations.alias_for([]).should == 'articles'
128
+ end
129
+
130
+ it "adds just one join for a stack with a single association" do
131
+ JoinDependency::JoinAssociation.unstub :new
132
+ JoinDependency::JoinAssociation.should_receive(:new).
133
+ with(join.reflection, base, join_base).once.and_return(join)
134
+
135
+ associations.alias_for([:user])
136
+ end
137
+
138
+ it "returns the aliased table name for the join" do
139
+ associations.alias_for([:user]).should == 'users'
140
+ end
141
+
142
+ it "does not duplicate joins when given the same stack twice" do
143
+ JoinDependency::JoinAssociation.unstub :new
144
+ JoinDependency::JoinAssociation.should_receive(:new).once.and_return(join)
145
+
146
+ associations.alias_for([:user])
147
+ associations.alias_for([:user])
148
+ end
149
+
150
+ context 'multiple joins' do
151
+ it "adds two joins for a stack with two associations" do
152
+ JoinDependency::JoinAssociation.unstub :new
153
+ JoinDependency::JoinAssociation.should_receive(:new).
154
+ with(join.reflection, base, join_base).once.and_return(join)
155
+ JoinDependency::JoinAssociation.should_receive(:new).
156
+ with(sub_join.reflection, base, join).once.and_return(sub_join)
157
+
158
+ associations.alias_for([:user, :posts])
159
+ end
160
+
161
+ it "returns the sub join's aliased table name" do
162
+ associations.alias_for([:user, :posts]).should == 'posts'
163
+ end
164
+
165
+ it "extends upon existing joins when given stacks where parts are already mapped" do
166
+ JoinDependency::JoinAssociation.unstub :new
167
+ JoinDependency::JoinAssociation.should_receive(:new).twice.
168
+ and_return(join, sub_join)
169
+
170
+ associations.alias_for([:user])
171
+ associations.alias_for([:user, :posts])
172
+ end
173
+ end
174
+ end
175
+
176
+ describe '#join_values' do
177
+ it "returns all joins that have been created" do
178
+ associations.alias_for([:user])
179
+ associations.alias_for([:user, :posts])
180
+
181
+ associations.join_values.should == [join, sub_join]
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,147 @@
1
+ module ThinkingSphinx
2
+ module ActiveRecord
3
+ class Attribute; end
4
+ end
5
+ end
6
+
7
+ require 'thinking_sphinx/active_record/attribute/type'
8
+
9
+ describe ThinkingSphinx::ActiveRecord::Attribute::Type do
10
+ let(:type) {
11
+ ThinkingSphinx::ActiveRecord::Attribute::Type.new attribute, model }
12
+ let(:attribute) { double('attribute', :columns => [column], :options => {}) }
13
+ let(:model) { double('model', :columns => [db_column]) }
14
+ let(:column) { double('column', :__name => :created_at, :string? => false,
15
+ :__stack => []) }
16
+ let(:db_column) { double('column', :name => 'created_at',
17
+ :type => :integer) }
18
+
19
+ describe '#multi?' do
20
+ let(:association) { double('association', :klass => double) }
21
+
22
+ before :each do
23
+ column.__stack << :foo
24
+
25
+ model.stub :reflect_on_association => association
26
+ end
27
+
28
+ it "returns true if there are has_many associations" do
29
+ association.stub :macro => :has_many
30
+
31
+ type.should be_multi
32
+ end
33
+
34
+ it "returns true if there are has_and_belongs_to_many associations" do
35
+ association.stub :macro => :has_and_belongs_to_many
36
+
37
+ type.should be_multi
38
+ end
39
+
40
+ it "returns false if there are no associations" do
41
+ column.__stack.clear
42
+
43
+ type.should_not be_multi
44
+ end
45
+
46
+ it "returns false if there are only belongs_to associations" do
47
+ association.stub :macro => :belongs_to
48
+
49
+ type.should_not be_multi
50
+ end
51
+
52
+ it "returns false if there are only has_one associations" do
53
+ association.stub :macro => :has_one
54
+
55
+ type.should_not be_multi
56
+ end
57
+
58
+ it "returns true if deeper associations have many" do
59
+ column.__stack << :bar
60
+ deep_association = double(:klass => double, :macro => :has_many)
61
+ association.stub :macro => :belongs_to,
62
+ :klass => double(:reflect_on_association => deep_association)
63
+
64
+ type.should be_multi
65
+ end
66
+
67
+ it "respects the provided setting" do
68
+ attribute.options[:multi] = true
69
+
70
+ type.should be_multi
71
+ end
72
+ end
73
+
74
+ describe '#type' do
75
+ it "returns the type option provided" do
76
+ attribute.options[:type] = :datetime
77
+
78
+ type.type.should == :datetime
79
+ end
80
+
81
+ it "detects integer types from the database" do
82
+ db_column.stub!(:type => :integer, :sql_type => 'integer(11)')
83
+
84
+ type.type.should == :integer
85
+ end
86
+
87
+ it "detects boolean types from the database" do
88
+ db_column.stub!(:type => :boolean)
89
+
90
+ type.type.should == :boolean
91
+ end
92
+
93
+ it "detects datetime types from the database as timestamps" do
94
+ db_column.stub!(:type => :datetime)
95
+
96
+ type.type.should == :timestamp
97
+ end
98
+
99
+ it "detects date types from the database as timestamps" do
100
+ db_column.stub!(:type => :date)
101
+
102
+ type.type.should == :timestamp
103
+ end
104
+
105
+ it "detects string types from the database" do
106
+ db_column.stub!(:type => :string)
107
+
108
+ type.type.should == :string
109
+ end
110
+
111
+ it "detects text types from the database as strings" do
112
+ db_column.stub!(:type => :text)
113
+
114
+ type.type.should == :string
115
+ end
116
+
117
+ it "detects float types from the database" do
118
+ db_column.stub!(:type => :float)
119
+
120
+ type.type.should == :float
121
+ end
122
+
123
+ it "detects decimal types from the database as floats" do
124
+ db_column.stub!(:type => :decimal)
125
+
126
+ type.type.should == :float
127
+ end
128
+
129
+ it "detects big ints as big ints" do
130
+ db_column.stub :type => :bigint
131
+
132
+ type.type.should == :bigint
133
+ end
134
+
135
+ it "detects large integers as big ints" do
136
+ db_column.stub :type => :integer, :sql_type => 'bigint(20)'
137
+
138
+ type.type.should == :bigint
139
+ end
140
+
141
+ it "respects provided type setting" do
142
+ attribute.options[:type] = :timestamp
143
+
144
+ type.type.should == :timestamp
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::Base do
4
+ let(:model) {
5
+ Class.new(ActiveRecord::Base) do
6
+ include ThinkingSphinx::ActiveRecord::Base
7
+
8
+ def self.name; 'Model'; end
9
+ end
10
+ }
11
+ let(:sub_model) {
12
+ Class.new(model) do
13
+ def self.name; 'SubModel'; end
14
+ end
15
+ }
16
+ let(:search) { double('search', :options => {})}
17
+
18
+ describe '.search' do
19
+ before :each do
20
+ ThinkingSphinx.stub :search => search
21
+ end
22
+
23
+ it "returns a new search object" do
24
+ model.search.should == search
25
+ end
26
+
27
+ it "passes through arguments to the search object initializer" do
28
+ ThinkingSphinx.should_receive(:search).with('pancakes', anything)
29
+
30
+ model.search 'pancakes'
31
+ end
32
+
33
+ it "scopes the search to a given model" do
34
+ model.search('pancakes').options[:classes].should == [model]
35
+ end
36
+
37
+ it "merges the :classes option with the model" do
38
+ search_options = {:classes=>[sub_model]}
39
+ search.stub :options => search_options
40
+ model.search('pancakes', search_options).options[:classes].should == [sub_model, model]
41
+ end
42
+ end
43
+
44
+ describe '.search_count' do
45
+ let(:search) { double('search', :options => {}, :total_entries => 12) }
46
+
47
+ before :each do
48
+ ThinkingSphinx.stub :search => search
49
+ end
50
+
51
+ it "returns the search object's total entries count" do
52
+ model.search_count.should == search.total_entries
53
+ end
54
+
55
+ it "scopes the search to a given model" do
56
+ model.search_count
57
+
58
+ search.options[:classes].should == [model]
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::Callbacks::DeleteCallbacks do
4
+ let(:callbacks) {
5
+ ThinkingSphinx::ActiveRecord::Callbacks::DeleteCallbacks.new instance
6
+ }
7
+ let(:instance) { double('instance', :delta? => true) }
8
+
9
+ describe '.after_destroy' do
10
+ let(:callbacks) { double('callbacks', :after_destroy => nil) }
11
+
12
+ before :each do
13
+ ThinkingSphinx::ActiveRecord::Callbacks::DeleteCallbacks.
14
+ stub :new => callbacks
15
+ end
16
+
17
+ it "builds an object from the instance" do
18
+ ThinkingSphinx::ActiveRecord::Callbacks::DeleteCallbacks.
19
+ should_receive(:new).with(instance).and_return(callbacks)
20
+
21
+ ThinkingSphinx::ActiveRecord::Callbacks::DeleteCallbacks.
22
+ after_destroy(instance)
23
+ end
24
+
25
+ it "invokes after_destroy on the object" do
26
+ callbacks.should_receive(:after_destroy)
27
+
28
+ ThinkingSphinx::ActiveRecord::Callbacks::DeleteCallbacks.
29
+ after_destroy(instance)
30
+ end
31
+ end
32
+
33
+ describe '#after_destroy' do
34
+ let(:config) { double('config', :connection => connection,
35
+ :indices_for_references => [index], :preload_indices => true) }
36
+ let(:connection) { double('connection', :query => nil) }
37
+ let(:index) {
38
+ double('index', :name => 'foo_core', :document_id_for_key => 14)
39
+ }
40
+ let(:instance) { double('instance', :id => 7) }
41
+
42
+ before :each do
43
+ ThinkingSphinx::Configuration.stub :instance => config
44
+ Riddle::Query.stub :update => 'UPDATE STATEMENT'
45
+ end
46
+
47
+ it "updates the deleted flag to false" do
48
+ connection.should_receive(:query).with('UPDATE STATEMENT')
49
+
50
+ callbacks.after_destroy
51
+ end
52
+
53
+ it "builds the update query for the given index" do
54
+ Riddle::Query.should_receive(:update).
55
+ with('foo_core', anything, anything).and_return('')
56
+
57
+ callbacks.after_destroy
58
+ end
59
+
60
+ it "builds the update query for the sphinx document id" do
61
+ Riddle::Query.should_receive(:update).
62
+ with(anything, 14, anything).and_return('')
63
+
64
+ callbacks.after_destroy
65
+ end
66
+
67
+ it "builds the update query for setting sphinx_deleted to true" do
68
+ Riddle::Query.should_receive(:update).
69
+ with(anything, anything, :sphinx_deleted => true).and_return('')
70
+
71
+ callbacks.after_destroy
72
+ end
73
+
74
+ it "doesn't care about Sphinx errors" do
75
+ connection.stub(:query).and_raise(Mysql2::Error.new(''))
76
+
77
+ lambda { callbacks.after_destroy }.should_not raise_error
78
+ end
79
+ end
80
+ end