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
@@ -1,127 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ThinkingSphinx::Field do
4
- before :each do
5
- @index = ThinkingSphinx::Index.new(Alpha)
6
- @source = ThinkingSphinx::Source.new(@index)
7
- end
8
-
9
- describe '#initialize' do
10
- it 'raises if no columns are provided so that configuration errors are easier to track down' do
11
- lambda {
12
- ThinkingSphinx::Field.new(@source, [])
13
- }.should raise_error(RuntimeError)
14
- end
15
-
16
- it 'raises if an element of the columns param is an integer - as happens when you use id instead of :id - so that configuration errors are easier to track down' do
17
- lambda {
18
- ThinkingSphinx::Field.new(@source, [1234])
19
- }.should raise_error(RuntimeError)
20
- end
21
- end
22
-
23
- describe "unique_name method" do
24
- before :each do
25
- @field = ThinkingSphinx::Field.new @source, [
26
- stub('column', :__stack => [], :__name => "col_name")
27
- ]
28
- end
29
-
30
- it "should use the alias if there is one" do
31
- @field.alias = "alias"
32
- @field.unique_name.should == "alias"
33
- end
34
-
35
- it "should use the alias if there's multiple columns" do
36
- @field.columns << stub('column', :__stack => [], :__name => "col_name")
37
- @field.unique_name.should be_nil
38
-
39
- @field.alias = "alias"
40
- @field.unique_name.should == "alias"
41
- end
42
-
43
- it "should use the column name if there's no alias and just one column" do
44
- @field.unique_name.should == "col_name"
45
- end
46
- end
47
-
48
- describe '#to_select_sql' do
49
- it "should return nil if polymorphic association data does not exist" do
50
- field = ThinkingSphinx::Field.new(@source,
51
- [ThinkingSphinx::Index::FauxColumn.new(:source, :name)],
52
- :as => :source_name
53
- )
54
-
55
- field.to_select_sql.should be_nil
56
- end
57
- end
58
-
59
- describe "prefixes method" do
60
- it "should default to false" do
61
- @field = ThinkingSphinx::Field.new(
62
- @source, [stub('column', :__stack => [])]
63
- )
64
- @field.prefixes.should be_false
65
- end
66
-
67
- it "should be true if the corresponding option is set" do
68
- @field = ThinkingSphinx::Field.new(
69
- @source, [stub('column', :__stack => [])], :prefixes => true
70
- )
71
- @field.prefixes.should be_true
72
- end
73
- end
74
-
75
- describe "infixes method" do
76
- it "should default to false" do
77
- @field = ThinkingSphinx::Field.new(
78
- @source, [stub('column', :__stack => [])]
79
- )
80
- @field.infixes.should be_false
81
- end
82
-
83
- it "should be true if the corresponding option is set" do
84
- @field = ThinkingSphinx::Field.new(
85
- @source, [stub('column', :__stack => [])], :infixes => true
86
- )
87
- @field.infixes.should be_true
88
- end
89
- end
90
-
91
- describe "is_many? method" do
92
- before :each do
93
- @assoc_a = ThinkingSphinx::Association.new(nil, nil)
94
- @assoc_b = ThinkingSphinx::Association.new(nil, nil)
95
- @assoc_c = ThinkingSphinx::Association.new(nil, nil)
96
-
97
- @field = ThinkingSphinx::Field.new(
98
- @source, [ThinkingSphinx::Index::FauxColumn.new(:col_name)]
99
- )
100
- @field.associations = {
101
- :a => @assoc_a, :b => @assoc_b, :c => @assoc_c
102
- }
103
- @field.associations.values.each { |assoc|
104
- assoc.stub!(:is_many? => true)
105
- }
106
- end
107
-
108
- it "should return true if all associations return true to is_many?" do
109
- @field.send(:is_many?).should be_true
110
- end
111
-
112
- it "should return true if one association returns true to is_many?" do
113
- @assoc_b.stub!(:is_many? => false)
114
- @assoc_c.stub!(:is_many? => false)
115
-
116
- @field.send(:is_many?).should be_true
117
- end
118
-
119
- it "should return false if all associations return false to is_many?" do
120
- @assoc_a.stub!(:is_many? => false)
121
- @assoc_b.stub!(:is_many? => false)
122
- @assoc_c.stub!(:is_many? => false)
123
-
124
- @field.send(:is_many?).should be_false
125
- end
126
- end
127
- end
@@ -1,532 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ThinkingSphinx::Index::Builder do
4
- let(:internal_attribute_count) {
5
- Riddle.loaded_version.to_i < 2 ? 3 : 4
6
- }
7
- describe ".generate without source scope" do
8
- before :each do
9
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
10
- indexes first_name, last_name
11
- has birthday
12
- has id, :as => :internal_id
13
-
14
- set_property :sql_range_step => 1000
15
-
16
- where "birthday <= NOW()"
17
- group_by "first_name"
18
- end
19
-
20
- @source = @index.sources.first
21
- end
22
-
23
- it "should return an index" do
24
- @index.should be_a_kind_of(ThinkingSphinx::Index)
25
- end
26
-
27
- it "should have one source for the index" do
28
- @index.sources.length.should == 1
29
- end
30
-
31
- it "should have two fields" do
32
- @source.fields.length.should == 2
33
- @source.fields[0].unique_name.should == :first_name
34
- @source.fields[1].unique_name.should == :last_name
35
- end
36
-
37
- it "should have two attributes alongside the internal ones" do
38
- @source.attributes.length.should == 2 + internal_attribute_count
39
- @source.attributes[internal_attribute_count].unique_name.should == :birthday
40
- @source.attributes[1 + internal_attribute_count].unique_name.should == :internal_id
41
- end
42
-
43
- it "should have one condition" do
44
- @source.conditions.length.should == 1
45
- @source.conditions.first.should == "birthday <= NOW()"
46
- end
47
-
48
- it "should have one grouping" do
49
- @source.groupings.length.should == 1
50
- @source.groupings.first.should == "first_name"
51
- end
52
-
53
- it "should have one option" do
54
- @source.options.length.should == 1
55
- @source.options[:sql_range_step].should == 1000
56
- end
57
- end
58
-
59
- describe 'aliased field' do
60
- before :each do
61
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
62
- indexes first_name, :as => 'name'
63
- end
64
-
65
- @source = @index.sources.first
66
- end
67
-
68
- it "should store the alias as a symbol for consistency" do
69
- @source.fields.last.unique_name.should == :name
70
- end
71
- end
72
-
73
- describe 'aliased attribute' do
74
- before :each do
75
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
76
- indexes first_name
77
- has :id, :as => 'real_id'
78
- end
79
-
80
- @source = @index.sources.first
81
- end
82
-
83
- it "should store the alias as a symbol for consistency" do
84
- @source.attributes.last.unique_name.should == :real_id
85
- end
86
- end
87
-
88
- describe "sortable field" do
89
- before :each do
90
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
91
- indexes first_name, :sortable => true
92
- end
93
-
94
- @source = @index.sources.first
95
- end
96
-
97
- it "should have one field" do
98
- @source.fields.length.should == 1
99
- end
100
-
101
- it "should have one attribute alongside the internal ones" do
102
- @source.attributes.length.should == 1 + internal_attribute_count
103
- end
104
-
105
- it "should set the attribute name to have the _sort suffix" do
106
- @source.attributes.last.unique_name.should == :first_name_sort
107
- end
108
-
109
- it "should set the attribute column to be the same as the field" do
110
- @source.attributes.last.columns.length.should == 1
111
- @source.attributes.last.columns.first.__name.should == :first_name
112
- end
113
- end
114
-
115
- describe '#join' do
116
- before :each do
117
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
118
- indexes first_name
119
-
120
- join contacts
121
- end
122
-
123
- @source = @index.sources.first
124
- end
125
-
126
- it "should include the explicit join" do
127
- @source.joins.length.should == 1
128
- end
129
- end
130
-
131
- describe "faceted field" do
132
- before :each do
133
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
134
- indexes first_name, :facet => true
135
- end
136
-
137
- @source = @index.sources.first
138
- end
139
-
140
- after :each do
141
- Person.sphinx_facets.delete_at(-1)
142
- end
143
-
144
- it "should have one field" do
145
- @source.fields.length.should == 1
146
- end
147
-
148
- it "should have one attribute alongside the internal ones" do
149
- @source.attributes.length.should == 1 + internal_attribute_count
150
- end
151
-
152
- it "should set the attribute name to have the _facet suffix" do
153
- @source.attributes.last.unique_name.should == :first_name_facet
154
- end
155
-
156
- it "should set the attribute type to integer" do
157
- @source.attributes.last.type.should == :integer
158
- end
159
-
160
- it "should set the attribute column to be the same as the field" do
161
- @source.attributes.last.columns.length.should == 1
162
- @source.attributes.last.columns.first.__name.should == :first_name
163
- end
164
- end
165
-
166
- describe "faceted integer attribute" do
167
- before :each do
168
- @index = ThinkingSphinx::Index::Builder.generate(Alpha) do
169
- indexes :name
170
- has value, :facet => true
171
- end
172
-
173
- @source = @index.sources.first
174
- end
175
-
176
- after :each do
177
- Alpha.sphinx_facets.delete_at(-1)
178
- end
179
-
180
- it "should have just one attribute alongside the internal ones" do
181
- @source.attributes.length.should == 1 + internal_attribute_count
182
- end
183
- end
184
-
185
- describe "faceted timestamp attribute" do
186
- before :each do
187
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
188
- indexes first_name
189
- has birthday, :facet => true
190
- end
191
-
192
- @source = @index.sources.first
193
- end
194
-
195
- after :each do
196
- Person.sphinx_facets.delete_at(-1)
197
- end
198
-
199
- it "should have just one attribute alongside the internal ones" do
200
- @source.attributes.length.should == 1 + internal_attribute_count
201
- end
202
- end
203
-
204
- describe "faceted boolean attribute" do
205
- before :each do
206
- @index = ThinkingSphinx::Index::Builder.generate(Beta) do
207
- indexes :name
208
- has delta, :facet => true
209
- end
210
-
211
- @source = @index.sources.first
212
- end
213
-
214
- after :each do
215
- Beta.sphinx_facets.delete_at(-1)
216
- end
217
-
218
- it "should have just one attribute alongside the internal ones" do
219
- @source.attributes.length.should == 1 + internal_attribute_count
220
- end
221
- end
222
-
223
- describe "faceted float attribute" do
224
- before :each do
225
- @index = ThinkingSphinx::Index::Builder.generate(Alpha) do
226
- indexes :name
227
- has cost, :facet => true
228
- end
229
-
230
- @source = @index.sources.first
231
- end
232
-
233
- after :each do
234
- Alpha.sphinx_facets.delete_at(-1)
235
- end
236
-
237
- it "should have just one attribute alongside the internal ones" do
238
- @source.attributes.length.should == 1 + internal_attribute_count
239
- end
240
- end
241
-
242
- describe "faceted string attribute" do
243
- before :each do
244
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
245
- indexes first_name
246
- has last_name, :facet => true
247
- end
248
-
249
- @source = @index.sources.first
250
- end
251
-
252
- after :each do
253
- Person.sphinx_facets.delete_at(-1)
254
- end
255
-
256
- it "should have two attributes alongside the internal ones" do
257
- @source.attributes.length.should == 2 + internal_attribute_count
258
- end
259
-
260
- it "should set the facet attribute name to have the _facet suffix" do
261
- @source.attributes.last.unique_name.should == :last_name_facet
262
- end
263
-
264
- it "should set the attribute type to integer" do
265
- @source.attributes.last.type.should == :integer
266
- end
267
-
268
- it "should set the attribute column to be the same as the field" do
269
- @source.attributes.last.columns.length.should == 1
270
- @source.attributes.last.columns.first.__name.should == :last_name
271
- end
272
- end
273
-
274
- describe 'faceted manual MVA' do
275
- before :each do
276
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
277
- indexes first_name
278
- has 'SQL STATEMENT', :type => :multi, :as => :sql, :facet => true
279
- end
280
-
281
- @source = @index.sources.first
282
- end
283
-
284
- after :each do
285
- Person.sphinx_facets.delete_at(-1)
286
- end
287
-
288
- it "should have two attributes alongside the internal ones" do
289
- @source.attributes.length.should == 2 + internal_attribute_count
290
- end
291
-
292
- it "should set the facet attribute name to have the _facet suffix" do
293
- @source.attributes.last.unique_name.should == :sql_facet
294
- end
295
-
296
- it "should keep the original attribute's name set as requested" do
297
- @source.attributes[-2].unique_name.should == :sql
298
- end
299
-
300
- it "should set the attribute type to multi" do
301
- @source.attributes.last.type.should == :multi
302
- end
303
-
304
- it "should set the attribute column to be the same as the field" do
305
- @source.attributes.last.columns.length.should == 1
306
- @source.attributes.last.columns.first.__name.should == 'SQL STATEMENT'
307
- end
308
- end
309
-
310
- describe 'faceted MVA field' do
311
- before :each do
312
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
313
- indexes tags(:name), :as => :tags, :facet => true
314
- end
315
-
316
- @source = @index.sources.first
317
- end
318
-
319
- after :each do
320
- Person.sphinx_facets.delete_at(-1)
321
- end
322
-
323
- it "should have one field" do
324
- @source.fields.length.should == 1
325
- end
326
-
327
- it "should have one attribute alongside the internal ones" do
328
- @source.attributes.length.should == 1 + internal_attribute_count
329
- end
330
-
331
- it "should set the attribute name to have the _facet suffix" do
332
- @source.attributes.last.unique_name.should == :tags_facet
333
- end
334
-
335
- it "should set the attribute type to multi" do
336
- @source.attributes.last.type.should == :multi
337
- end
338
-
339
- it "should set the attribute column to be the same as the field" do
340
- @source.attributes.last.columns.length.should == 1
341
- @source.attributes.last.columns.first.__name.should == :name
342
- end
343
- end
344
-
345
- describe "no fields" do
346
- it "should raise an exception" do
347
- lambda {
348
- ThinkingSphinx::Index::Builder.generate(Person) do
349
- #
350
- end
351
- }.should raise_error
352
- end
353
- end
354
-
355
- describe "explicit source" do
356
- before :each do
357
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
358
- define_source do
359
- indexes first_name, last_name
360
- has birthday
361
- has id, :as => :internal_id
362
-
363
- set_property :delta => true
364
-
365
- where "birthday <= NOW()"
366
- group_by "first_name"
367
- end
368
- end
369
-
370
- @source = @index.sources.first
371
- end
372
-
373
- it "should return an index" do
374
- @index.should be_a_kind_of(ThinkingSphinx::Index)
375
- end
376
-
377
- it "should have one source for the index" do
378
- @index.sources.length.should == 1
379
- end
380
-
381
- it "should have two fields" do
382
- @source.fields.length.should == 2
383
- @source.fields[0].unique_name.should == :first_name
384
- @source.fields[1].unique_name.should == :last_name
385
- end
386
-
387
- it "should have two attributes alongside the internal ones" do
388
- @source.attributes.length.should == 2 + internal_attribute_count
389
- @source.attributes[internal_attribute_count].unique_name.should == :birthday
390
- @source.attributes[1 + internal_attribute_count].unique_name.should == :internal_id
391
- end
392
- end
393
-
394
- describe "multiple sources" do
395
- before :each do
396
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
397
- define_source do
398
- indexes first_name
399
- has birthday
400
- end
401
-
402
- define_source do
403
- indexes last_name
404
- has :id, :as => :internal_id
405
- end
406
- end
407
- end
408
-
409
- it "should have two sources" do
410
- @index.sources.length.should == 2
411
- end
412
-
413
- it "should have two fields" do
414
- @index.fields.length.should == 2
415
- end
416
-
417
- it "should have one field in each source" do
418
- @index.sources.each do |source|
419
- source.fields.length.should == 1
420
- end
421
- end
422
-
423
- it "should have two attributes alongside the six internal ones" do
424
- @index.attributes.length.should == 2 + (internal_attribute_count * 2)
425
- end
426
-
427
- it "should have one attribute in each source alongside the internal ones" do
428
- @index.sources.each do |source|
429
- source.attributes.length.should == 1 + internal_attribute_count
430
- end
431
- end
432
- end
433
-
434
- describe "multiple local indexes" do
435
- before :each do
436
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
437
- indexes first_name
438
-
439
- use_local_index :other_local_index_1
440
- use_local_indices "other_local_index_2", "other_local_index_3"
441
- end
442
- end
443
-
444
- it "should have three additional indexes" do
445
- @index.additional_indices.length.should == 3
446
- end
447
-
448
- it "should append _core to the name of each local index" do
449
- @index.additional_indices[0].should eql("other_local_index_1_core")
450
- @index.additional_indices[1].should eql("other_local_index_2_core")
451
- @index.additional_indices[2].should eql("other_local_index_3_core")
452
- end
453
- end
454
-
455
- describe "index options" do
456
- before :each do
457
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
458
- indexes first_name
459
-
460
- set_property :charset_type => "utf16"
461
- set_property :group_concat_max_len => 1024
462
- end
463
- end
464
-
465
- it "should store the index setting for the index" do
466
- @index.local_options[:charset_type].should == "utf16"
467
- end
468
-
469
- it "should store non-Sphinx settings for the index" do
470
- @index.local_options[:group_concat_max_len].should == 1024
471
- end
472
- end
473
-
474
- describe "delta options" do
475
- before :each do
476
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
477
- indexes first_name
478
-
479
- set_property :delta => true
480
- end
481
- end
482
-
483
- it "should not keep the delta setting in source options" do
484
- @index.sources.first.options.should be_empty
485
- end
486
-
487
- it "should not keep the delta setting in index options" do
488
- @index.local_options.should be_empty
489
- end
490
-
491
- it "should set the index delta object set" do
492
- @index.delta_object.should be_a_kind_of(ThinkingSphinx::Deltas::DefaultDelta)
493
- end
494
- end
495
-
496
- context 'index options' do
497
- before :each do
498
- @index = ThinkingSphinx::Index::Builder.generate(Person) do
499
- indexes first_name
500
-
501
- set_property :index_exact_words => true
502
- end
503
- end
504
-
505
- it "should track the index_exact_words option to the index" do
506
- @index.local_options[:index_exact_words].should be_true
507
- end
508
- end
509
-
510
- context 'with an explicit name' do
511
- it "should set the index's name using the provided value" do
512
- index = ThinkingSphinx::Index::Builder.generate(Person, 'custom') do
513
- indexes first_name
514
- end
515
-
516
- index.name.should == 'custom'
517
- end
518
- end
519
-
520
- describe "sanitize_sql" do
521
- def index
522
- @index ||= ThinkingSphinx::Index::Builder.generate(Person) do
523
- indexes first_name, last_name
524
- where sanitize_sql(["gender = ?", "female"])
525
- end
526
- end
527
-
528
- it "should be aliased to ActiveRecord::Base.sanitize_sql" do
529
- index.sources.first.conditions.first.should == index.model.send(:sanitize_sql, ["gender = ?", "female"])
530
- end
531
- end
532
- end