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,47 @@
1
+ module ThinkingSphinx
2
+ module Middlewares; end
3
+ class Search; end
4
+ end
5
+
6
+ require 'thinking_sphinx/middlewares/middleware'
7
+ require 'thinking_sphinx/middlewares/stale_id_checker'
8
+ require 'thinking_sphinx/search/stale_ids_exception'
9
+
10
+ describe ThinkingSphinx::Middlewares::StaleIdChecker do
11
+ let(:app) { double('app') }
12
+ let(:middleware) { ThinkingSphinx::Middlewares::StaleIdChecker.new app }
13
+ let(:context) { {:raw => [], :results => []} }
14
+ let(:model) { double('model') }
15
+
16
+ def raw_result(id, model_name)
17
+ {'sphinx_internal_id' => id, 'sphinx_internal_class' => model_name}
18
+ end
19
+
20
+ describe '#call' do
21
+ it 'passes the call on if there are no nil results' do
22
+ context[:raw] << raw_result(24, 'Article')
23
+ context[:raw] << raw_result(42, 'Article')
24
+
25
+ context[:results] << double('instance', :id => 24)
26
+ context[:results] << double('instance', :id => 42)
27
+
28
+ app.should_receive(:call)
29
+
30
+ middleware.call [context]
31
+ end
32
+
33
+ it "raises a stale id exception if ActiveRecord doesn't return ids" do
34
+ context[:raw] << raw_result(24, 'Article')
35
+ context[:raw] << raw_result(42, 'Article')
36
+
37
+ context[:results] << double('instance', :id => 24)
38
+ context[:results] << nil
39
+
40
+ lambda {
41
+ middleware.call [context]
42
+ }.should raise_error(ThinkingSphinx::Search::StaleIdsException) { |err|
43
+ err.ids.should == [42]
44
+ }
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,91 @@
1
+ module ThinkingSphinx
2
+ module Middlewares; end
3
+ class Search; end
4
+ end
5
+
6
+ require 'thinking_sphinx/middlewares/middleware'
7
+ require 'thinking_sphinx/middlewares/stale_id_filter'
8
+ require 'thinking_sphinx/search/stale_ids_exception'
9
+
10
+ describe ThinkingSphinx::Middlewares::StaleIdFilter do
11
+ let(:app) { double('app', :call => true) }
12
+ let(:middleware) { ThinkingSphinx::Middlewares::StaleIdFilter.new app }
13
+ let(:context) { {:raw => [], :results => []} }
14
+ let(:search) { double('search', :options => {}) }
15
+
16
+ describe '#call' do
17
+ before :each do
18
+ context.stub :search => search, :log => true
19
+ end
20
+
21
+ context 'one stale ids exception' do
22
+ before :each do
23
+ app.stub(:call) do
24
+ @calls ||= 0
25
+ @calls += 1
26
+ raise ThinkingSphinx::Search::StaleIdsException, [12] if @calls == 1
27
+ end
28
+ end
29
+
30
+ it "appends the ids to the without_ids filter" do
31
+ middleware.call [context]
32
+
33
+ search.options[:without_ids].should == [12]
34
+ end
35
+
36
+ it "respects existing without_ids filters" do
37
+ search.options[:without_ids] = [11]
38
+
39
+ middleware.call [context]
40
+
41
+ search.options[:without_ids].should == [11, 12]
42
+ end
43
+ end
44
+
45
+ context 'two stale ids exceptions' do
46
+ before :each do
47
+ app.stub(:call) do
48
+ @calls ||= 0
49
+ @calls += 1
50
+ raise ThinkingSphinx::Search::StaleIdsException, [12] if @calls == 1
51
+ raise ThinkingSphinx::Search::StaleIdsException, [13] if @calls == 2
52
+ end
53
+ end
54
+
55
+ it "appends the ids to the without_ids filter" do
56
+ middleware.call [context]
57
+
58
+ search.options[:without_ids].should == [12, 13]
59
+ end
60
+
61
+ it "respects existing without_ids filters" do
62
+ search.options[:without_ids] = [11]
63
+
64
+ middleware.call [context]
65
+
66
+ search.options[:without_ids].should == [11, 12, 13]
67
+ end
68
+ end
69
+
70
+ context 'three stale ids exceptions' do
71
+ before :each do
72
+ app.stub(:call) do
73
+ @calls ||= 0
74
+ @calls += 1
75
+
76
+ raise ThinkingSphinx::Search::StaleIdsException, [12] if @calls == 1
77
+ raise ThinkingSphinx::Search::StaleIdsException, [13] if @calls == 2
78
+ raise ThinkingSphinx::Search::StaleIdsException, [14] if @calls == 3
79
+ end
80
+ end
81
+
82
+ it "raises the final stale ids exceptions" do
83
+ lambda {
84
+ middleware.call [context]
85
+ }.should raise_error(ThinkingSphinx::Search::StaleIdsException) { |err|
86
+ err.ids.should == [14]
87
+ }
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,21 @@
1
+ module ThinkingSphinx
2
+ module Panes; end
3
+ end
4
+
5
+ require 'thinking_sphinx/panes/attributes_pane'
6
+
7
+ describe ThinkingSphinx::Panes::AttributesPane do
8
+ let(:pane) {
9
+ ThinkingSphinx::Panes::AttributesPane.new context, object, raw }
10
+ let(:context) { double('context') }
11
+ let(:object) { double('object') }
12
+ let(:raw) { {} }
13
+
14
+ describe '#sphinx_attributes' do
15
+ it "returns the object's sphinx attributes by default" do
16
+ raw['foo'] = 24
17
+
18
+ pane.sphinx_attributes.should == {'foo' => 24}
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,41 @@
1
+ module ThinkingSphinx
2
+ module Panes; end
3
+ end
4
+
5
+ require 'thinking_sphinx/panes/distance_pane'
6
+
7
+ describe ThinkingSphinx::Panes::DistancePane do
8
+ let(:pane) {
9
+ ThinkingSphinx::Panes::DistancePane.new context, object, raw }
10
+ let(:context) { double('context') }
11
+ let(:object) { double('object') }
12
+ let(:raw) { {} }
13
+
14
+ describe '#distance' do
15
+ it "returns the object's geodistance attribute by default" do
16
+ raw['geodist'] = 123.45
17
+
18
+ pane.distance.should == 123.45
19
+ end
20
+
21
+ it "converts string geodistances to floats" do
22
+ raw['geodist'] = '123.450'
23
+
24
+ pane.distance.should == 123.45
25
+ end
26
+ end
27
+
28
+ describe '#geodist' do
29
+ it "returns the object's geodistance attribute by default" do
30
+ raw['geodist'] = 123.45
31
+
32
+ pane.geodist.should == 123.45
33
+ end
34
+
35
+ it "converts string geodistances to floats" do
36
+ raw['geodist'] = '123.450'
37
+
38
+ pane.geodist.should == 123.45
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,53 @@
1
+ module ThinkingSphinx
2
+ module Panes; end
3
+ end
4
+
5
+ require 'thinking_sphinx/panes/excerpts_pane'
6
+
7
+ describe ThinkingSphinx::Panes::ExcerptsPane do
8
+ let(:pane) {
9
+ ThinkingSphinx::Panes::ExcerptsPane.new context, object, raw }
10
+ let(:context) { {:indices => [double(:name => 'foo_core')],
11
+ :meta => {}} }
12
+ let(:object) { double('object') }
13
+ let(:raw) { {} }
14
+ let(:search) { double('search', :options => {}) }
15
+
16
+ before :each do
17
+ context.stub :search => search
18
+ end
19
+
20
+ describe '#excerpts' do
21
+ let(:excerpter) { double('excerpter') }
22
+ let(:excerpts) { double('excerpts object') }
23
+
24
+ before :each do
25
+ stub_const 'ThinkingSphinx::Excerpter', double(:new => excerpter)
26
+ ThinkingSphinx::Panes::ExcerptsPane::Excerpts.stub :new => excerpts
27
+ end
28
+
29
+ it "returns an excerpt glazing" do
30
+ pane.excerpts.should == excerpts
31
+ end
32
+
33
+ it "creates an excerpter with the first index and all keywords" do
34
+ context[:indices] = [double(:name => 'alpha'), double(:name => 'beta')]
35
+ context[:meta]['keyword[0]'] = 'foo'
36
+ context[:meta]['keyword[1]'] = 'bar'
37
+
38
+ ThinkingSphinx::Excerpter.should_receive(:new).
39
+ with('alpha', 'foo bar', anything).and_return(excerpter)
40
+
41
+ pane.excerpts
42
+ end
43
+
44
+ it "passes through excerpts options" do
45
+ search.options[:excerpts] = {:before_match => 'foo'}
46
+
47
+ ThinkingSphinx::Excerpter.should_receive(:new).
48
+ with(anything, anything, :before_match => 'foo').and_return(excerpter)
49
+
50
+ pane.excerpts
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,20 @@
1
+ module ThinkingSphinx
2
+ module Panes; end
3
+ end
4
+
5
+ require 'thinking_sphinx/panes/weight_pane'
6
+
7
+ describe ThinkingSphinx::Panes::WeightPane do
8
+ let(:pane) { ThinkingSphinx::Panes::WeightPane.new context, object, raw }
9
+ let(:context) { double('context') }
10
+ let(:object) { double('object') }
11
+ let(:raw) { {} }
12
+
13
+ describe '#weight' do
14
+ it "returns the object's weight by default" do
15
+ raw['@weight'] = 101
16
+
17
+ pane.weight.should == 101
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,147 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::RakeInterface do
4
+ let(:configuration) { double('configuration', :controller => controller) }
5
+ let(:interface) { ThinkingSphinx::RakeInterface.new }
6
+
7
+ before :each do
8
+ ThinkingSphinx::Configuration.stub :instance => configuration
9
+ interface.stub(:puts => nil)
10
+ end
11
+
12
+ describe '#configure' do
13
+ let(:controller) { double('controller') }
14
+
15
+ before :each do
16
+ configuration.stub(
17
+ :configuration_file => '/path/to/foo.conf',
18
+ :render_to_file => true
19
+ )
20
+ end
21
+
22
+ it "renders the configuration to a file" do
23
+ configuration.should_receive(:render_to_file)
24
+
25
+ interface.configure
26
+ end
27
+
28
+ it "prints a message stating the file is being generated" do
29
+ interface.should_receive(:puts).
30
+ with('Generating configuration to /path/to/foo.conf')
31
+
32
+ interface.configure
33
+ end
34
+ end
35
+
36
+ describe '#index' do
37
+ let(:controller) { double('controller', :index => true) }
38
+
39
+ before :each do
40
+ configuration.stub(
41
+ :configuration_file => '/path/to/foo.conf',
42
+ :render_to_file => true,
43
+ :indices_location => '/path/to/indices'
44
+ )
45
+
46
+ FileUtils.stub :mkdir_p => true
47
+ end
48
+
49
+ it "renders the configuration to a file by default" do
50
+ configuration.should_receive(:render_to_file)
51
+
52
+ interface.index
53
+ end
54
+
55
+ it "does not render the configuration if requested" do
56
+ configuration.should_not_receive(:render_to_file)
57
+
58
+ interface.index false
59
+ end
60
+
61
+ it "creates the directory for the index files" do
62
+ FileUtils.should_receive(:mkdir_p).with('/path/to/indices')
63
+
64
+ interface.index
65
+ end
66
+
67
+ it "indexes all indices verbosely" do
68
+ controller.should_receive(:index).with(:verbose => true)
69
+
70
+ interface.index
71
+ end
72
+ end
73
+
74
+ describe '#start' do
75
+ let(:controller) { double('controller', :start => true, :pid => 101) }
76
+
77
+ before :each do
78
+ controller.stub(:running?).and_return(false, true)
79
+ end
80
+
81
+ it "starts the daemon" do
82
+ controller.should_receive(:start)
83
+
84
+ interface.start
85
+ end
86
+
87
+ it "raises an error if the daemon is already running" do
88
+ controller.stub :running? => true
89
+
90
+ lambda {
91
+ interface.start
92
+ }.should raise_error(RuntimeError)
93
+ end
94
+
95
+ it "prints a success message if the daemon has started" do
96
+ controller.stub(:running?).and_return(false, true)
97
+
98
+ interface.should_receive(:puts).
99
+ with('Started searchd successfully (pid: 101).')
100
+
101
+ interface.start
102
+ end
103
+
104
+ it "prints a failure message if the daemon does not start" do
105
+ controller.stub(:running?).and_return(false, false)
106
+
107
+ interface.should_receive(:puts).
108
+ with('Failed to start searchd. Check the log files for more information.')
109
+
110
+ interface.start
111
+ end
112
+ end
113
+
114
+ describe '#stop' do
115
+ let(:controller) { double('controller', :stop => true, :pid => 101) }
116
+
117
+ before :each do
118
+ controller.stub :running? => true
119
+ end
120
+
121
+ it "prints a message if the daemon is not already running" do
122
+ controller.stub :running? => false
123
+
124
+ interface.should_receive(:puts).with('searchd is not currently running.')
125
+
126
+ interface.stop
127
+ end
128
+
129
+ it "stops the daemon" do
130
+ controller.should_receive(:stop)
131
+
132
+ interface.stop
133
+ end
134
+
135
+ it "prints a message informing the daemon has stopped" do
136
+ interface.should_receive(:puts).with('Stopped searchd daemon (pid: 101).')
137
+
138
+ interface.stop
139
+ end
140
+
141
+ it "should retry stopping the daemon until it stops" do
142
+ controller.should_receive(:stop).twice.and_return(false, true)
143
+
144
+ interface.stop
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::RealTime::Attribute do
4
+ let(:attribute) { ThinkingSphinx::RealTime::Attribute.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
+ attribute = ThinkingSphinx::RealTime::Attribute.new column, :as => :foo
10
+ attribute.name.should == 'foo'
11
+ end
12
+
13
+ it "falls back to the column's name" do
14
+ attribute.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
+ attribute.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
+ attribute.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
+ attribute.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
+ attribute.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
+ attribute.translate(object).should be_nil
52
+ end
53
+ end
54
+
55
+ describe '#type' do
56
+ it "returns the given type option" do
57
+ attribute = ThinkingSphinx::RealTime::Attribute.new column,
58
+ :type => :string
59
+ attribute.type.should == :string
60
+ end
61
+ end
62
+ end