thinking-sphinx 2.1.0 → 3.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
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