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,40 +0,0 @@
1
- module ThinkingSphinx
2
- class AutoVersion
3
- def self.detect
4
- version = ThinkingSphinx::Configuration.instance.version
5
- case version
6
- when '0.9.8', '0.9.9'
7
- require "riddle/#{version}"
8
- when /1.10/
9
- require 'riddle/1.10'
10
- when /2.0.[12]/
11
- require 'riddle/2.0.1'
12
- when /2.0.[^12]/, /2.1.\d/
13
- require 'riddle/2.1.0'
14
- else
15
- documentation_link = %Q{
16
- For more information, read the documentation:
17
- http://pat.github.io/thinking-sphinx/advanced_config.html
18
- }
19
-
20
- if version.nil? || version.empty?
21
- STDERR.puts %Q{
22
- Sphinx cannot be found on your system. You may need to configure the following
23
- settings in your config/sphinx.yml file:
24
- * bin_path
25
- * searchd_binary_name
26
- * indexer_binary_name
27
-
28
- #{documentation_link}
29
- }
30
- else
31
- STDERR.puts %Q{
32
- Unsupported version: #{version}
33
-
34
- #{documentation_link}
35
- }
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,40 +0,0 @@
1
- module ThinkingSphinx
2
- class BundledSearch
3
- def initialize
4
- @searches = []
5
- end
6
-
7
- def search(*args)
8
- @searches << ThinkingSphinx.search(*args)
9
- end
10
-
11
- def search_for_ids(*args)
12
- @searches << ThinkingSphinx.search_for_ids(*args)
13
- end
14
-
15
- def searches
16
- populate
17
- @searches
18
- end
19
-
20
- private
21
-
22
- def populated?
23
- @populated
24
- end
25
-
26
- def populate
27
- return if populated?
28
-
29
- @populated = true
30
-
31
- ThinkingSphinx::Connection.take do |client|
32
- @searches.each { |search| search.append_to client }
33
-
34
- client.run.each_with_index do |results, index|
35
- searches[index].populate_from_queue results
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,20 +0,0 @@
1
- module ThinkingSphinx
2
- class ClassFacet < ThinkingSphinx::Facet
3
- def name
4
- :class
5
- end
6
-
7
- def attribute_name
8
- Riddle.loaded_version.to_i < 2 ? 'class_crc' : 'sphinx_internal_class'
9
- end
10
-
11
- def value(object, attribute_hash)
12
- if Riddle.loaded_version.to_i < 2
13
- crc = attribute_hash['class_crc']
14
- ThinkingSphinx::Configuration.instance.models_by_crc[crc]
15
- else
16
- attribute_hash['sphinx_internal_class']
17
- end
18
- end
19
- end
20
- end
@@ -1,71 +0,0 @@
1
- class ThinkingSphinx::Connection
2
- def self.pool
3
- @pool ||= Innertube::Pool.new(
4
- Proc.new { ThinkingSphinx::Connection.new },
5
- Proc.new { |connection| connection.close }
6
- )
7
- end
8
-
9
- def self.take
10
- retries = 0
11
- original = nil
12
- begin
13
- pool.take do |connection|
14
- connection.reset
15
- begin
16
- yield connection
17
- rescue Riddle::ConnectionError, Riddle::ResponseError, SystemCallError => error
18
- original = error
19
- raise Innertube::Pool::BadResource
20
- end
21
- end
22
- rescue Innertube::Pool::BadResource
23
- retries += 1
24
- retry if retries < 3
25
- raise original
26
- end
27
- end
28
-
29
- def initialize
30
- client.open
31
- end
32
-
33
- def client
34
- @client ||= begin
35
- client = Riddle::Client.new shuffled_addresses, configuration.port,
36
- client_key
37
- client.max_matches = _max_matches
38
- client.timeout = configuration.timeout || 0
39
- client
40
- end
41
- end
42
-
43
- private
44
-
45
- def client_key
46
- configuration.configuration.searchd.client_key
47
- end
48
-
49
- def configuration
50
- ThinkingSphinx::Configuration.instance
51
- end
52
-
53
- def _max_matches
54
- configuration.configuration.searchd.max_matches || 1000
55
- end
56
-
57
- def method_missing(method, *arguments, &block)
58
- client.send method, *arguments, &block
59
- end
60
-
61
- def shuffled_addresses
62
- return configuration.address unless configuration.shuffle
63
-
64
- addresses = Array(configuration.address)
65
- if addresses.respond_to?(:shuffle)
66
- addresses.shuffle
67
- else
68
- address.sort_by { rand }
69
- end
70
- end
71
- end
@@ -1,81 +0,0 @@
1
- class ThinkingSphinx::Context
2
- attr_reader :indexed_models
3
-
4
- def initialize(*models)
5
- @indexed_models = []
6
- end
7
-
8
- def prepare
9
- ThinkingSphinx::Configuration.instance.indexed_models.each do |model|
10
- add_indexed_model model
11
- end
12
-
13
- return unless indexed_models.empty?
14
-
15
- load_models
16
- add_indexed_models
17
- end
18
-
19
- def define_indexes
20
- indexed_models.each { |model|
21
- model.constantize.define_indexes
22
- }
23
- end
24
-
25
- def add_indexed_model(model)
26
- model = model.name if model.is_a?(Class)
27
-
28
- indexed_models << model
29
- indexed_models.uniq!
30
- indexed_models.sort!
31
- end
32
-
33
- def superclass_indexed_models
34
- klasses = indexed_models.collect { |name| name.constantize }
35
- klasses.reject { |klass|
36
- klass.superclass.ancestors.any? { |ancestor| klasses.include?(ancestor) }
37
- }.collect { |klass| klass.name }
38
- end
39
-
40
- private
41
-
42
- def add_indexed_models
43
- ActiveRecord::Base.descendants.each do |klass|
44
- add_indexed_model klass if klass.has_sphinx_indexes?
45
- end
46
- end
47
-
48
- # Make sure all models are loaded - without reloading any that
49
- # ActiveRecord::Base is already aware of (otherwise we start to hit some
50
- # messy dependencies issues).
51
- #
52
- def load_models
53
- ThinkingSphinx::Configuration.instance.model_directories.each do |base|
54
- Dir["#{base}**/*.rb"].each do |file|
55
- model_name = file.gsub(/^#{base}([\w_\/\\]+)\.rb/, '\1')
56
-
57
- next if model_name.nil?
58
- camelized_model = model_name.camelize
59
- next if ::ActiveRecord::Base.descendants.detect { |model|
60
- model.name == camelized_model
61
- }
62
-
63
- begin
64
- camelized_model.constantize
65
- rescue LoadError, NameError
66
- # Make sure that STI subclasses in subfolders are loaded.
67
- if camelized_model.gsub!(/.+::/, '').nil?
68
- STDERR.puts "ThinkingSphinx: error loading #{file}"
69
- next
70
- else
71
- retry
72
- end
73
- rescue Exception => err
74
- STDERR.puts "Warning: Error loading #{file}:"
75
- STDERR.puts err.message
76
- STDERR.puts err.backtrace.join("\n"), ''
77
- end
78
- end
79
- end
80
- end
81
- end
@@ -1,15 +0,0 @@
1
- require 'zlib'
2
-
3
- module ThinkingSphinx
4
- module Core
5
- module String
6
- def to_crc32
7
- Zlib.crc32 self
8
- end
9
- end
10
- end
11
- end
12
-
13
- class String
14
- include ThinkingSphinx::Core::String
15
- end
@@ -1,16 +0,0 @@
1
- class ThinkingSphinx::Deltas::DeleteJob
2
- def initialize(indices, document_id)
3
- @indices, @document_id = indices, document_id
4
- end
5
-
6
- def perform
7
- ThinkingSphinx::Connection.take do |client|
8
- @indices.each do |index|
9
- client.update(index, ['sphinx_deleted'], {@document_id => [1]})
10
- end
11
- end
12
- rescue Riddle::ConnectionError, Riddle::ResponseError,
13
- ThinkingSphinx::SphinxError, Errno::ETIMEDOUT, Timeout::Error
14
- # Not the end of the world if Sphinx isn't running.
15
- end
16
- end
@@ -1,17 +0,0 @@
1
- class ThinkingSphinx::Deltas::IndexJob
2
- def initialize(indices)
3
- @indices = indices
4
- @indices << {:verbose => !ThinkingSphinx.suppress_delta_output?}
5
- end
6
-
7
- def perform
8
- ThinkingSphinx::Configuration.instance.controller.index *@indices
9
- ThinkingSphinx::Connection.pool.clear
10
-
11
- true
12
- end
13
-
14
- def configuration
15
- ThinkingSphinx::Configuration.instance
16
- end
17
- end
@@ -1,99 +0,0 @@
1
- Capistrano::Configuration.instance(:must_exist).load do
2
- namespace :thinking_sphinx do
3
- namespace :install do
4
- desc <<-DESC
5
- Install Sphinx by source
6
-
7
- If Postgres is available, Sphinx will use it.
8
-
9
- If the variable :thinking_sphinx_configure_args is set, it will
10
- be passed to the Sphinx configure script. You can use this to
11
- install Sphinx in a non-standard location:
12
-
13
- set :thinking_sphinx_configure_args, "--prefix=$HOME/software"
14
- DESC
15
-
16
- task :sphinx do
17
- with_postgres = false
18
- begin
19
- run "which pg_config" do |channel, stream, data|
20
- with_postgres = !(data.nil? || data == "")
21
- end
22
- rescue Capistrano::CommandError => e
23
- puts "Continuing despite error: #{e.message}"
24
- end
25
-
26
- args = []
27
- if with_postgres
28
- run "pg_config --pkgincludedir" do |channel, stream, data|
29
- args << "--with-pgsql=#{data}"
30
- end
31
- end
32
- args << fetch(:thinking_sphinx_configure_args, '')
33
-
34
- commands = <<-CMD
35
- wget -q http://sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz >> sphinx.log
36
- tar xzvf sphinx-0.9.9.tar.gz
37
- cd sphinx-0.9.9
38
- ./configure #{args.join(" ")}
39
- make
40
- #{try_sudo} make install
41
- rm -rf sphinx-0.9.9 sphinx-0.9.9.tar.gz
42
- CMD
43
- run commands.split(/\n\s+/).join(" && ")
44
- end
45
-
46
- desc "Install Thinking Sphinx as a gem"
47
- task :ts do
48
- run "#{try_sudo} gem install thinking-sphinx"
49
- end
50
- end
51
-
52
- desc "Generate the Sphinx configuration file"
53
- task :configure do
54
- rake "thinking_sphinx:configure"
55
- end
56
-
57
- desc "Index data"
58
- task :index do
59
- rake "thinking_sphinx:index"
60
- end
61
-
62
- desc "Start the Sphinx daemon"
63
- task :start do
64
- rake "thinking_sphinx:configure thinking_sphinx:start"
65
- end
66
-
67
- desc "Stop the Sphinx daemon"
68
- task :stop do
69
- rake "thinking_sphinx:configure thinking_sphinx:stop"
70
- end
71
-
72
- desc "Stop and then start the Sphinx daemon"
73
- task :restart do
74
- rake "thinking_sphinx:configure thinking_sphinx:stop \
75
- thinking_sphinx:start"
76
- end
77
-
78
- desc "Stop, re-index and then start the Sphinx daemon"
79
- task :rebuild do
80
- rake "thinking_sphinx:configure thinking_sphinx:stop \
81
- thinking_sphinx:reindex \
82
- thinking_sphinx:start"
83
- end
84
-
85
- desc "Add the shared folder for sphinx files"
86
- task :shared_sphinx_folder, :roles => :web do
87
- rails_env = fetch(:rails_env, "production")
88
- run "mkdir -p #{shared_path}/sphinx/#{rails_env}"
89
- end
90
-
91
- def rake(*tasks)
92
- rails_env = fetch(:rails_env, "production")
93
- rake = fetch(:rake, "rake")
94
- tasks.each do |t|
95
- run "if [ -d #{release_path} ]; then cd #{release_path}; else cd #{current_path}; fi; if [ -f Rakefile ]; then #{rake} RAILS_ENV=#{rails_env} #{t}; fi;"
96
- end
97
- end
98
- end
99
- end
@@ -1,98 +0,0 @@
1
- module ThinkingSphinx
2
- # Fields - holding the string data which Sphinx indexes for your searches.
3
- # This class isn't really useful to you unless you're hacking around with the
4
- # internals of Thinking Sphinx - but hey, don't let that stop you.
5
- #
6
- # One key thing to remember - if you're using the field manually to
7
- # generate SQL statements, you'll need to set the base model, and all the
8
- # associations. Which can get messy. Use Index.link!, it really helps.
9
- #
10
- class Field < ThinkingSphinx::Property
11
- attr_accessor :sortable, :infixes, :prefixes
12
-
13
- # To create a new field, you'll need to pass in either a single Column
14
- # or an array of them, and some (optional) options. The columns are
15
- # references to the data that will make up the field.
16
- #
17
- # Valid options are:
18
- # - :as => :alias_name
19
- # - :sortable => true
20
- # - :infixes => true
21
- # - :prefixes => true
22
- # - :file => true
23
- # - :with => :attribute # or :wordcount
24
- #
25
- # Alias is only required in three circumstances: when there's
26
- # another attribute or field with the same name, when the column name is
27
- # 'id', or when there's more than one column.
28
- #
29
- # Sortable defaults to false - but is quite useful when set to true, as
30
- # it creates an attribute with the same string value (which Sphinx converts
31
- # to an integer value), which can be sorted by. Thinking Sphinx is smart
32
- # enough to realise that when you specify fields in sort statements, you
33
- # mean their respective attributes.
34
- #
35
- # If you have partial matching enabled (ie: enable_star), then you can
36
- # specify certain fields to have their prefixes and infixes indexed. Keep
37
- # in mind, though, that Sphinx's default is _all_ fields - so once you
38
- # highlight a particular field, no other fields in the index will have
39
- # these partial indexes.
40
- #
41
- # Here's some examples:
42
- #
43
- # Field.new(
44
- # Column.new(:name)
45
- # )
46
- #
47
- # Field.new(
48
- # [Column.new(:first_name), Column.new(:last_name)],
49
- # :as => :name, :sortable => true
50
- # )
51
- #
52
- # Field.new(
53
- # [Column.new(:posts, :subject), Column.new(:posts, :content)],
54
- # :as => :posts, :prefixes => true
55
- # )
56
- #
57
- def initialize(source, columns, options = {})
58
- super
59
-
60
- @sortable = options[:sortable] || false
61
- @infixes = options[:infixes] || false
62
- @prefixes = options[:prefixes] || false
63
- @file = options[:file] || false
64
- @with = options[:with]
65
-
66
- source.fields << self
67
- end
68
-
69
- # Get the part of the SELECT clause related to this field. Don't forget
70
- # to set your model and associations first though.
71
- #
72
- # This will concatenate strings if there's more than one data source or
73
- # multiple data values (has_many or has_and_belongs_to_many associations).
74
- #
75
- def to_select_sql
76
- return nil unless available?
77
-
78
- clause = columns_with_prefixes.join(', ')
79
-
80
- clause = adapter.concatenate(clause) if concat_ws?
81
- clause = adapter.group_concatenate(clause) if is_many?
82
-
83
- "#{clause} AS #{quote_column(unique_name)}"
84
- end
85
-
86
- def file?
87
- @file
88
- end
89
-
90
- def with_attribute?
91
- @with == :attribute
92
- end
93
-
94
- def with_wordcount?
95
- @with == :wordcount
96
- end
97
- end
98
- end