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,68 @@
1
+ module ThinkingSphinx; end
2
+
3
+ require 'active_support/core_ext/string/inflections'
4
+ require 'thinking_sphinx/index_set'
5
+
6
+ describe ThinkingSphinx::IndexSet do
7
+ let(:set) { ThinkingSphinx::IndexSet.new classes, indices,
8
+ configuration }
9
+ let(:classes) { [] }
10
+ let(:indices) { [] }
11
+ let(:configuration) { double('configuration', :preload_indices => true,
12
+ :indices => []) }
13
+ let(:ar_base) { double('ActiveRecord::Base') }
14
+
15
+ before :each do
16
+ stub_const 'ActiveRecord::Base', ar_base
17
+ end
18
+
19
+ def class_double(name, *superclasses)
20
+ klass = double 'class', :name => name, :class => Class
21
+ klass.stub :ancestors => ([klass] + superclasses + [ar_base])
22
+ klass
23
+ end
24
+
25
+ describe '#to_a' do
26
+ it "ensures the indices are loaded" do
27
+ configuration.should_receive(:preload_indices)
28
+
29
+ set.to_a
30
+ end
31
+
32
+ it "returns all indices when no models or indices are specified" do
33
+ article_core = double('index', :name => 'article_core')
34
+ user_core = double('index', :name => 'user_core')
35
+ configuration.indices.replace [article_core, user_core]
36
+
37
+ set.to_a.should == [article_core, user_core]
38
+ end
39
+
40
+ it "uses indices for the given classes" do
41
+ classes << class_double('Article')
42
+
43
+ configuration.should_receive(:indices_for_references).with(:article).
44
+ and_return([])
45
+
46
+ set.to_a
47
+ end
48
+
49
+ it "requests indices for any superclasses" do
50
+ classes << class_double('OpinionArticle', class_double('Article'))
51
+
52
+ configuration.should_receive(:indices_for_references).
53
+ with(:opinion_article, :article).and_return([])
54
+
55
+ set.to_a
56
+ end
57
+
58
+ it "uses named indices if names are provided" do
59
+ article_core = double('index', :name => 'article_core')
60
+ user_core = double('index', :name => 'user_core')
61
+ configuration.indices.replace [article_core, user_core]
62
+
63
+ indices << 'article_core'
64
+
65
+ set.to_a.should == [article_core]
66
+ end
67
+ end
68
+ end
@@ -1,188 +1,124 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ThinkingSphinx::Index do
4
- describe "prefix_fields method" do
5
- before :each do
6
- @index = ThinkingSphinx::Index.new(Person)
7
-
8
- @field_a = stub('field', :prefixes => true)
9
- @field_b = stub('field', :prefixes => false)
10
- @field_c = stub('field', :prefixes => true)
11
-
12
- @index.stub!(:fields => [@field_a, @field_b, @field_c])
13
- end
4
+ describe '.define' do
5
+ let(:index) { double('index', :definition_block= => nil) }
6
+ let(:config) { Struct.new(:indices).new([]) }
14
7
 
15
- it "should return fields that are flagged as prefixed" do
16
- @index.prefix_fields.should include(@field_a)
17
- @index.prefix_fields.should include(@field_c)
18
- end
19
-
20
- it "should not return fields that aren't flagged as prefixed" do
21
- @index.prefix_fields.should_not include(@field_b)
22
- end
23
- end
24
-
25
- describe "infix_fields method" do
26
8
  before :each do
27
- @index = ThinkingSphinx::Index.new(Person)
28
-
29
- @field_a = stub('field', :infixes => true)
30
- @field_b = stub('field', :infixes => false)
31
- @field_c = stub('field', :infixes => true)
32
-
33
- @index.stub!(:fields => [@field_a, @field_b, @field_c])
34
- end
35
-
36
- it "should return fields that are flagged as infixed" do
37
- @index.infix_fields.should include(@field_a)
38
- @index.infix_fields.should include(@field_c)
39
- end
40
-
41
- it "should not return fields that aren't flagged as infixed" do
42
- @index.infix_fields.should_not include(@field_b)
9
+ ThinkingSphinx::Configuration.stub :instance => config
43
10
  end
44
- end
45
-
46
- describe '.name_for' do
47
- it "should return the model's name downcased" do
48
- ThinkingSphinx::Index.name_for(Alpha).should == 'alpha'
49
- end
50
-
51
- it "should separate words by underscores" do
52
- ThinkingSphinx::Index.name_for(ActiveRecord).should == 'active_record'
53
- end
54
-
55
- it "should separate namespaces by underscores" do
56
- ThinkingSphinx::Index.name_for(ActiveRecord::Base).
57
- should == 'active_record_base'
58
- end
59
- end
60
11
 
61
- describe '#name' do
62
- it "should return the downcased name of the index's model" do
63
- ThinkingSphinx::Index.new(Alpha).name.should == 'alpha'
64
- end
65
-
66
- it "should return a custom name if one is set" do
67
- index = ThinkingSphinx::Index.new(Alpha)
68
- index.name = 'custom'
69
- index.name.should == 'custom'
70
- end
71
- end
72
-
73
- describe '#core_name' do
74
- it "should take the index's name and append _core" do
75
- ThinkingSphinx::Index.new(Alpha).core_name.should == 'alpha_core'
76
- end
77
- end
78
-
79
- describe '#delta_name' do
80
- it "should take the index's name and append _delta" do
81
- ThinkingSphinx::Index.new(Alpha).delta_name.should == 'alpha_delta'
82
- end
83
- end
84
-
85
- describe '#all_names' do
86
- it "should return the core index name by default" do
87
- ThinkingSphinx::Index.new(Alpha).all_names.should == ['alpha_core']
88
- end
89
-
90
- it "should return both core and delta names if deltas are enabled" do
91
- index = ThinkingSphinx::Index.new(Alpha)
92
- index.delta_object = stub('delta')
93
-
94
- index.all_names.should == ['alpha_core', 'alpha_delta']
95
- end
96
-
97
- it "should respect custom names" do
98
- index = ThinkingSphinx::Index.new(Alpha)
99
- index.name = 'custom'
100
-
101
- index.all_names.should == ['custom_core']
102
- end
103
-
104
- it "should respect custom names when deltas are enabled" do
105
- index = ThinkingSphinx::Index.new(Alpha)
106
- index.name = 'custom'
107
- index.delta_object = stub('delta')
108
-
109
- index.all_names.should == ['custom_core', 'custom_delta']
110
- end
111
- end
12
+ context 'with ActiveRecord' do
13
+ before :each do
14
+ ThinkingSphinx::ActiveRecord::Index.stub :new => index
15
+ end
112
16
 
113
- describe '#to_riddle' do
114
- it "should return two Riddle indexes if deltas are disabled" do
115
- index = ThinkingSphinx::Index.new(Alpha)
17
+ it "creates an ActiveRecord index" do
18
+ ThinkingSphinx::ActiveRecord::Index.should_receive(:new).
19
+ with(:user, :with => :active_record).and_return index
116
20
 
117
- index.to_riddle(0).length.should == 2
118
- end
21
+ ThinkingSphinx::Index.define(:user, :with => :active_record)
22
+ end
119
23
 
120
- it "should return three Riddle indexes if deltas are enabled" do
121
- index = ThinkingSphinx::Index.new(Beta)
122
- index.delta_object = stub('delta')
24
+ it "returns the ActiveRecord index" do
25
+ ThinkingSphinx::Index.define(:user, :with => :active_record).
26
+ should == [index]
27
+ end
123
28
 
124
- index.to_riddle(0).length.should == 3
125
- end
29
+ it "adds the index to the collection of indices" do
30
+ ThinkingSphinx::Index.define(:user, :with => :active_record)
126
31
 
127
- it "should include a distributed index" do
128
- index = ThinkingSphinx::Index.new(Alpha)
32
+ config.indices.should include(index)
33
+ end
129
34
 
130
- index.to_riddle(0).last.
131
- should be_a(Riddle::Configuration::DistributedIndex)
132
- end
35
+ it "sets the block in the index" do
36
+ index.should_receive(:definition_block=).with instance_of(Proc)
133
37
 
134
- context 'core index' do
135
- it "should use the core name" do
136
- @index = ThinkingSphinx::Index.new(Alpha).to_riddle(0).first
137
- @index.name.should == 'alpha_core'
38
+ ThinkingSphinx::Index.define(:user, :with => :active_record) do
39
+ indexes name
40
+ end
138
41
  end
139
42
 
140
- it "should not try to set disable_range on the index" do
141
- ThinkingSphinx::Configuration.instance.
142
- index_options[:disable_range] = true
143
-
144
- lambda {
145
- @index = ThinkingSphinx::Index.new(Alpha).to_riddle(0).first
146
- }.should_not raise_error(NoMethodError)
43
+ context 'with a delta' do
44
+ let(:delta_index) { double('delta index', :definition_block= => nil) }
45
+ let(:processor) { double('delta processor') }
46
+
47
+ before :each do
48
+ ThinkingSphinx::Deltas.stub :processor_for => processor
49
+ ThinkingSphinx::ActiveRecord::Index.stub(:new).
50
+ and_return(index, delta_index)
51
+ end
52
+
53
+ it "creates two indices with delta settings" do
54
+ ThinkingSphinx::ActiveRecord::Index.unstub :new
55
+ ThinkingSphinx::ActiveRecord::Index.should_receive(:new).
56
+ with(:user,
57
+ hash_including(:delta? => false, :delta_processor => processor)
58
+ ).once.
59
+ and_return index
60
+ ThinkingSphinx::ActiveRecord::Index.should_receive(:new).
61
+ with(:user,
62
+ hash_including(:delta? => true, :delta_processor => processor)
63
+ ).once.
64
+ and_return delta_index
65
+
66
+ ThinkingSphinx::Index.define :user,
67
+ :with => :active_record,
68
+ :delta => true
69
+ end
70
+
71
+ it "appends both indices to the collection" do
72
+ ThinkingSphinx::Index.define :user,
73
+ :with => :active_record,
74
+ :delta => true
75
+
76
+ config.indices.should include(index)
77
+ config.indices.should include(delta_index)
78
+ end
79
+
80
+ it "sets the block in the index" do
81
+ index.should_receive(:definition_block=).with instance_of(Proc)
82
+ delta_index.should_receive(:definition_block=).with instance_of(Proc)
83
+
84
+ ThinkingSphinx::Index.define(:user,
85
+ :with => :active_record,
86
+ :delta => true) do
87
+ indexes name
88
+ end
89
+ end
147
90
  end
148
91
  end
149
92
 
150
- context 'delta index' do
93
+ context 'with Real-Time' do
151
94
  before :each do
152
- index = ThinkingSphinx::Index.new(Beta)
153
- index.delta_object = stub('delta')
154
- @index = index.to_riddle(0)[1]
95
+ ThinkingSphinx::RealTime::Index.stub :new => index
155
96
  end
156
97
 
157
- it "should use the delta name" do
158
- @index.name.should == 'beta_delta'
159
- end
160
- end
98
+ it "creates a real-time index" do
99
+ ThinkingSphinx::RealTime::Index.should_receive(:new).
100
+ with(:user, :with => :real_time).and_return index
161
101
 
162
- context 'distributed index' do
163
- it "should use the index's name" do
164
- index = ThinkingSphinx::Index.new(Alpha)
165
-
166
- index.to_riddle(0).last.name.should == 'alpha'
102
+ ThinkingSphinx::Index.define(:user, :with => :real_time)
167
103
  end
168
104
 
169
- it "should add the core index" do
170
- index = ThinkingSphinx::Index.new(Alpha)
171
-
172
- index.to_riddle(0).last.local_indices.should include('alpha_core')
105
+ it "returns the ActiveRecord index" do
106
+ ThinkingSphinx::Index.define(:user, :with => :real_time).
107
+ should == [index]
173
108
  end
174
109
 
175
- it "should add the delta index if there is one" do
176
- index = ThinkingSphinx::Index.new(Beta)
177
- index.delta_object = stub('delta')
110
+ it "adds the index to the collection of indices" do
111
+ ThinkingSphinx::Index.define(:user, :with => :real_time)
178
112
 
179
- index.to_riddle(0).last.local_indices.should include('beta_delta')
113
+ config.indices.should include(index)
180
114
  end
181
115
 
182
- it "should add additional local indexes if there are any" do
183
- index = ThinkingSphinx::Index.new(Alpha)
184
- index.additional_indices << "other_index_core"
185
- index.to_riddle(0).last.local_indices.should include('other_index_core')
116
+ it "sets the block in the index" do
117
+ index.should_receive(:definition_block=).with instance_of(Proc)
118
+
119
+ ThinkingSphinx::Index.define(:user, :with => :real_time) do
120
+ indexes name
121
+ end
186
122
  end
187
123
  end
188
124
  end
@@ -0,0 +1,121 @@
1
+ module ThinkingSphinx
2
+ module Masks; end
3
+ end
4
+
5
+ require 'active_support/core_ext/object/blank'
6
+ require 'thinking_sphinx/masks/pagination_mask'
7
+
8
+ describe ThinkingSphinx::Masks::PaginationMask do
9
+ let(:search) { double('search', :options => {}, :meta => {},
10
+ :per_page => 20) }
11
+ let(:mask) { ThinkingSphinx::Masks::PaginationMask.new search }
12
+
13
+ describe '#first_page?' do
14
+ it "returns true when on the first page" do
15
+ mask.should be_first_page
16
+ end
17
+
18
+ it "returns false on other pages" do
19
+ search.options[:page] = 2
20
+
21
+ mask.should_not be_first_page
22
+ end
23
+ end
24
+
25
+ describe '#last_page?' do
26
+ before :each do
27
+ search.meta['total'] = '44'
28
+ end
29
+
30
+ it "is true when there's no more pages" do
31
+ search.options[:page] = 3
32
+
33
+ mask.should be_last_page
34
+ end
35
+
36
+ it "is false when there's still more pages" do
37
+ mask.should_not be_last_page
38
+ end
39
+ end
40
+
41
+ describe '#next_page' do
42
+ before :each do
43
+ search.meta['total'] = '44'
44
+ end
45
+
46
+ it "should return one more than the current page" do
47
+ mask.next_page.should == 2
48
+ end
49
+
50
+ it "should return nil if on the last page" do
51
+ search.options[:page] = 3
52
+
53
+ mask.next_page.should be_nil
54
+ end
55
+ end
56
+
57
+ describe '#next_page?' do
58
+ before :each do
59
+ search.meta['total'] = '44'
60
+ end
61
+
62
+ it "is true when there is a second page" do
63
+ mask.next_page?.should be_true
64
+ end
65
+
66
+ it "is false when there's no more pages" do
67
+ search.options[:page] = 3
68
+
69
+ mask.next_page?.should be_false
70
+ end
71
+ end
72
+
73
+ describe '#previous_page' do
74
+ before :each do
75
+ search.meta['total'] = '44'
76
+ end
77
+
78
+ it "should return one less than the current page" do
79
+ search.options[:page] = 2
80
+
81
+ mask.previous_page.should == 1
82
+ end
83
+
84
+ it "should return nil if on the first page" do
85
+ mask.previous_page.should be_nil
86
+ end
87
+ end
88
+
89
+ describe '#total_entries' do
90
+ before :each do
91
+ search.meta['total_found'] = '12'
92
+ end
93
+
94
+ it "returns the total found from the search request metadata" do
95
+ mask.total_entries.should == 12
96
+ end
97
+ end
98
+
99
+ describe '#total_pages' do
100
+ before :each do
101
+ search.meta['total'] = '40'
102
+ search.meta['total_found'] = '44'
103
+ end
104
+
105
+ it "uses the total available from the search request metadata" do
106
+ mask.total_pages.should == 2
107
+ end
108
+
109
+ it "should allow for custom per_page values" do
110
+ search.stub :per_page => 40
111
+
112
+ mask.total_pages.should == 1
113
+ end
114
+
115
+ it "should return 0 if there is no index and therefore no results" do
116
+ search.meta.clear
117
+
118
+ mask.total_pages.should == 0
119
+ end
120
+ end
121
+ end