thinking-sphinx 1.2.13 → 6.0.0

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 (517) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +99 -0
  3. data/.github/actions/test/action.yml +46 -0
  4. data/.github/workflows/ci.yml +75 -0
  5. data/.gitignore +18 -0
  6. data/.travis.yml +36 -0
  7. data/Appraisals +71 -0
  8. data/CHANGELOG.markdown +782 -0
  9. data/Gemfile +18 -0
  10. data/LICENCE +1 -1
  11. data/Procfile.support +2 -0
  12. data/README.textile +91 -136
  13. data/Rakefile +26 -0
  14. data/bin/console +15 -0
  15. data/bin/loadsphinx +99 -0
  16. data/bin/testmatrix +48 -0
  17. data/lib/thinking/sphinx.rb +3 -0
  18. data/lib/thinking-sphinx.rb +3 -0
  19. data/lib/thinking_sphinx/active_record/association.rb +19 -0
  20. data/lib/thinking_sphinx/active_record/association_proxy/attribute_finder.rb +44 -0
  21. data/lib/thinking_sphinx/active_record/association_proxy/attribute_matcher.rb +40 -0
  22. data/lib/thinking_sphinx/active_record/association_proxy.rb +34 -0
  23. data/lib/thinking_sphinx/active_record/attribute/sphinx_presenter.rb +52 -0
  24. data/lib/thinking_sphinx/active_record/attribute/type.rb +106 -0
  25. data/lib/thinking_sphinx/active_record/attribute/values.rb +20 -0
  26. data/lib/thinking_sphinx/active_record/attribute.rb +22 -0
  27. data/lib/thinking_sphinx/active_record/base.rb +91 -0
  28. data/lib/thinking_sphinx/active_record/callbacks/association_delta_callbacks.rb +21 -0
  29. data/lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb +27 -0
  30. data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +66 -0
  31. data/lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb +78 -0
  32. data/lib/thinking_sphinx/active_record/column.rb +44 -0
  33. data/lib/thinking_sphinx/active_record/column_sql_presenter.rb +54 -0
  34. data/lib/thinking_sphinx/active_record/database_adapters/abstract_adapter.rb +19 -0
  35. data/lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb +51 -0
  36. data/lib/thinking_sphinx/active_record/database_adapters/postgresql_adapter.rb +47 -0
  37. data/lib/thinking_sphinx/active_record/database_adapters.rb +59 -0
  38. data/lib/thinking_sphinx/active_record/depolymorph/association_reflection.rb +32 -0
  39. data/lib/thinking_sphinx/active_record/depolymorph/base_reflection.rb +32 -0
  40. data/lib/thinking_sphinx/active_record/depolymorph/conditions_reflection.rb +40 -0
  41. data/lib/thinking_sphinx/active_record/depolymorph/overridden_reflection.rb +50 -0
  42. data/lib/thinking_sphinx/active_record/depolymorph/scoped_reflection.rb +26 -0
  43. data/lib/thinking_sphinx/active_record/field.rb +18 -0
  44. data/lib/thinking_sphinx/active_record/filter_reflection.rb +18 -0
  45. data/lib/thinking_sphinx/active_record/index.rb +71 -0
  46. data/lib/thinking_sphinx/active_record/interpreter.rb +77 -0
  47. data/lib/thinking_sphinx/active_record/join_association.rb +17 -0
  48. data/lib/thinking_sphinx/active_record/log_subscriber.rb +37 -0
  49. data/lib/thinking_sphinx/active_record/polymorpher.rb +64 -0
  50. data/lib/thinking_sphinx/active_record/property.rb +30 -0
  51. data/lib/thinking_sphinx/active_record/property_query.rb +149 -0
  52. data/lib/thinking_sphinx/active_record/property_sql_presenter.rb +89 -0
  53. data/lib/thinking_sphinx/active_record/simple_many_query.rb +37 -0
  54. data/lib/thinking_sphinx/active_record/source_joins.rb +68 -0
  55. data/lib/thinking_sphinx/active_record/sql_builder/clause_builder.rb +29 -0
  56. data/lib/thinking_sphinx/active_record/sql_builder/query.rb +59 -0
  57. data/lib/thinking_sphinx/active_record/sql_builder/statement.rb +147 -0
  58. data/lib/thinking_sphinx/active_record/sql_builder.rb +107 -0
  59. data/lib/thinking_sphinx/active_record/sql_source/template.rb +55 -0
  60. data/lib/thinking_sphinx/active_record/sql_source.rb +173 -0
  61. data/lib/thinking_sphinx/active_record.rb +39 -301
  62. data/lib/thinking_sphinx/attribute_types.rb +72 -0
  63. data/lib/thinking_sphinx/batched_search.rb +28 -0
  64. data/lib/thinking_sphinx/callbacks/appender.rb +63 -0
  65. data/lib/thinking_sphinx/callbacks.rb +44 -0
  66. data/lib/thinking_sphinx/capistrano/v2.rb +60 -0
  67. data/lib/thinking_sphinx/capistrano/v3.rb +104 -0
  68. data/lib/thinking_sphinx/capistrano.rb +10 -0
  69. data/lib/thinking_sphinx/commander.rb +27 -0
  70. data/lib/thinking_sphinx/commands/base.rb +53 -0
  71. data/lib/thinking_sphinx/commands/clear_real_time.rb +22 -0
  72. data/lib/thinking_sphinx/commands/clear_sql.rb +18 -0
  73. data/lib/thinking_sphinx/commands/configure.rb +15 -0
  74. data/lib/thinking_sphinx/commands/index_real_time.rb +15 -0
  75. data/lib/thinking_sphinx/commands/index_sql.rb +25 -0
  76. data/lib/thinking_sphinx/commands/merge.rb +27 -0
  77. data/lib/thinking_sphinx/commands/merge_and_update.rb +57 -0
  78. data/lib/thinking_sphinx/commands/prepare.rb +15 -0
  79. data/lib/thinking_sphinx/commands/rotate.rb +13 -0
  80. data/lib/thinking_sphinx/commands/running.rb +15 -0
  81. data/lib/thinking_sphinx/commands/start_attached.rb +22 -0
  82. data/lib/thinking_sphinx/commands/start_detached.rb +21 -0
  83. data/lib/thinking_sphinx/commands/stop.rb +24 -0
  84. data/lib/thinking_sphinx/commands.rb +20 -0
  85. data/lib/thinking_sphinx/configuration/consistent_ids.rb +35 -0
  86. data/lib/thinking_sphinx/configuration/defaults.rb +7 -0
  87. data/lib/thinking_sphinx/configuration/distributed_indices.rb +31 -0
  88. data/lib/thinking_sphinx/configuration/duplicate_names.rb +36 -0
  89. data/lib/thinking_sphinx/configuration/minimum_fields.rb +36 -0
  90. data/lib/thinking_sphinx/configuration.rb +196 -269
  91. data/lib/thinking_sphinx/connection/client.rb +74 -0
  92. data/lib/thinking_sphinx/connection/jruby.rb +58 -0
  93. data/lib/thinking_sphinx/connection/mri.rb +26 -0
  94. data/lib/thinking_sphinx/connection.rb +73 -0
  95. data/lib/thinking_sphinx/core/field.rb +11 -0
  96. data/lib/thinking_sphinx/core/index.rb +110 -0
  97. data/lib/thinking_sphinx/core/interpreter.rb +25 -0
  98. data/lib/thinking_sphinx/core/property.rb +15 -0
  99. data/lib/thinking_sphinx/core/settings.rb +11 -0
  100. data/lib/thinking_sphinx/core.rb +11 -0
  101. data/lib/thinking_sphinx/deletion.rb +70 -0
  102. data/lib/thinking_sphinx/deltas/default_delta.rb +57 -66
  103. data/lib/thinking_sphinx/deltas/delete_job.rb +27 -0
  104. data/lib/thinking_sphinx/deltas/index_job.rb +28 -0
  105. data/lib/thinking_sphinx/deltas.rb +52 -27
  106. data/lib/thinking_sphinx/distributed/index.rb +46 -0
  107. data/lib/thinking_sphinx/distributed.rb +7 -0
  108. data/lib/thinking_sphinx/errors.rb +96 -0
  109. data/lib/thinking_sphinx/excerpter.rb +36 -19
  110. data/lib/thinking_sphinx/facet.rb +29 -122
  111. data/lib/thinking_sphinx/facet_search.rb +132 -125
  112. data/lib/thinking_sphinx/float_formatter.rb +35 -0
  113. data/lib/thinking_sphinx/frameworks/plain.rb +10 -0
  114. data/lib/thinking_sphinx/frameworks/rails.rb +11 -0
  115. data/lib/thinking_sphinx/frameworks.rb +11 -0
  116. data/lib/thinking_sphinx/guard/file.rb +28 -0
  117. data/lib/thinking_sphinx/guard/files.rb +40 -0
  118. data/lib/thinking_sphinx/guard/none.rb +7 -0
  119. data/lib/thinking_sphinx/guard.rb +9 -0
  120. data/lib/thinking_sphinx/hooks/guard_presence.rb +34 -0
  121. data/lib/thinking_sphinx/index.rb +50 -92
  122. data/lib/thinking_sphinx/index_set.rb +96 -0
  123. data/lib/thinking_sphinx/indexing_strategies/all_at_once.rb +9 -0
  124. data/lib/thinking_sphinx/indexing_strategies/one_at_a_time.rb +16 -0
  125. data/lib/thinking_sphinx/interfaces/base.rb +13 -0
  126. data/lib/thinking_sphinx/interfaces/daemon.rb +27 -0
  127. data/lib/thinking_sphinx/interfaces/real_time.rb +46 -0
  128. data/lib/thinking_sphinx/interfaces/sql.rb +53 -0
  129. data/lib/thinking_sphinx/interfaces.rb +10 -0
  130. data/lib/thinking_sphinx/logger.rb +9 -0
  131. data/lib/thinking_sphinx/masks/group_enumerators_mask.rb +30 -0
  132. data/lib/thinking_sphinx/masks/pagination_mask.rb +63 -0
  133. data/lib/thinking_sphinx/masks/scopes_mask.rb +56 -0
  134. data/lib/thinking_sphinx/masks/weight_enumerator_mask.rb +17 -0
  135. data/lib/thinking_sphinx/masks.rb +10 -0
  136. data/lib/thinking_sphinx/middlewares/active_record_translator.rb +103 -0
  137. data/lib/thinking_sphinx/middlewares/geographer.rb +94 -0
  138. data/lib/thinking_sphinx/middlewares/glazier.rb +52 -0
  139. data/lib/thinking_sphinx/middlewares/ids_only.rb +15 -0
  140. data/lib/thinking_sphinx/middlewares/inquirer.rb +64 -0
  141. data/lib/thinking_sphinx/middlewares/middleware.rb +11 -0
  142. data/lib/thinking_sphinx/middlewares/sphinxql.rb +256 -0
  143. data/lib/thinking_sphinx/middlewares/stale_id_checker.rb +47 -0
  144. data/lib/thinking_sphinx/middlewares/stale_id_filter.rb +48 -0
  145. data/lib/thinking_sphinx/middlewares/valid_options.rb +25 -0
  146. data/lib/thinking_sphinx/middlewares.rb +35 -0
  147. data/lib/thinking_sphinx/panes/attributes_pane.rb +11 -0
  148. data/lib/thinking_sphinx/panes/distance_pane.rb +15 -0
  149. data/lib/thinking_sphinx/panes/excerpts_pane.rb +43 -0
  150. data/lib/thinking_sphinx/panes/weight_pane.rb +11 -0
  151. data/lib/thinking_sphinx/panes.rb +10 -0
  152. data/lib/thinking_sphinx/processor.rb +71 -0
  153. data/lib/thinking_sphinx/query.rb +11 -0
  154. data/lib/thinking_sphinx/railtie.rb +38 -0
  155. data/lib/thinking_sphinx/rake_interface.rb +34 -0
  156. data/lib/thinking_sphinx/real_time/attribute.rb +27 -0
  157. data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +60 -0
  158. data/lib/thinking_sphinx/real_time/field.rb +9 -0
  159. data/lib/thinking_sphinx/real_time/index/template.rb +52 -0
  160. data/lib/thinking_sphinx/real_time/index.rb +102 -0
  161. data/lib/thinking_sphinx/real_time/interpreter.rb +54 -0
  162. data/lib/thinking_sphinx/real_time/populator.rb +46 -0
  163. data/lib/thinking_sphinx/real_time/processor.rb +36 -0
  164. data/lib/thinking_sphinx/real_time/property.rb +21 -0
  165. data/lib/thinking_sphinx/real_time/transcribe_instance.rb +38 -0
  166. data/lib/thinking_sphinx/real_time/transcriber.rb +89 -0
  167. data/lib/thinking_sphinx/real_time/translator.rb +39 -0
  168. data/lib/thinking_sphinx/real_time.rb +40 -0
  169. data/lib/thinking_sphinx/scopes.rb +34 -0
  170. data/lib/thinking_sphinx/search/batch_inquirer.rb +23 -0
  171. data/lib/thinking_sphinx/search/context.rb +31 -0
  172. data/lib/thinking_sphinx/search/glaze.rb +39 -0
  173. data/lib/thinking_sphinx/search/merger.rb +34 -0
  174. data/lib/thinking_sphinx/search/query.rb +33 -0
  175. data/lib/thinking_sphinx/search/stale_ids_exception.rb +15 -0
  176. data/lib/thinking_sphinx/search.rb +166 -704
  177. data/lib/thinking_sphinx/settings.rb +128 -0
  178. data/lib/thinking_sphinx/sinatra.rb +7 -0
  179. data/lib/thinking_sphinx/subscribers/populator_subscriber.rb +48 -0
  180. data/lib/thinking_sphinx/tasks.rb +70 -150
  181. data/lib/thinking_sphinx/test.rb +56 -0
  182. data/lib/thinking_sphinx/utf8.rb +18 -0
  183. data/lib/thinking_sphinx/wildcard.rb +42 -0
  184. data/lib/thinking_sphinx/with_output.rb +13 -0
  185. data/lib/thinking_sphinx.rb +83 -185
  186. data/spec/acceptance/association_scoping_spec.rb +65 -0
  187. data/spec/acceptance/attribute_access_spec.rb +58 -0
  188. data/spec/acceptance/attribute_updates_spec.rb +18 -0
  189. data/spec/acceptance/batch_searching_spec.rb +23 -0
  190. data/spec/acceptance/big_integers_spec.rb +61 -0
  191. data/spec/acceptance/excerpts_spec.rb +50 -0
  192. data/spec/acceptance/facets_spec.rb +141 -0
  193. data/spec/acceptance/geosearching_spec.rb +70 -0
  194. data/spec/acceptance/grouping_by_attributes_spec.rb +79 -0
  195. data/spec/acceptance/index_options_spec.rb +154 -0
  196. data/spec/acceptance/indexing_spec.rb +38 -0
  197. data/spec/acceptance/merging_spec.rb +90 -0
  198. data/spec/acceptance/paginating_search_results_spec.rb +42 -0
  199. data/spec/acceptance/real_time_updates_spec.rb +115 -0
  200. data/spec/acceptance/remove_deleted_records_spec.rb +99 -0
  201. data/spec/acceptance/search_counts_spec.rb +20 -0
  202. data/spec/acceptance/search_for_just_ids_spec.rb +21 -0
  203. data/spec/acceptance/searching_across_models_spec.rb +47 -0
  204. data/spec/acceptance/searching_across_schemas_spec.rb +40 -0
  205. data/spec/acceptance/searching_on_fields_spec.rb +59 -0
  206. data/spec/acceptance/searching_with_filters_spec.rb +159 -0
  207. data/spec/acceptance/searching_with_sti_spec.rb +76 -0
  208. data/spec/acceptance/searching_within_a_model_spec.rb +117 -0
  209. data/spec/acceptance/sorting_search_results_spec.rb +50 -0
  210. data/spec/acceptance/spec_helper.rb +6 -0
  211. data/spec/acceptance/specifying_sql_spec.rb +516 -0
  212. data/spec/acceptance/sphinx_scopes_spec.rb +87 -0
  213. data/spec/acceptance/sql_deltas_spec.rb +78 -0
  214. data/spec/acceptance/support/database_cleaner.rb +13 -0
  215. data/spec/acceptance/support/sphinx_controller.rb +62 -0
  216. data/spec/acceptance/support/sphinx_helpers.rb +45 -0
  217. data/spec/acceptance/suspended_deltas_spec.rb +56 -0
  218. data/spec/fixtures/database.yml +4 -0
  219. data/spec/internal/app/indices/admin_person_index.rb +9 -0
  220. data/spec/internal/app/indices/album_index.rb +9 -0
  221. data/spec/internal/app/indices/animal_index.rb +5 -0
  222. data/spec/internal/app/indices/article_index.rb +31 -0
  223. data/spec/internal/app/indices/bird_index.rb +6 -0
  224. data/spec/internal/app/indices/book_index.rb +11 -0
  225. data/spec/internal/app/indices/car_index.rb +7 -0
  226. data/spec/internal/app/indices/city_index.rb +9 -0
  227. data/spec/internal/app/indices/colour_index.rb +7 -0
  228. data/spec/internal/app/indices/product_index.rb +27 -0
  229. data/spec/internal/app/indices/tee_index.rb +6 -0
  230. data/spec/internal/app/indices/user_index.rb +9 -0
  231. data/spec/internal/app/models/admin/person.rb +9 -0
  232. data/spec/internal/app/models/album.rb +25 -0
  233. data/spec/internal/app/models/animal.rb +5 -0
  234. data/spec/internal/app/models/article.rb +9 -0
  235. data/spec/internal/app/models/bird.rb +5 -0
  236. data/spec/internal/app/models/book.rb +18 -0
  237. data/spec/internal/app/models/car.rb +7 -0
  238. data/spec/internal/app/models/categorisation.rb +15 -0
  239. data/spec/internal/app/models/category.rb +6 -0
  240. data/spec/internal/app/models/city.rb +7 -0
  241. data/spec/internal/app/models/colour.rb +7 -0
  242. data/spec/internal/app/models/event.rb +5 -0
  243. data/spec/internal/app/models/flightless_bird.rb +4 -0
  244. data/spec/internal/app/models/genre.rb +5 -0
  245. data/spec/internal/app/models/hardcover.rb +5 -0
  246. data/spec/internal/app/models/mammal.rb +4 -0
  247. data/spec/internal/app/models/manufacturer.rb +5 -0
  248. data/spec/internal/app/models/product.rb +8 -0
  249. data/spec/internal/app/models/tag.rb +6 -0
  250. data/{features/support → spec/internal/app}/models/tagging.rb +3 -1
  251. data/spec/internal/app/models/tee.rb +10 -0
  252. data/spec/internal/app/models/tweet.rb +5 -0
  253. data/spec/internal/app/models/user.rb +10 -0
  254. data/spec/internal/config/database.yml +17 -0
  255. data/spec/internal/db/schema.rb +115 -0
  256. data/spec/internal/tmp/.gitkeep +0 -0
  257. data/spec/spec_helper.rb +29 -0
  258. data/spec/support/json_column.rb +35 -0
  259. data/spec/support/multi_schema.rb +50 -0
  260. data/spec/support/mysql.rb +25 -0
  261. data/spec/support/sphinx_yaml_helpers.rb +16 -0
  262. data/spec/thinking_sphinx/active_record/association_spec.rb +14 -0
  263. data/spec/thinking_sphinx/active_record/attribute/type_spec.rb +165 -0
  264. data/spec/thinking_sphinx/active_record/base_spec.rb +131 -0
  265. data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +128 -0
  266. data/spec/thinking_sphinx/active_record/callbacks/delta_callbacks_spec.rb +176 -0
  267. data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +91 -0
  268. data/spec/thinking_sphinx/active_record/column_spec.rb +72 -0
  269. data/spec/thinking_sphinx/active_record/column_sql_presenter_spec.rb +39 -0
  270. data/spec/thinking_sphinx/active_record/database_adapters/abstract_adapter_spec.rb +33 -0
  271. data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +70 -0
  272. data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +66 -0
  273. data/spec/thinking_sphinx/active_record/database_adapters_spec.rb +128 -0
  274. data/spec/thinking_sphinx/active_record/field_spec.rb +51 -0
  275. data/spec/thinking_sphinx/active_record/filter_reflection_spec.rb +207 -0
  276. data/spec/thinking_sphinx/active_record/index_spec.rb +220 -0
  277. data/spec/thinking_sphinx/active_record/interpreter_spec.rb +329 -0
  278. data/spec/thinking_sphinx/active_record/polymorpher_spec.rb +87 -0
  279. data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +264 -0
  280. data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +662 -0
  281. data/spec/thinking_sphinx/active_record/sql_source_spec.rb +507 -0
  282. data/spec/thinking_sphinx/attribute_types_spec.rb +52 -0
  283. data/spec/thinking_sphinx/commands/clear_real_time_spec.rb +46 -0
  284. data/spec/thinking_sphinx/commands/clear_sql_spec.rb +52 -0
  285. data/spec/thinking_sphinx/commands/configure_spec.rb +31 -0
  286. data/spec/thinking_sphinx/commands/index_real_time_spec.rb +33 -0
  287. data/spec/thinking_sphinx/commands/index_sql_spec.rb +86 -0
  288. data/spec/thinking_sphinx/commands/merge_and_update_spec.rb +106 -0
  289. data/spec/thinking_sphinx/commands/merge_spec.rb +48 -0
  290. data/spec/thinking_sphinx/commands/prepare_spec.rb +31 -0
  291. data/spec/thinking_sphinx/commands/running_spec.rb +30 -0
  292. data/spec/thinking_sphinx/commands/start_detached_spec.rb +67 -0
  293. data/spec/thinking_sphinx/commands/stop_spec.rb +63 -0
  294. data/spec/thinking_sphinx/configuration/minimum_fields_spec.rb +60 -0
  295. data/spec/thinking_sphinx/configuration_spec.rb +582 -0
  296. data/spec/thinking_sphinx/connection/mri_spec.rb +49 -0
  297. data/spec/thinking_sphinx/connection_spec.rb +87 -0
  298. data/spec/thinking_sphinx/deletion_spec.rb +57 -0
  299. data/spec/thinking_sphinx/deltas/default_delta_spec.rb +123 -0
  300. data/spec/thinking_sphinx/deltas_spec.rb +77 -0
  301. data/spec/thinking_sphinx/errors_spec.rb +103 -0
  302. data/spec/thinking_sphinx/excerpter_spec.rb +53 -0
  303. data/spec/thinking_sphinx/facet_search_spec.rb +133 -0
  304. data/spec/thinking_sphinx/hooks/guard_presence_spec.rb +30 -0
  305. data/spec/thinking_sphinx/index_set_spec.rb +132 -0
  306. data/spec/thinking_sphinx/index_spec.rb +140 -0
  307. data/spec/thinking_sphinx/interfaces/daemon_spec.rb +60 -0
  308. data/spec/thinking_sphinx/interfaces/real_time_spec.rb +109 -0
  309. data/spec/thinking_sphinx/interfaces/sql_spec.rb +122 -0
  310. data/spec/thinking_sphinx/masks/pagination_mask_spec.rb +123 -0
  311. data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +139 -0
  312. data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +180 -0
  313. data/spec/thinking_sphinx/middlewares/geographer_spec.rb +102 -0
  314. data/spec/thinking_sphinx/middlewares/glazier_spec.rb +65 -0
  315. data/spec/thinking_sphinx/middlewares/inquirer_spec.rb +72 -0
  316. data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +401 -0
  317. data/spec/thinking_sphinx/middlewares/stale_id_checker_spec.rb +50 -0
  318. data/spec/thinking_sphinx/middlewares/stale_id_filter_spec.rb +113 -0
  319. data/spec/thinking_sphinx/middlewares/valid_options_spec.rb +51 -0
  320. data/spec/thinking_sphinx/panes/attributes_pane_spec.rb +23 -0
  321. data/spec/thinking_sphinx/panes/distance_pane_spec.rb +43 -0
  322. data/spec/thinking_sphinx/panes/excerpts_pane_spec.rb +53 -0
  323. data/spec/thinking_sphinx/panes/weight_pane_spec.rb +22 -0
  324. data/spec/thinking_sphinx/rake_interface_spec.rb +39 -0
  325. data/spec/thinking_sphinx/real_time/attribute_spec.rb +64 -0
  326. data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +238 -0
  327. data/spec/thinking_sphinx/real_time/field_spec.rb +69 -0
  328. data/spec/thinking_sphinx/real_time/index_spec.rb +230 -0
  329. data/spec/thinking_sphinx/real_time/interpreter_spec.rb +203 -0
  330. data/spec/thinking_sphinx/real_time/transcribe_instance_spec.rb +35 -0
  331. data/spec/thinking_sphinx/real_time/transcriber_spec.rb +109 -0
  332. data/spec/thinking_sphinx/real_time/translator_spec.rb +17 -0
  333. data/spec/thinking_sphinx/scopes_spec.rb +51 -0
  334. data/spec/thinking_sphinx/search/glaze_spec.rb +79 -0
  335. data/spec/thinking_sphinx/search/query_spec.rb +87 -0
  336. data/spec/thinking_sphinx/search_spec.rb +214 -0
  337. data/spec/thinking_sphinx/wildcard_spec.rb +53 -0
  338. data/spec/thinking_sphinx_spec.rb +44 -0
  339. data/thinking-sphinx.gemspec +42 -0
  340. metadata +656 -243
  341. data/VERSION.yml +0 -5
  342. data/features/alternate_primary_key.feature +0 -27
  343. data/features/attribute_transformation.feature +0 -22
  344. data/features/attribute_updates.feature +0 -33
  345. data/features/datetime_deltas.feature +0 -66
  346. data/features/delayed_delta_indexing.feature +0 -37
  347. data/features/deleting_instances.feature +0 -64
  348. data/features/direct_attributes.feature +0 -11
  349. data/features/excerpts.feature +0 -13
  350. data/features/extensible_delta_indexing.feature +0 -9
  351. data/features/facets.feature +0 -76
  352. data/features/facets_across_model.feature +0 -29
  353. data/features/handling_edits.feature +0 -92
  354. data/features/retry_stale_indexes.feature +0 -24
  355. data/features/searching_across_models.feature +0 -20
  356. data/features/searching_by_model.feature +0 -175
  357. data/features/searching_with_find_arguments.feature +0 -56
  358. data/features/sphinx_detection.feature +0 -25
  359. data/features/sphinx_scopes.feature +0 -35
  360. data/features/step_definitions/alpha_steps.rb +0 -3
  361. data/features/step_definitions/beta_steps.rb +0 -7
  362. data/features/step_definitions/common_steps.rb +0 -178
  363. data/features/step_definitions/datetime_delta_steps.rb +0 -15
  364. data/features/step_definitions/delayed_delta_indexing_steps.rb +0 -7
  365. data/features/step_definitions/extensible_delta_indexing_steps.rb +0 -7
  366. data/features/step_definitions/facet_steps.rb +0 -92
  367. data/features/step_definitions/find_arguments_steps.rb +0 -36
  368. data/features/step_definitions/gamma_steps.rb +0 -15
  369. data/features/step_definitions/scope_steps.rb +0 -11
  370. data/features/step_definitions/search_steps.rb +0 -89
  371. data/features/step_definitions/sphinx_steps.rb +0 -31
  372. data/features/sti_searching.feature +0 -14
  373. data/features/support/database.example.yml +0 -3
  374. data/features/support/database.yml +0 -5
  375. data/features/support/db/active_record.rb +0 -40
  376. data/features/support/db/database.yml +0 -5
  377. data/features/support/db/fixtures/alphas.rb +0 -10
  378. data/features/support/db/fixtures/authors.rb +0 -1
  379. data/features/support/db/fixtures/betas.rb +0 -10
  380. data/features/support/db/fixtures/boxes.rb +0 -9
  381. data/features/support/db/fixtures/categories.rb +0 -1
  382. data/features/support/db/fixtures/cats.rb +0 -3
  383. data/features/support/db/fixtures/comments.rb +0 -24
  384. data/features/support/db/fixtures/delayed_betas.rb +0 -10
  385. data/features/support/db/fixtures/developers.rb +0 -29
  386. data/features/support/db/fixtures/dogs.rb +0 -3
  387. data/features/support/db/fixtures/extensible_betas.rb +0 -10
  388. data/features/support/db/fixtures/gammas.rb +0 -10
  389. data/features/support/db/fixtures/people.rb +0 -1001
  390. data/features/support/db/fixtures/posts.rb +0 -6
  391. data/features/support/db/fixtures/robots.rb +0 -14
  392. data/features/support/db/fixtures/tags.rb +0 -27
  393. data/features/support/db/fixtures/thetas.rb +0 -10
  394. data/features/support/db/migrations/create_alphas.rb +0 -7
  395. data/features/support/db/migrations/create_animals.rb +0 -5
  396. data/features/support/db/migrations/create_authors.rb +0 -3
  397. data/features/support/db/migrations/create_authors_posts.rb +0 -6
  398. data/features/support/db/migrations/create_betas.rb +0 -5
  399. data/features/support/db/migrations/create_boxes.rb +0 -5
  400. data/features/support/db/migrations/create_categories.rb +0 -3
  401. data/features/support/db/migrations/create_comments.rb +0 -10
  402. data/features/support/db/migrations/create_delayed_betas.rb +0 -17
  403. data/features/support/db/migrations/create_developers.rb +0 -9
  404. data/features/support/db/migrations/create_extensible_betas.rb +0 -5
  405. data/features/support/db/migrations/create_gammas.rb +0 -3
  406. data/features/support/db/migrations/create_people.rb +0 -13
  407. data/features/support/db/migrations/create_posts.rb +0 -5
  408. data/features/support/db/migrations/create_robots.rb +0 -4
  409. data/features/support/db/migrations/create_taggings.rb +0 -5
  410. data/features/support/db/migrations/create_tags.rb +0 -4
  411. data/features/support/db/migrations/create_thetas.rb +0 -5
  412. data/features/support/db/mysql.rb +0 -3
  413. data/features/support/db/postgresql.rb +0 -3
  414. data/features/support/env.rb +0 -18
  415. data/features/support/lib/generic_delta_handler.rb +0 -8
  416. data/features/support/models/alpha.rb +0 -10
  417. data/features/support/models/animal.rb +0 -5
  418. data/features/support/models/author.rb +0 -3
  419. data/features/support/models/beta.rb +0 -8
  420. data/features/support/models/box.rb +0 -8
  421. data/features/support/models/cat.rb +0 -3
  422. data/features/support/models/category.rb +0 -4
  423. data/features/support/models/comment.rb +0 -10
  424. data/features/support/models/delayed_beta.rb +0 -7
  425. data/features/support/models/developer.rb +0 -16
  426. data/features/support/models/dog.rb +0 -3
  427. data/features/support/models/extensible_beta.rb +0 -9
  428. data/features/support/models/gamma.rb +0 -5
  429. data/features/support/models/person.rb +0 -23
  430. data/features/support/models/post.rb +0 -20
  431. data/features/support/models/robot.rb +0 -12
  432. data/features/support/models/tag.rb +0 -3
  433. data/features/support/models/theta.rb +0 -7
  434. data/features/support/post_database.rb +0 -43
  435. data/lib/cucumber/thinking_sphinx/internal_world.rb +0 -125
  436. data/lib/cucumber/thinking_sphinx/sql_logger.rb +0 -20
  437. data/lib/thinking_sphinx/active_record/attribute_updates.rb +0 -48
  438. data/lib/thinking_sphinx/active_record/delta.rb +0 -87
  439. data/lib/thinking_sphinx/active_record/has_many_association.rb +0 -28
  440. data/lib/thinking_sphinx/active_record/scopes.rb +0 -39
  441. data/lib/thinking_sphinx/adapters/abstract_adapter.rb +0 -42
  442. data/lib/thinking_sphinx/adapters/mysql_adapter.rb +0 -54
  443. data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +0 -143
  444. data/lib/thinking_sphinx/association.rb +0 -164
  445. data/lib/thinking_sphinx/attribute.rb +0 -341
  446. data/lib/thinking_sphinx/class_facet.rb +0 -15
  447. data/lib/thinking_sphinx/core/array.rb +0 -7
  448. data/lib/thinking_sphinx/core/string.rb +0 -15
  449. data/lib/thinking_sphinx/deltas/datetime_delta.rb +0 -50
  450. data/lib/thinking_sphinx/deltas/delayed_delta/delta_job.rb +0 -24
  451. data/lib/thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job.rb +0 -27
  452. data/lib/thinking_sphinx/deltas/delayed_delta/job.rb +0 -26
  453. data/lib/thinking_sphinx/deltas/delayed_delta.rb +0 -30
  454. data/lib/thinking_sphinx/deploy/capistrano.rb +0 -100
  455. data/lib/thinking_sphinx/field.rb +0 -82
  456. data/lib/thinking_sphinx/index/builder.rb +0 -286
  457. data/lib/thinking_sphinx/index/faux_column.rb +0 -110
  458. data/lib/thinking_sphinx/property.rb +0 -162
  459. data/lib/thinking_sphinx/rails_additions.rb +0 -150
  460. data/lib/thinking_sphinx/search_methods.rb +0 -421
  461. data/lib/thinking_sphinx/source/internal_properties.rb +0 -46
  462. data/lib/thinking_sphinx/source/sql.rb +0 -128
  463. data/lib/thinking_sphinx/source.rb +0 -150
  464. data/rails/init.rb +0 -14
  465. data/spec/lib/thinking_sphinx/active_record/delta_spec.rb +0 -130
  466. data/spec/lib/thinking_sphinx/active_record/has_many_association_spec.rb +0 -49
  467. data/spec/lib/thinking_sphinx/active_record/scopes_spec.rb +0 -96
  468. data/spec/lib/thinking_sphinx/active_record_spec.rb +0 -353
  469. data/spec/lib/thinking_sphinx/association_spec.rb +0 -239
  470. data/spec/lib/thinking_sphinx/attribute_spec.rb +0 -507
  471. data/spec/lib/thinking_sphinx/configuration_spec.rb +0 -268
  472. data/spec/lib/thinking_sphinx/core/array_spec.rb +0 -9
  473. data/spec/lib/thinking_sphinx/core/string_spec.rb +0 -9
  474. data/spec/lib/thinking_sphinx/deltas/job_spec.rb +0 -32
  475. data/spec/lib/thinking_sphinx/excerpter_spec.rb +0 -57
  476. data/spec/lib/thinking_sphinx/facet_search_spec.rb +0 -176
  477. data/spec/lib/thinking_sphinx/facet_spec.rb +0 -333
  478. data/spec/lib/thinking_sphinx/field_spec.rb +0 -154
  479. data/spec/lib/thinking_sphinx/index/builder_spec.rb +0 -455
  480. data/spec/lib/thinking_sphinx/index/faux_column_spec.rb +0 -30
  481. data/spec/lib/thinking_sphinx/index_spec.rb +0 -45
  482. data/spec/lib/thinking_sphinx/rails_additions_spec.rb +0 -203
  483. data/spec/lib/thinking_sphinx/search_methods_spec.rb +0 -152
  484. data/spec/lib/thinking_sphinx/search_spec.rb +0 -1101
  485. data/spec/lib/thinking_sphinx/source_spec.rb +0 -227
  486. data/spec/lib/thinking_sphinx_spec.rb +0 -162
  487. data/tasks/distribution.rb +0 -53
  488. data/tasks/rails.rake +0 -1
  489. data/tasks/testing.rb +0 -72
  490. data/vendor/after_commit/LICENSE +0 -20
  491. data/vendor/after_commit/README +0 -16
  492. data/vendor/after_commit/Rakefile +0 -22
  493. data/vendor/after_commit/init.rb +0 -8
  494. data/vendor/after_commit/lib/after_commit/active_record.rb +0 -114
  495. data/vendor/after_commit/lib/after_commit/connection_adapters.rb +0 -103
  496. data/vendor/after_commit/lib/after_commit.rb +0 -45
  497. data/vendor/after_commit/test/after_commit_test.rb +0 -53
  498. data/vendor/delayed_job/lib/delayed/job.rb +0 -251
  499. data/vendor/delayed_job/lib/delayed/message_sending.rb +0 -7
  500. data/vendor/delayed_job/lib/delayed/performable_method.rb +0 -55
  501. data/vendor/delayed_job/lib/delayed/worker.rb +0 -54
  502. data/vendor/riddle/lib/riddle/client/filter.rb +0 -53
  503. data/vendor/riddle/lib/riddle/client/message.rb +0 -66
  504. data/vendor/riddle/lib/riddle/client/response.rb +0 -84
  505. data/vendor/riddle/lib/riddle/client.rb +0 -635
  506. data/vendor/riddle/lib/riddle/configuration/distributed_index.rb +0 -48
  507. data/vendor/riddle/lib/riddle/configuration/index.rb +0 -142
  508. data/vendor/riddle/lib/riddle/configuration/indexer.rb +0 -19
  509. data/vendor/riddle/lib/riddle/configuration/remote_index.rb +0 -17
  510. data/vendor/riddle/lib/riddle/configuration/searchd.rb +0 -25
  511. data/vendor/riddle/lib/riddle/configuration/section.rb +0 -43
  512. data/vendor/riddle/lib/riddle/configuration/source.rb +0 -23
  513. data/vendor/riddle/lib/riddle/configuration/sql_source.rb +0 -34
  514. data/vendor/riddle/lib/riddle/configuration/xml_source.rb +0 -28
  515. data/vendor/riddle/lib/riddle/configuration.rb +0 -33
  516. data/vendor/riddle/lib/riddle/controller.rb +0 -53
  517. data/vendor/riddle/lib/riddle.rb +0 -30
@@ -1,48 +0,0 @@
1
- module ThinkingSphinx
2
- module ActiveRecord
3
- module AttributeUpdates
4
- def self.included(base)
5
- base.class_eval do
6
- after_commit :update_attribute_values
7
- end
8
- end
9
-
10
- private
11
-
12
- def update_attribute_values
13
- return unless ThinkingSphinx.updates_enabled? && ThinkingSphinx.sphinx_running?
14
-
15
- config = ThinkingSphinx::Configuration.instance
16
- client = Riddle::Client.new config.address, config.port
17
-
18
- self.sphinx_indexes.each do |index|
19
- attribute_pairs = attribute_values_for_index(index)
20
- attribute_names = attribute_pairs.keys
21
- attribute_values = attribute_names.collect { |key|
22
- attribute_pairs[key]
23
- }
24
-
25
- client.update "#{index.name}_core", attribute_names, {
26
- sphinx_document_id => attribute_values
27
- } if in_core_index?
28
- end
29
- end
30
-
31
- def updatable_attributes(index)
32
- index.attributes.select { |attrib| attrib.updatable? }
33
- end
34
-
35
- def attribute_values_for_index(index)
36
- updatable_attributes(index).inject({}) { |hash, attrib|
37
- if attrib.type == :datetime
38
- hash[attrib.unique_name.to_s] = attrib.live_value(self).to_time.to_i
39
- else
40
- hash[attrib.unique_name.to_s] = attrib.live_value self
41
- end
42
-
43
- hash
44
- }
45
- end
46
- end
47
- end
48
- end
@@ -1,87 +0,0 @@
1
- module ThinkingSphinx
2
- module ActiveRecord
3
- # This module contains all the delta-related code for models. There isn't
4
- # really anything you need to call manually in here - except perhaps
5
- # index_delta, but not sure what reason why.
6
- #
7
- module Delta
8
- # Code for after_commit callback is written by Eli Miller:
9
- # http://elimiller.blogspot.com/2007/06/proper-cache-expiry-with-aftercommit.html
10
- # with slight modification from Joost Hietbrink.
11
- #
12
- def self.included(base)
13
- base.class_eval do
14
- class << self
15
- # Temporarily disable delta indexing inside a block, then perform a single
16
- # rebuild of index at the end.
17
- #
18
- # Useful when performing updates to batches of models to prevent
19
- # the delta index being rebuilt after each individual update.
20
- #
21
- # In the following example, the delta index will only be rebuilt once,
22
- # not 10 times.
23
- #
24
- # SomeModel.suspended_delta do
25
- # 10.times do
26
- # SomeModel.create( ... )
27
- # end
28
- # end
29
- #
30
- def suspended_delta(reindex_after = true, &block)
31
- original_setting = ThinkingSphinx.deltas_enabled?
32
- ThinkingSphinx.deltas_enabled = false
33
- begin
34
- yield
35
- ensure
36
- ThinkingSphinx.deltas_enabled = original_setting
37
- self.index_delta if reindex_after
38
- end
39
- end
40
-
41
- # Build the delta index for the related model. This won't be called
42
- # if running in the test environment.
43
- #
44
- def index_delta(instance = nil)
45
- delta_object.index(self, instance)
46
- end
47
-
48
- def delta_object
49
- self.sphinx_indexes.first.delta_object
50
- end
51
- end
52
-
53
- def toggled_delta?
54
- self.class.delta_object.toggled(self)
55
- end
56
-
57
- private
58
-
59
- # Set the delta value for the model to be true.
60
- def toggle_delta
61
- self.class.delta_object.toggle(self) if should_toggle_delta?
62
- end
63
-
64
- # Build the delta index for the related model. This won't be called
65
- # if running in the test environment.
66
- #
67
- def index_delta
68
- self.class.index_delta(self) if self.class.delta_object.toggled(self)
69
- end
70
-
71
- def should_toggle_delta?
72
- self.new_record? || indexed_data_changed?
73
- end
74
-
75
- def indexed_data_changed?
76
- sphinx_indexes.any? { |index|
77
- index.fields.any? { |field| field.changed?(self) } ||
78
- index.attributes.any? { |attrib|
79
- attrib.public? && attrib.changed?(self) && !attrib.updatable?
80
- }
81
- }
82
- end
83
- end
84
- end
85
- end
86
- end
87
- end
@@ -1,28 +0,0 @@
1
- module ThinkingSphinx
2
- module ActiveRecord
3
- module HasManyAssociation
4
- def search(*args)
5
- foreign_key = @reflection.primary_key_name
6
- stack = [@reflection.options[:through]].compact
7
-
8
- attribute = nil
9
- (@reflection.klass.sphinx_indexes || []).each do |index|
10
- attribute = index.attributes.detect { |attrib|
11
- attrib.columns.length == 1 &&
12
- attrib.columns.first.__name == foreign_key.to_sym
13
- }
14
- break if attribute
15
- end
16
-
17
- raise "Missing Attribute for Foreign Key #{foreign_key}" unless attribute
18
-
19
- options = args.extract_options!
20
- options[:with] ||= {}
21
- options[:with][attribute.unique_name] = @owner.id
22
-
23
- args << options
24
- @reflection.klass.search(*args)
25
- end
26
- end
27
- end
28
- end
@@ -1,39 +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
- def sphinx_scope(method, &block)
12
- @sphinx_scopes ||= []
13
- @sphinx_scopes << method
14
-
15
- metaclass.instance_eval do
16
- define_method(method) do |*args|
17
- options = {:classes => classes_option}
18
- options.merge! block.call(*args)
19
-
20
- ThinkingSphinx::Search.new(options)
21
- end
22
- end
23
- end
24
-
25
- def sphinx_scopes
26
- @sphinx_scopes || []
27
- end
28
-
29
- def remove_sphinx_scopes
30
- sphinx_scopes.each do |scope|
31
- metaclass.send(:undef_method, scope)
32
- end
33
-
34
- sphinx_scopes.clear
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,42 +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
- case model.connection.class.name
14
- when "ActiveRecord::ConnectionAdapters::MysqlAdapter",
15
- "ActiveRecord::ConnectionAdapters::MysqlplusAdapter"
16
- ThinkingSphinx::MysqlAdapter.new model
17
- when "ActiveRecord::ConnectionAdapters::PostgreSQLAdapter"
18
- ThinkingSphinx::PostgreSQLAdapter.new model
19
- when "ActiveRecord::ConnectionAdapters::JdbcAdapter"
20
- if model.connection.config[:adapter] == "jdbcmysql"
21
- ThinkingSphinx::MysqlAdapter.new model
22
- elsif model.connection.config[:adapter] == "jdbcpostgresql"
23
- ThinkingSphinx::PostgreSQLAdapter.new model
24
- else
25
- raise "Invalid Database Adapter: Sphinx only supports MySQL and PostgreSQL"
26
- end
27
- else
28
- raise "Invalid Database Adapter: Sphinx only supports MySQL and PostgreSQL, not #{model.connection.class.name}"
29
- end
30
- end
31
-
32
- def quote_with_table(column)
33
- "#{@model.quoted_table_name}.#{@model.connection.quote_column_name(column)}"
34
- end
35
-
36
- protected
37
-
38
- def connection
39
- @connection ||= @model.connection
40
- end
41
- end
42
- end
@@ -1,54 +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 convert_nulls(clause, default = '')
32
- default = "'#{default}'" if default.is_a?(String)
33
-
34
- "IFNULL(#{clause}, #{default})"
35
- end
36
-
37
- def boolean(value)
38
- value ? 1 : 0
39
- end
40
-
41
- def crc(clause, blank_to_null = false)
42
- clause = "NULLIF(#{clause},'')" if blank_to_null
43
- "CRC32(#{clause})"
44
- end
45
-
46
- def utf8_query_pre
47
- "SET NAMES utf8"
48
- end
49
-
50
- def time_difference(diff)
51
- "DATE_SUB(NOW(), INTERVAL #{diff} SECOND)"
52
- end
53
- end
54
- end
@@ -1,143 +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}, '') as varchar)"
18
- }.join(" || '#{separator}' || ")
19
- end
20
- end
21
-
22
- def group_concatenate(clause, separator = ' ')
23
- "array_to_string(array_accum(COALESCE(#{clause}, '0')), '#{separator}')"
24
- end
25
-
26
- def cast_to_string(clause)
27
- clause
28
- end
29
-
30
- def cast_to_datetime(clause)
31
- "cast(extract(epoch from #{clause}) as int)"
32
- end
33
-
34
- def cast_to_unsigned(clause)
35
- clause
36
- end
37
-
38
- def convert_nulls(clause, default = '')
39
- default = case default
40
- when String
41
- "'#{default}'"
42
- when NilClass
43
- 'NULL'
44
- when Fixnum
45
- "#{default}::bigint"
46
- else
47
- default
48
- end
49
-
50
- "COALESCE(#{clause}, #{default})"
51
- end
52
-
53
- def boolean(value)
54
- value ? 'TRUE' : 'FALSE'
55
- end
56
-
57
- def crc(clause, blank_to_null = false)
58
- clause = "NULLIF(#{clause},'')" if blank_to_null
59
- "crc32(#{clause})"
60
- end
61
-
62
- def utf8_query_pre
63
- nil
64
- end
65
-
66
- def time_difference(diff)
67
- "current_timestamp - interval '#{diff} seconds'"
68
- end
69
-
70
- private
71
-
72
- def execute(command, output_error = false)
73
- connection.execute "begin"
74
- connection.execute "savepoint ts"
75
- begin
76
- connection.execute command
77
- rescue StandardError => err
78
- puts err if output_error
79
- connection.execute "rollback to savepoint ts"
80
- end
81
- connection.execute "release savepoint ts"
82
- connection.execute "commit"
83
- end
84
-
85
- def create_array_accum_function
86
- if connection.raw_connection.respond_to?(:server_version) && connection.raw_connection.server_version > 80200
87
- execute <<-SQL
88
- CREATE AGGREGATE array_accum (anyelement)
89
- (
90
- sfunc = array_append,
91
- stype = anyarray,
92
- initcond = '{}'
93
- );
94
- SQL
95
- else
96
- execute <<-SQL
97
- CREATE AGGREGATE array_accum
98
- (
99
- basetype = anyelement,
100
- sfunc = array_append,
101
- stype = anyarray,
102
- initcond = '{}'
103
- );
104
- SQL
105
- end
106
- end
107
-
108
- def create_crc32_function
109
- execute "CREATE LANGUAGE 'plpgsql';"
110
- function = <<-SQL
111
- CREATE OR REPLACE FUNCTION crc32(word text)
112
- RETURNS bigint AS $$
113
- DECLARE tmp bigint;
114
- DECLARE i int;
115
- DECLARE j int;
116
- DECLARE word_array bytea;
117
- BEGIN
118
- i = 0;
119
- tmp = 4294967295;
120
- word_array = decode(replace(word, E'\\\\', E'\\\\\\\\'), 'escape');
121
- LOOP
122
- tmp = (tmp # get_byte(word_array, i))::bigint;
123
- i = i + 1;
124
- j = 0;
125
- LOOP
126
- tmp = ((tmp >> 1) # (3988292384 * (tmp & 1)))::bigint;
127
- j = j + 1;
128
- IF j >= 8 THEN
129
- EXIT;
130
- END IF;
131
- END LOOP;
132
- IF i >= char_length(word) THEN
133
- EXIT;
134
- END IF;
135
- END LOOP;
136
- return (tmp # 4294967295);
137
- END
138
- $$ IMMUTABLE STRICT LANGUAGE plpgsql;
139
- SQL
140
- execute function, true
141
- end
142
- end
143
- end
@@ -1,164 +0,0 @@
1
- module ThinkingSphinx
2
- # Association tracks a specific reflection and join to reference data that
3
- # isn't in the base model. Very much an internal class for Thinking Sphinx -
4
- # perhaps because I feel it's not as strong (or simple) as most of the rest.
5
- #
6
- class Association
7
- attr_accessor :parent, :reflection, :join
8
-
9
- # Create a new association by passing in the parent association, and the
10
- # corresponding reflection instance. If there is no parent, pass in nil.
11
- #
12
- # top = Association.new nil, top_reflection
13
- # child = Association.new top, child_reflection
14
- #
15
- def initialize(parent, reflection)
16
- @parent, @reflection = parent, reflection
17
- @children = {}
18
- end
19
-
20
- # Get the children associations for a given association name. The only time
21
- # that there'll actually be more than one association is when the
22
- # relationship is polymorphic. To keep things simple though, it will always
23
- # be an Array that gets returned (an empty one if no matches).
24
- #
25
- # # where pages is an association on the class tied to the reflection.
26
- # association.children(:pages)
27
- #
28
- def children(assoc)
29
- @children[assoc] ||= Association.children(@reflection.klass, assoc, self)
30
- end
31
-
32
- # Get the children associations for a given class, association name and
33
- # parent association. Much like the instance method of the same name, it
34
- # will return an empty array if no associations have the name, and only
35
- # have multiple association instances if the underlying relationship is
36
- # polymorphic.
37
- #
38
- # Association.children(User, :pages, user_association)
39
- #
40
- def self.children(klass, assoc, parent=nil)
41
- ref = klass.reflect_on_association(assoc)
42
-
43
- return [] if ref.nil?
44
- return [Association.new(parent, ref)] unless ref.options[:polymorphic]
45
-
46
- # association is polymorphic - create associations for each
47
- # non-polymorphic reflection.
48
- polymorphic_classes(ref).collect { |klass|
49
- Association.new parent, ::ActiveRecord::Reflection::AssociationReflection.new(
50
- ref.macro,
51
- "#{ref.name}_#{klass.name}".to_sym,
52
- casted_options(klass, ref),
53
- ref.active_record
54
- )
55
- }
56
- end
57
-
58
- # Link up the join for this model from a base join - and set parent
59
- # associations' joins recursively.
60
- #
61
- def join_to(base_join)
62
- parent.join_to(base_join) if parent && parent.join.nil?
63
-
64
- @join ||= ::ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation.new(
65
- @reflection, base_join, parent ? parent.join : base_join.joins.first
66
- )
67
- end
68
-
69
- # Returns the association's join SQL statements - and it replaces
70
- # ::ts_join_alias:: with the aliased table name so the generated reflection
71
- # join conditions avoid column name collisions.
72
- #
73
- def to_sql
74
- @join.association_join.gsub(/::ts_join_alias::/,
75
- "#{@reflection.klass.connection.quote_table_name(@join.parent.aliased_table_name)}"
76
- )
77
- end
78
-
79
- # Returns true if the association - or a parent - is a has_many or
80
- # has_and_belongs_to_many.
81
- #
82
- def is_many?
83
- case @reflection.macro
84
- when :has_many, :has_and_belongs_to_many
85
- true
86
- else
87
- @parent ? @parent.is_many? : false
88
- end
89
- end
90
-
91
- # Returns an array of all the associations that lead to this one - starting
92
- # with the top level all the way to the current association object.
93
- #
94
- def ancestors
95
- (parent ? parent.ancestors : []) << self
96
- end
97
-
98
- def has_column?(column)
99
- @reflection.klass.column_names.include?(column.to_s)
100
- end
101
-
102
- def primary_key_from_reflection
103
- if @reflection.options[:through]
104
- @reflection.source_reflection.options[:foreign_key] ||
105
- @reflection.source_reflection.primary_key_name
106
- elsif @reflection.macro == :has_and_belongs_to_many
107
- @reflection.association_foreign_key
108
- else
109
- nil
110
- end
111
- end
112
-
113
- def table
114
- if @reflection.options[:through] ||
115
- @reflection.macro == :has_and_belongs_to_many
116
- @join.aliased_join_table_name
117
- else
118
- @join.aliased_table_name
119
- end
120
- end
121
-
122
- private
123
-
124
- # Returns all the objects that could be currently instantiated from a
125
- # polymorphic association. This is pretty damn fast if there's an index on
126
- # the foreign type column - but if there isn't, it can take a while if you
127
- # have a lot of data.
128
- #
129
- def self.polymorphic_classes(ref)
130
- ref.active_record.connection.select_all(
131
- "SELECT DISTINCT #{ref.options[:foreign_type]} " +
132
- "FROM #{ref.active_record.table_name} " +
133
- "WHERE #{ref.options[:foreign_type]} IS NOT NULL"
134
- ).collect { |row|
135
- row[ref.options[:foreign_type]].constantize
136
- }
137
- end
138
-
139
- # Returns a new set of options for an association that mimics an existing
140
- # polymorphic relationship for a specific class. It adds a condition to
141
- # filter by the appropriate object.
142
- #
143
- def self.casted_options(klass, ref)
144
- options = ref.options.clone
145
- options[:polymorphic] = nil
146
- options[:class_name] = klass.name
147
- options[:foreign_key] ||= "#{ref.name}_id"
148
-
149
- quoted_foreign_type = klass.connection.quote_column_name ref.options[:foreign_type]
150
- case options[:conditions]
151
- when nil
152
- options[:conditions] = "::ts_join_alias::.#{quoted_foreign_type} = '#{klass.name}'"
153
- when Array
154
- options[:conditions] << "::ts_join_alias::.#{quoted_foreign_type} = '#{klass.name}'"
155
- when Hash
156
- options[:conditions].merge!(ref.options[:foreign_type] => klass.name)
157
- else
158
- options[:conditions] << " AND ::ts_join_alias::.#{quoted_foreign_type} = '#{klass.name}'"
159
- end
160
-
161
- options
162
- end
163
- end
164
- end