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,582 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::Configuration do
6
+ let(:config) { ThinkingSphinx::Configuration.instance }
7
+ let(:use_load?) { ActiveRecord::VERSION::MAJOR > 5 }
8
+ let(:loading_object) { use_load? ? config : ActiveSupport::Dependencies }
9
+ let(:loading_method) { use_load? ? :load : :require_or_load }
10
+
11
+ after :each do
12
+ ThinkingSphinx::Configuration.reset
13
+ end
14
+
15
+ def expect_loading_of(file)
16
+ expect(loading_object).to receive(loading_method).with(file).once
17
+ end
18
+
19
+ describe '.instance' do
20
+ it "returns an instance of ThinkingSphinx::Configuration" do
21
+ expect(ThinkingSphinx::Configuration.instance).
22
+ to be_a(ThinkingSphinx::Configuration)
23
+ end
24
+
25
+ it "memoizes the instance" do
26
+ config = double('configuration')
27
+
28
+ expect(ThinkingSphinx::Configuration).to receive(:new).once.and_return(config)
29
+
30
+ ThinkingSphinx::Configuration.instance
31
+ ThinkingSphinx::Configuration.instance
32
+ end
33
+ end
34
+
35
+ describe '.reset' do
36
+ after :each do
37
+ config.framework = ThinkingSphinx::Frameworks.current
38
+ end
39
+
40
+ it 'does not cache settings after reset' do
41
+ allow(File).to receive(:exist?).and_wrap_original do |original, path|
42
+ next true if path.to_s == File.absolute_path("config/thinking_sphinx.yml", Rails.root)
43
+
44
+ original.call(path)
45
+ end
46
+
47
+ allow(File).to receive_messages :read => {
48
+ 'test' => {'foo' => 'bugs'},
49
+ 'production' => {'foo' => 'bar'}
50
+ }.to_yaml
51
+
52
+ ThinkingSphinx::Configuration.reset
53
+ # Grab a new copy of the instance.
54
+ config = ThinkingSphinx::Configuration.instance
55
+ expect(config.settings['foo']).to eq('bugs')
56
+
57
+ config.framework = double :environment => 'production', :root => Pathname.new(__FILE__).join('..', '..', 'internal')
58
+ expect(config.settings['foo']).to eq('bar')
59
+ end
60
+ end
61
+
62
+ describe '#configuration_file' do
63
+ it "uses the Rails environment in the configuration file name" do
64
+ expect(config.configuration_file).
65
+ to eq(File.join(Rails.root, 'config', 'test.sphinx.conf'))
66
+ end
67
+
68
+ it "respects provided settings" do
69
+ write_configuration 'configuration_file' => '/path/to/foo.conf'
70
+
71
+ expect(config.configuration_file).to eq('/path/to/foo.conf')
72
+ end
73
+ end
74
+
75
+ describe '#controller' do
76
+ it "returns an instance of Riddle::Controller" do
77
+ expect(config.controller).to be_a(Riddle::Controller)
78
+ end
79
+
80
+ it "memoizes the instance" do
81
+ expect(Riddle::Controller).to receive(:new).once.
82
+ and_return(double('controller'))
83
+
84
+ config.controller
85
+ config.controller
86
+ end
87
+
88
+ it "sets the bin path from the thinking_sphinx.yml file" do
89
+ write_configuration('bin_path' => '/foo/bar/bin/')
90
+
91
+ expect(config.controller.bin_path).to eq('/foo/bar/bin/')
92
+ end
93
+
94
+ it "appends a backslash to the bin_path if appropriate" do
95
+ write_configuration('bin_path' => '/foo/bar/bin')
96
+
97
+ expect(config.controller.bin_path).to eq('/foo/bar/bin/')
98
+ end
99
+ end
100
+
101
+ describe '#index_paths' do
102
+ it "uses app/indices in the Rails app by default" do
103
+ expect(config.index_paths).to include(File.join(Rails.root, 'app', 'indices'))
104
+ end
105
+
106
+ it "uses app/indices in the Rails engines" do
107
+ engine = double :engine, { :paths => { 'app/indices' =>
108
+ double(:path, { :existent => '/engine/app/indices' } )
109
+ } }
110
+ engine_class = double :instance => engine
111
+
112
+ expect(Rails::Engine).to receive(:subclasses).and_return([ engine_class ])
113
+
114
+ expect(config.index_paths).to include('/engine/app/indices')
115
+ end
116
+ end
117
+
118
+ describe '#indices_location' do
119
+ it "stores index files in db/sphinx/ENVIRONMENT" do
120
+ expect(config.indices_location).
121
+ to eq(File.join(Rails.root, 'db', 'sphinx', 'test'))
122
+ end
123
+
124
+ it "respects provided settings" do
125
+ write_configuration 'indices_location' => '/my/index/files'
126
+
127
+ expect(config.indices_location).to eq('/my/index/files')
128
+ end
129
+
130
+ it "respects relative paths" do
131
+ write_configuration 'indices_location' => 'my/index/files'
132
+
133
+ expect(config.indices_location).to eq('my/index/files')
134
+ end
135
+
136
+ it "translates relative paths to absolute if config requests it" do
137
+ write_configuration(
138
+ 'indices_location' => 'my/index/files',
139
+ 'absolute_paths' => true
140
+ )
141
+
142
+ expect(config.indices_location).to eq(
143
+ File.join(config.framework.root, 'my/index/files')
144
+ )
145
+ end
146
+
147
+ it "respects paths that are already absolute" do
148
+ write_configuration(
149
+ 'indices_location' => '/my/index/files',
150
+ 'absolute_paths' => true
151
+ )
152
+
153
+ expect(config.indices_location).to eq('/my/index/files')
154
+ end
155
+
156
+ it "translates linked directories" do
157
+ write_configuration(
158
+ 'indices_location' => 'mine/index/files',
159
+ 'absolute_paths' => true
160
+ )
161
+
162
+ framework = ThinkingSphinx::Frameworks.current
163
+ local_path = File.join framework.root, "mine"
164
+ linked_path = File.join framework.root, "my"
165
+
166
+ FileUtils.mkdir_p linked_path
167
+ `ln -s #{linked_path} #{local_path}`
168
+
169
+ expect(config.indices_location).to eq(
170
+ File.join(config.framework.root, "my/index/files")
171
+ )
172
+
173
+ FileUtils.rm_rf local_path
174
+ FileUtils.rm_rf linked_path
175
+ end
176
+ end
177
+
178
+ describe '#initialize' do
179
+ before :each do
180
+ FileUtils.rm_rf Rails.root.join('log')
181
+ end
182
+
183
+ it "sets the daemon pid file within log for the Rails app" do
184
+ expect(config.searchd.pid_file).
185
+ to eq(File.join(Rails.root, 'log', 'test.sphinx.pid'))
186
+ end
187
+
188
+ it "sets the daemon log within log for the Rails app" do
189
+ expect(config.searchd.log).
190
+ to eq(File.join(Rails.root, 'log', 'test.searchd.log'))
191
+ end
192
+
193
+ it "sets the query log within log for the Rails app" do
194
+ expect(config.searchd.query_log).
195
+ to eq(File.join(Rails.root, 'log', 'test.searchd.query.log'))
196
+ end
197
+
198
+ it "sets indexer settings if within thinking_sphinx.yml" do
199
+ write_configuration 'mem_limit' => '128M'
200
+
201
+ expect(config.indexer.mem_limit).to eq('128M')
202
+ end
203
+
204
+ it "sets searchd settings if within thinking_sphinx.yml" do
205
+ write_configuration 'workers' => 'none'
206
+
207
+ expect(config.searchd.workers).to eq('none')
208
+ end
209
+
210
+ it 'adds settings to indexer without common section' do
211
+ write_configuration 'lemmatizer_base' => 'foo'
212
+
213
+ expect(config.indexer.lemmatizer_base).to eq('foo')
214
+ end
215
+
216
+ it 'adds settings to common section if requested' do
217
+ write_configuration 'lemmatizer_base' => 'foo',
218
+ 'common_sphinx_configuration' => true
219
+
220
+ expect(config.common.lemmatizer_base).to eq('foo')
221
+ end
222
+ end
223
+
224
+ describe '#next_offset' do
225
+ let(:reference) { double('reference') }
226
+
227
+ it "starts at 0" do
228
+ expect(config.next_offset(reference)).to eq(0)
229
+ end
230
+
231
+ it "increments for each new reference" do
232
+ expect(config.next_offset(double('reference'))).to eq(0)
233
+ expect(config.next_offset(double('reference'))).to eq(1)
234
+ expect(config.next_offset(double('reference'))).to eq(2)
235
+ end
236
+
237
+ it "doesn't increment for recorded references" do
238
+ expect(config.next_offset(reference)).to eq(0)
239
+ expect(config.next_offset(reference)).to eq(0)
240
+ end
241
+ end
242
+
243
+ describe '#preload_indices' do
244
+ let(:distributor) { double :reconcile => true }
245
+
246
+ before :each do
247
+ stub_const 'ThinkingSphinx::Configuration::DistributedIndices',
248
+ double(:new => distributor)
249
+ end
250
+
251
+ it "searches each index path for ruby files" do
252
+ config.index_paths.replace ['/path/to/indices', '/path/to/other/indices']
253
+
254
+ expect(Dir).to receive(:[]).with('/path/to/indices/**/*.rb').once.
255
+ and_return([])
256
+ expect(Dir).to receive(:[]).with('/path/to/other/indices/**/*.rb').once.
257
+ and_return([])
258
+
259
+ config.preload_indices
260
+ end
261
+
262
+ it "loads each file returned" do
263
+ config.index_paths.replace ['/path/to/indices']
264
+ allow(Dir).to receive_messages :[] => [
265
+ '/path/to/indices/foo_index.rb',
266
+ '/path/to/indices/bar_index.rb'
267
+ ]
268
+
269
+ expect_loading_of('/path/to/indices/foo_index.rb')
270
+ expect_loading_of('/path/to/indices/bar_index.rb')
271
+
272
+ config.preload_indices
273
+ end
274
+
275
+ it "does not double-load indices" do
276
+ config.index_paths.replace ['/path/to/indices']
277
+ allow(Dir).to receive_messages :[] => [
278
+ '/path/to/indices/foo_index.rb',
279
+ '/path/to/indices/bar_index.rb'
280
+ ]
281
+
282
+ expect_loading_of('/path/to/indices/foo_index.rb')
283
+ expect_loading_of('/path/to/indices/bar_index.rb')
284
+
285
+ config.preload_indices
286
+ config.preload_indices
287
+ end
288
+
289
+ it 'adds distributed indices' do
290
+ expect(distributor).to receive(:reconcile)
291
+
292
+ config.preload_indices
293
+ end
294
+
295
+ it 'does not add distributed indices if disabled' do
296
+ write_configuration('distributed_indices' => false)
297
+
298
+ expect(distributor).not_to receive(:reconcile)
299
+
300
+ config.preload_indices
301
+ end
302
+ end
303
+
304
+ describe '#render' do
305
+ before :each do
306
+ allow(config.searchd).to receive_messages :render => 'searchd { }'
307
+ end
308
+
309
+ it "searches each index path for ruby files" do
310
+ config.index_paths.replace ['/path/to/indices', '/path/to/other/indices']
311
+
312
+ expect(Dir).to receive(:[]).with('/path/to/indices/**/*.rb').once.
313
+ and_return([])
314
+ expect(Dir).to receive(:[]).with('/path/to/other/indices/**/*.rb').once.
315
+ and_return([])
316
+
317
+ config.render
318
+ end
319
+
320
+ it "loads each file returned" do
321
+ config.index_paths.replace ['/path/to/indices']
322
+ allow(Dir).to receive_messages :[] => [
323
+ '/path/to/indices/foo_index.rb',
324
+ '/path/to/indices/bar_index.rb'
325
+ ]
326
+
327
+ expect_loading_of('/path/to/indices/foo_index.rb')
328
+ expect_loading_of('/path/to/indices/bar_index.rb')
329
+
330
+ config.render
331
+ end
332
+
333
+ it "does not double-load indices" do
334
+ config.index_paths.replace ['/path/to/indices']
335
+ allow(Dir).to receive_messages :[] => [
336
+ '/path/to/indices/foo_index.rb',
337
+ '/path/to/indices/bar_index.rb'
338
+ ]
339
+
340
+ expect_loading_of('/path/to/indices/foo_index.rb')
341
+ expect_loading_of('/path/to/indices/bar_index.rb')
342
+
343
+ config.preload_indices
344
+ config.preload_indices
345
+ end
346
+ end
347
+
348
+ describe '#render_to_file' do
349
+ let(:file) { double('file') }
350
+ let(:output) { config.render }
351
+ let(:skip_directories) { false }
352
+
353
+ before :each do
354
+ write_configuration('skip_directory_creation' => skip_directories)
355
+
356
+ allow(config.searchd).to receive_messages :render => 'searchd { }'
357
+ end
358
+
359
+ it "writes the rendered configuration to the file" do
360
+ config.configuration_file = '/path/to/file.config'
361
+
362
+ expect(config).to receive(:open).with('/path/to/file.config', 'w').
363
+ and_yield(file)
364
+ expect(file).to receive(:write).with(output)
365
+
366
+ config.render_to_file
367
+ end
368
+
369
+ it "creates a directory at the binlog_path" do
370
+ allow(FileUtils).to receive_messages :mkdir_p => true
371
+ allow(config).to receive_messages :searchd => double(:binlog_path => '/path/to/binlog')
372
+
373
+ expect(FileUtils).to receive(:mkdir_p).with('/path/to/binlog')
374
+
375
+ config.render_to_file
376
+ end
377
+
378
+ it "skips creating a directory when the binlog_path is blank" do
379
+ allow(loading_object).to receive(loading_method)
380
+
381
+ allow(FileUtils).to receive_messages :mkdir_p => true
382
+ allow(config).to receive_messages :searchd => double(:binlog_path => '')
383
+
384
+ expect(FileUtils).not_to receive(:mkdir_p)
385
+
386
+ config.render_to_file
387
+ end
388
+
389
+ context 'skipping directory creation' do
390
+ let(:skip_directories) { true }
391
+
392
+ it "skips creating a directory when flag is set" do
393
+ expect(FileUtils).not_to receive(:mkdir_p)
394
+
395
+ config.render_to_file
396
+ end
397
+ end
398
+ end
399
+
400
+ describe '#searchd' do
401
+ describe '#address' do
402
+ it "defaults to 127.0.0.1" do
403
+ expect(config.searchd.address).to eq('127.0.0.1')
404
+ end
405
+
406
+ it "respects the address setting" do
407
+ write_configuration('address' => '10.11.12.13')
408
+
409
+ expect(config.searchd.address).to eq('10.11.12.13')
410
+ end
411
+ end
412
+
413
+ describe '#log' do
414
+ it "defaults to an environment-specific file" do
415
+ expect(config.searchd.log).to eq(
416
+ File.join(config.framework.root, "log/test.searchd.log")
417
+ )
418
+ end
419
+
420
+ it "translates linked directories" do
421
+ framework = ThinkingSphinx::Frameworks.current
422
+ log_path = File.join framework.root, "log"
423
+ linked_path = File.join framework.root, "logging"
424
+ log_exists = File.exist? log_path
425
+
426
+ FileUtils.mv log_path, "#{log_path}-tmp" if log_exists
427
+ FileUtils.mkdir_p linked_path
428
+ `ln -s #{linked_path} #{log_path}`
429
+
430
+ expect(config.searchd.log).to eq(
431
+ File.join(config.framework.root, "logging/test.searchd.log")
432
+ )
433
+
434
+ FileUtils.rm log_path
435
+ FileUtils.rmdir linked_path
436
+ FileUtils.mv "#{log_path}-tmp", log_path if log_exists
437
+ end unless RUBY_PLATFORM == "java"
438
+ end
439
+
440
+ describe '#mysql41' do
441
+ it "defaults to 9306" do
442
+ expect(config.searchd.mysql41).to eq(9306)
443
+ end
444
+
445
+ it "respects the port setting" do
446
+ write_configuration('port' => 9313)
447
+
448
+ expect(config.searchd.mysql41).to eq(9313)
449
+ end
450
+
451
+ it "respects the mysql41 setting" do
452
+ write_configuration('mysql41' => 9307)
453
+
454
+ expect(config.searchd.mysql41).to eq(9307)
455
+ end
456
+ end
457
+
458
+ describe "#socket" do
459
+ it "does not set anything by default" do
460
+ expect(config.searchd.socket).to be_nil
461
+ end
462
+
463
+ it "ignores unspecified address and port when socket is set" do
464
+ write_configuration("socket" => "/my/socket")
465
+
466
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
467
+ expect(config.searchd.address).to be_nil
468
+ expect(config.searchd.mysql41).to be_nil
469
+ end
470
+
471
+ it "allows address and socket settings" do
472
+ write_configuration("socket" => "/my/socket", "address" => "1.1.1.1")
473
+
474
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
475
+ expect(config.searchd.address).to eq("1.1.1.1")
476
+ expect(config.searchd.mysql41).to eq(9306)
477
+ end
478
+
479
+ it "allows mysql41 and socket settings" do
480
+ write_configuration("socket" => "/my/socket", "mysql41" => 9307)
481
+
482
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
483
+ expect(config.searchd.address).to eq("127.0.0.1")
484
+ expect(config.searchd.mysql41).to eq(9307)
485
+ end
486
+
487
+ it "allows port and socket settings" do
488
+ write_configuration("socket" => "/my/socket", "port" => 9307)
489
+
490
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
491
+ expect(config.searchd.address).to eq("127.0.0.1")
492
+ expect(config.searchd.mysql41).to eq(9307)
493
+ end
494
+
495
+ it "allows address, mysql41 and socket settings" do
496
+ write_configuration(
497
+ "socket" => "/my/socket",
498
+ "address" => "1.2.3.4",
499
+ "mysql41" => 9307
500
+ )
501
+
502
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
503
+ expect(config.searchd.address).to eq("1.2.3.4")
504
+ expect(config.searchd.mysql41).to eq(9307)
505
+ end
506
+ end
507
+ end
508
+
509
+ describe '#settings' do
510
+ context 'YAML file exists' do
511
+ before :each do
512
+ allow(File).to receive(:exist?).and_wrap_original do |original, path|
513
+ next true if path.to_s == File.absolute_path("config/thinking_sphinx.yml", Rails.root)
514
+
515
+ original.call(path)
516
+ end
517
+ end
518
+
519
+ it "reads from the YAML file" do
520
+ expect(File).to receive(:read).and_return('')
521
+
522
+ config.settings
523
+ end
524
+
525
+ it "uses the settings for the given environment" do
526
+ allow(File).to receive_messages :read => {
527
+ 'test' => {'foo' => 'bar'},
528
+ 'staging' => {'baz' => 'qux'}
529
+ }.to_yaml
530
+ allow(Rails).to receive_messages :env => 'staging'
531
+
532
+ expect(config.settings['baz']).to eq('qux')
533
+ end
534
+
535
+ it "remembers the file contents" do
536
+ expect(File).to receive(:read).and_return('')
537
+
538
+ config.settings
539
+ config.settings
540
+ end
541
+
542
+ it "returns the default hash when no settings for the environment exist" do
543
+ allow(File).to receive_messages :read => {'test' => {'foo' => 'bar'}}.to_yaml
544
+ allow(Rails).to receive_messages :env => 'staging'
545
+
546
+ expect(config.settings.class).to eq(Hash)
547
+ end
548
+ end
549
+
550
+ context 'YAML file does not exist' do
551
+ before :each do
552
+ allow(File).to receive(:exist?).and_wrap_original do |original, path|
553
+ next false if path.to_s == File.absolute_path("config/thinking_sphinx.yml", Rails.root)
554
+
555
+ original.call(path)
556
+ end
557
+ end
558
+
559
+ it "does not read the file" do
560
+ expect(File).not_to receive(:read)
561
+
562
+ config.settings
563
+ end
564
+
565
+ it "returns a hash" do
566
+ expect(config.settings.class).to eq(Hash)
567
+ end
568
+ end
569
+ end
570
+
571
+ describe '#version' do
572
+ it "defaults to 2.2.11" do
573
+ expect(config.version).to eq('2.2.11')
574
+ end
575
+
576
+ it "respects supplied YAML versions" do
577
+ write_configuration 'version' => '2.0.4'
578
+
579
+ expect(config.version).to eq('2.0.4')
580
+ end
581
+ end
582
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe ThinkingSphinx::Connection::MRI do
4
+ subject { described_class.new :host => "127.0.0.1", :port => 9306 }
5
+
6
+ let(:client) { double :client, :query => "result", :next_result => false }
7
+
8
+ before :each do
9
+ allow(Mysql2::Client).to receive(:new).and_return(client)
10
+ end
11
+
12
+ after :each do
13
+ ThinkingSphinx::Configuration.reset
14
+ end
15
+
16
+ describe "#execute" do
17
+ it "sends the query to the client" do
18
+ subject.execute "SELECT QUERY"
19
+
20
+ expect(client).to have_received(:query).with("SELECT QUERY")
21
+ end
22
+
23
+ it "returns a result" do
24
+ expect(subject.execute("SELECT QUERY")).to eq("result")
25
+ end
26
+
27
+ context "with long queries" do
28
+ let(:maximum) { (2 ** 23) - 5 }
29
+ let(:query) { String.new "SELECT * FROM book_core WHERE MATCH('')" }
30
+ let(:difference) { maximum - query.length }
31
+
32
+ it 'does not allow overly long queries' do
33
+ expect {
34
+ subject.execute(query.insert(-3, 'a' * (difference + 5)))
35
+ }.to raise_error(ThinkingSphinx::QueryLengthError)
36
+ end
37
+
38
+ it 'does not allow queries longer than specified in the settings' do
39
+ ThinkingSphinx::Configuration.reset
40
+
41
+ write_configuration('maximum_statement_length' => maximum - 5)
42
+
43
+ expect {
44
+ subject.execute(query.insert(-3, 'a' * (difference)))
45
+ }.to raise_error(ThinkingSphinx::QueryLengthError)
46
+ end
47
+ end
48
+ end
49
+ end if RUBY_PLATFORM != 'java'