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,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::Field do
4
+ let(:field) { ThinkingSphinx::ActiveRecord::Field.new model, column }
5
+ let(:column) { double('column', :__name => :title, :__stack => [],
6
+ :string? => false) }
7
+ let(:model) { double('model') }
8
+
9
+ before :each do
10
+ column.stub! :to_a => [column]
11
+ end
12
+
13
+ describe '#file?' do
14
+ it "defaults to false" do
15
+ field.should_not be_file
16
+ end
17
+
18
+ it "is true if file option is set" do
19
+ field = ThinkingSphinx::ActiveRecord::Field.new model, column,
20
+ :file => true
21
+ field.should be_file
22
+ end
23
+ end
24
+
25
+ describe '#with_attribute?' do
26
+ it "defaults to false" do
27
+ field.should_not be_with_attribute
28
+ end
29
+
30
+ it "is true if the field is sortable" do
31
+ field = ThinkingSphinx::ActiveRecord::Field.new model, column,
32
+ :sortable => true
33
+ field.should be_with_attribute
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,208 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::Index do
4
+ let(:index) { ThinkingSphinx::ActiveRecord::Index.new :user }
5
+ let(:indices_path) { double('indices path', :join => '') }
6
+ let(:config) { double('config', :settings => {},
7
+ :indices_location => indices_path, :next_offset => 8) }
8
+
9
+ before :each do
10
+ ThinkingSphinx::Configuration.stub :instance => config
11
+ end
12
+
13
+ describe '#append_source' do
14
+ let(:model) { double('model', :primary_key => :id) }
15
+ let(:source) { double('source') }
16
+
17
+ before :each do
18
+ ActiveSupport::Inflector.stub(:constantize => model)
19
+ ThinkingSphinx::ActiveRecord::SQLSource.stub :new => source
20
+ config.stub :next_offset => 17
21
+ end
22
+
23
+ it "adds a source to the index" do
24
+ index.sources.should_receive(:<<).with(source)
25
+
26
+ index.append_source
27
+ end
28
+
29
+ it "creates the source with the index's offset" do
30
+ ThinkingSphinx::ActiveRecord::SQLSource.should_receive(:new).
31
+ with(model, hash_including(:offset => 17)).and_return(source)
32
+
33
+ index.append_source
34
+ end
35
+
36
+ it "returns the new source" do
37
+ index.append_source.should == source
38
+ end
39
+
40
+ it "defaults to the model's primary key" do
41
+ model.stub :primary_key => :sphinx_id
42
+
43
+ ThinkingSphinx::ActiveRecord::SQLSource.should_receive(:new).
44
+ with(model, hash_including(:primary_key => :sphinx_id)).
45
+ and_return(source)
46
+
47
+ index.append_source
48
+ end
49
+
50
+ it "uses a custom column when set" do
51
+ model.stub :primary_key => :sphinx_id
52
+
53
+ ThinkingSphinx::ActiveRecord::SQLSource.should_receive(:new).
54
+ with(model, hash_including(:primary_key => :custom_sphinx_id)).
55
+ and_return(source)
56
+
57
+ index = ThinkingSphinx::ActiveRecord::Index.new:user,
58
+ :primary_key => :custom_sphinx_id
59
+ index.append_source
60
+ end
61
+
62
+ it "defaults to id if no primary key is set" do
63
+ model.stub :primary_key => nil
64
+
65
+ ThinkingSphinx::ActiveRecord::SQLSource.should_receive(:new).
66
+ with(model, hash_including(:primary_key => :id)).
67
+ and_return(source)
68
+
69
+ index.append_source
70
+ end
71
+ end
72
+
73
+ describe '#delta?' do
74
+ it "defaults to false" do
75
+ index.should_not be_delta
76
+ end
77
+
78
+ it "reflects the delta? option" do
79
+ index = ThinkingSphinx::ActiveRecord::Index.new :user, :delta? => true
80
+ index.should be_delta
81
+ end
82
+ end
83
+
84
+ describe '#delta_processor' do
85
+ it "creates an instance of the delta processor option" do
86
+ processor = double('processor')
87
+ processor_class = double('processor class', :new => processor)
88
+ index = ThinkingSphinx::ActiveRecord::Index.new :user,
89
+ :delta_processor => processor_class
90
+
91
+ index.delta_processor.should == processor
92
+ end
93
+ end
94
+
95
+ describe '#document_id_for_key' do
96
+ it "calculates the document id based on offset and number of indices" do
97
+ config.stub_chain(:indices, :count).and_return(5)
98
+ config.stub :next_offset => 7
99
+
100
+ index.document_id_for_key(123).should == 622
101
+ end
102
+ end
103
+
104
+ describe '#interpret_definition!' do
105
+ let(:block) { double('block') }
106
+
107
+ before :each do
108
+ index.definition_block = block
109
+ end
110
+
111
+ it "interprets the definition block" do
112
+ ThinkingSphinx::ActiveRecord::Interpreter.should_receive(:translate!).
113
+ with(index, block)
114
+
115
+ index.interpret_definition!
116
+ end
117
+
118
+ it "only interprets the definition block once" do
119
+ ThinkingSphinx::ActiveRecord::Interpreter.should_receive(:translate!).
120
+ once
121
+
122
+ index.interpret_definition!
123
+ index.interpret_definition!
124
+ end
125
+ end
126
+
127
+ describe '#model' do
128
+ let(:model) { double('model') }
129
+
130
+ it "translates symbol references to model class" do
131
+ ActiveSupport::Inflector.stub(:constantize => model)
132
+
133
+ index.model.should == model
134
+ end
135
+
136
+ it "memoizes the result" do
137
+ ActiveSupport::Inflector.should_receive(:constantize).with('User').once.
138
+ and_return(model)
139
+
140
+ index.model
141
+ index.model
142
+ end
143
+ end
144
+
145
+ describe '#morphology' do
146
+ context 'with a render' do
147
+ it "defaults to nil" do
148
+ begin
149
+ index.render
150
+ rescue Riddle::Configuration::ConfigurationError
151
+ end
152
+
153
+ index.morphology.should be_nil
154
+ end
155
+
156
+ it "reads from the settings file if provided" do
157
+ config.settings['morphology'] = 'stem_en'
158
+
159
+ begin
160
+ index.render
161
+ rescue Riddle::Configuration::ConfigurationError
162
+ end
163
+
164
+ index.morphology.should == 'stem_en'
165
+ end
166
+ end
167
+ end
168
+
169
+ describe '#name' do
170
+ it "uses the core suffix by default" do
171
+ index = ThinkingSphinx::ActiveRecord::Index.new :user
172
+ index.name.should == 'user_core'
173
+ end
174
+
175
+ it "uses the delta suffix when delta? is true" do
176
+ index = ThinkingSphinx::ActiveRecord::Index.new :user, :delta? => true
177
+ index.name.should == 'user_delta'
178
+ end
179
+ end
180
+
181
+ describe '#offset' do
182
+ before :each do
183
+ config.stub :next_offset => 4
184
+ end
185
+
186
+ it "uses the next offset value from the configuration" do
187
+ index.offset.should == 4
188
+ end
189
+
190
+ it "uses the reference to get a unique offset" do
191
+ config.should_receive(:next_offset).with(:user).and_return(2)
192
+
193
+ index.offset
194
+ end
195
+ end
196
+
197
+ describe '#render' do
198
+ it "interprets the provided definition" do
199
+ index.should_receive(:interpret_definition!)
200
+
201
+ begin
202
+ index.render
203
+ rescue Riddle::Configuration::ConfigurationError
204
+ # Ignoring underlying validation error.
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,293 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::ActiveRecord::Interpreter do
4
+ let(:instance) {
5
+ ThinkingSphinx::ActiveRecord::Interpreter.new index, block
6
+ }
7
+ let(:model) { double('model') }
8
+ let(:index) { double('index', :append_source => source) }
9
+ let(:source) {
10
+ Struct.new(:attributes, :fields, :associations, :groupings, :conditions).
11
+ new([], [], [], [], [])
12
+ }
13
+ let(:block) { Proc.new { } }
14
+
15
+ before :each do
16
+ ThinkingSphinx::ActiveRecord::SQLSource.stub! :new => source
17
+ source.stub :model => model
18
+ end
19
+
20
+ describe '.translate!' do
21
+ let(:instance) { double('interpreter', :translate! => true) }
22
+
23
+ it "creates a new interpreter instance with the given block and index" do
24
+ ThinkingSphinx::ActiveRecord::Interpreter.should_receive(:new).
25
+ with(index, block).and_return(instance)
26
+
27
+ ThinkingSphinx::ActiveRecord::Interpreter.translate! index, block
28
+ end
29
+
30
+ it "calls translate! on the instance" do
31
+ ThinkingSphinx::ActiveRecord::Interpreter.stub!(:new => instance)
32
+ instance.should_receive(:translate!)
33
+
34
+ ThinkingSphinx::ActiveRecord::Interpreter.translate! index, block
35
+ end
36
+ end
37
+
38
+ describe '#group_by' do
39
+ it "adds a source to the index" do
40
+ index.should_receive(:append_source).and_return(source)
41
+
42
+ instance.group_by 'lat'
43
+ end
44
+
45
+ it "only adds a single source for the given context" do
46
+ index.should_receive(:append_source).once.and_return(source)
47
+
48
+ instance.group_by 'lat'
49
+ instance.group_by 'lng'
50
+ end
51
+
52
+ it "appends a new grouping statement to the source" do
53
+ instance.group_by 'lat'
54
+
55
+ source.groupings.should include('lat')
56
+ end
57
+ end
58
+
59
+ describe '#has' do
60
+ let(:column) { double('column') }
61
+ let(:attribute) { double('attribute') }
62
+
63
+ before :each do
64
+ ThinkingSphinx::ActiveRecord::Attribute.stub! :new => attribute
65
+ end
66
+
67
+ it "adds a source to the index" do
68
+ index.should_receive(:append_source).and_return(source)
69
+
70
+ instance.has column
71
+ end
72
+
73
+ it "only adds a single source for the given context" do
74
+ index.should_receive(:append_source).once.and_return(source)
75
+
76
+ instance.has column
77
+ instance.has column
78
+ end
79
+
80
+ it "creates a new attribute with the provided column" do
81
+ ThinkingSphinx::ActiveRecord::Attribute.should_receive(:new).
82
+ with(model, column, {}).and_return(attribute)
83
+
84
+ instance.has column
85
+ end
86
+
87
+ it "passes through options to the attribute" do
88
+ ThinkingSphinx::ActiveRecord::Attribute.should_receive(:new).
89
+ with(model, column, :as => :other_name).and_return(attribute)
90
+
91
+ instance.has column, :as => :other_name
92
+ end
93
+
94
+ it "adds an attribute to the source" do
95
+ instance.has column
96
+
97
+ source.attributes.should include(attribute)
98
+ end
99
+
100
+ it "adds multiple attributes when passed multiple columns" do
101
+ instance.has column, column
102
+
103
+ source.attributes.select { |saved_attribute|
104
+ saved_attribute == attribute
105
+ }.length.should == 2
106
+ end
107
+ end
108
+
109
+ describe '#indexes' do
110
+ let(:column) { double('column') }
111
+ let(:field) { double('field') }
112
+
113
+ before :each do
114
+ ThinkingSphinx::ActiveRecord::Field.stub! :new => field
115
+ end
116
+
117
+ it "adds a source to the index" do
118
+ index.should_receive(:append_source).and_return(source)
119
+
120
+ instance.indexes column
121
+ end
122
+
123
+ it "only adds a single source for the given context" do
124
+ index.should_receive(:append_source).once.and_return(source)
125
+
126
+ instance.indexes column
127
+ instance.indexes column
128
+ end
129
+
130
+ it "creates a new field with the provided column" do
131
+ ThinkingSphinx::ActiveRecord::Field.should_receive(:new).
132
+ with(model, column, {}).and_return(field)
133
+
134
+ instance.indexes column
135
+ end
136
+
137
+ it "passes through options to the field" do
138
+ ThinkingSphinx::ActiveRecord::Field.should_receive(:new).
139
+ with(model, column, :as => :other_name).and_return(field)
140
+
141
+ instance.indexes column, :as => :other_name
142
+ end
143
+
144
+ it "adds a field to the source" do
145
+ instance.indexes column
146
+
147
+ source.fields.should include(field)
148
+ end
149
+
150
+ it "adds multiple fields when passed multiple columns" do
151
+ instance.indexes column, column
152
+
153
+ source.fields.select { |saved_field|
154
+ saved_field == field
155
+ }.length.should == 2
156
+ end
157
+ end
158
+
159
+ describe '#join' do
160
+ let(:column) { double('column') }
161
+ let(:association) { double('association') }
162
+
163
+ before :each do
164
+ ThinkingSphinx::ActiveRecord::Association.stub! :new => association
165
+ end
166
+
167
+ it "adds a source to the index" do
168
+ index.should_receive(:append_source).and_return(source)
169
+
170
+ instance.join column
171
+ end
172
+
173
+ it "only adds a single source for the given context" do
174
+ index.should_receive(:append_source).once.and_return(source)
175
+
176
+ instance.join column
177
+ instance.join column
178
+ end
179
+
180
+ it "creates a new association with the provided column" do
181
+ ThinkingSphinx::ActiveRecord::Association.should_receive(:new).
182
+ with(column).and_return(association)
183
+
184
+ instance.join column
185
+ end
186
+
187
+ it "adds an association to the source" do
188
+ instance.join column
189
+
190
+ source.associations.should include(association)
191
+ end
192
+
193
+ it "adds multiple fields when passed multiple columns" do
194
+ instance.join column, column
195
+
196
+ source.associations.select { |saved_assoc|
197
+ saved_assoc == association
198
+ }.length.should == 2
199
+ end
200
+ end
201
+
202
+ describe '#method_missing' do
203
+ let(:column) { double('column') }
204
+
205
+ before :each do
206
+ ThinkingSphinx::ActiveRecord::Column.stub!(:new => column)
207
+ end
208
+
209
+ it "returns a new column for the given method" do
210
+ instance.id.should == column
211
+ end
212
+
213
+ it "should initialise the column with the method name and arguments" do
214
+ ThinkingSphinx::ActiveRecord::Column.should_receive(:new).
215
+ with(:users, :posts, :subject).and_return(column)
216
+
217
+ instance.users(:posts, :subject)
218
+ end
219
+ end
220
+
221
+ describe '#set_property' do
222
+ before :each do
223
+ index.class.stub :settings => [:morphology]
224
+ source.class.stub :settings => [:mysql_ssl_cert]
225
+ end
226
+
227
+ context 'index settings' do
228
+ it "sets the provided setting" do
229
+ index.should_receive(:morphology=).with('stem_en')
230
+
231
+ instance.set_property :morphology => 'stem_en'
232
+ end
233
+ end
234
+
235
+ context 'source settings' do
236
+ before :each do
237
+ source.stub :mysql_ssl_cert= => true
238
+ end
239
+
240
+ it "adds a source to the index" do
241
+ index.should_receive(:append_source).and_return(source)
242
+
243
+ instance.set_property :mysql_ssl_cert => 'private.cert'
244
+ end
245
+
246
+ it "only adds a single source for the given context" do
247
+ index.should_receive(:append_source).once.and_return(source)
248
+
249
+ instance.set_property :mysql_ssl_cert => 'private.cert'
250
+ instance.set_property :mysql_ssl_cert => 'private.cert'
251
+ end
252
+
253
+ it "sets the provided setting" do
254
+ source.should_receive(:mysql_ssl_cert=).with('private.cert')
255
+
256
+ instance.set_property :mysql_ssl_cert => 'private.cert'
257
+ end
258
+ end
259
+ end
260
+
261
+ describe '#translate!' do
262
+ it "returns the block evaluated within the context of the interpreter" do
263
+ block = Proc.new {
264
+ __id__
265
+ }
266
+
267
+ interpreter = ThinkingSphinx::ActiveRecord::Interpreter.new index, block
268
+ interpreter.translate!.
269
+ should == interpreter.__id__
270
+ end
271
+ end
272
+
273
+ describe '#where' do
274
+ it "adds a source to the index" do
275
+ index.should_receive(:append_source).and_return(source)
276
+
277
+ instance.where 'id > 100'
278
+ end
279
+
280
+ it "only adds a single source for the given context" do
281
+ index.should_receive(:append_source).once.and_return(source)
282
+
283
+ instance.where 'id > 100'
284
+ instance.where 'id < 150'
285
+ end
286
+
287
+ it "appends a new grouping statement to the source" do
288
+ instance.where 'id > 100'
289
+
290
+ source.conditions.should include('id > 100')
291
+ end
292
+ end
293
+ end