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,23 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Scoping association search calls by foreign keys', :live => true do
4
+ it "limits results to those matching the foreign key" do
5
+ pat = User.create :name => 'Pat'
6
+ melbourne = Article.create :title => 'Guide to Melbourne', :user => pat
7
+ paul = User.create :name => 'Paul'
8
+ dublin = Article.create :title => 'Guide to Dublin', :user => paul
9
+ index
10
+
11
+ pat.articles.search('Guide').to_a.should == [melbourne]
12
+ end
13
+
14
+ it "limits id-only results to those matching the foreign key" do
15
+ pat = User.create :name => 'Pat'
16
+ melbourne = Article.create :title => 'Guide to Melbourne', :user => pat
17
+ paul = User.create :name => 'Paul'
18
+ dublin = Article.create :title => 'Guide to Dublin', :user => paul
19
+ index
20
+
21
+ pat.articles.search_for_ids('Guide').to_a.should == [melbourne.id]
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Accessing attributes directly via search results', :live => true do
4
+ it "allows access to attribute values" do
5
+ Book.create! :title => 'American Gods', :year => 2001
6
+ index
7
+
8
+ search = Book.search('gods')
9
+ search.context[:panes] << ThinkingSphinx::Panes::AttributesPane
10
+
11
+ search.first.sphinx_attributes['year'].should == 2001
12
+ end
13
+
14
+ it "provides direct access to the search weight/relevance scores" do
15
+ Book.create! :title => 'American Gods', :year => 2001
16
+ index
17
+
18
+ search = Book.search('gods', :select => '*, @weight')
19
+ search.context[:panes] << ThinkingSphinx::Panes::WeightPane
20
+
21
+ search.first.weight.should == 3500
22
+ end
23
+
24
+ it "can enumerate with the weight" do
25
+ gods = Book.create! :title => 'American Gods', :year => 2001
26
+ index
27
+
28
+ search = Book.search('gods', :select => '*, @weight')
29
+ search.masks << ThinkingSphinx::Masks::WeightEnumeratorMask
30
+
31
+ expectations = [[gods, 3500]]
32
+ search.each_with_weight do |result, weight|
33
+ expectation = expectations.shift
34
+
35
+ result.should == expectation.first
36
+ weight.should == expectation.last
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Update attributes automatically where possible', :live => true do
4
+ it "updates boolean values" do
5
+ article = Article.create :title => 'Pancakes', :published => false
6
+ index
7
+
8
+ Article.search('pancakes', :with => {:published => true}).should be_empty
9
+
10
+ article.published = true
11
+ article.save
12
+
13
+ Article.search('pancakes', :with => {:published => true}).to_a
14
+ .should == [article]
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Executing multiple searches in one Sphinx call', :live => true do
4
+ it "returns results matching the given queries" do
5
+ pancakes = Article.create! :title => 'Pancakes'
6
+ waffles = Article.create! :title => 'Waffles'
7
+ index
8
+
9
+ batch = ThinkingSphinx::BatchedSearch.new
10
+ batch.searches << Article.search('pancakes')
11
+ batch.searches << Article.search('waffles')
12
+
13
+ batch.populate
14
+
15
+ batch.searches.first.should include(pancakes)
16
+ batch.searches.first.should_not include(waffles)
17
+
18
+ batch.searches.last.should include(waffles)
19
+ batch.searches.last.should_not include(pancakes)
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe '64 bit integer support' do
4
+ it "ensures all internal id attributes are big ints if one is" do
5
+ large_index = ThinkingSphinx::ActiveRecord::Index.new(:tweet)
6
+ large_index.definition_block = Proc.new {
7
+ indexes text
8
+ }
9
+
10
+ small_index = ThinkingSphinx::ActiveRecord::Index.new(:article)
11
+ small_index.definition_block = Proc.new {
12
+ indexes title
13
+ }
14
+
15
+ ThinkingSphinx::Configuration::ConsistentIds.new(
16
+ [small_index, large_index]
17
+ ).reconcile
18
+
19
+ large_index.sources.first.attributes.detect { |attribute|
20
+ attribute.name == 'sphinx_internal_id'
21
+ }.type.should == :bigint
22
+
23
+ small_index.sources.first.attributes.detect { |attribute|
24
+ attribute.name == 'sphinx_internal_id'
25
+ }.type.should == :bigint
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Accessing excerpts for methods on a search result', :live => true do
4
+ it "returns excerpts for a given method" do
5
+ Book.create! :title => 'American Gods', :year => 2001
6
+ index
7
+
8
+ search = Book.search('gods')
9
+ search.context[:panes] << ThinkingSphinx::Panes::ExcerptsPane
10
+
11
+ search.first.excerpts.title.
12
+ should == 'American <span class="match">Gods</span>'
13
+ end
14
+ end
@@ -0,0 +1,122 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Faceted searching', :live => true do
4
+ it "provides facet breakdowns across marked integer attributes" do
5
+ blue = Colour.create! :name => 'blue'
6
+ red = Colour.create! :name => 'red'
7
+ green = Colour.create! :name => 'green'
8
+
9
+ Tee.create! :colour => blue
10
+ Tee.create! :colour => blue
11
+ Tee.create! :colour => red
12
+ Tee.create! :colour => green
13
+ Tee.create! :colour => green
14
+ Tee.create! :colour => green
15
+ index
16
+
17
+ Tee.facets.to_hash[:colour_id].should == {
18
+ blue.id => 2, red.id => 1, green.id => 3
19
+ }
20
+ end
21
+
22
+ it "provides facet breakdowns across classes" do
23
+ Tee.create!
24
+ Tee.create!
25
+ City.create!
26
+ index
27
+
28
+ ThinkingSphinx.facets.to_hash[:class].should == {
29
+ 'Tee' => 2, 'City' => 1
30
+ }
31
+ end
32
+
33
+ it "handles field facets" do
34
+ Book.create! :title => 'American Gods', :author => 'Neil Gaiman'
35
+ Book.create! :title => 'Anansi Boys', :author => 'Neil Gaiman'
36
+ Book.create! :title => 'Snuff', :author => 'Terry Pratchett'
37
+ index
38
+
39
+ Book.facets.to_hash[:author].should == {
40
+ 'Neil Gaiman' => 2, 'Terry Pratchett' => 1
41
+ }
42
+ end
43
+
44
+ it "handles MVA facets" do
45
+ pancakes = Tag.create! :name => 'pancakes'
46
+ waffles = Tag.create! :name => 'waffles'
47
+
48
+ user = User.create!
49
+ Tagging.create! :article => Article.create!(:user => user),
50
+ :tag => pancakes
51
+ Tagging.create! :article => Article.create!(:user => user),
52
+ :tag => waffles
53
+
54
+ user = User.create!
55
+ Tagging.create! :article => Article.create!(:user => user),
56
+ :tag => pancakes
57
+ index
58
+
59
+ User.facets.to_hash[:tag_ids].should == {
60
+ pancakes.id => 2, waffles.id => 1
61
+ }
62
+ end
63
+
64
+ it "can filter on integer facet results" do
65
+ blue = Colour.create! :name => 'blue'
66
+ red = Colour.create! :name => 'red'
67
+
68
+ b1 = Tee.create! :colour => blue
69
+ b2 = Tee.create! :colour => blue
70
+ r1 = Tee.create! :colour => red
71
+ index
72
+
73
+ Tee.facets.for(:colour_id => blue.id).to_a.should == [b1, b2]
74
+ end
75
+
76
+ it "can filter on MVA facet results" do
77
+ pancakes = Tag.create! :name => 'pancakes'
78
+ waffles = Tag.create! :name => 'waffles'
79
+
80
+ u1 = User.create!
81
+ Tagging.create! :article => Article.create!(:user => u1), :tag => pancakes
82
+ Tagging.create! :article => Article.create!(:user => u1), :tag => waffles
83
+
84
+ u2 = User.create!
85
+ Tagging.create! :article => Article.create!(:user => u2), :tag => pancakes
86
+ index
87
+
88
+ User.facets.for(:tag_ids => waffles.id).to_a.should == [u1]
89
+ end
90
+
91
+ it "can filter on string facet results" do
92
+ gods = Book.create! :title => 'American Gods', :author => 'Neil Gaiman'
93
+ boys = Book.create! :title => 'Anansi Boys', :author => 'Neil Gaiman'
94
+ snuff = Book.create! :title => 'Snuff', :author => 'Terry Pratchett'
95
+ index
96
+
97
+ Book.facets.for(:author => 'Neil Gaiman').to_a.should == [gods, boys]
98
+ end
99
+
100
+ it "allows enumeration" do
101
+ blue = Colour.create! :name => 'blue'
102
+ red = Colour.create! :name => 'red'
103
+
104
+ b1 = Tee.create! :colour => blue
105
+ b2 = Tee.create! :colour => blue
106
+ r1 = Tee.create! :colour => red
107
+ index
108
+
109
+ calls = 0
110
+ expectations = [
111
+ [:sphinx_internal_class, {'Tee' => 3}],
112
+ [:colour_id, {blue.id => 2, red.id => 1}],
113
+ [:class, {'Tee' => 3}]
114
+ ]
115
+ Tee.facets.each do |facet, hash|
116
+ facet.should == expectations[calls].first
117
+ hash.should == expectations[calls].last
118
+
119
+ calls += 1
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,39 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Searching by latitude and longitude', :live => true do
4
+ it "orders by distance" do
5
+ mel = City.create :name => 'Melbourne', :lat => -0.6599720, :lng => 2.530082
6
+ syd = City.create :name => 'Sydney', :lat => -0.5909679, :lng => 2.639131
7
+ bri = City.create :name => 'Brisbane', :lat => -0.4794031, :lng => 2.670838
8
+ index
9
+
10
+ City.search(:geo => [-0.616241, 2.602712], :order => 'geodist ASC').
11
+ to_a.should == [syd, mel, bri]
12
+ end
13
+
14
+ it "filters by distance" do
15
+ mel = City.create :name => 'Melbourne', :lat => -0.6599720, :lng => 2.530082
16
+ syd = City.create :name => 'Sydney', :lat => -0.5909679, :lng => 2.639131
17
+ bri = City.create :name => 'Brisbane', :lat => -0.4794031, :lng => 2.670838
18
+ index
19
+
20
+ City.search(
21
+ :geo => [-0.616241, 2.602712],
22
+ :with => {:geodist => 0.0..470_000.0}
23
+ ).to_a.should == [mel, syd]
24
+ end
25
+
26
+ it "provides the distance for each search result" do
27
+ mel = City.create :name => 'Melbourne', :lat => -0.6599720, :lng => 2.530082
28
+ syd = City.create :name => 'Sydney', :lat => -0.5909679, :lng => 2.639131
29
+ bri = City.create :name => 'Brisbane', :lat => -0.4794031, :lng => 2.670838
30
+ index
31
+
32
+ cities = City.search(:geo => [-0.616241, 2.602712], :order => 'geodist ASC')
33
+ if ActiveRecord::Base.configurations['test']['adapter'][/postgres/]
34
+ cities.first.geodist.should == 250331.234375
35
+ else # mysql
36
+ cities.first.geodist.should == 250326.906250
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,77 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Grouping search results by attributes', :live => true do
4
+ it "groups by the provided attribute" do
5
+ snuff = Book.create! :title => 'Snuff', :year => 2011
6
+ earth = Book.create! :title => 'The Long Earth', :year => 2012
7
+ dodger = Book.create! :title => 'Dodger', :year => 2012
8
+
9
+ index
10
+
11
+ Book.search(:group_by => :year).to_a.should == [snuff, earth]
12
+ end
13
+
14
+ it "allows sorting within the group" do
15
+ snuff = Book.create! :title => 'Snuff', :year => 2011
16
+ earth = Book.create! :title => 'The Long Earth', :year => 2012
17
+ dodger = Book.create! :title => 'Dodger', :year => 2012
18
+
19
+ index
20
+
21
+ Book.search(:group_by => :year, :order_group_by => 'title ASC').to_a.
22
+ should == [snuff, dodger]
23
+ end
24
+
25
+ it "allows enumerating by count" do
26
+ snuff = Book.create! :title => 'Snuff', :year => 2011
27
+ earth = Book.create! :title => 'The Long Earth', :year => 2012
28
+ dodger = Book.create! :title => 'Dodger', :year => 2012
29
+
30
+ index
31
+
32
+ expectations = [[snuff, 1], [earth, 2]]
33
+
34
+ Book.search(:group_by => :year).each_with_count do |book, count|
35
+ expectation = expectations.shift
36
+
37
+ book.should == expectation.first
38
+ count.should == expectation.last
39
+ end
40
+ end
41
+
42
+ it "allows enumerating by group" do
43
+ snuff = Book.create! :title => 'Snuff', :year => 2011
44
+ earth = Book.create! :title => 'The Long Earth', :year => 2012
45
+ dodger = Book.create! :title => 'Dodger', :year => 2012
46
+
47
+ index
48
+
49
+ expectations = [[snuff, 2011], [earth, 2012]]
50
+
51
+ Book.search(:group_by => :year).each_with_group do |book, group|
52
+ expectation = expectations.shift
53
+
54
+ book.should == expectation.first
55
+ group.should == expectation.last
56
+ end
57
+ end
58
+
59
+ it "allows enumerating by group and count" do
60
+ snuff = Book.create! :title => 'Snuff', :year => 2011
61
+ earth = Book.create! :title => 'The Long Earth', :year => 2012
62
+ dodger = Book.create! :title => 'Dodger', :year => 2012
63
+
64
+ index
65
+
66
+ expectations = [[snuff, 2011, 1], [earth, 2012, 2]]
67
+ search = Book.search(:group_by => :year)
68
+
69
+ search.each_with_group_and_count do |book, group, count|
70
+ expectation = expectations.shift
71
+
72
+ book.should == expectation[0]
73
+ group.should == expectation[1]
74
+ count.should == expectation[2]
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,24 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Paginating search results', :live => true do
4
+ it "tracks how many results there are in total" do
5
+ 21.times { |number| Article.create :title => "Article #{number}" }
6
+ index
7
+
8
+ Article.search.total_entries.should == 21
9
+ end
10
+
11
+ it "paginates the result set by default" do
12
+ 21.times { |number| Article.create :title => "Article #{number}" }
13
+ index
14
+
15
+ Article.search.length.should == 20
16
+ end
17
+
18
+ it "tracks the number of pages" do
19
+ 21.times { |number| Article.create :title => "Article #{number}" }
20
+ index
21
+
22
+ Article.search.total_pages.should == 2
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Hiding deleted records from search results', :live => true do
4
+ it "does not return deleted records" do
5
+ pancakes = Article.create! :title => 'Pancakes'
6
+ index
7
+
8
+ Article.search('pancakes').should_not be_empty
9
+ pancakes.destroy
10
+
11
+ Article.search('pancakes').should be_empty
12
+ end
13
+
14
+ it "will catch stale records deleted without callbacks being fired" do
15
+ pancakes = Article.create! :title => 'Pancakes'
16
+ index
17
+
18
+ Article.search('pancakes').should_not be_empty
19
+ Article.connection.execute "DELETE FROM articles WHERE id = #{pancakes.id}"
20
+
21
+ Article.search('pancakes').should be_empty
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Get search result counts', :live => true do
4
+ it "returns counts for a single model" do
5
+ 4.times { |i| Article.create :title => "Article #{i}" }
6
+ index
7
+
8
+ Article.search_count.should == 4
9
+ end
10
+
11
+ it "returns counts across all models" do
12
+ 3.times { |i| Article.create :title => "Article #{i}" }
13
+ 2.times { |i| Book.create :title => "Book #{i}" }
14
+ index
15
+
16
+ ThinkingSphinx.count.should == 5
17
+ end
18
+ end