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,103 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ThinkingSphinx::AutoVersion do
4
- describe '.detect' do
5
- before :each do
6
- @config = ThinkingSphinx::Configuration.instance
7
- end
8
-
9
- it "should require 0.9.8 if that is the detected version" do
10
- ThinkingSphinx::AutoVersion.should_receive(:require).
11
- with('riddle/0.9.8')
12
-
13
- @config.stub!(:version => '0.9.8')
14
- ThinkingSphinx::AutoVersion.detect
15
- end
16
-
17
- it "should require 0.9.9 if that is the detected version" do
18
- ThinkingSphinx::AutoVersion.should_receive(:require).
19
- with('riddle/0.9.9')
20
-
21
- @config.stub!(:version => '0.9.9')
22
- ThinkingSphinx::AutoVersion.detect
23
- end
24
-
25
- it "should require 1.10-beta if that is the detected version" do
26
- ThinkingSphinx::AutoVersion.should_receive(:require).
27
- with('riddle/1.10')
28
-
29
- @config.stub!(:version => '1.10-beta')
30
- ThinkingSphinx::AutoVersion.detect
31
- end
32
-
33
- it "should require 1.10-beta if using 1.10-beta compiled with id64 support" do
34
- ThinkingSphinx::AutoVersion.should_receive(:require).
35
- with('riddle/1.10')
36
-
37
- @config.stub!(:version => '1.10-id64-beta')
38
- ThinkingSphinx::AutoVersion.detect
39
- end
40
-
41
- it "should require 2.0.1 if using Sphinx 2.0.1 beta" do
42
- ThinkingSphinx::AutoVersion.should_receive(:require).
43
- with('riddle/2.0.1')
44
-
45
- @config.stub!(:version => '2.0.1-beta')
46
- ThinkingSphinx::AutoVersion.detect
47
- end
48
-
49
- it "should require 2.0.1 if using Sphinx 2.0.2 dev" do
50
- ThinkingSphinx::AutoVersion.should_receive(:require).
51
- with('riddle/2.0.1')
52
-
53
- @config.stub!(:version => '2.0.2-dev')
54
- ThinkingSphinx::AutoVersion.detect
55
- end
56
-
57
- it "should require 2.1.0 if using Sphinx 2.0.3" do
58
- ThinkingSphinx::AutoVersion.should_receive(:require).
59
- with('riddle/2.1.0')
60
-
61
- @config.stub!(:version => '2.0.3-release')
62
- ThinkingSphinx::AutoVersion.detect
63
- end
64
-
65
- it "should require 2.1.0 if using Sphinx 2.0.3" do
66
- ThinkingSphinx::AutoVersion.should_receive(:require).
67
- with('riddle/2.1.0')
68
-
69
- @config.stub!(:version => '2.0.4-release')
70
- ThinkingSphinx::AutoVersion.detect
71
- end
72
-
73
- it "should require 2.1.0 if using Sphinx 2.0.3" do
74
- ThinkingSphinx::AutoVersion.should_receive(:require).
75
- with('riddle/2.1.0')
76
-
77
- @config.stub!(:version => '2.0.5-release')
78
- ThinkingSphinx::AutoVersion.detect
79
- end
80
-
81
- it "should require 2.1.0 if using Sphinx 2.1.0 dev" do
82
- ThinkingSphinx::AutoVersion.should_receive(:require).
83
- with('riddle/2.1.0')
84
-
85
- @config.stub!(:version => '2.1.0-dev')
86
- ThinkingSphinx::AutoVersion.detect
87
- end
88
-
89
- it "should output a warning if the detected version is unsupported" do
90
- STDERR.should_receive(:puts).with(/unsupported/i)
91
-
92
- @config.stub!(:version => '0.9.7')
93
- ThinkingSphinx::AutoVersion.detect
94
- end
95
-
96
- it "should output a warning if the version cannot be determined" do
97
- STDERR.should_receive(:puts).at_least(:once)
98
-
99
- @config.stub!(:version => nil)
100
- ThinkingSphinx::AutoVersion.detect
101
- end
102
- end
103
- end
@@ -1,77 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ThinkingSphinx::Connection do
4
- describe '#client' do
5
- let(:connection) { ThinkingSphinx::Connection.new }
6
-
7
- before :each do
8
- @config = ThinkingSphinx::Configuration.instance
9
- @config.address = 'domain.url'
10
- @config.port = 3333
11
- @config.configuration.searchd.max_matches = 100
12
- @config.timeout = 1
13
-
14
- pending
15
- end
16
-
17
- it "should return an instance of Riddle::Client" do
18
- connection.client.should be_a(Riddle::Client)
19
- end
20
-
21
- it "should use the configuration address" do
22
- connection.client.server.should == 'domain.url'
23
- end
24
-
25
- it "should use the configuration port" do
26
- connection.client.port.should == 3333
27
- end
28
-
29
- it "should use the configuration max matches" do
30
- connection.client.max_matches.should == 100
31
- end
32
-
33
- it "should use the configuration timeout" do
34
- connection.client.timeout.should == 1
35
- end
36
-
37
- describe 'when shuffle is enabled' do
38
- let(:client) { double('client', :max_matches= => nil, :timeout= => nil,
39
- :open => true) }
40
-
41
- before :each do
42
- @config.shuffle = true
43
- end
44
-
45
- it "should shuffle client servers" do
46
- @config.address = ['1.1.1.1', '2.2.2.2']
47
- @config.address.stub!(:shuffle => ['2.2.2.2', '1.1.1.1'])
48
-
49
- Riddle::Client.should_receive(:new) do |addresses, port, key|
50
- addresses.should == ['2.2.2.2', '1.1.1.1']
51
- client
52
- end
53
- connection.client
54
- end
55
- end
56
-
57
- describe 'when shuffle is disabled' do
58
- let(:client) { double('client', :max_matches= => nil, :timeout= => nil,
59
- :open => true) }
60
-
61
- before :each do
62
- @config.shuffle = false
63
- end
64
-
65
- it "should not shuffle client servers" do
66
- @config.address = ['1.1.1.1', '2.2.2.2.', '3.3.3.3', '4.4.4.4', '5.5.5.5']
67
-
68
- @config.address.should_not_receive(:shuffle)
69
- Riddle::Client.should_receive(:new) do |addresses, port, key|
70
- addresses.should == ['1.1.1.1', '2.2.2.2.', '3.3.3.3', '4.4.4.4', '5.5.5.5']
71
- client
72
- end
73
- connection.client
74
- end
75
- end
76
- end
77
- end
@@ -1,127 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ThinkingSphinx::Context do
4
- let(:ts_context) { ThinkingSphinx::Context.new }
5
-
6
- describe '#prepare' do
7
- let(:config) { ThinkingSphinx::Configuration.instance }
8
- let(:file_name) { 'a.rb' }
9
- let(:model_name_lower) { 'a' }
10
- let(:class_name) { 'A' }
11
-
12
- before :each do
13
- config.model_directories = ['']
14
-
15
- file_name.stub!(:gsub).and_return(model_name_lower)
16
- model_name_lower.stub!(:camelize).and_return(class_name)
17
- Dir.stub(:[]).and_return([file_name])
18
- end
19
-
20
- it "should load the files by guessing the file name" do
21
- class_name.should_receive(:constantize).and_return(true)
22
-
23
- ts_context.prepare
24
- end
25
-
26
- it "should not raise errors if the model name is nil" do
27
- file_name.stub!(:gsub).and_return(nil)
28
-
29
- lambda {
30
- ts_context.prepare
31
- }.should_not raise_error
32
- end
33
-
34
- it "should report name errors but not raise them" do
35
- class_name.stub(:constantize).and_raise(NameError)
36
- STDERR.stub!(:puts => '')
37
- STDERR.should_receive(:puts).with('ThinkingSphinx: error loading a.rb')
38
-
39
- lambda {
40
- ts_context.prepare
41
- }.should_not raise_error
42
- end
43
-
44
- it "should report load errors but not raise them" do
45
- class_name.stub(:constantize).and_raise(LoadError)
46
- STDERR.stub!(:puts => '')
47
- STDERR.should_receive(:puts).with('ThinkingSphinx: error loading a.rb')
48
-
49
- lambda {
50
- ts_context.prepare
51
- }.should_not raise_error
52
- end
53
-
54
- it "should catch database errors with a warning" do
55
- class_name.should_receive(:constantize).and_raise(Mysql2::Error)
56
- STDERR.stub!(:puts => '')
57
- STDERR.should_receive(:puts).with('Warning: Error loading a.rb:')
58
-
59
- lambda {
60
- ts_context.prepare
61
- }.should_not raise_error
62
- end unless RUBY_PLATFORM == 'java'
63
-
64
- it "should not load models if they're explicitly set in the configuration" do
65
- config.indexed_models = ['Alpha', 'Beta']
66
- ts_context.prepare
67
-
68
- ts_context.indexed_models.should == ['Alpha', 'Beta']
69
- end
70
- end
71
-
72
- describe '#define_indexes' do
73
- it "should call define_indexes on all known indexed models" do
74
- ts_context.stub!(:indexed_models => ['Alpha', 'Beta'])
75
- Alpha.should_receive(:define_indexes)
76
- Beta.should_receive(:define_indexes)
77
-
78
- ts_context.define_indexes
79
- end
80
- end
81
-
82
- describe '#add_indexed_model' do
83
- before :each do
84
- ts_context.indexed_models.clear
85
- end
86
-
87
- it "should add the model to the collection" do
88
- ts_context.add_indexed_model 'Alpha'
89
-
90
- ts_context.indexed_models.should == ['Alpha']
91
- end
92
-
93
- it "should not duplicate models in the collection" do
94
- ts_context.add_indexed_model 'Alpha'
95
- ts_context.add_indexed_model 'Alpha'
96
-
97
- ts_context.indexed_models.should == ['Alpha']
98
- end
99
-
100
- it "should keep the collection in alphabetical order" do
101
- ts_context.add_indexed_model 'Beta'
102
- ts_context.add_indexed_model 'Alpha'
103
-
104
- ts_context.indexed_models.should == ['Alpha', 'Beta']
105
- end
106
-
107
- it "should translate classes to their names" do
108
- ts_context.add_indexed_model Alpha
109
-
110
- ts_context.indexed_models.should == ['Alpha']
111
- end
112
- end
113
-
114
- describe '#superclass_indexed_models' do
115
- it "should return indexed model names" do
116
- ts_context.stub!(:indexed_models => ['Alpha', 'Beta'])
117
-
118
- ts_context.superclass_indexed_models.should == ['Alpha', 'Beta']
119
- end
120
-
121
- it "should not include classes which have indexed superclasses" do
122
- ts_context.stub!(:indexed_models => ['Parent', 'Person'])
123
-
124
- ts_context.superclass_indexed_models.should == ['Person']
125
- end
126
- end
127
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Array do
4
- describe '.===' do
5
- it "should return true if an instance of ThinkingSphinx::Search" do
6
- Array.should === ThinkingSphinx::Search.new
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe String do
4
- describe "to_crc32 instance method" do
5
- it "should return an integer" do
6
- 'to_crc32'.to_crc32.should be_a_kind_of(Integer)
7
- end
8
- end
9
- end
@@ -1,359 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ThinkingSphinx::Facet do
4
- describe ".name_for" do
5
- it "should remove '_facet' from provided string and return a symbol" do
6
- ThinkingSphinx::Facet.name_for('attribute_facet').should == :attribute
7
- end
8
-
9
- it "should remove '_facet' from provided symbol" do
10
- ThinkingSphinx::Facet.name_for(:attribute_facet).should == :attribute
11
- end
12
-
13
- it "should return the name of the facet if a Facet is passed" do
14
- facet = ThinkingSphinx::Facet.new(
15
- stub('attribute', :unique_name => :attribute, :columns => ['attribute'])
16
- )
17
- ThinkingSphinx::Facet.name_for(facet).should == :attribute
18
- end
19
-
20
- it "should return 'class' for special case name 'class_crc'" do
21
- ThinkingSphinx::Facet.name_for(:class_crc).should == :class
22
- end
23
-
24
- it "should cycle" do
25
- ThinkingSphinx::Facet.name_for(ThinkingSphinx::Facet.attribute_name_for(:attribute)).should == :attribute
26
- end
27
- end
28
-
29
- describe ".attribute_name_for" do
30
- it "should append '_facet' to provided string" do
31
- ThinkingSphinx::Facet.attribute_name_for('attribute').should == 'attribute_facet'
32
- end
33
-
34
- it "should append '_facet' to provided symbol and return a string" do
35
- ThinkingSphinx::Facet.attribute_name_for(:attribute).should == 'attribute_facet'
36
- end
37
-
38
- it "should return 'class_crc' for special case attribute 'class'" do
39
- ThinkingSphinx::Facet.attribute_name_for(:class).should == 'class_crc'
40
- end
41
-
42
- it "should cycle" do
43
- ThinkingSphinx::Facet.attribute_name_for(ThinkingSphinx::Facet.name_for('attribute_facet')).should == 'attribute_facet'
44
- end
45
- end
46
-
47
- describe ".attribute_name_from_value" do
48
- it "should append _facet if the value is a string" do
49
- ThinkingSphinx::Facet.attribute_name_from_value('attribute', 'string').
50
- should == 'attribute_facet'
51
- end
52
-
53
- it "should not append _facet if the value isn't a string" do
54
- ThinkingSphinx::Facet.attribute_name_from_value('attribute', 1).
55
- should == 'attribute'
56
- ThinkingSphinx::Facet.attribute_name_from_value('attribute', Time.now).
57
- should == 'attribute'
58
- ThinkingSphinx::Facet.attribute_name_from_value('attribute', true).
59
- should == 'attribute'
60
- ThinkingSphinx::Facet.attribute_name_from_value('attribute', 1.23).
61
- should == 'attribute'
62
- end
63
-
64
- it "should append _facet is the value is an array of strings" do
65
- ThinkingSphinx::Facet.attribute_name_from_value('attribute', ['a', 'b']).
66
- should == 'attribute_facet'
67
- end
68
-
69
- it "should not append _facet if the value is an array of integers" do
70
- ThinkingSphinx::Facet.attribute_name_from_value('attribute', [1, 2]).
71
- should == 'attribute'
72
- end
73
- end
74
-
75
- describe ".translate?" do
76
- before :each do
77
- @index = ThinkingSphinx::Index.new(Alpha)
78
- @source = ThinkingSphinx::Source.new(@index)
79
- @attribute = ThinkingSphinx::Attribute.new(
80
- @source, ThinkingSphinx::Index::FauxColumn.new(:name)
81
- )
82
- end
83
-
84
- it "should return true if the property is a field" do
85
- field = ThinkingSphinx::Field.new(
86
- @source, ThinkingSphinx::Index::FauxColumn.new(:name)
87
- )
88
-
89
- ThinkingSphinx::Facet.translate?(field).should be_true
90
- end
91
-
92
- it "should return true if the property is a string attribute" do
93
- @attribute.stub!(:type => :string)
94
-
95
- ThinkingSphinx::Facet.translate?(@attribute).should be_true
96
- end
97
-
98
- it "should return false if the property is an integer attribute" do
99
- @attribute.stub!(:type => :integer)
100
-
101
- ThinkingSphinx::Facet.translate?(@attribute).should be_false
102
- end
103
-
104
- it "should return false if the property is a boolean attribute" do
105
- @attribute.stub!(:type => :boolean)
106
-
107
- ThinkingSphinx::Facet.translate?(@attribute).should be_false
108
- end
109
-
110
- it "should return false if the property is a timestamp attribute" do
111
- @attribute.stub!(:type => :datetime)
112
-
113
- ThinkingSphinx::Facet.translate?(@attribute).should be_false
114
- end
115
-
116
- it "should return false if the property is a float attribute" do
117
- @attribute.stub!(:type => :float)
118
-
119
- ThinkingSphinx::Facet.translate?(@attribute).should be_false
120
- end
121
-
122
- it "should return false if the property is an MVA of integer values" do
123
- @attribute.stub!(:type => :multi, :all_ints? => true)
124
-
125
- ThinkingSphinx::Facet.translate?(@attribute).should be_false
126
- end
127
-
128
- it "should return true if the property is an MVA of string values" do
129
- @attribute.stub!(:type => :multi, :all_ints? => false)
130
-
131
- ThinkingSphinx::Facet.translate?(@attribute).should be_true
132
- end
133
- end
134
-
135
- describe "#translate?" do
136
- before :each do
137
- @index = ThinkingSphinx::Index.new(Alpha)
138
- @source = ThinkingSphinx::Source.new(@index)
139
- @attribute = ThinkingSphinx::Attribute.new(
140
- @source, ThinkingSphinx::Index::FauxColumn.new(:name)
141
- )
142
- end
143
-
144
- it "should return true if the property is a field" do
145
- field = ThinkingSphinx::Field.new(
146
- @source, ThinkingSphinx::Index::FauxColumn.new(:name)
147
- )
148
-
149
- ThinkingSphinx::Facet.new(field).translate?.should be_true
150
- end
151
-
152
- it "should return true if the property is a string attribute" do
153
- @attribute.stub!(:type => :string)
154
-
155
- ThinkingSphinx::Facet.new(@attribute).translate?.should be_true
156
- end
157
-
158
- it "should return false if the property is an integer attribute" do
159
- @attribute.stub!(:type => :integer)
160
-
161
- ThinkingSphinx::Facet.new(@attribute).translate?.should be_false
162
- end
163
-
164
- it "should return false if the property is a boolean attribute" do
165
- @attribute.stub!(:type => :boolean)
166
-
167
- ThinkingSphinx::Facet.new(@attribute).translate?.should be_false
168
- end
169
-
170
- it "should return false if the property is a timestamp attribute" do
171
- @attribute.stub!(:type => :datetime)
172
-
173
- ThinkingSphinx::Facet.new(@attribute).translate?.should be_false
174
- end
175
-
176
- it "should return false if the property is a float attribute" do
177
- @attribute.stub!(:type => :float)
178
-
179
- ThinkingSphinx::Facet.new(@attribute).translate?.should be_false
180
- end
181
-
182
- it "should return false if the property is an MVA of integer values" do
183
- @attribute.stub!(:type => :multi, :all_ints? => true)
184
-
185
- ThinkingSphinx::Facet.new(@attribute).translate?.should be_false
186
- end
187
-
188
- it "should return true if the property is an MVA of string values" do
189
- @attribute.stub!(:type => :multi, :all_ints? => false)
190
-
191
- ThinkingSphinx::Facet.new(@attribute).translate?.should be_true
192
- end
193
- end
194
-
195
- describe "#attribute_name" do
196
- before :each do
197
- @index = ThinkingSphinx::Index.new(Alpha)
198
- @source = ThinkingSphinx::Source.new(@index)
199
- @attribute = ThinkingSphinx::Attribute.new(
200
- @source, ThinkingSphinx::Index::FauxColumn.new(:name)
201
- )
202
- end
203
-
204
- it "should return the attribute name if built off an integer attribute" do
205
- @attribute.stub!(:type => :integer)
206
-
207
- ThinkingSphinx::Facet.new(@attribute).attribute_name.should == "name"
208
- end
209
-
210
- it "should return the attribute name if built off a boolean attribute" do
211
- @attribute.stub!(:type => :boolean)
212
-
213
- ThinkingSphinx::Facet.new(@attribute).attribute_name.should == "name"
214
- end
215
-
216
- it "should return the attribute name if built off a float attribute" do
217
- @attribute.stub!(:type => :float)
218
-
219
- ThinkingSphinx::Facet.new(@attribute).attribute_name.should == "name"
220
- end
221
-
222
- it "should return the attribute name if built off a timestamp attribute" do
223
- @attribute.stub!(:type => :datetime)
224
-
225
- ThinkingSphinx::Facet.new(@attribute).attribute_name.should == "name"
226
- end
227
-
228
- it "should return the attribute name with _facet suffix if built off a string attribute" do
229
- @attribute.stub!(:type => :string)
230
-
231
- ThinkingSphinx::Facet.new(@attribute).attribute_name.should == "name_facet"
232
- end
233
-
234
- it "should return the attribute name with _facet suffix if built off a field" do
235
- field = ThinkingSphinx::Field.new(
236
- @source, ThinkingSphinx::Index::FauxColumn.new(:name)
237
- )
238
-
239
- ThinkingSphinx::Facet.new(field).attribute_name.should == "name_facet"
240
- end
241
-
242
- it "should return the attribute name if build off an integer MVA" do
243
- @attribute.stub!(:type => :multi, :all_ints? => true)
244
-
245
- ThinkingSphinx::Facet.new(@attribute).attribute_name.should == "name"
246
- end
247
-
248
- it "should return the attribute name with the _facet suffix if build off an non-integer MVA" do
249
- @attribute.stub!(:type => :multi, :all_ints? => false)
250
-
251
- ThinkingSphinx::Facet.new(@attribute).attribute_name.should == "name_facet"
252
- end
253
- end
254
-
255
- describe "#type" do
256
- before :each do
257
- @index = ThinkingSphinx::Index.new(Alpha)
258
- @source = ThinkingSphinx::Source.new(@index)
259
- end
260
-
261
- it "should return :string if the property is a field" do
262
- field = ThinkingSphinx::Field.new(
263
- @source, ThinkingSphinx::Index::FauxColumn.new(:name)
264
- )
265
-
266
- ThinkingSphinx::Facet.new(field).type.should == :string
267
- end
268
-
269
- it "should return the attribute type if the property is an attribute" do
270
- attribute = ThinkingSphinx::Attribute.new(
271
- @source, ThinkingSphinx::Index::FauxColumn.new(:name)
272
- )
273
- attribute.stub!(:type => :anything)
274
-
275
- ThinkingSphinx::Facet.new(attribute).type.should == :anything
276
- end
277
- end
278
-
279
- describe "#value" do
280
- describe 'for fields from associations' do
281
- before :each do
282
- @index = ThinkingSphinx::Index.new(Friendship)
283
- @source = ThinkingSphinx::Source.new(@index)
284
- @field = ThinkingSphinx::Field.new(
285
- @source, ThinkingSphinx::Index::FauxColumn.new(:person, :first_name)
286
- )
287
- @facet = ThinkingSphinx::Facet.new(@field)
288
- end
289
-
290
- it "should return association values" do
291
- person = Person.find(:first)
292
- friendship = Friendship.new(:person => person)
293
-
294
- @facet.value(friendship, {'first_name_facet' => 1}).should == person.first_name
295
- end
296
-
297
- it "should return nil if the association is nil" do
298
- friendship = Friendship.new(:person => nil)
299
-
300
- @facet.value(friendship, {'first_name_facet' => 1}).should be_nil
301
- end
302
-
303
- it "should return multi-level association values" do
304
- person = Person.find(:first)
305
- tag = person.tags.build(:name => 'buried')
306
- friendship = Friendship.new(:person => person)
307
-
308
- field = ThinkingSphinx::Field.new(
309
- @source, ThinkingSphinx::Index::FauxColumn.new(:person, :tags, :name)
310
- )
311
- ThinkingSphinx::Facet.new(field).value(friendship, {'name_facet' => 'buried'.to_crc32}).
312
- should == 'buried'
313
- end
314
-
315
- it "should not error with multi-level association values containing a nil value" do
316
- person = Person.find(:first)
317
- tag = person.tags.build(:name => nil)
318
- tag = person.tags.build(:name => "buried")
319
- friendship = Friendship.new(:person => person)
320
-
321
- field = ThinkingSphinx::Field.new(
322
- @source, ThinkingSphinx::Index::FauxColumn.new(:person, :tags, :name)
323
- )
324
- lambda{ThinkingSphinx::Facet.new(field).value(friendship, {'name_facet' => 'buried'.to_crc32})}.should_not raise_error
325
- end
326
- end
327
-
328
- describe 'for float attributes' do
329
- before :each do
330
- @index = ThinkingSphinx::Index.new(Alpha)
331
- @source = ThinkingSphinx::Source.new(@index)
332
- @attribute = ThinkingSphinx::Attribute.new(
333
- @source, ThinkingSphinx::Index::FauxColumn.new(:cost)
334
- )
335
- @facet = ThinkingSphinx::Facet.new(@attribute)
336
- end
337
-
338
- it "should translate using the given model" do
339
- alpha = Alpha.new(:cost => 10.5)
340
-
341
- @facet.value(alpha, {'cost' => 1093140480}).should == 10.5
342
- end
343
- end
344
-
345
- context 'manual value source' do
346
- let(:index) { ThinkingSphinx::Index.new(Alpha) }
347
- let(:source) { ThinkingSphinx::Source.new(index) }
348
- let(:column) { ThinkingSphinx::Index::FauxColumn.new('LOWER(name)') }
349
- let(:field) { ThinkingSphinx::Field.new(source, column) }
350
- let(:facet) { ThinkingSphinx::Facet.new(field, :name) }
351
-
352
- it "should use the given value source to figure out the value" do
353
- alpha = Alpha.new(:name => 'Foo')
354
-
355
- facet.value(alpha, {'foo_facet' => 'foo'.to_crc32}).should == 'Foo'
356
- end
357
- end
358
- end
359
- end