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,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks do
4
+ let(:callbacks) {
5
+ ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks.new instance
6
+ }
7
+ let(:instance) { double('instance', :id => 12) }
8
+ let(:config) { double('config', :indices_for_references => [index],
9
+ :connection => connection) }
10
+ let(:index) { double('index', :name => 'my_index', :is_a? => true,
11
+ :document_id_for_key => 123, :fields => [], :attributes => []) }
12
+ let(:connection) { double('connection', :query => true) }
13
+
14
+ before :each do
15
+ ThinkingSphinx::Configuration.stub :instance => config
16
+ end
17
+
18
+ describe '.after_save' do
19
+ let(:callbacks) { double('callbacks', :after_save => nil) }
20
+
21
+ before :each do
22
+ ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks.
23
+ stub :new => callbacks
24
+ end
25
+
26
+ it "builds an object from the instance" do
27
+ ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks.
28
+ should_receive(:new).with(instance).and_return(callbacks)
29
+
30
+ ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks.
31
+ after_save(instance)
32
+ end
33
+
34
+ it "invokes after_save on the object" do
35
+ callbacks.should_receive(:after_save)
36
+
37
+ ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks.
38
+ after_save(instance)
39
+ end
40
+ end
41
+
42
+ describe '#after_save' do
43
+ let(:insert) { double('insert', :to_sql => 'REPLACE INTO my_index') }
44
+ let(:time) { 1.day.ago }
45
+ let(:field) { double('field', :name => 'name', :translate => 'Foo') }
46
+ let(:attribute) { double('attribute', :name => 'created_at',
47
+ :translate => time) }
48
+
49
+ before :each do
50
+ ThinkingSphinx::Configuration.stub :instance => config
51
+ Riddle::Query::Insert.stub :new => insert
52
+ insert.stub :replace! => insert
53
+ index.stub :fields => [field], :attributes => [attribute]
54
+ end
55
+
56
+ it "creates an insert statement with all fields and attributes" do
57
+ Riddle::Query::Insert.should_receive(:new).
58
+ with('my_index', ['id', 'name', 'created_at'], [123, 'Foo', time]).
59
+ and_return(insert)
60
+
61
+ callbacks.after_save
62
+ end
63
+
64
+ it "switches the insert to a replace statement" do
65
+ insert.should_receive(:replace!).and_return(insert)
66
+
67
+ callbacks.after_save
68
+ end
69
+
70
+ it "sends the insert through to the server" do
71
+ connection.should_receive(:query).with('REPLACE INTO my_index')
72
+
73
+ callbacks.after_save
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::RealTime::Field do
4
+ let(:field) { ThinkingSphinx::RealTime::Field.new column }
5
+ let(:column) { double('column', :__name => :created_at, :__stack => []) }
6
+
7
+ describe '#name' do
8
+ it "uses the provided option by default" do
9
+ field = ThinkingSphinx::RealTime::Field.new column, :as => :foo
10
+ field.name.should == 'foo'
11
+ end
12
+
13
+ it "falls back to the column's name" do
14
+ field.name.should == 'created_at'
15
+ end
16
+ end
17
+
18
+ describe '#translate' do
19
+ let(:klass) { Struct.new(:name, :parent) }
20
+ let(:object) { klass.new 'the object name', parent }
21
+ let(:parent) { klass.new 'the parent name', nil }
22
+
23
+ it "returns the column's name if it's a string" do
24
+ column.stub :__name => 'value'
25
+
26
+ field.translate(object).should == 'value'
27
+ end
28
+
29
+ it "returns the column's name if it's an integer" do
30
+ column.stub :__name => 404
31
+
32
+ field.translate(object).should == 404
33
+ end
34
+
35
+ it "returns the object's method matching the column's name" do
36
+ object.stub :created_at => 'a time'
37
+
38
+ field.translate(object).should == 'a time'
39
+ end
40
+
41
+ it "uses the column's stack to navigate through the object tree" do
42
+ column.stub :__name => :name, :__stack => [:parent]
43
+
44
+ field.translate(object).should == 'the parent name'
45
+ end
46
+
47
+ it "returns nil if any element in the object tree is nil" do
48
+ column.stub :__name => :name, :__stack => [:parent]
49
+ object.parent = nil
50
+
51
+ field.translate(object).should be_nil
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,154 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::RealTime::Index do
4
+ let(:index) { ThinkingSphinx::RealTime::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 '#attributes' do
14
+ it "has the internal id attribute by default" do
15
+ index.attributes.collect(&:name).should include('sphinx_internal_id')
16
+ end
17
+
18
+ it "has the internal deleted attribute by default" do
19
+ index.attributes.collect(&:name).should include('sphinx_deleted')
20
+ end
21
+ end
22
+
23
+ describe '#delta?' do
24
+ it "always returns false" do
25
+ index.should_not be_delta
26
+ end
27
+ end
28
+
29
+ describe '#document_id_for_key' do
30
+ it "calculates the document id based on offset and number of indices" do
31
+ config.stub_chain(:indices, :count).and_return(5)
32
+ config.stub :next_offset => 7
33
+
34
+ index.document_id_for_key(123).should == 622
35
+ end
36
+ end
37
+
38
+ describe '#fields' do
39
+ it "has the internal class field by default" do
40
+ index.fields.collect(&:name).should include('sphinx_internal_class')
41
+ end
42
+ end
43
+
44
+ describe '#interpret_definition!' do
45
+ let(:block) { double('block') }
46
+
47
+ before :each do
48
+ index.definition_block = block
49
+ end
50
+
51
+ it "interprets the definition block" do
52
+ ThinkingSphinx::RealTime::Interpreter.should_receive(:translate!).
53
+ with(index, block)
54
+
55
+ index.interpret_definition!
56
+ end
57
+
58
+ it "only interprets the definition block once" do
59
+ ThinkingSphinx::RealTime::Interpreter.should_receive(:translate!).
60
+ once
61
+
62
+ index.interpret_definition!
63
+ index.interpret_definition!
64
+ end
65
+ end
66
+
67
+ describe '#model' do
68
+ let(:model) { double('model') }
69
+
70
+ it "translates symbol references to model class" do
71
+ ActiveSupport::Inflector.stub(:constantize => model)
72
+
73
+ index.model.should == model
74
+ end
75
+
76
+ it "memoizes the result" do
77
+ ActiveSupport::Inflector.should_receive(:constantize).with('User').once.
78
+ and_return(model)
79
+
80
+ index.model
81
+ index.model
82
+ end
83
+ end
84
+
85
+ describe '#morphology' do
86
+ before :each do
87
+ pending
88
+ end
89
+
90
+ context 'with a render' do
91
+ it "defaults to nil" do
92
+ begin
93
+ index.render
94
+ rescue Riddle::Configuration::ConfigurationError
95
+ end
96
+
97
+ index.morphology.should be_nil
98
+ end
99
+
100
+ it "reads from the settings file if provided" do
101
+ config.settings['morphology'] = 'stem_en'
102
+
103
+ begin
104
+ index.render
105
+ rescue Riddle::Configuration::ConfigurationError
106
+ end
107
+
108
+ index.morphology.should == 'stem_en'
109
+ end
110
+ end
111
+ end
112
+
113
+ describe '#name' do
114
+ it "always uses the core suffix" do
115
+ index = ThinkingSphinx::RealTime::Index.new :user
116
+ index.name.should == 'user_core'
117
+ end
118
+ end
119
+
120
+ describe '#offset' do
121
+ before :each do
122
+ config.stub :next_offset => 4
123
+ end
124
+
125
+ it "uses the next offset value from the configuration" do
126
+ index.offset.should == 4
127
+ end
128
+
129
+ it "uses the reference to get a unique offset" do
130
+ config.should_receive(:next_offset).with(:user).and_return(2)
131
+
132
+ index.offset
133
+ end
134
+ end
135
+
136
+ describe '#render' do
137
+ it "interprets the provided definition" do
138
+ index.should_receive(:interpret_definition!)
139
+
140
+ begin
141
+ index.render
142
+ rescue Riddle::Configuration::ConfigurationError
143
+ # Ignoring underlying validation error.
144
+ end
145
+ end
146
+ end
147
+
148
+ describe '#unique_attribute_names' do
149
+ it "returns all attribute names" do
150
+ index.unique_attribute_names.
151
+ should == ['sphinx_internal_id', 'sphinx_deleted']
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,147 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::RealTime::Interpreter do
4
+ let(:instance) {
5
+ ThinkingSphinx::RealTime::Interpreter.new index, block
6
+ }
7
+ let(:model) { double('model') }
8
+ let(:index) { Struct.new(:attributes, :fields).new([], []) }
9
+ let(:block) { Proc.new { } }
10
+
11
+ describe '.translate!' do
12
+ let(:instance) { double('interpreter', :translate! => true) }
13
+
14
+ it "creates a new interpreter instance with the given block and index" do
15
+ ThinkingSphinx::RealTime::Interpreter.should_receive(:new).
16
+ with(index, block).and_return(instance)
17
+
18
+ ThinkingSphinx::RealTime::Interpreter.translate! index, block
19
+ end
20
+
21
+ it "calls translate! on the instance" do
22
+ ThinkingSphinx::RealTime::Interpreter.stub!(:new => instance)
23
+ instance.should_receive(:translate!)
24
+
25
+ ThinkingSphinx::RealTime::Interpreter.translate! index, block
26
+ end
27
+ end
28
+
29
+ describe '#has' do
30
+ let(:column) { double('column') }
31
+ let(:attribute) { double('attribute') }
32
+
33
+ before :each do
34
+ ThinkingSphinx::RealTime::Attribute.stub! :new => attribute
35
+ end
36
+
37
+ it "creates a new attribute with the provided column" do
38
+ ThinkingSphinx::RealTime::Attribute.should_receive(:new).
39
+ with(column, {}).and_return(attribute)
40
+
41
+ instance.has column
42
+ end
43
+
44
+ it "passes through options to the attribute" do
45
+ ThinkingSphinx::RealTime::Attribute.should_receive(:new).
46
+ with(column, :as => :other_name).and_return(attribute)
47
+
48
+ instance.has column, :as => :other_name
49
+ end
50
+
51
+ it "adds an attribute to the index" do
52
+ instance.has column
53
+
54
+ index.attributes.should include(attribute)
55
+ end
56
+
57
+ it "adds multiple attributes when passed multiple columns" do
58
+ instance.has column, column
59
+
60
+ index.attributes.select { |saved_attribute|
61
+ saved_attribute == attribute
62
+ }.length.should == 2
63
+ end
64
+ end
65
+
66
+ describe '#indexes' do
67
+ let(:column) { double('column') }
68
+ let(:field) { double('field') }
69
+
70
+ before :each do
71
+ ThinkingSphinx::RealTime::Field.stub! :new => field
72
+ end
73
+
74
+ it "creates a new field with the provided column" do
75
+ ThinkingSphinx::RealTime::Field.should_receive(:new).
76
+ with(column, {}).and_return(field)
77
+
78
+ instance.indexes column
79
+ end
80
+
81
+ it "passes through options to the field" do
82
+ ThinkingSphinx::RealTime::Field.should_receive(:new).
83
+ with(column, :as => :other_name).and_return(field)
84
+
85
+ instance.indexes column, :as => :other_name
86
+ end
87
+
88
+ it "adds a field to the index" do
89
+ instance.indexes column
90
+
91
+ index.fields.should include(field)
92
+ end
93
+
94
+ it "adds multiple fields when passed multiple columns" do
95
+ instance.indexes column, column
96
+
97
+ index.fields.select { |saved_field|
98
+ saved_field == field
99
+ }.length.should == 2
100
+ end
101
+ end
102
+
103
+ describe '#method_missing' do
104
+ let(:column) { double('column') }
105
+
106
+ before :each do
107
+ ThinkingSphinx::ActiveRecord::Column.stub!(:new => column)
108
+ end
109
+
110
+ it "returns a new column for the given method" do
111
+ instance.id.should == column
112
+ end
113
+
114
+ it "should initialise the column with the method name and arguments" do
115
+ ThinkingSphinx::ActiveRecord::Column.should_receive(:new).
116
+ with(:users, :posts, :subject).and_return(column)
117
+
118
+ instance.users(:posts, :subject)
119
+ end
120
+ end
121
+
122
+ describe '#set_property' do
123
+ before :each do
124
+ index.class.stub :settings => [:morphology]
125
+ end
126
+
127
+ context 'index settings' do
128
+ it "sets the provided setting" do
129
+ index.should_receive(:morphology=).with('stem_en')
130
+
131
+ instance.set_property :morphology => 'stem_en'
132
+ end
133
+ end
134
+ end
135
+
136
+ describe '#translate!' do
137
+ it "returns the block evaluated within the context of the interpreter" do
138
+ block = Proc.new {
139
+ __id__
140
+ }
141
+
142
+ interpreter = ThinkingSphinx::RealTime::Interpreter.new index, block
143
+ interpreter.translate!.
144
+ should == interpreter.__id__
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::Scopes do
4
+ let(:model) {
5
+ Class.new do
6
+ include ThinkingSphinx::Scopes
7
+
8
+ def self.search(query = nil, options = {})
9
+ ThinkingSphinx::Search.new(query, options)
10
+ end
11
+ end
12
+ }
13
+
14
+ describe '#method_missing' do
15
+ before :each do
16
+ model.sphinx_scopes[:foo] = Proc.new { {:with => {:foo => :bar}} }
17
+ end
18
+
19
+ it "creates new search" do
20
+ model.foo.class.should == ThinkingSphinx::Search
21
+ end
22
+
23
+ it "passes block result to constructor" do
24
+ model.foo.options[:with].should == {:foo => :bar}
25
+ end
26
+
27
+ it "passes non-scopes through to the standard method error call" do
28
+ lambda { model.bar }.should raise_error(NoMethodError)
29
+ end
30
+ end
31
+
32
+ describe '#sphinx_scope' do
33
+ it "saves the given block with a name" do
34
+ model.sphinx_scope(:foo) { 27 }
35
+ model.sphinx_scopes[:foo].call.should == 27
36
+ end
37
+ end
38
+ end