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,110 +0,0 @@
1
- module ThinkingSphinx
2
- module ActiveRecord
3
- module Scopes
4
- def self.included(base)
5
- base.class_eval do
6
- extend ThinkingSphinx::ActiveRecord::Scopes::ClassMethods
7
- end
8
- end
9
-
10
- module ClassMethods
11
-
12
- # Similar to ActiveRecord's default_scope method Thinking Sphinx supports
13
- # a default_sphinx_scope. For example:
14
- #
15
- # default_sphinx_scope :some_sphinx_named_scope
16
- #
17
- # The scope is automatically applied when the search method is called. It
18
- # will only be applied if it is an existing sphinx_scope.
19
- def default_sphinx_scope(sphinx_scope_name)
20
- add_sphinx_scopes_support_to_has_many_associations
21
- @default_sphinx_scope = sphinx_scope_name
22
- end
23
-
24
- # Returns the default_sphinx_scope or nil if none is set.
25
- def get_default_sphinx_scope
26
- @default_sphinx_scope
27
- end
28
-
29
- # Returns true if the current Model has a default_sphinx_scope. Also checks if
30
- # the default_sphinx_scope actually is a scope.
31
- def has_default_sphinx_scope?
32
- !@default_sphinx_scope.nil? && sphinx_scopes.include?(@default_sphinx_scope)
33
- end
34
-
35
- # Similar to ActiveRecord's named_scope method Thinking Sphinx supports
36
- # scopes. For example:
37
- #
38
- # sphinx_scope(:latest_first) {
39
- # {:order => 'created_at DESC, @relevance DESC'}
40
- # }
41
- #
42
- # Usage:
43
- #
44
- # @articles = Article.latest_first.search 'pancakes'
45
- #
46
- def sphinx_scope(method, &block)
47
- add_sphinx_scopes_support_to_has_many_associations
48
-
49
- @sphinx_scopes ||= []
50
- @sphinx_scopes << method
51
-
52
- singleton_class.instance_eval do
53
- define_method(method) do |*args|
54
- options = {:classes => classes_option}
55
- options.merge! block.call(*args)
56
-
57
- ThinkingSphinx::Search.new(options)
58
- end
59
-
60
- define_method("#{method}_without_default".to_sym) do |*args|
61
- options = {:classes => classes_option, :ignore_default => true}
62
- options.merge! block.call(*args)
63
-
64
- ThinkingSphinx::Search.new(options)
65
- end
66
- end
67
- end
68
-
69
- # This returns an Array of all defined scopes. The default
70
- # scope shows as :default.
71
- def sphinx_scopes
72
- @sphinx_scopes || []
73
- end
74
-
75
- def remove_sphinx_scopes
76
- sphinx_scopes.each do |scope|
77
- singleton_class.send(:undef_method, scope)
78
- end
79
-
80
- sphinx_scopes.clear
81
- end
82
-
83
- def add_sphinx_scopes_support_to_has_many_associations
84
- mixin = sphinx_scopes_support_mixin
85
- sphinx_scopes_support_classes.each do |klass|
86
- klass.send(:include, mixin) unless klass.ancestors.include?(mixin)
87
- end
88
- end
89
-
90
- def sphinx_scopes_support_classes
91
- if ThinkingSphinx.rails_3_1?
92
- [::ActiveRecord::Associations::CollectionProxy]
93
- else
94
- [::ActiveRecord::Associations::HasManyAssociation,
95
- ::ActiveRecord::Associations::HasManyThroughAssociation]
96
- end
97
- end
98
-
99
- def sphinx_scopes_support_mixin
100
- if ThinkingSphinx.rails_3_1?
101
- ::ThinkingSphinx::ActiveRecord::CollectionProxyWithScopes
102
- else
103
- ::ThinkingSphinx::ActiveRecord::HasManyAssociationWithScopes
104
- end
105
- end
106
-
107
- end
108
- end
109
- end
110
- end
@@ -1,94 +0,0 @@
1
- module ThinkingSphinx
2
- class AbstractAdapter
3
- def initialize(model)
4
- @model = model
5
- end
6
-
7
- def setup
8
- # Deliberately blank - subclasses should do something though. Well, if
9
- # they need to.
10
- end
11
-
12
- def self.detect(model)
13
- adapter = adapter_for_model model
14
- case adapter
15
- when :mysql
16
- ThinkingSphinx::MysqlAdapter.new model
17
- when :postgresql
18
- ThinkingSphinx::PostgreSQLAdapter.new model
19
- when Class
20
- adapter.new model
21
- else
22
- raise "Invalid Database Adapter: Sphinx only supports MySQL and PostgreSQL, not #{adapter}"
23
- end
24
- end
25
-
26
- def self.adapter_for_model(model)
27
- case ThinkingSphinx.database_adapter
28
- when String
29
- ThinkingSphinx.database_adapter.to_sym
30
- when NilClass
31
- standard_adapter_for_model model
32
- when Proc
33
- ThinkingSphinx.database_adapter.call model
34
- else
35
- ThinkingSphinx.database_adapter
36
- end
37
- end
38
-
39
- def self.standard_adapter_for_model(model)
40
- case model.connection.class.name
41
- when "ActiveRecord::ConnectionAdapters::MysqlAdapter",
42
- "ActiveRecord::ConnectionAdapters::MysqlplusAdapter",
43
- "ActiveRecord::ConnectionAdapters::Mysql2Adapter",
44
- "ActiveRecord::ConnectionAdapters::NullDBAdapter"
45
- :mysql
46
- when "ActiveRecord::ConnectionAdapters::PostgreSQLAdapter"
47
- :postgresql
48
- when "ActiveRecord::ConnectionAdapters::JdbcAdapter"
49
- case model.connection.config[:adapter]
50
- when "jdbcmysql"
51
- :mysql
52
- when "jdbcpostgresql"
53
- :postgresql
54
- when "jdbc"
55
- match = /^jdbc:(mysql|postgresql):\/\//.match(model.connection.config[:url])
56
- if match
57
- match[1].to_sym
58
- else
59
- model.connection.config[:adapter]
60
- end
61
- else
62
- model.connection.config[:adapter].to_sym
63
- end
64
- else
65
- model.connection.class.name
66
- end
67
- end
68
-
69
- def quote_with_table(column)
70
- "#{@model.quoted_table_name}.#{@model.connection.quote_column_name(column)}"
71
- end
72
-
73
- def bigint_pattern
74
- /bigint/i
75
- end
76
-
77
- def downcase(clause)
78
- "LOWER(#{clause})"
79
- end
80
-
81
- def case(expression, pairs, default)
82
- "CASE #{expression} " +
83
- pairs.keys.inject('') { |string, key|
84
- string + "WHEN '#{key}' THEN #{pairs[key]} "
85
- } + "ELSE #{default} END"
86
- end
87
-
88
- protected
89
-
90
- def connection
91
- @connection ||= @model.connection
92
- end
93
- end
94
- end
@@ -1,62 +0,0 @@
1
- module ThinkingSphinx
2
- class MysqlAdapter < AbstractAdapter
3
- def setup
4
- # Does MySQL actually need to do anything?
5
- end
6
-
7
- def sphinx_identifier
8
- "mysql"
9
- end
10
-
11
- def concatenate(clause, separator = ' ')
12
- "CONCAT_WS('#{separator}', #{clause})"
13
- end
14
-
15
- def group_concatenate(clause, separator = ' ')
16
- "GROUP_CONCAT(DISTINCT IFNULL(#{clause}, '0') SEPARATOR '#{separator}')"
17
- end
18
-
19
- def cast_to_string(clause)
20
- "CAST(#{clause} AS CHAR)"
21
- end
22
-
23
- def cast_to_datetime(clause)
24
- "UNIX_TIMESTAMP(#{clause})"
25
- end
26
-
27
- def cast_to_unsigned(clause)
28
- "CAST(#{clause} AS UNSIGNED)"
29
- end
30
-
31
- def cast_to_int(clause)
32
- "CAST(#{clause} AS SIGNED)"
33
- end
34
-
35
- def convert_nulls(clause, default = '')
36
- default = "'#{default}'" if default.is_a?(String)
37
-
38
- "IFNULL(#{clause}, #{default})"
39
- end
40
-
41
- def boolean(value)
42
- value ? 1 : 0
43
- end
44
-
45
- def crc(clause, blank_to_null = false)
46
- clause = "NULLIF(#{clause},'')" if blank_to_null
47
- "CRC32(#{clause})"
48
- end
49
-
50
- def utf8_query_pre
51
- "SET NAMES utf8"
52
- end
53
-
54
- def time_difference(diff)
55
- "DATE_SUB(NOW(), INTERVAL #{diff} SECOND)"
56
- end
57
-
58
- def utc_query_pre
59
- "SET TIME_ZONE = '+0:00'"
60
- end
61
- end
62
- end
@@ -1,188 +0,0 @@
1
- module ThinkingSphinx
2
- class PostgreSQLAdapter < AbstractAdapter
3
- def setup
4
- create_array_accum_function
5
- create_crc32_function
6
- end
7
-
8
- def sphinx_identifier
9
- "pgsql"
10
- end
11
-
12
- def concatenate(clause, separator = ' ')
13
- if clause[/^COALESCE/]
14
- clause.split('), ').join(") || '#{separator}' || ")
15
- else
16
- clause.split(', ').collect { |field|
17
- "CAST(COALESCE(#{field}::varchar, '') as varchar)"
18
- }.join(" || '#{separator}' || ")
19
- end
20
- end
21
-
22
- def group_concatenate(clause, separator = ' ')
23
- if server_version >= 80400
24
- "array_to_string(array_agg(COALESCE(#{clause}, '0')), '#{separator}')"
25
- else
26
- "array_to_string(array_accum(COALESCE(#{clause}, '0')), '#{separator}')"
27
- end
28
- end
29
-
30
- def cast_to_string(clause)
31
- clause
32
- end
33
-
34
- def cast_to_datetime(clause)
35
- if ThinkingSphinx::Configuration.instance.use_64_bit
36
- "cast(floor(extract(epoch from #{clause})) as bigint)"
37
- else
38
- "cast(floor(extract(epoch from #{clause})) as int)"
39
- end
40
- end
41
-
42
- def cast_to_unsigned(clause)
43
- clause
44
- end
45
-
46
- def cast_to_int(clause)
47
- "#{clause}::INT8"
48
- end
49
-
50
- def convert_nulls(clause, default = '')
51
- default = case default
52
- when String
53
- "'#{default}'"
54
- when NilClass
55
- 'NULL'
56
- when Fixnum
57
- "#{default}::bigint"
58
- else
59
- default
60
- end
61
-
62
- "COALESCE(#{clause}, #{default})"
63
- end
64
-
65
- def boolean(value)
66
- value ? 'TRUE' : 'FALSE'
67
- end
68
-
69
- def crc(clause, blank_to_null = false)
70
- clause = "NULLIF(#{clause},'')" if blank_to_null
71
- "crc32(#{clause})"
72
- end
73
-
74
- def utf8_query_pre
75
- nil
76
- end
77
-
78
- def time_difference(diff)
79
- "current_timestamp - interval '#{diff} seconds'"
80
- end
81
-
82
- def utc_query_pre
83
- "SET TIME ZONE 'UTC'"
84
- end
85
-
86
- private
87
-
88
- def execute(command, output_error = false)
89
- if RUBY_PLATFORM == 'java'
90
- connection.transaction do
91
- execute_command command, output_error
92
- end
93
- else
94
- execute_command command, output_error
95
- end
96
- end
97
-
98
- def execute_command(command, output_error = false)
99
- connection.execute "begin"
100
- connection.execute "savepoint ts"
101
- begin
102
- connection.execute command
103
- rescue StandardError => err
104
- puts err if output_error
105
- connection.execute "rollback to savepoint ts"
106
- end
107
- connection.execute "release savepoint ts"
108
- connection.execute "commit"
109
- end
110
-
111
- def create_array_accum_function
112
- if server_version >= 80311
113
- return
114
- elsif server_version > 80200
115
- execute <<-SQL
116
- CREATE AGGREGATE array_accum (anyelement)
117
- (
118
- sfunc = array_append,
119
- stype = anyarray,
120
- initcond = '{}'
121
- );
122
- SQL
123
- else
124
- execute <<-SQL
125
- CREATE AGGREGATE array_accum
126
- (
127
- basetype = anyelement,
128
- sfunc = array_append,
129
- stype = anyarray,
130
- initcond = '{}'
131
- );
132
- SQL
133
- end
134
- end
135
-
136
- def create_crc32_function
137
- execute "CREATE LANGUAGE 'plpgsql';"
138
- function = <<-SQL
139
- CREATE OR REPLACE FUNCTION crc32(word text)
140
- RETURNS bigint AS $$
141
- DECLARE tmp bigint;
142
- DECLARE i int;
143
- DECLARE j int;
144
- DECLARE byte_length int;
145
- DECLARE word_array bytea;
146
- BEGIN
147
- IF COALESCE(word, '') = '' THEN
148
- return 0;
149
- END IF;
150
-
151
- i = 0;
152
- tmp = 4294967295;
153
- byte_length = bit_length(word) / 8;
154
- word_array = decode(replace(word, E'\\\\', E'\\\\\\\\'), 'escape');
155
- LOOP
156
- tmp = (tmp # get_byte(word_array, i))::bigint;
157
- i = i + 1;
158
- j = 0;
159
- LOOP
160
- tmp = ((tmp >> 1) # (3988292384 * (tmp & 1)))::bigint;
161
- j = j + 1;
162
- IF j >= 8 THEN
163
- EXIT;
164
- END IF;
165
- END LOOP;
166
- IF i >= byte_length THEN
167
- EXIT;
168
- END IF;
169
- END LOOP;
170
- return (tmp # 4294967295);
171
- END
172
- $$ IMMUTABLE LANGUAGE plpgsql;
173
- SQL
174
- execute function, true
175
- end
176
-
177
- def server_version
178
- if RUBY_PLATFORM == 'java'
179
- (connection.raw_connection.connection.server_major_version * 10000) +
180
- (connection.raw_connection.connection.server_minor_version * 100)
181
- elsif connection.raw_connection.respond_to?(:server_version)
182
- connection.raw_connection.server_version
183
- else
184
- 0
185
- end
186
- end
187
- end
188
- end