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
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::ActiveRecord::SQLSource::Template
4
+ attr_reader :source
5
+
6
+ def initialize(source)
7
+ @source = source
8
+ end
9
+
10
+ def apply
11
+ add_field class_column, :sphinx_internal_class_name
12
+
13
+ add_attribute primary_key, :sphinx_internal_id, nil
14
+ add_attribute class_column, :sphinx_internal_class, :string, :facet => true
15
+ add_attribute '0', :sphinx_deleted, :integer
16
+ end
17
+
18
+ private
19
+
20
+ def add_attribute(column, name, type, options = {})
21
+ source.add_attribute ThinkingSphinx::ActiveRecord::Attribute.new(
22
+ source.model, ThinkingSphinx::ActiveRecord::Column.new(column),
23
+ options.merge(:as => name, :type => type)
24
+ )
25
+ end
26
+
27
+ def add_field(column, name, options = {})
28
+ source.add_field ThinkingSphinx::ActiveRecord::Field.new(
29
+ source.model, ThinkingSphinx::ActiveRecord::Column.new(column),
30
+ options.merge(:as => name)
31
+ )
32
+ end
33
+
34
+ def class_column
35
+ if inheriting?
36
+ adapter = source.adapter
37
+ quoted_column = "#{adapter.quoted_table_name}.#{adapter.quote(model.inheritance_column)}"
38
+ source.adapter.convert_blank quoted_column, "'#{model.sti_name}'"
39
+ else
40
+ "'#{model.name}'"
41
+ end
42
+ end
43
+
44
+ def inheriting?
45
+ model.column_names.include?(model.inheritance_column)
46
+ end
47
+
48
+ def model
49
+ source.model
50
+ end
51
+
52
+ def primary_key
53
+ source.options[:primary_key].to_sym
54
+ end
55
+ end
@@ -0,0 +1,173 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ThinkingSphinx
4
+ module ActiveRecord
5
+ class SQLSource < Riddle::Configuration::SQLSource
6
+ include ThinkingSphinx::Core::Settings
7
+
8
+ attr_reader :model, :options
9
+ attr_accessor :fields, :attributes, :associations, :conditions,
10
+ :groupings, :polymorphs
11
+
12
+ OPTIONS = [:name, :offset, :delta_processor, :delta?, :delta_options,
13
+ :disable_range?, :group_concat_max_len, :utf8?, :position,
14
+ :minimal_group_by?, :big_document_ids]
15
+
16
+ def initialize(model, options = {})
17
+ @model = model
18
+ @options = {
19
+ :utf8? => (database_settings[:encoding].to_s[/^utf8/])
20
+ }.merge options
21
+
22
+ @fields = []
23
+ @attributes = []
24
+ @associations = []
25
+ @conditions = []
26
+ @groupings = []
27
+ @polymorphs = []
28
+
29
+ Template.new(self).apply
30
+
31
+ name = "#{options[:name] || model.name.downcase}_#{options[:position]}"
32
+
33
+ super name, type
34
+
35
+ apply_defaults!
36
+ end
37
+
38
+ def adapter
39
+ @adapter ||= DatabaseAdapters.adapter_for(@model)
40
+ end
41
+
42
+ def add_attribute(attribute)
43
+ attributes.delete_if { |existing| existing.name == attribute.name }
44
+
45
+ attributes << attribute
46
+ end
47
+
48
+ def add_field(field)
49
+ fields.delete_if { |existing| existing.name == field.name }
50
+
51
+ fields << field
52
+ end
53
+
54
+ def delta_processor
55
+ options[:delta_processor].try(:new, adapter, @options[:delta_options] || {})
56
+ end
57
+
58
+ def delta?
59
+ options[:delta?]
60
+ end
61
+
62
+ def disable_range?
63
+ options[:disable_range?]
64
+ end
65
+
66
+ def facets
67
+ properties.select(&:facet?)
68
+ end
69
+
70
+ def offset
71
+ options[:offset]
72
+ end
73
+
74
+ def primary_key
75
+ options[:primary_key]
76
+ end
77
+
78
+ def properties
79
+ fields + attributes
80
+ end
81
+
82
+ def render
83
+ prepare_for_render unless @prepared
84
+
85
+ super
86
+ end
87
+
88
+ def set_database_settings(settings)
89
+ @sql_host ||= settings[:host] || 'localhost'
90
+ @sql_user ||= settings[:username] || settings[:user] || ENV['USER']
91
+ @sql_pass ||= settings[:password].to_s.gsub('#', '\#')
92
+ @sql_db ||= settings[:database]
93
+ @sql_port ||= settings[:port]
94
+ @sql_sock ||= settings[:socket]
95
+ @mysql_ssl_cert ||= settings[:sslcert]
96
+ @mysql_ssl_key ||= settings[:sslkey]
97
+ @mysql_ssl_ca ||= settings[:sslca]
98
+ end
99
+
100
+ def type
101
+ @type ||= case adapter
102
+ when DatabaseAdapters::MySQLAdapter
103
+ 'mysql'
104
+ when DatabaseAdapters::PostgreSQLAdapter
105
+ 'pgsql'
106
+ else
107
+ raise UnknownDatabaseAdapter, "Provided type: #{adapter.class.name}"
108
+ end
109
+ end
110
+
111
+ private
112
+
113
+ def append_presenter_to_attribute_array
114
+ attributes.each do |attribute|
115
+ presenter = Attribute::SphinxPresenter.new(attribute, self)
116
+
117
+ attribute_array_for(presenter.collection_type) << presenter.declaration
118
+ end
119
+ end
120
+
121
+ def attribute_array_for(type)
122
+ instance_variable_get "@sql_attr_#{type}".to_sym
123
+ end
124
+
125
+ def builder
126
+ @builder ||= SQLBuilder.new self
127
+ end
128
+
129
+ def build_sql_fields
130
+ fields.each do |field|
131
+ @sql_field_string << field.name if field.with_attribute?
132
+ @sql_field_str2wordcount << field.name if field.wordcount?
133
+ @sql_file_field << field.name if field.file?
134
+
135
+ @sql_joined_field << PropertyQuery.new(field, self).to_s if field.source_type
136
+ end
137
+ end
138
+
139
+ def build_sql_query
140
+ @sql_query = builder.sql_query
141
+ @sql_query_range ||= builder.sql_query_range
142
+ @sql_query_pre += builder.sql_query_pre
143
+ end
144
+
145
+ def config
146
+ ThinkingSphinx::Configuration.instance
147
+ end
148
+
149
+ def database_settings
150
+ @database_settings ||= begin
151
+ if model.connection.respond_to?(:config)
152
+ model.connection.config.clone
153
+ else
154
+ model.connection.instance_variable_get(:@config).clone
155
+ end
156
+ end
157
+ end
158
+
159
+ def prepare_for_render
160
+ polymorphs.each &:morph!
161
+ append_presenter_to_attribute_array
162
+
163
+ set_database_settings database_settings
164
+ build_sql_fields
165
+ build_sql_query
166
+
167
+ @prepared = true
168
+ end
169
+ end
170
+ end
171
+ end
172
+
173
+ require 'thinking_sphinx/active_record/sql_source/template'
@@ -1,306 +1,44 @@
1
- require 'thinking_sphinx/active_record/attribute_updates'
2
- require 'thinking_sphinx/active_record/delta'
3
- require 'thinking_sphinx/active_record/has_many_association'
4
- require 'thinking_sphinx/active_record/scopes'
1
+ # frozen_string_literal: true
5
2
 
6
- module ThinkingSphinx
7
- # Core additions to ActiveRecord models - define_index for creating indexes
8
- # for models. If you want to interrogate the index objects created for the
9
- # model, you can use the class-level accessor :sphinx_indexes.
10
- #
11
- module ActiveRecord
12
- def self.included(base)
13
- base.class_eval do
14
- class_inheritable_array :sphinx_indexes, :sphinx_facets
15
- class << self
16
-
17
- def set_sphinx_primary_key(attribute)
18
- @sphinx_primary_key_attribute = attribute
19
- end
20
-
21
- def primary_key_for_sphinx
22
- @sphinx_primary_key_attribute || primary_key
23
- end
24
-
25
- # Allows creation of indexes for Sphinx. If you don't do this, there
26
- # isn't much point trying to search (or using this plugin at all,
27
- # really).
28
- #
29
- # An example or two:
30
- #
31
- # define_index
32
- # indexes :id, :as => :model_id
33
- # indexes name
34
- # end
35
- #
36
- # You can also grab fields from associations - multiple levels deep
37
- # if necessary.
38
- #
39
- # define_index do
40
- # indexes tags.name, :as => :tag
41
- # indexes articles.content
42
- # indexes orders.line_items.product.name, :as => :product
43
- # end
44
- #
45
- # And it will automatically concatenate multiple fields:
46
- #
47
- # define_index do
48
- # indexes [author.first_name, author.last_name], :as => :author
49
- # end
50
- #
51
- # The #indexes method is for fields - if you want attributes, use
52
- # #has instead. All the same rules apply - but keep in mind that
53
- # attributes are for sorting, grouping and filtering, not searching.
54
- #
55
- # define_index do
56
- # # fields ...
57
- #
58
- # has created_at, updated_at
59
- # end
60
- #
61
- # One last feature is the delta index. This requires the model to
62
- # have a boolean field named 'delta', and is enabled as follows:
63
- #
64
- # define_index do
65
- # # fields ...
66
- # # attributes ...
67
- #
68
- # set_property :delta => true
69
- # end
70
- #
71
- # Check out the more detailed documentation for each of these methods
72
- # at ThinkingSphinx::Index::Builder.
73
- #
74
- def define_index(&block)
75
- return unless ThinkingSphinx.define_indexes?
76
-
77
- self.sphinx_indexes ||= []
78
- self.sphinx_facets ||= []
79
- index = ThinkingSphinx::Index::Builder.generate(self, &block)
80
-
81
- self.sphinx_indexes << index
82
- unless ThinkingSphinx.indexed_models.include?(self.name)
83
- ThinkingSphinx.indexed_models << self.name
84
- end
85
-
86
- if index.delta?
87
- before_save :toggle_delta
88
- after_commit :index_delta
89
- end
90
-
91
- after_destroy :toggle_deleted
92
-
93
- include ThinkingSphinx::SearchMethods
94
- include ThinkingSphinx::ActiveRecord::AttributeUpdates
95
- include ThinkingSphinx::ActiveRecord::Scopes
96
-
97
- index
98
-
99
- # We want to make sure that if the database doesn't exist, then Thinking
100
- # Sphinx doesn't mind when running non-TS tasks (like db:create, db:drop
101
- # and db:migrate). It's a bit hacky, but I can't think of a better way.
102
- rescue StandardError => err
103
- case err.class.name
104
- when "Mysql::Error", "Java::JavaSql::SQLException", "ActiveRecord::StatementInvalid"
105
- return
106
- else
107
- raise err
108
- end
109
- end
110
- alias_method :sphinx_index, :define_index
111
-
112
- def sphinx_index_options
113
- sphinx_indexes.last.options
114
- end
115
-
116
- # Generate a unique CRC value for the model's name, to use to
117
- # determine which Sphinx documents belong to which AR records.
118
- #
119
- # Really only written for internal use - but hey, if it's useful to
120
- # you in some other way, awesome.
121
- #
122
- def to_crc32
123
- self.name.to_crc32
124
- end
125
-
126
- def to_crc32s
127
- (subclasses << self).collect { |klass| klass.to_crc32 }
128
- end
129
-
130
- def source_of_sphinx_index
131
- possible_models = self.sphinx_indexes.collect { |index| index.model }
132
- return self if possible_models.include?(self)
3
+ require 'active_record'
4
+ require 'joiner'
133
5
 
134
- parent = self.superclass
135
- while !possible_models.include?(parent) && parent != ::ActiveRecord::Base
136
- parent = parent.superclass
137
- end
6
+ module ThinkingSphinx::ActiveRecord
7
+ module Callbacks; end
8
+ module Depolymorph; end
9
+ end
138
10
 
139
- return parent
140
- end
141
-
142
- def to_riddle(offset)
143
- sphinx_database_adapter.setup
144
-
145
- indexes = [to_riddle_for_core(offset)]
146
- indexes << to_riddle_for_delta(offset) if sphinx_delta?
147
- indexes << to_riddle_for_distributed
148
- end
149
-
150
- def sphinx_database_adapter
151
- @sphinx_database_adapter ||=
152
- ThinkingSphinx::AbstractAdapter.detect(self)
153
- end
154
-
155
- def sphinx_name
156
- self.name.underscore.tr(':/\\', '_')
157
- end
158
-
159
- def sphinx_index_names
160
- klass = source_of_sphinx_index
161
- names = ["#{klass.sphinx_name}_core"]
162
- names << "#{klass.sphinx_name}_delta" if sphinx_delta?
163
-
164
- names
165
- end
166
-
167
- private
168
-
169
- def sphinx_delta?
170
- self.sphinx_indexes.any? { |index| index.delta? }
171
- end
172
-
173
- def to_riddle_for_core(offset)
174
- index = Riddle::Configuration::Index.new("#{sphinx_name}_core")
175
- index.path = File.join(
176
- ThinkingSphinx::Configuration.instance.searchd_file_path, index.name
177
- )
178
-
179
- set_configuration_options_for_indexes index
180
- set_field_settings_for_indexes index
181
-
182
- self.sphinx_indexes.select { |ts_index|
183
- ts_index.model == self
184
- }.each_with_index do |ts_index, i|
185
- index.sources += ts_index.sources.collect { |source|
186
- source.to_riddle_for_core(offset, i)
187
- }
188
- end
189
-
190
- index
191
- end
192
-
193
- def to_riddle_for_delta(offset)
194
- index = Riddle::Configuration::Index.new("#{sphinx_name}_delta")
195
- index.parent = "#{sphinx_name}_core"
196
- index.path = File.join(ThinkingSphinx::Configuration.instance.searchd_file_path, index.name)
197
-
198
- self.sphinx_indexes.each_with_index do |ts_index, i|
199
- index.sources += ts_index.sources.collect { |source|
200
- source.to_riddle_for_delta(offset, i)
201
- } if ts_index.delta?
202
- end
203
-
204
- index
205
- end
206
-
207
- def to_riddle_for_distributed
208
- index = Riddle::Configuration::DistributedIndex.new(sphinx_name)
209
- index.local_indexes << "#{sphinx_name}_core"
210
- index.local_indexes.unshift "#{sphinx_name}_delta" if sphinx_delta?
211
- index
212
- end
213
-
214
- def set_configuration_options_for_indexes(index)
215
- ThinkingSphinx::Configuration.instance.index_options.each do |key, value|
216
- index.send("#{key}=".to_sym, value)
217
- end
218
-
219
- self.sphinx_indexes.each do |ts_index|
220
- ts_index.options.each do |key, value|
221
- index.send("#{key}=".to_sym, value) if ThinkingSphinx::Configuration::IndexOptions.include?(key.to_s) && !value.nil?
222
- end
223
- end
224
- end
225
-
226
- def set_field_settings_for_indexes(index)
227
- field_names = lambda { |field| field.unique_name.to_s }
228
-
229
- self.sphinx_indexes.each do |ts_index|
230
- index.prefix_field_names += ts_index.prefix_fields.collect(&field_names)
231
- index.infix_field_names += ts_index.infix_fields.collect(&field_names)
232
- end
233
- end
234
- end
235
- end
236
-
237
- base.send(:include, ThinkingSphinx::ActiveRecord::Delta)
238
-
239
- ::ActiveRecord::Associations::HasManyAssociation.send(
240
- :include, ThinkingSphinx::ActiveRecord::HasManyAssociation
241
- )
242
- ::ActiveRecord::Associations::HasManyThroughAssociation.send(
243
- :include, ThinkingSphinx::ActiveRecord::HasManyAssociation
244
- )
245
- end
246
-
247
- def in_index?(suffix)
248
- self.class.search_for_id self.sphinx_document_id, sphinx_index_name(suffix)
249
- end
250
-
251
- def in_core_index?
252
- in_index? "core"
253
- end
254
-
255
- def in_delta_index?
256
- in_index? "delta"
257
- end
258
-
259
- def in_both_indexes?
260
- in_core_index? && in_delta_index?
261
- end
262
-
263
- def toggle_deleted
264
- return unless ThinkingSphinx.updates_enabled? && ThinkingSphinx.sphinx_running?
265
-
266
- config = ThinkingSphinx::Configuration.instance
267
- client = Riddle::Client.new config.address, config.port
268
-
269
- client.update(
270
- "#{self.class.sphinx_indexes.first.name}_core",
271
- ['sphinx_deleted'],
272
- {self.sphinx_document_id => 1}
273
- ) if self.in_core_index?
274
-
275
- client.update(
276
- "#{self.class.sphinx_indexes.first.name}_delta",
277
- ['sphinx_deleted'],
278
- {self.sphinx_document_id => 1}
279
- ) if self.class.sphinx_indexes.any? { |index| index.delta? } &&
280
- self.toggled_delta?
281
- rescue ::ThinkingSphinx::ConnectionError
282
- # nothing
283
- end
284
-
285
- # Returns the unique integer id for the object. This method uses the
286
- # attribute hash to get around ActiveRecord always mapping the #id method
287
- # to whatever the real primary key is (which may be a unique string hash).
288
- #
289
- # @return [Integer] Unique record id for the purposes of Sphinx.
290
- #
291
- def primary_key_for_sphinx
292
- @primary_key_for_sphinx ||= read_attribute(self.class.primary_key_for_sphinx)
293
- end
294
-
295
- def sphinx_document_id
296
- primary_key_for_sphinx * ThinkingSphinx.indexed_models.size +
297
- ThinkingSphinx.indexed_models.index(self.class.source_of_sphinx_index.name)
298
- end
11
+ require 'thinking_sphinx/active_record/property'
12
+ require 'thinking_sphinx/active_record/association'
13
+ require 'thinking_sphinx/active_record/association_proxy'
14
+ require 'thinking_sphinx/active_record/attribute'
15
+ require 'thinking_sphinx/active_record/base'
16
+ require 'thinking_sphinx/active_record/column'
17
+ require 'thinking_sphinx/active_record/column_sql_presenter'
18
+ require 'thinking_sphinx/active_record/database_adapters'
19
+ require 'thinking_sphinx/active_record/field'
20
+ require 'thinking_sphinx/active_record/index'
21
+ require 'thinking_sphinx/active_record/interpreter'
22
+ require 'thinking_sphinx/active_record/join_association'
23
+ require 'thinking_sphinx/active_record/log_subscriber'
24
+ require 'thinking_sphinx/active_record/polymorpher'
25
+ require 'thinking_sphinx/active_record/property_query'
26
+ require 'thinking_sphinx/active_record/property_sql_presenter'
27
+ require 'thinking_sphinx/active_record/simple_many_query'
28
+ require 'thinking_sphinx/active_record/source_joins'
29
+ require 'thinking_sphinx/active_record/sql_builder'
30
+ require 'thinking_sphinx/active_record/sql_source'
299
31
 
300
- private
32
+ require 'thinking_sphinx/active_record/callbacks/association_delta_callbacks'
33
+ require 'thinking_sphinx/active_record/callbacks/delete_callbacks'
34
+ require 'thinking_sphinx/active_record/callbacks/delta_callbacks'
35
+ require 'thinking_sphinx/active_record/callbacks/update_callbacks'
301
36
 
302
- def sphinx_index_name(suffix)
303
- "#{self.class.source_of_sphinx_index.name.underscore.tr(':/\\', '_')}_#{suffix}"
304
- end
305
- end
306
- end
37
+ require 'thinking_sphinx/active_record/depolymorph/base_reflection'
38
+ require 'thinking_sphinx/active_record/depolymorph/association_reflection'
39
+ require 'thinking_sphinx/active_record/depolymorph/conditions_reflection'
40
+ require 'thinking_sphinx/active_record/depolymorph/overridden_reflection'
41
+ require 'thinking_sphinx/active_record/depolymorph/scoped_reflection'
42
+ require 'thinking_sphinx/active_record/filter_reflection'
43
+
44
+ ActiveRecord::Base.include ThinkingSphinx::ActiveRecord::Base
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::AttributeTypes
4
+ def self.call
5
+ @call ||= new.call
6
+ end
7
+
8
+ def self.reset
9
+ @call = nil
10
+ end
11
+
12
+ def call
13
+ return {} unless File.exist?(configuration_file)
14
+
15
+ realtime_indices.each { |index|
16
+ map_types_with_prefix index, :rt,
17
+ [:uint, :bigint, :float, :timestamp, :string, :bool, :json]
18
+
19
+ index.rt_attr_multi.each { |name| attributes[name] << :uint }
20
+ index.rt_attr_multi_64.each { |name| attributes[name] << :bigint }
21
+ }
22
+
23
+ plain_sources.each { |source|
24
+ map_types_with_prefix source, :sql,
25
+ [:uint, :bigint, :float, :timestamp, :string, :bool, :json]
26
+
27
+ source.sql_attr_str2ordinal { |name| attributes[name] << :uint }
28
+ source.sql_attr_str2wordcount { |name| attributes[name] << :uint }
29
+ source.sql_attr_multi.each { |setting|
30
+ type, name, *ignored = setting.split(/\s+/)
31
+ attributes[name] << type.to_sym
32
+ }
33
+ }
34
+
35
+ attributes.values.each &:uniq!
36
+ attributes
37
+ end
38
+
39
+ private
40
+
41
+ def attributes
42
+ @attributes ||= Hash.new { |hash, key| hash[key] = [] }
43
+ end
44
+
45
+ def configuration
46
+ @configuration ||= Riddle::Configuration.parse!(
47
+ File.read(configuration_file)
48
+ )
49
+ end
50
+
51
+ def configuration_file
52
+ ThinkingSphinx::Configuration.instance.configuration_file
53
+ end
54
+
55
+ def map_types_with_prefix(object, prefix, types)
56
+ types.each do |type|
57
+ object.public_send("#{prefix}_attr_#{type}").each do |name|
58
+ attributes[name] << type
59
+ end
60
+ end
61
+ end
62
+
63
+ def plain_sources
64
+ configuration.indices.select { |index|
65
+ index.type == 'plain' || index.type.nil?
66
+ }.collect(&:sources).flatten
67
+ end
68
+
69
+ def realtime_indices
70
+ configuration.indices.select { |index| index.type == 'rt' }
71
+ end
72
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::BatchedSearch
4
+ attr_accessor :searches
5
+
6
+ def initialize
7
+ @searches = []
8
+ end
9
+
10
+ def populate(middleware = ThinkingSphinx::Middlewares::DEFAULT)
11
+ return if populated? || searches.empty?
12
+
13
+ middleware.call contexts
14
+ searches.each &:populated!
15
+
16
+ @populated = true
17
+ end
18
+
19
+ private
20
+
21
+ def contexts
22
+ searches.collect &:context
23
+ end
24
+
25
+ def populated?
26
+ @populated
27
+ end
28
+ end