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,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Configuration::ConsistentIds
4
+ def initialize(indices)
5
+ @indices = indices
6
+ end
7
+
8
+ def reconcile
9
+ return unless sphinx_internal_ids.any? { |attribute|
10
+ attribute.type == :bigint
11
+ }
12
+
13
+ sphinx_internal_ids.each do |attribute|
14
+ attribute.type = :bigint
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def attributes
21
+ @attributes = sources.collect(&:attributes).flatten
22
+ end
23
+
24
+ def sphinx_internal_ids
25
+ @sphinx_internal_ids ||= attributes.select { |attribute|
26
+ attribute.name == 'sphinx_internal_id'
27
+ }
28
+ end
29
+
30
+ def sources
31
+ @sources ||= @indices.select { |index|
32
+ index.respond_to?(:sources)
33
+ }.collect(&:sources).flatten
34
+ end
35
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ThinkingSphinx::Configuration::Defaults
4
+ ADDRESS = '127.0.0.1'
5
+ PORT = 9306
6
+ PANES = []
7
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Configuration::DistributedIndices
4
+ def initialize(indices)
5
+ @indices = indices
6
+ end
7
+
8
+ def reconcile
9
+ grouped_indices.each do |reference, indices|
10
+ append distributed_index(reference, indices)
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ attr_reader :indices
17
+
18
+ def append(index)
19
+ ThinkingSphinx::Configuration.instance.indices << index
20
+ end
21
+
22
+ def distributed_index(reference, indices)
23
+ index = ThinkingSphinx::Distributed::Index.new reference
24
+ index.local_index_objects = indices
25
+ index
26
+ end
27
+
28
+ def grouped_indices
29
+ indices.group_by &:reference
30
+ end
31
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Configuration::DuplicateNames
4
+ def initialize(indices)
5
+ @indices = indices
6
+ end
7
+
8
+ def reconcile
9
+ indices.each do |index|
10
+ return if index.distributed?
11
+
12
+ counts_for(index).each do |name, count|
13
+ next if count <= 1
14
+
15
+ raise ThinkingSphinx::DuplicateNameError,
16
+ "Duplicate field/attribute name '#{name}' in index '#{index.name}'"
17
+ end
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :indices
24
+
25
+ def counts_for(index)
26
+ names_for(index).inject({}) do |hash, name|
27
+ hash[name] ||= 0
28
+ hash[name] += 1
29
+ hash
30
+ end
31
+ end
32
+
33
+ def names_for(index)
34
+ index.fields.collect(&:name) + index.attributes.collect(&:name)
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Configuration::MinimumFields
4
+ def initialize(indices)
5
+ @indices = indices
6
+ end
7
+
8
+ def reconcile
9
+ field_collections.each do |collection|
10
+ collection.fields.delete_if do |field|
11
+ field.name == 'sphinx_internal_class_name'
12
+ end
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :indices
19
+
20
+ def field_collections
21
+ indices_without_inheritance_of_type('plain').collect(&:sources).flatten +
22
+ indices_without_inheritance_of_type('rt')
23
+ end
24
+
25
+ def inheritance_columns?(index)
26
+ index.model.table_exists? && index.model.column_names.include?(index.model.inheritance_column)
27
+ end
28
+
29
+ def indices_without_inheritance_of_type(type)
30
+ indices_without_inheritance.select { |index| index.type == type }
31
+ end
32
+
33
+ def indices_without_inheritance
34
+ indices.reject(&method(:inheritance_columns?))
35
+ end
36
+ end
@@ -1,282 +1,209 @@
1
- require 'erb'
2
- require 'singleton'
3
-
4
- module ThinkingSphinx
5
- # This class both keeps track of the configuration settings for Sphinx and
6
- # also generates the resulting file for Sphinx to use.
7
- #
8
- # Here are the default settings, relative to RAILS_ROOT where relevant:
9
- #
10
- # config file:: config/#{environment}.sphinx.conf
11
- # searchd log file:: log/searchd.log
12
- # query log file:: log/searchd.query.log
13
- # pid file:: log/searchd.#{environment}.pid
14
- # searchd files:: db/sphinx/#{environment}/
15
- # address:: 127.0.0.1
16
- # port:: 3312
17
- # allow star:: false
18
- # min prefix length:: 1
19
- # min infix length:: 1
20
- # mem limit:: 64M
21
- # max matches:: 1000
22
- # morphology:: nil
23
- # charset type:: utf-8
24
- # charset table:: nil
25
- # ignore chars:: nil
26
- # html strip:: false
27
- # html remove elements:: ''
28
- # searchd_binary_name:: searchd
29
- # indexer_binary_name:: indexer
30
- #
31
- # If you want to change these settings, create a YAML file at
32
- # config/sphinx.yml with settings for each environment, in a similar
33
- # fashion to database.yml - using the following keys: config_file,
34
- # searchd_log_file, query_log_file, pid_file, searchd_file_path, port,
35
- # allow_star, enable_star, min_prefix_len, min_infix_len, mem_limit,
36
- # max_matches, morphology, charset_type, charset_table, ignore_chars,
37
- # html_strip, html_remove_elements, delayed_job_priority,
38
- # searchd_binary_name, indexer_binary_name.
39
- #
40
- # I think you've got the idea.
41
- #
42
- # Each setting in the YAML file is optional - so only put in the ones you
43
- # want to change.
44
- #
45
- # Keep in mind, if for some particular reason you're using a version of
46
- # Sphinx older than 0.9.8 r871 (that's prior to the proper 0.9.8 release),
47
- # don't set allow_star to true.
48
- #
49
- class Configuration
50
- include Singleton
51
-
52
- SourceOptions = %w( mysql_connect_flags sql_range_step sql_query_pre
53
- sql_query_post sql_ranged_throttle sql_query_post_index )
54
-
55
- IndexOptions = %w( charset_table charset_type docinfo enable_star
56
- exceptions html_index_attrs html_remove_elements html_strip ignore_chars
57
- min_infix_len min_prefix_len min_word_len mlock morphology ngram_chars
58
- ngram_len phrase_boundary phrase_boundary_step preopen stopwords
59
- wordforms )
60
-
61
- CustomOptions = %w( disable_range )
62
-
63
- attr_accessor :config_file, :searchd_log_file, :query_log_file,
64
- :pid_file, :searchd_file_path, :address, :port, :allow_star,
65
- :database_yml_file, :app_root, :bin_path, :model_directories,
66
- :delayed_job_priority, :searchd_binary_name, :indexer_binary_name
67
-
68
- attr_accessor :source_options, :index_options
69
-
70
- attr_reader :environment, :configuration
71
-
72
- # Load in the configuration settings - this will look for config/sphinx.yml
73
- # and parse it according to the current environment.
74
- #
75
- def initialize(app_root = Dir.pwd)
76
- self.reset
77
- end
78
-
79
- def self.configure(&block)
80
- yield instance
81
- instance.reset(instance.app_root)
82
- end
83
-
84
- def reset(custom_app_root=nil)
85
- if custom_app_root
86
- self.app_root = custom_app_root
87
- else
88
- self.app_root = RAILS_ROOT if defined?(RAILS_ROOT)
89
- self.app_root = Merb.root if defined?(Merb)
90
- self.app_root ||= app_root
91
- end
92
-
93
- @configuration = Riddle::Configuration.new
94
- @configuration.searchd.address = "127.0.0.1"
95
- @configuration.searchd.port = 3312
96
- @configuration.searchd.pid_file = "#{self.app_root}/log/searchd.#{environment}.pid"
97
- @configuration.searchd.log = "#{self.app_root}/log/searchd.log"
98
- @configuration.searchd.query_log = "#{self.app_root}/log/searchd.query.log"
99
-
100
- self.database_yml_file = "#{self.app_root}/config/database.yml"
101
- self.config_file = "#{self.app_root}/config/#{environment}.sphinx.conf"
102
- self.searchd_file_path = "#{self.app_root}/db/sphinx/#{environment}"
103
- self.allow_star = false
104
- self.bin_path = ""
105
- self.model_directories = ["#{app_root}/app/models/"] +
106
- Dir.glob("#{app_root}/vendor/plugins/*/app/models/")
107
- self.delayed_job_priority = 0
108
-
109
- self.source_options = {}
110
- self.index_options = {
111
- :charset_type => "utf-8"
112
- }
113
-
114
- self.searchd_binary_name = "searchd"
115
- self.indexer_binary_name = "indexer"
116
-
117
- parse_config
118
-
119
- self
120
- end
121
-
122
- def self.environment
123
- @@environment ||= (
124
- defined?(Merb) ? Merb.environment : ENV['RAILS_ENV']
125
- ) || "development"
126
- end
127
-
128
- def environment
129
- self.class.environment
130
- end
131
-
132
- def controller
133
- @controller ||= Riddle::Controller.new(@configuration, self.config_file)
1
+ # frozen_string_literal: true
2
+
3
+ require 'pathname'
4
+
5
+ class ThinkingSphinx::Configuration < Riddle::Configuration
6
+ attr_accessor :configuration_file, :indices_location, :version, :batch_size
7
+ attr_reader :index_paths
8
+ attr_writer :controller, :index_set_class, :indexing_strategy,
9
+ :guarding_strategy
10
+
11
+ delegate :environment, :to => :framework
12
+
13
+ @@mutex = defined?(ActiveSupport::Concurrency::LoadInterlockAwareMonitor) ?
14
+ ActiveSupport::Concurrency::LoadInterlockAwareMonitor.new : Mutex.new
15
+
16
+ def initialize
17
+ super
18
+
19
+ reset
20
+ end
21
+
22
+ def self.instance
23
+ @instance ||= new
24
+ end
25
+
26
+ def self.reset
27
+ @instance = nil
28
+ end
29
+
30
+ def bin_path
31
+ settings['bin_path']
32
+ end
33
+
34
+ def controller
35
+ @controller ||= begin
36
+ rc = Riddle::Controller.new self, configuration_file
37
+ rc.bin_path = bin_path.gsub(/([^\/])$/, '\1/') if bin_path.present?
38
+ rc
134
39
  end
135
-
136
- # Generate the config file for Sphinx by using all the settings defined and
137
- # looping through all the models with indexes to build the relevant
138
- # indexer and searchd configuration, and sources and indexes details.
139
- #
140
- def build(file_path=nil)
141
- load_models
142
- file_path ||= "#{self.config_file}"
143
-
144
- @configuration.indexes.clear
145
-
146
- ThinkingSphinx.indexed_models.each_with_index do |model, model_index|
147
- @configuration.indexes.concat model.constantize.to_riddle(model_index)
148
- end
149
-
150
- open(file_path, "w") do |file|
151
- file.write @configuration.render
152
- end
40
+ end
41
+
42
+ def framework
43
+ @framework ||= ThinkingSphinx::Frameworks.current
44
+ end
45
+
46
+ def framework=(framework)
47
+ @framework = framework
48
+ reset
49
+ framework
50
+ end
51
+
52
+ def engine_index_paths
53
+ return [] unless defined?(Rails)
54
+
55
+ engine_indice_paths.flatten.compact.sort
56
+ end
57
+
58
+ def engine_indice_paths
59
+ Rails::Engine.subclasses.collect(&:instance).collect do |engine|
60
+ engine.paths.add 'app/indices' unless engine.paths['app/indices']
61
+ engine.paths['app/indices'].existent
153
62
  end
154
-
155
- # Make sure all models are loaded - without reloading any that
156
- # ActiveRecord::Base is already aware of (otherwise we start to hit some
157
- # messy dependencies issues).
158
- #
159
- def load_models
160
- return if defined?(Rails) &&
161
- Rails::VERSION::STRING.to_f > 2.1 &&
162
- Rails.configuration.cache_classes
163
-
164
- self.model_directories.each do |base|
165
- Dir["#{base}**/*.rb"].each do |file|
166
- model_name = file.gsub(/^#{base}([\w_\/\\]+)\.rb/, '\1')
167
-
168
- next if model_name.nil?
169
- next if ::ActiveRecord::Base.send(:subclasses).detect { |model|
170
- model.name == model_name
171
- }
172
-
173
- begin
174
- model_name.camelize.constantize
175
- rescue LoadError
176
- model_name.gsub!(/.*[\/\\]/, '').nil? ? next : retry
177
- rescue NameError
178
- next
179
- rescue StandardError
180
- puts "Warning: Error loading #{file}"
181
- end
182
- end
63
+ end
64
+
65
+ def guarding_strategy
66
+ @guarding_strategy ||= ThinkingSphinx::Guard::Files
67
+ end
68
+
69
+ def index_set_class
70
+ @index_set_class ||= ThinkingSphinx::IndexSet
71
+ end
72
+
73
+ def indexing_strategy
74
+ @indexing_strategy ||= ThinkingSphinx::IndexingStrategies::AllAtOnce
75
+ end
76
+
77
+ def indices_for_references(*references)
78
+ index_set_class.new(:references => references).to_a
79
+ end
80
+
81
+ def next_offset(reference)
82
+ @offsets[reference] ||= @offsets.keys.count
83
+ end
84
+
85
+ def preload_indices
86
+ @@mutex.synchronize do
87
+ return if @preloaded_indices
88
+
89
+ index_paths.each do |path|
90
+ Dir["#{path}/**/*.rb"].sort.each { |file| preload_index file }
183
91
  end
92
+
93
+ normalise
94
+ verify
95
+
96
+ @preloaded_indices = true
184
97
  end
185
-
186
- def address
187
- @configuration.searchd.address
188
- end
189
-
190
- def address=(address)
191
- @configuration.searchd.address = address
192
- end
193
-
194
- def port
195
- @configuration.searchd.port
196
- end
197
-
198
- def port=(port)
199
- @configuration.searchd.port = port
200
- end
201
-
202
- def pid_file
203
- @configuration.searchd.pid_file
204
- end
205
-
206
- def pid_file=(pid_file)
207
- @configuration.searchd.pid_file = pid_file
208
- end
209
-
210
- def searchd_log_file
211
- @configuration.searchd.log
212
- end
213
-
214
- def searchd_log_file=(file)
215
- @configuration.searchd.log = file
216
- end
217
-
218
- def query_log_file
219
- @configuration.searchd.query_log
98
+ end
99
+
100
+ def preload_index(file)
101
+ if ActiveRecord::VERSION::MAJOR <= 5
102
+ ActiveSupport::Dependencies.require_or_load file
103
+ else
104
+ load file
220
105
  end
221
-
222
- def query_log_file=(file)
223
- @configuration.searchd.query_log = file
106
+ end
107
+
108
+ def render
109
+ preload_indices
110
+
111
+ super
112
+ end
113
+
114
+ def render_to_file
115
+ unless settings['skip_directory_creation'] || searchd.binlog_path.blank?
116
+ FileUtils.mkdir_p searchd.binlog_path
224
117
  end
225
-
226
- def client
227
- client = Riddle::Client.new address, port
228
- client.max_matches = configuration.searchd.max_matches || 1000
229
- client
118
+
119
+ open(configuration_file, 'w') { |file| file.write render }
120
+ end
121
+
122
+ def settings
123
+ @settings ||= ThinkingSphinx::Settings.call self
124
+ end
125
+
126
+ def setup
127
+ @configuration_file = settings['configuration_file']
128
+ @index_paths = engine_index_paths +
129
+ [Pathname.new(framework.root).join('app', 'indices').to_s]
130
+ @indices_location = settings['indices_location']
131
+ @version = settings['version'] || '2.2.11'
132
+ @batch_size = settings['batch_size'] || 1000
133
+
134
+ if settings['common_sphinx_configuration']
135
+ common.common_sphinx_configuration = true
136
+ indexer.common_sphinx_configuration = true
230
137
  end
231
-
232
- def models_by_crc
233
- @models_by_crc ||= begin
234
- ThinkingSphinx.indexed_models.inject({}) do |hash, model|
235
- hash[model.constantize.to_crc32] = model
236
- Object.subclasses_of(model.constantize).each { |subclass|
237
- hash[subclass.to_crc32] = subclass.name
238
- }
239
- hash
240
- end
138
+
139
+ configure_searchd
140
+
141
+ apply_sphinx_settings!
142
+
143
+ @offsets = {}
144
+ end
145
+
146
+ private
147
+
148
+ def apply_sphinx_settings!
149
+ sphinx_sections.each do |object|
150
+ settings.each do |key, value|
151
+ next unless object.class.settings.include?(key.to_sym)
152
+
153
+ object.send("#{key}=", value)
241
154
  end
242
155
  end
243
-
244
- private
245
-
246
- # Parse the config/sphinx.yml file - if it exists - then use the attribute
247
- # accessors to set the appropriate values. Nothing too clever.
248
- #
249
- def parse_config
250
- path = "#{app_root}/config/sphinx.yml"
251
- return unless File.exists?(path)
252
-
253
- conf = YAML::load(ERB.new(IO.read(path)).result)[environment]
254
-
255
- conf.each do |key,value|
256
- self.send("#{key}=", value) if self.respond_to?("#{key}=")
257
-
258
- set_sphinx_setting self.source_options, key, value, SourceOptions
259
- set_sphinx_setting self.index_options, key, value, IndexOptions
260
- set_sphinx_setting self.index_options, key, value, CustomOptions
261
- set_sphinx_setting @configuration.searchd, key, value
262
- set_sphinx_setting @configuration.indexer, key, value
263
- end unless conf.nil?
264
-
265
- self.bin_path += '/' unless self.bin_path.blank?
266
-
267
- if self.allow_star
268
- self.index_options[:enable_star] = true
269
- self.index_options[:min_prefix_len] = 1
270
- end
156
+ end
157
+
158
+ def configure_searchd
159
+ searchd.socket = "#{settings["socket"]}:mysql41" if socket?
160
+
161
+ if tcp?
162
+ searchd.address = settings['address'].presence || Defaults::ADDRESS
163
+ searchd.mysql41 = settings['mysql41'] || settings['port'] || Defaults::PORT
271
164
  end
272
-
273
- def set_sphinx_setting(object, key, value, allowed = {})
274
- if object.is_a?(Hash)
275
- object[key.to_sym] = value if allowed.include?(key.to_s)
276
- else
277
- object.send("#{key}=", value) if object.respond_to?("#{key}")
278
- send("#{key}=", value) if self.respond_to?("#{key}")
279
- end
165
+
166
+ searchd.mysql_version_string = '5.5.21' if RUBY_PLATFORM == 'java'
167
+ end
168
+
169
+ def normalise
170
+ if settings['distributed_indices'].nil? || settings['distributed_indices']
171
+ ThinkingSphinx::Configuration::DistributedIndices.new(indices).reconcile
280
172
  end
173
+
174
+ ThinkingSphinx::Configuration::ConsistentIds.new(indices).reconcile
175
+ ThinkingSphinx::Configuration::MinimumFields.new(indices).reconcile
176
+ end
177
+
178
+ def reset
179
+ @settings = nil
180
+ setup
181
+ end
182
+
183
+ def socket?
184
+ settings["socket"].present?
185
+ end
186
+
187
+ def sphinx_sections
188
+ sections = [indexer, searchd]
189
+ sections.unshift common if settings['common_sphinx_configuration']
190
+ sections
191
+ end
192
+
193
+ def tcp?
194
+ settings["socket"].nil? ||
195
+ settings["address"].present? ||
196
+ settings["mysql41"].present? ||
197
+ settings["port"].present?
198
+ end
199
+
200
+ def verify
201
+ ThinkingSphinx::Configuration::DuplicateNames.new(indices).reconcile
281
202
  end
282
203
  end
204
+
205
+ require 'thinking_sphinx/configuration/consistent_ids'
206
+ require 'thinking_sphinx/configuration/defaults'
207
+ require 'thinking_sphinx/configuration/distributed_indices'
208
+ require 'thinking_sphinx/configuration/duplicate_names'
209
+ require 'thinking_sphinx/configuration/minimum_fields'