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,19 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Searching for just instance Ids', :live => true do
4
+ it "returns just the instance ids" do
5
+ pancakes = Article.create! :title => 'Pancakes'
6
+ waffles = Article.create! :title => 'Waffles'
7
+ index
8
+
9
+ Article.search_for_ids('pancakes').to_a.should == [pancakes.id]
10
+ end
11
+
12
+ it "works across the global context" do
13
+ article = Article.create! :title => 'Pancakes'
14
+ book = Book.create! :title => 'American Gods'
15
+ index
16
+
17
+ ThinkingSphinx.search_for_ids.to_a.should =~ [article.id, book.id]
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Searching across models', :live => true do
4
+ it "returns results" do
5
+ article = Article.create! :title => 'Pancakes'
6
+ index
7
+
8
+ ThinkingSphinx.search.first.should == article
9
+ end
10
+
11
+ it "returns results matching the given query" do
12
+ pancakes = Article.create! :title => 'Pancakes'
13
+ waffles = Article.create! :title => 'Waffles'
14
+ index
15
+
16
+ articles = ThinkingSphinx.search 'pancakes'
17
+ articles.should include(pancakes)
18
+ articles.should_not include(waffles)
19
+ end
20
+
21
+ it "handles results from different models" do
22
+ article = Article.create! :title => 'Pancakes'
23
+ book = Book.create! :title => 'American Gods'
24
+ index
25
+
26
+ ThinkingSphinx.search.to_a.should =~ [article, book]
27
+ end
28
+ end
@@ -0,0 +1,56 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Searching on fields', :live => true do
4
+ it "limits results by field" do
5
+ pancakes = Article.create! :title => 'Pancakes'
6
+ waffles = Article.create! :title => 'Waffles',
7
+ :content => 'Different to pancakes - and not quite as tasty.'
8
+ index
9
+
10
+ articles = Article.search :conditions => {:title => 'pancakes'}
11
+ articles.should include(pancakes)
12
+ articles.should_not include(waffles)
13
+ end
14
+
15
+ it "limits results for a field from an association" do
16
+ user = User.create! :name => 'Pat'
17
+ pancakes = Article.create! :title => 'Pancakes', :user => user
18
+ index
19
+
20
+ Article.search(:conditions => {:user => 'pat'}).first.should == pancakes
21
+ end
22
+
23
+ it "returns results with matches from grouped fields" do
24
+ user = User.create! :name => 'Pat'
25
+ pancakes = Article.create! :title => 'Pancakes', :user => user
26
+ waffles = Article.create! :title => 'Waffles', :user => user
27
+ index
28
+
29
+ Article.search('waffles', :conditions => {:title => 'pancakes'}).to_a.
30
+ should == [pancakes]
31
+ end
32
+
33
+ it "returns results with matches from concatenated columns in a field" do
34
+ book = Book.create! :title => 'Night Watch', :author => 'Terry Pratchett'
35
+ index
36
+
37
+ Book.search(:conditions => {:info => 'Night Pratchett'}).to_a.
38
+ should == [book]
39
+ end
40
+
41
+ it "handles NULLs in concatenated fields" do
42
+ book = Book.create! :title => 'Night Watch'
43
+ index
44
+
45
+ Book.search(:conditions => {:info => 'Night Watch'}).to_a.should == [book]
46
+ end
47
+
48
+ it "returns results with matches from file fields" do
49
+ file_path = Rails.root.join('tmp', 'caption.txt')
50
+ File.open(file_path, 'w') { |file| file.print 'Cyberpunk at its best' }
51
+
52
+ book = Book.create! :title => 'Accelerando', :blurb_file => file_path.to_s
53
+
54
+ Book.search('cyberpunk').to_a.should == [book]
55
+ end
56
+ end
@@ -0,0 +1,109 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Searching with filters', :live => true do
4
+ it "limits results by single value boolean filters" do
5
+ pancakes = Article.create! :title => 'Pancakes', :published => true
6
+ waffles = Article.create! :title => 'Waffles', :published => false
7
+ index
8
+
9
+ Article.search(:with => {:published => true}).to_a.should == [pancakes]
10
+ end
11
+
12
+ it "limits results by an array of values" do
13
+ gods = Book.create! :title => 'American Gods', :year => 2001
14
+ boys = Book.create! :title => 'Anansi Boys', :year => 2005
15
+ grave = Book.create! :title => 'The Graveyard Book', :year => 2009
16
+ index
17
+
18
+ Book.search(:with => {:year => [2001, 2005]}).to_a.should == [gods, boys]
19
+ end
20
+
21
+ it "limits results by a ranged filter" do
22
+ gods = Book.create! :title => 'American Gods'
23
+ boys = Book.create! :title => 'Anansi Boys'
24
+ grave = Book.create! :title => 'The Graveyard Book'
25
+
26
+ gods.update_column :created_at, 5.days.ago
27
+ boys.update_column :created_at, 3.days.ago
28
+ grave.update_column :created_at, 1.day.ago
29
+ index
30
+
31
+ Book.search(:with => {:created_at => 6.days.ago..2.days.ago}).to_a.
32
+ should == [gods, boys]
33
+ end
34
+
35
+ it "limits results by exclusive filters on single values" do
36
+ pancakes = Article.create! :title => 'Pancakes', :published => true
37
+ waffles = Article.create! :title => 'Waffles', :published => false
38
+ index
39
+
40
+ Article.search(:without => {:published => true}).to_a.should == [waffles]
41
+ end
42
+
43
+ it "limits results by exclusive filters on arrays of values" do
44
+ gods = Book.create! :title => 'American Gods', :year => 2001
45
+ boys = Book.create! :title => 'Anansi Boys', :year => 2005
46
+ grave = Book.create! :title => 'The Graveyard Book', :year => 2009
47
+ index
48
+
49
+ Book.search(:without => {:year => [2001, 2005]}).to_a.should == [grave]
50
+ end
51
+
52
+ it "limits results by ranged filters on timestamp MVAs" do
53
+ pancakes = Article.create :title => 'Pancakes'
54
+ waffles = Article.create :title => 'Waffles'
55
+
56
+ food = Tag.create :name => 'food'
57
+ flat = Tag.create :name => 'flat'
58
+
59
+ Tagging.create(:tag => food, :article => pancakes).
60
+ update_column :created_at, 5.days.ago
61
+ Tagging.create :tag => flat, :article => pancakes
62
+ Tagging.create(:tag => food, :article => waffles).
63
+ update_column :created_at, 3.days.ago
64
+
65
+ index
66
+
67
+ Article.search(
68
+ :with => {:taggings_at => 1.days.ago..1.day.from_now}
69
+ ).to_a.should == [pancakes]
70
+ end
71
+
72
+ it "limits results with MVAs having all of the given values" do
73
+ pancakes = Article.create :title => 'Pancakes'
74
+ waffles = Article.create :title => 'Waffles'
75
+
76
+ food = Tag.create :name => 'food'
77
+ flat = Tag.create :name => 'flat'
78
+
79
+ Tagging.create :tag => food, :article => pancakes
80
+ Tagging.create :tag => flat, :article => pancakes
81
+ Tagging.create :tag => food, :article => waffles
82
+
83
+ index
84
+
85
+ articles = Article.search :with_all => {:tag_ids => [food.id, flat.id]}
86
+ articles.to_a.should == [pancakes]
87
+ end
88
+
89
+ it "limits results with MVAs that don't contain all the given values" do
90
+ # Matching results may have some of the given values, but cannot have all
91
+ # of them. Certainly an edge case.
92
+ pending "SphinxQL doesn't yet support OR in its WHERE clause"
93
+
94
+ pancakes = Article.create :title => 'Pancakes'
95
+ waffles = Article.create :title => 'Waffles'
96
+
97
+ food = Tag.create :name => 'food'
98
+ flat = Tag.create :name => 'flat'
99
+
100
+ Tagging.create :tag => food, :article => pancakes
101
+ Tagging.create :tag => flat, :article => pancakes
102
+ Tagging.create :tag => food, :article => waffles
103
+
104
+ index
105
+
106
+ articles = Article.search :without_all => {:tag_ids => [food.id, flat.id]}
107
+ articles.to_a.should == [waffles]
108
+ end
109
+ end
@@ -0,0 +1,55 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Searching across STI models', :live => true do
4
+ it "returns super- and sub-class results" do
5
+ platypus = Animal.create :name => 'Platypus'
6
+ duck = Bird.create :name => 'Duck'
7
+ index
8
+
9
+ Animal.search.to_a.should == [platypus, duck]
10
+ end
11
+
12
+ it "limits results based on subclasses" do
13
+ platypus = Animal.create :name => 'Platypus'
14
+ duck = Bird.create :name => 'Duck'
15
+ index
16
+
17
+ Bird.search.to_a.should == [duck]
18
+ end
19
+
20
+ it "returns results for deeper subclasses when searching on their parents" do
21
+ platypus = Animal.create :name => 'Platypus'
22
+ duck = Bird.create :name => 'Duck'
23
+ emu = FlightlessBird.create :name => 'Emu'
24
+ index
25
+
26
+ Bird.search.to_a.should == [duck, emu]
27
+ end
28
+
29
+ it "returns results for deeper subclasses" do
30
+ platypus = Animal.create :name => 'Platypus'
31
+ duck = Bird.create :name => 'Duck'
32
+ emu = FlightlessBird.create :name => 'Emu'
33
+ index
34
+
35
+ FlightlessBird.search.to_a.should == [emu]
36
+ end
37
+
38
+ it "filters out sibling subclasses" do
39
+ platypus = Animal.create :name => 'Platypus'
40
+ duck = Bird.create :name => 'Duck'
41
+ otter = Mammal.create :name => 'Otter'
42
+ index
43
+
44
+ Bird.search.to_a.should == [duck]
45
+ end
46
+
47
+ it "obeys :classes if supplied" do
48
+ platypus = Animal.create :name => 'Platypus'
49
+ duck = Bird.create :name => 'Duck'
50
+ emu = FlightlessBird.create :name => 'Emu'
51
+ index
52
+
53
+ Bird.search(nil, :skip_sti => true, :classes=>[Bird, FlightlessBird]).to_a.should == [duck, emu]
54
+ end
55
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: UTF-8
2
+ require 'acceptance/spec_helper'
3
+
4
+ describe 'Searching within a model', :live => true do
5
+ it "returns results" do
6
+ article = Article.create! :title => 'Pancakes'
7
+ index
8
+
9
+ Article.search.first.should == article
10
+ end
11
+
12
+ it "returns results matching the given query" do
13
+ pancakes = Article.create! :title => 'Pancakes'
14
+ waffles = Article.create! :title => 'Waffles'
15
+ index
16
+
17
+ articles = Article.search 'pancakes'
18
+ articles.should include(pancakes)
19
+ articles.should_not include(waffles)
20
+ end
21
+
22
+ it "handles unicode characters" do
23
+ istanbul = City.create! :name => 'İstanbul'
24
+ index
25
+
26
+ City.search('İstanbul').to_a.should == [istanbul]
27
+ end
28
+
29
+ it "will star provided queries on request" do
30
+ article = Article.create! :title => 'Pancakes'
31
+ index
32
+
33
+ Article.search('cake', :star => true).first.should == article
34
+ end
35
+
36
+ it "allows for searching on specific indices" do
37
+ article = Article.create :title => 'Pancakes'
38
+ index
39
+
40
+ articles = Article.search('pancake', :indices => ['stemmed_article_core'])
41
+ articles.to_a.should == [article]
42
+ end
43
+ end
44
+
45
+ describe 'Searching within a model with a realtime index', :live => true do
46
+ it "returns results" do
47
+ pending "Sphinx bug on OS X means I can't currently test this."
48
+ product = Product.create! :name => 'Widget'
49
+
50
+ Product.search.first.should == product
51
+ end
52
+ end
@@ -0,0 +1,41 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Sorting search results', :live => true do
4
+ it "sorts by a given clause" do
5
+ gods = Book.create! :title => 'American Gods', :year => 2001
6
+ grave = Book.create! :title => 'The Graveyard Book', :year => 2009
7
+ boys = Book.create! :title => 'Anansi Boys', :year => 2005
8
+ index
9
+
10
+ Book.search(:order => 'year ASC').to_a.should == [gods, boys, grave]
11
+ end
12
+
13
+ it "sorts by a given attribute in ascending order" do
14
+ gods = Book.create! :title => 'American Gods', :year => 2001
15
+ grave = Book.create! :title => 'The Graveyard Book', :year => 2009
16
+ boys = Book.create! :title => 'Anansi Boys', :year => 2005
17
+ index
18
+
19
+ Book.search(:order => :year).to_a.should == [gods, boys, grave]
20
+ end
21
+
22
+ it "sorts by a given sortable field" do
23
+ gods = Book.create! :title => 'American Gods', :year => 2001
24
+ grave = Book.create! :title => 'The Graveyard Book', :year => 2009
25
+ boys = Book.create! :title => 'Anansi Boys', :year => 2005
26
+ index
27
+
28
+ Book.search(:order => :title).to_a.should == [gods, boys, grave]
29
+ end
30
+
31
+ it "can sort with a provided expression" do
32
+ gods = Book.create! :title => 'American Gods', :year => 2001
33
+ grave = Book.create! :title => 'The Graveyard Book', :year => 2009
34
+ boys = Book.create! :title => 'Anansi Boys', :year => 2005
35
+ index
36
+
37
+ Book.search(
38
+ :select => 'year MOD 2004 as mod_year', :order => 'mod_year ASC'
39
+ ).to_a.should == [boys, grave, gods]
40
+ end
41
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ root = File.expand_path File.dirname(__FILE__)
4
+ Dir["#{root}/support/**/*.rb"].each { |file| require file }
@@ -0,0 +1,62 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'specifying SQL for index definitions' do
4
+ it "renders the SQL with the join" do
5
+ index = ThinkingSphinx::ActiveRecord::Index.new(:article)
6
+ index.definition_block = Proc.new {
7
+ indexes title
8
+ join user
9
+ }
10
+ index.render
11
+ index.sources.first.sql_query.should match(/LEFT OUTER JOIN .users./)
12
+ end
13
+
14
+ it "handles deep joins" do
15
+ index = ThinkingSphinx::ActiveRecord::Index.new(:article)
16
+ index.definition_block = Proc.new {
17
+ indexes title
18
+ join user.articles
19
+ }
20
+ index.render
21
+
22
+ query = index.sources.first.sql_query
23
+ query.should match(/LEFT OUTER JOIN .users./)
24
+ query.should match(/LEFT OUTER JOIN .articles./)
25
+ end
26
+
27
+ it "handles GROUP BY clauses" do
28
+ index = ThinkingSphinx::ActiveRecord::Index.new(:article)
29
+ index.definition_block = Proc.new {
30
+ indexes title
31
+ group_by 'lat'
32
+ }
33
+ index.render
34
+
35
+ query = index.sources.first.sql_query
36
+ query.should match(/GROUP BY .articles.\..id., .articles.\..title., .articles.\..id., lat/)
37
+ end
38
+
39
+ it "handles WHERE clauses" do
40
+ index = ThinkingSphinx::ActiveRecord::Index.new(:article)
41
+ index.definition_block = Proc.new {
42
+ indexes title
43
+ where "title != 'secret'"
44
+ }
45
+ index.render
46
+
47
+ query = index.sources.first.sql_query
48
+ query.should match(/WHERE .+title != 'secret'.+ GROUP BY/)
49
+ end
50
+
51
+ it "handles manual MVA declarations" do
52
+ index = ThinkingSphinx::ActiveRecord::Index.new(:article)
53
+ index.definition_block = Proc.new {
54
+ indexes title
55
+ has "taggings.tag_ids", :as => :tag_ids, :type => :integer,
56
+ :multi => true
57
+ }
58
+ index.render
59
+
60
+ index.sources.first.sql_attr_multi.should == ['uint tag_ids from field']
61
+ end
62
+ end
@@ -0,0 +1,49 @@
1
+ require 'acceptance/spec_helper'
2
+
3
+ describe 'Sphinx scopes', :live => true do
4
+ it "allows calling sphinx scopes from models" do
5
+ gods = Book.create! :title => 'American Gods', :year => 2001
6
+ boys = Book.create! :title => 'Anansi Boys', :year => 2005
7
+ grave = Book.create! :title => 'The Graveyard Book', :year => 2009
8
+ index
9
+
10
+ Book.by_year(2009).to_a.should == [grave]
11
+ end
12
+
13
+ it "allows scopes to return both query and options" do
14
+ gods = Book.create! :title => 'American Gods', :year => 2001
15
+ boys = Book.create! :title => 'Anansi Boys', :year => 2005
16
+ grave = Book.create! :title => 'The Graveyard Book', :year => 2009
17
+ index
18
+
19
+ Book.by_query_and_year('Graveyard', 2009).to_a.should == [grave]
20
+ end
21
+
22
+ it "allows chaining of scopes" do
23
+ gods = Book.create! :title => 'American Gods', :year => 2001
24
+ boys = Book.create! :title => 'Anansi Boys', :year => 2005
25
+ grave = Book.create! :title => 'The Graveyard Book', :year => 2009
26
+ index
27
+
28
+ Book.by_year(2001).by_query_and_year('Graveyard', 2009).to_a.
29
+ should == [grave]
30
+ end
31
+
32
+ it "allows further search calls on scopes" do
33
+ gaiman = Book.create! :title => 'American Gods'
34
+ pratchett = Book.create! :title => 'Small Gods'
35
+ index
36
+
37
+ Book.by_query('Gods').search('Small').to_a.should == [pratchett]
38
+ end
39
+
40
+ it "allows accessing counts on scopes" do
41
+ Book.create! :title => 'American Gods'
42
+ Book.create! :title => 'Anansi Boys'
43
+ Book.create! :title => 'Small Gods'
44
+ Book.create! :title => 'Night Watch'
45
+ index
46
+
47
+ Book.by_query('gods').count.should == 2
48
+ end
49
+ end