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,116 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::Deltas::DefaultDelta do
4
+ let(:delta) { ThinkingSphinx::Deltas::DefaultDelta.new adapter }
5
+ let(:adapter) {
6
+ double('adapter', :quoted_table_name => 'articles', :quote => 'delta')
7
+ }
8
+
9
+ describe '#clause' do
10
+ context 'for a delta source' do
11
+ before :each do
12
+ adapter.stub :boolean_value => 't'
13
+ end
14
+
15
+ it "limits results to those flagged as deltas" do
16
+ delta.clause(true).should == "articles.delta = t"
17
+ end
18
+ end
19
+ end
20
+
21
+ describe '#delete' do
22
+ let(:config) { double('config', :connection => connection) }
23
+ let(:connection) { double('connection', :query => nil) }
24
+ let(:index) { double('index', :name => 'foo_core',
25
+ :document_id_for_key => 14) }
26
+ let(:instance) { double('instance', :id => 7) }
27
+
28
+ before :each do
29
+ ThinkingSphinx::Configuration.stub :instance => config
30
+ Riddle::Query.stub :update => 'UPDATE STATEMENT'
31
+ end
32
+
33
+ it "updates the deleted flag to false" do
34
+ connection.should_receive(:query).with('UPDATE STATEMENT')
35
+
36
+ delta.delete index, instance
37
+ end
38
+
39
+ it "builds the update query for the given index" do
40
+ Riddle::Query.should_receive(:update).
41
+ with('foo_core', anything, anything).and_return('')
42
+
43
+ delta.delete index, instance
44
+ end
45
+
46
+ it "builds the update query for the sphinx document id" do
47
+ Riddle::Query.should_receive(:update).
48
+ with(anything, 14, anything).and_return('')
49
+
50
+ delta.delete index, instance
51
+ end
52
+
53
+ it "builds the update query for setting sphinx_deleted to true" do
54
+ Riddle::Query.should_receive(:update).
55
+ with(anything, anything, :sphinx_deleted => true).and_return('')
56
+
57
+ delta.delete index, instance
58
+ end
59
+
60
+ it "doesn't care about Sphinx errors" do
61
+ connection.stub(:query).and_raise(Mysql2::Error.new(''))
62
+
63
+ lambda { delta.delete index, instance }.should_not raise_error
64
+ end
65
+ end
66
+
67
+ describe '#index' do
68
+ let(:config) { double('config', :controller => controller,
69
+ :settings => {}) }
70
+ let(:controller) { double('controller') }
71
+
72
+ before :each do
73
+ ThinkingSphinx::Configuration.stub :instance => config
74
+ end
75
+
76
+ it "indexes the given index" do
77
+ controller.should_receive(:index).with('foo_delta', :verbose => true)
78
+
79
+ delta.index double('index', :name => 'foo_delta')
80
+ end
81
+ end
82
+
83
+ describe '#reset_query' do
84
+ it "updates the table to set delta flags to false" do
85
+ adapter.stub(:boolean_value) { |value| value ? 't' : 'f' }
86
+ delta.reset_query.
87
+ should == 'UPDATE articles SET delta = f WHERE delta = t'
88
+ end
89
+ end
90
+
91
+ describe '#toggle' do
92
+ let(:instance) { double('instance') }
93
+
94
+ it "sets instance's delta flag to true" do
95
+ instance.should_receive(:delta=).with(true)
96
+
97
+ delta.toggle(instance)
98
+ end
99
+ end
100
+
101
+ describe '#toggled?' do
102
+ let(:instance) { double('instance') }
103
+
104
+ it "returns the delta flag value when true" do
105
+ instance.stub! :delta? => true
106
+
107
+ delta.toggled?(instance).should be_true
108
+ end
109
+
110
+ it "returns the delta flag value when false" do
111
+ instance.stub! :delta? => false
112
+
113
+ delta.toggled?(instance).should be_false
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe ThinkingSphinx::Deltas do
4
+ describe '.processor_for' do
5
+ it "returns the default processor class when given true" do
6
+ ThinkingSphinx::Deltas.processor_for(true).
7
+ should == ThinkingSphinx::Deltas::DefaultDelta
8
+ end
9
+
10
+ it "returns the class when given one" do
11
+ klass = Class.new
12
+ ThinkingSphinx::Deltas.processor_for(klass).should == klass
13
+ end
14
+ end
15
+
16
+ describe '.suspend' do
17
+ let(:config) { double('config', :indices_for_references => [index]) }
18
+ let(:index) { double('index', :name => 'user_core',
19
+ :delta_processor => processor) }
20
+ let(:processor) { double('processor', :index => true) }
21
+
22
+ before :each do
23
+ ThinkingSphinx::Configuration.stub :instance => config
24
+ end
25
+
26
+ it "executes the given block" do
27
+ variable = :foo
28
+
29
+ ThinkingSphinx::Deltas.suspend :user do
30
+ variable = :bar
31
+ end
32
+
33
+ variable.should == :bar
34
+ end
35
+
36
+ it "suspends deltas within the block" do
37
+ ThinkingSphinx::Deltas.suspend :user do
38
+ ThinkingSphinx::Deltas.should be_suspended
39
+ end
40
+ end
41
+
42
+ it "removes the suspension after the block" do
43
+ ThinkingSphinx::Deltas.suspend :user do
44
+ #
45
+ end
46
+
47
+ ThinkingSphinx::Deltas.should_not be_suspended
48
+ end
49
+
50
+ it "processes the delta indices for the given reference" do
51
+ processor.should_receive(:index).with(index)
52
+
53
+ ThinkingSphinx::Deltas.suspend :user do
54
+ #
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,49 +1,51 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ThinkingSphinx::Excerpter do
4
+ let(:excerpter) { ThinkingSphinx::Excerpter.new('index', 'all words') }
5
+ let(:config) { double('config', :connection => connection) }
6
+ let(:connection) {
7
+ double('connection', :query => [{'snippet' => 'some highlighted words'}])
8
+ }
9
+
4
10
  before :each do
5
- @alpha = Alpha.find(:first)
6
- @search = mock 'search', :excerpt_for => 'excerpted value'
7
- @excerpter = ThinkingSphinx::Excerpter.new(@search, @alpha)
8
- end
9
-
10
- it "should not respond to id" do
11
- @excerpter.should_not respond_to(:id)
11
+ ThinkingSphinx::Configuration.stub :instance => config
12
+ Riddle::Query.stub :snippets => 'CALL SNIPPETS'
12
13
  end
13
-
14
- describe '#method_missing' do
15
- it "should return the excerpt from Sphinx" do
16
- @excerpter.name.should == 'excerpted value'
17
- end
18
-
19
- it "should send through the instance class to excerpt_for" do
20
- @search.should_receive(:excerpt_for) do |string, model|
21
- model.should == Alpha
22
- end
23
-
24
- @excerpter.name
14
+
15
+ describe '#excerpt!' do
16
+ it "generates a snippets call" do
17
+ Riddle::Query.should_receive(:snippets).
18
+ with('all of the words', 'index', 'all words',
19
+ ThinkingSphinx::Excerpter::DefaultOptions).
20
+ and_return('CALL SNIPPETS')
21
+
22
+ excerpter.excerpt!('all of the words')
25
23
  end
26
-
27
- it "should use attribute methods for excerpts calls" do
28
- @search.should_receive(:excerpt_for) do |string, model|
29
- string.should == 'one'
30
- end
31
-
32
- @excerpter.name
24
+
25
+ it "respects the provided options" do
26
+ excerpter = ThinkingSphinx::Excerpter.new('index', 'all words',
27
+ :before_match => '<b>', :chunk_separator => ' -- ')
28
+
29
+ Riddle::Query.should_receive(:snippets).
30
+ with('all of the words', 'index', 'all words',
31
+ :before_match => '<b>', :after_match => '</span>',
32
+ :chunk_separator => ' -- ').
33
+ and_return('CALL SNIPPETS')
34
+
35
+ excerpter.excerpt!('all of the words')
33
36
  end
34
-
35
- it "should use instance methods for excerpts calls" do
36
- @search.should_receive(:excerpt_for) do |string, model|
37
- string.should == 'ONE'
38
- end
39
-
40
- @excerpter.big_name
37
+
38
+ it "sends the snippets call to Sphinx" do
39
+ connection.should_receive(:query).with('CALL SNIPPETS').
40
+ and_return([{'snippet' => ''}])
41
+
42
+ excerpter.excerpt!('all of the words')
41
43
  end
42
-
43
- it "should still raise an exception if no column or method exists" do
44
- lambda {
45
- @excerpter.foo
46
- }.should raise_error(NoMethodError)
44
+
45
+ it "returns the first value returned by Sphinx" do
46
+ connection.stub :query => [{'snippet' => 'some highlighted words'}]
47
+
48
+ excerpter.excerpt!('all of the words').should == 'some highlighted words'
47
49
  end
48
50
  end
49
51
  end
@@ -1,176 +1,74 @@
1
- require 'spec_helper'
1
+ module ThinkingSphinx; end
2
+
3
+ require 'thinking_sphinx/facet_search'
4
+ require 'thinking_sphinx/facet'
2
5
 
3
6
  describe ThinkingSphinx::FacetSearch do
4
- let(:search) { stub('search', :append_to => nil, :empty? => true) }
5
- let(:config) { ThinkingSphinx::Configuration.instance }
6
- let(:client) { stub('client', :run => []) }
7
+ let(:facet_search) { ThinkingSphinx::FacetSearch.new '', {} }
8
+ let(:batch) { double('batch', :searches => [], :populate => true) }
9
+ let(:index_set) { [] }
10
+ let(:index) { double('index', :facets => [property],
11
+ :name => 'foo_core') }
12
+ let(:property) { double('property', :name => 'price_bracket',
13
+ :multi? => false)}
7
14
 
8
15
  before :each do
9
- ThinkingSphinx::Connection.stub!(:take).and_yield(client)
10
- end
11
-
12
- describe 'populate' do
13
- before :each do
14
- config.configuration.searchd.max_matches = 10_000
15
- end
16
-
17
- it "should request all shared facets in a multi-model request by default" do
18
- ThinkingSphinx.stub!(:search => search)
19
- if Riddle.loaded_version.to_i < 2
20
- ThinkingSphinx::FacetSearch.new.facet_names.should == ['class_crc']
21
- else
22
- ThinkingSphinx::FacetSearch.new.facet_names.should == ['sphinx_internal_class']
23
- end
24
- end
16
+ stub_const 'ThinkingSphinx::IndexSet', double(:new => index_set)
17
+ stub_const 'ThinkingSphinx::BatchedSearch', double(:new => batch)
18
+ stub_const 'ThinkingSphinx::Search', DumbSearch
25
19
 
26
- it "should request all facets in a multi-model request if specified" do
27
- ThinkingSphinx.stub!(:search => search)
28
- names = ThinkingSphinx::FacetSearch.new(:all_facets => true).facet_names
20
+ index_set << index << double('index', :facets => [], :name => 'bar_core')
21
+ end
29
22
 
30
- if Riddle.loaded_version.to_i < 2
31
- names.should == ['class_crc', 'city_facet', 'state_facet', 'birthday']
32
- else
33
- names.should == ['sphinx_internal_class', 'city_facet', 'state_facet', 'birthday']
34
- end
23
+ DumbSearch = ::Struct.new(:query, :options) do
24
+ def raw
25
+ [{
26
+ 'sphinx_internal_class' => 'Foo',
27
+ 'price_bracket' => 3,
28
+ 'tag_ids' => '1,2',
29
+ '@count' => 5,
30
+ '@groupby' => 2
31
+ }]
35
32
  end
33
+ end
36
34
 
37
- it "should use the system-set max_matches for limit on facet calls" do
38
- ThinkingSphinx.should_receive(:search) do |options|
39
- options[:max_matches].should == 10_000
40
- options[:limit].should == 10_000
41
- search
42
- end
43
-
44
- ThinkingSphinx::FacetSearch.new
35
+ describe '#[]' do
36
+ it "populates facet results" do
37
+ facet_search[:price_bracket].should == {3 => 5}
45
38
  end
39
+ end
46
40
 
47
- it "should use the default max-matches if there is no explicit setting" do
48
- config.configuration.searchd.max_matches = nil
49
- ThinkingSphinx.should_receive(:search) do |options|
50
- options[:max_matches].should == 1000
51
- options[:limit].should == 1000
52
- search
53
- end
54
-
55
- ThinkingSphinx::FacetSearch.new
56
- end
41
+ describe '#populate' do
42
+ it "queries on each facet with a grouped search in a batch" do
43
+ facet_search.populate
57
44
 
58
- it "should ignore user-provided max_matches and limit on facet calls" do
59
- ThinkingSphinx.should_receive(:search) do |options|
60
- options[:max_matches].should == 10_000
61
- options[:limit].should == 10_000
62
- search
63
- end
64
-
65
- ThinkingSphinx::FacetSearch.new(
66
- :max_matches => 500,
67
- :limit => 200
68
- )
45
+ batch.searches.detect { |search|
46
+ search.options[:group_by] == 'price_bracket'
47
+ }.should_not be_nil
69
48
  end
70
49
 
71
- it "should not use an explicit :page" do
72
- ThinkingSphinx.should_receive(:search) do |options|
73
- options[:page].should == 1
74
- search
75
- end
50
+ it "limits query for a facet to just indices that have that facet" do
51
+ facet_search.populate
76
52
 
77
- ThinkingSphinx::FacetSearch.new(:page => 3)
53
+ batch.searches.detect { |search|
54
+ search.options[:indices] == ['foo_core']
55
+ }.should_not be_nil
78
56
  end
79
57
 
80
- describe "conflicting facets" do
81
- before :each do
82
- @index = ThinkingSphinx::Index::Builder.generate(Alpha) do
83
- indexes :name
84
- has :value, :as => :city, :facet => true
85
- end
86
- end
87
-
88
- after :each do
89
- Alpha.sphinx_facets.delete_at(-1)
90
- end
91
-
92
- it "should raise an error if searching with facets of same name but different type" do
93
- lambda {
94
- facets = ThinkingSphinx.facets :all_facets => true
95
- }.should raise_error
96
- end
97
- end
58
+ it "aliases the class facet from sphinx_internal_class" do
59
+ property.stub :name => 'sphinx_internal_class'
98
60
 
99
- describe ':facets option' do
100
- it "should limit facets to the requested set" do
101
- ThinkingSphinx.should_receive(:search).once.and_return(search)
102
-
103
- ThinkingSphinx::FacetSearch.new(
104
- :classes => [Person], :facets => :state
105
- )
106
- end
107
- end
61
+ facet_search.populate
108
62
 
109
- describe "empty result set for attributes" do
110
- before :each do
111
- ThinkingSphinx.stub!(:search => search)
112
- @facets = ThinkingSphinx::FacetSearch.new(
113
- :classes => [Person], :facets => :state
114
- )
115
- end
116
-
117
- it "should add key as attribute" do
118
- @facets.should have_key(:state)
119
- end
120
-
121
- it "should return an empty hash for the facet results" do
122
- @facets[:state].should be_empty
123
- end
63
+ facet_search[:class].should == {'Foo' => 5}
124
64
  end
125
65
 
126
- describe "non-empty result set" do
127
- before :each do
128
- @person = Person.find(:first)
129
- @people = [@person]
130
- search.stub!(:empty? => false)
131
- search.stub!(:each_with_match).
132
- and_yield(@person, {:attributes => {'@groupby' => @person.city.to_crc32, '@count' => 1}})
133
- ThinkingSphinx::Search.stub!(:bundle_searches => [search])
134
-
135
- @facets = ThinkingSphinx::FacetSearch.new(
136
- :classes => [Person], :facets => :city
137
- )
138
- end
139
-
140
- it "should return a hash" do
141
- @facets.should be_a_kind_of(Hash)
142
- end
143
-
144
- it "should add key as attribute" do
145
- @facets.keys.should include(:city)
146
- end
147
-
148
- it "should return a hash" do
149
- @facets[:city].should == {@person.city => 1}
150
- end
151
- end
152
- end
153
-
154
- describe "#for" do
155
- before do
156
- @person = Person.find(:first)
157
- @people = [@person]
158
- search.stub!(:each_with_match).
159
- and_yield(@person, {:attributes => {'@groupby' => @person.city.to_crc32, '@count' => 1}})
160
- ThinkingSphinx::Search.stub!(:bundle_searches => [search])
161
-
162
- @facets = ThinkingSphinx::FacetSearch.new(
163
- :classes => [Person], :facets => :city
164
- )
165
- end
66
+ it "uses the @groupby value for MVAs" do
67
+ property.stub :name => 'tag_ids', :multi? => true
166
68
 
167
- it "should return the search results for the attribute and key pair" do
168
- ThinkingSphinx.should_receive(:search) do |options|
169
- options[:with].should have_key('city_facet')
170
- options[:with]['city_facet'].should == @person.city.to_crc32
171
- end
69
+ facet_search.populate
172
70
 
173
- @facets.for(:city => @person.city)
71
+ facet_search[:tag_ids].should == {2 => 5}
174
72
  end
175
73
  end
176
74
  end