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,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::Connection do
6
+ describe '.take' do
7
+ let(:pool) { double 'pool' }
8
+ let(:connection) { double 'connection', :base_error => StandardError }
9
+ let(:error) { ThinkingSphinx::QueryExecutionError.new 'failed' }
10
+ let(:translated_error) { ThinkingSphinx::SphinxError.new }
11
+
12
+ before :each do
13
+ allow(ThinkingSphinx::Connection).to receive_messages :pool => pool
14
+ allow(ThinkingSphinx::SphinxError).to receive_messages :new_from_mysql => translated_error
15
+ allow(pool).to receive(:take).and_yield(connection)
16
+
17
+ error.statement = 'SELECT * FROM article_core'
18
+ translated_error.statement = 'SELECT * FROM article_core'
19
+ end
20
+
21
+ it "yields a connection from the pool" do
22
+ ThinkingSphinx::Connection.take do |c|
23
+ expect(c).to eq(connection)
24
+ end
25
+ end
26
+
27
+ it "retries errors once" do
28
+ tries = 0
29
+
30
+ expect {
31
+ ThinkingSphinx::Connection.take do |c|
32
+ tries += 1
33
+ raise error if tries < 2
34
+ end
35
+ }.not_to raise_error
36
+ end
37
+
38
+ it "retries errors twice" do
39
+ tries = 0
40
+
41
+ expect {
42
+ ThinkingSphinx::Connection.take do |c|
43
+ tries += 1
44
+ raise error if tries < 3
45
+ end
46
+ }.not_to raise_error
47
+ end
48
+
49
+ it "raises a translated error if it fails three times" do
50
+ tries = 0
51
+
52
+ expect {
53
+ ThinkingSphinx::Connection.take do |c|
54
+ tries += 1
55
+ raise error if tries < 4
56
+ end
57
+ }.to raise_error(ThinkingSphinx::SphinxError)
58
+ end
59
+
60
+ [ThinkingSphinx::SyntaxError, ThinkingSphinx::ParseError].each do |klass|
61
+ context klass.name do
62
+ let(:translated_error) { klass.new }
63
+
64
+ it "raises the error" do
65
+ expect {
66
+ ThinkingSphinx::Connection.take { |c| raise error }
67
+ }.to raise_error(klass)
68
+ end
69
+
70
+ it "does not yield the connection more than once" do
71
+ yields = 0
72
+
73
+ begin
74
+ ThinkingSphinx::Connection.take do |c|
75
+ yields += 1
76
+ raise error
77
+ end
78
+ rescue klass
79
+ #
80
+ end
81
+
82
+ expect(yields).to eq(1)
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::Deletion do
6
+ describe '.perform' do
7
+ let(:connection) { double('connection', :execute => nil) }
8
+ let(:index) { double('index', :name => 'foo_core',
9
+ :type => 'plain', :distributed? => false) }
10
+
11
+ before :each do
12
+ allow(ThinkingSphinx::Connection).to receive(:take).and_yield(connection)
13
+ allow(Riddle::Query).to receive_messages :update => 'UPDATE STATEMENT'
14
+ end
15
+
16
+ context 'index is SQL-backed' do
17
+ it "updates the deleted flag to false" do
18
+ expect(connection).to receive(:execute).with(
19
+ 'UPDATE foo_core SET sphinx_deleted = 1 WHERE sphinx_internal_id IN (7)'
20
+ )
21
+
22
+ ThinkingSphinx::Deletion.perform index, 7
23
+ end
24
+
25
+ it "doesn't care about Sphinx errors" do
26
+ allow(connection).to receive(:execute).
27
+ and_raise(ThinkingSphinx::ConnectionError.new(''))
28
+
29
+ expect {
30
+ ThinkingSphinx::Deletion.perform index, 7
31
+ }.not_to raise_error
32
+ end
33
+ end
34
+
35
+ context "index is real-time" do
36
+ before :each do
37
+ allow(index).to receive_messages :type => 'rt'
38
+ end
39
+
40
+ it "deletes the record to false" do
41
+ expect(connection).to receive(:execute).
42
+ with('DELETE FROM foo_core WHERE sphinx_internal_id IN (7)')
43
+
44
+ ThinkingSphinx::Deletion.perform index, 7
45
+ end
46
+
47
+ it "doesn't care about Sphinx errors" do
48
+ allow(connection).to receive(:execute).
49
+ and_raise(ThinkingSphinx::ConnectionError.new(''))
50
+
51
+ expect {
52
+ ThinkingSphinx::Deletion.perform index, 7
53
+ }.not_to raise_error
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::Deltas::DefaultDelta do
6
+ let(:delta) { ThinkingSphinx::Deltas::DefaultDelta.new adapter }
7
+ let(:adapter) {
8
+ double('adapter', :quoted_table_name => 'articles', :quote => 'delta')
9
+ }
10
+
11
+ describe '#clause' do
12
+ context 'for a delta source' do
13
+ before :each do
14
+ allow(adapter).to receive_messages :boolean_value => 't'
15
+ end
16
+
17
+ it "limits results to those flagged as deltas" do
18
+ expect(delta.clause(true)).to eq("articles.delta = t")
19
+ end
20
+ end
21
+ end
22
+
23
+ describe '#delete' do
24
+ let(:connection) { double('connection', :execute => nil) }
25
+ let(:index) { double('index', :name => 'foo_core',
26
+ :document_id_for_instance => 14) }
27
+ let(:instance) { double('instance', :id => 7) }
28
+
29
+ before :each do
30
+ allow(ThinkingSphinx::Connection).to receive(:take).and_yield(connection)
31
+ allow(Riddle::Query).to receive_messages :update => 'UPDATE STATEMENT'
32
+ end
33
+
34
+ it "updates the deleted flag to false" do
35
+ expect(connection).to receive(:execute).with('UPDATE STATEMENT')
36
+
37
+ delta.delete index, instance
38
+ end
39
+
40
+ it "builds the update query for the given index" do
41
+ expect(Riddle::Query).to receive(:update).
42
+ with('foo_core', anything, anything).and_return('')
43
+
44
+ delta.delete index, instance
45
+ end
46
+
47
+ it "builds the update query for the sphinx document id" do
48
+ expect(Riddle::Query).to receive(:update).
49
+ with(anything, 14, anything).and_return('')
50
+
51
+ delta.delete index, instance
52
+ end
53
+
54
+ it "builds the update query for setting sphinx_deleted to true" do
55
+ expect(Riddle::Query).to receive(:update).
56
+ with(anything, anything, :sphinx_deleted => true).and_return('')
57
+
58
+ delta.delete index, instance
59
+ end
60
+
61
+ it "doesn't care about Sphinx errors" do
62
+ allow(connection).to receive(:execute).
63
+ and_raise(ThinkingSphinx::ConnectionError.new(''))
64
+
65
+ expect { delta.delete index, instance }.not_to raise_error
66
+ end
67
+ end
68
+
69
+ describe '#index' do
70
+ let(:config) { double('config', :controller => controller,
71
+ :settings => {}) }
72
+ let(:controller) { double('controller') }
73
+ let(:commander) { double('commander', :call => true) }
74
+
75
+ before :each do
76
+ stub_const 'ThinkingSphinx::Commander', commander
77
+
78
+ allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
79
+ end
80
+
81
+ it "indexes the given index" do
82
+ expect(commander).to receive(:call).with(
83
+ :index_sql, config, :indices => ['foo_delta'], :verbose => false
84
+ )
85
+
86
+ delta.index double('index', :name => 'foo_delta')
87
+ end
88
+ end
89
+
90
+ describe '#reset_query' do
91
+ it "updates the table to set delta flags to false" do
92
+ allow(adapter).to receive(:boolean_value) { |value| value ? 't' : 'f' }
93
+ expect(delta.reset_query).
94
+ to eq('UPDATE articles SET delta = f WHERE delta = t')
95
+ end
96
+ end
97
+
98
+ describe '#toggle' do
99
+ let(:instance) { double('instance') }
100
+
101
+ it "sets instance's delta flag to true" do
102
+ expect(instance).to receive(:delta=).with(true)
103
+
104
+ delta.toggle(instance)
105
+ end
106
+ end
107
+
108
+ describe '#toggled?' do
109
+ let(:instance) { double('instance') }
110
+
111
+ it "returns the delta flag value when true" do
112
+ allow(instance).to receive_messages :delta? => true
113
+
114
+ expect(delta.toggled?(instance)).to be_truthy
115
+ end
116
+
117
+ it "returns the delta flag value when false" do
118
+ allow(instance).to receive_messages :delta? => false
119
+
120
+ expect(delta.toggled?(instance)).to be_falsey
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::Deltas do
6
+ describe '.processor_for' do
7
+ it "returns the default processor class when given true" do
8
+ expect(ThinkingSphinx::Deltas.processor_for(true)).
9
+ to eq(ThinkingSphinx::Deltas::DefaultDelta)
10
+ end
11
+
12
+ it "returns the class when given one" do
13
+ klass = Class.new
14
+ expect(ThinkingSphinx::Deltas.processor_for(klass)).to eq(klass)
15
+ end
16
+
17
+ it "instantiates a class from the name as a string" do
18
+ expect(ThinkingSphinx::Deltas.
19
+ processor_for('ThinkingSphinx::Deltas::DefaultDelta')).
20
+ to eq(ThinkingSphinx::Deltas::DefaultDelta)
21
+ end
22
+ end
23
+
24
+ describe '.suspend' do
25
+ let(:config) { double('config',
26
+ :indices_for_references => [core_index, delta_index]) }
27
+ let(:core_index) { double('index', :name => 'user_core',
28
+ :delta_processor => processor, :delta? => false) }
29
+ let(:delta_index) { double('index', :name => 'user_core',
30
+ :delta_processor => processor, :delta? => true) }
31
+ let(:processor) { double('processor', :index => true) }
32
+
33
+ before :each do
34
+ allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
35
+ end
36
+
37
+ it "executes the given block" do
38
+ variable = :foo
39
+
40
+ ThinkingSphinx::Deltas.suspend :user do
41
+ variable = :bar
42
+ end
43
+
44
+ expect(variable).to eq(:bar)
45
+ end
46
+
47
+ it "suspends deltas within the block" do
48
+ ThinkingSphinx::Deltas.suspend :user do
49
+ expect(ThinkingSphinx::Deltas).to be_suspended
50
+ end
51
+ end
52
+
53
+ it "removes the suspension after the block" do
54
+ ThinkingSphinx::Deltas.suspend :user do
55
+ #
56
+ end
57
+
58
+ expect(ThinkingSphinx::Deltas).not_to be_suspended
59
+ end
60
+
61
+ it "processes the delta indices for the given reference" do
62
+ expect(processor).to receive(:index).with(delta_index)
63
+
64
+ ThinkingSphinx::Deltas.suspend :user do
65
+ #
66
+ end
67
+ end
68
+
69
+ it "does not process the core indices for the given reference" do
70
+ expect(processor).not_to receive(:index).with(core_index)
71
+
72
+ ThinkingSphinx::Deltas.suspend :user do
73
+ #
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::SphinxError do
6
+ describe '.new_from_mysql' do
7
+ let(:error) { double 'error', :message => 'index foo: unknown error',
8
+ :backtrace => ['foo', 'bar'] }
9
+
10
+ it "translates syntax errors" do
11
+ allow(error).to receive_messages :message => 'index foo: syntax error: something is wrong'
12
+
13
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
14
+ to be_a(ThinkingSphinx::SyntaxError)
15
+ end
16
+
17
+ it "translates parse errors" do
18
+ allow(error).to receive_messages :message => 'index foo: parse error: something is wrong'
19
+
20
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
21
+ to be_a(ThinkingSphinx::ParseError)
22
+ end
23
+
24
+ it "translates 'query is non-computable' errors" do
25
+ allow(error).to receive_messages :message => 'index model_core: query is non-computable (single NOT operator)'
26
+
27
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
28
+ to be_a(ThinkingSphinx::ParseError)
29
+ end
30
+
31
+ it "translates query errors" do
32
+ allow(error).to receive_messages :message => 'index foo: query error: something is wrong'
33
+
34
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
35
+ to be_a(ThinkingSphinx::QueryError)
36
+ end
37
+
38
+ it "translates connection errors" do
39
+ allow(error).to receive_messages :message => "Can't connect to MySQL server on '127.0.0.1' (61)"
40
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
41
+ to be_a(ThinkingSphinx::ConnectionError)
42
+
43
+ allow(error).to receive_messages :message => "Communications link failure"
44
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
45
+ to be_a(ThinkingSphinx::ConnectionError)
46
+
47
+ allow(error).to receive_messages :message => "Lost connection to MySQL server"
48
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
49
+ to be_a(ThinkingSphinx::ConnectionError)
50
+
51
+ # MariaDB has removed mention of MySQL in error messages:
52
+ allow(error).to receive_messages :message => "Can't connect to server on '127.0.0.1' (61)"
53
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
54
+ to be_a(ThinkingSphinx::ConnectionError)
55
+
56
+ allow(error).to receive_messages :message => "Lost connection to server"
57
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
58
+ to be_a(ThinkingSphinx::ConnectionError)
59
+ end
60
+
61
+ it 'translates out-of-bounds errors' do
62
+ allow(error).to receive_messages :message => "offset out of bounds (offset=1001, max_matches=1000)"
63
+
64
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
65
+ to be_a(ThinkingSphinx::OutOfBoundsError)
66
+ end
67
+
68
+ it 'prefixes the connection error message' do
69
+ allow(error).to receive_messages :message => "Can't connect to MySQL server on '127.0.0.1' (61)"
70
+
71
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error).message).
72
+ to eq("Error connecting to Sphinx via the MySQL protocol. Can't connect to MySQL server on '127.0.0.1' (61)")
73
+ end
74
+
75
+ it "translates jdbc connection errors" do
76
+ allow(error).to receive_messages :message => "Communications link failure"
77
+
78
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
79
+ to be_a(ThinkingSphinx::ConnectionError)
80
+ end
81
+
82
+ it 'prefixes the jdbc connection error message' do
83
+ allow(error).to receive_messages :message => "Communications link failure"
84
+
85
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error).message).
86
+ to eq("Error connecting to Sphinx via the MySQL protocol. Communications link failure")
87
+ end
88
+
89
+ it "defaults to sphinx errors" do
90
+ allow(error).to receive_messages :message => 'index foo: unknown error: something is wrong'
91
+
92
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error)).
93
+ to be_a(ThinkingSphinx::SphinxError)
94
+ end
95
+
96
+ it "keeps the original error's backtrace" do
97
+ allow(error).to receive_messages :message => 'index foo: unknown error: something is wrong'
98
+
99
+ expect(ThinkingSphinx::SphinxError.new_from_mysql(error).
100
+ backtrace).to eq(error.backtrace)
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::Excerpter do
6
+ let(:excerpter) { ThinkingSphinx::Excerpter.new('index', 'all words') }
7
+ let(:connection) {
8
+ double('connection', :execute => [{'snippet' => 'some highlighted words'}])
9
+ }
10
+
11
+ before :each do
12
+ allow(ThinkingSphinx::Connection).to receive(:take).and_yield(connection)
13
+ allow(Riddle::Query).to receive_messages :snippets => 'CALL SNIPPETS'
14
+ end
15
+
16
+ describe '#excerpt!' do
17
+ it "generates a snippets call" do
18
+ expect(Riddle::Query).to receive(:snippets).
19
+ with('all of the words', 'index', 'all words',
20
+ ThinkingSphinx::Excerpter::DefaultOptions).
21
+ and_return('CALL SNIPPETS')
22
+
23
+ excerpter.excerpt!('all of the words')
24
+ end
25
+
26
+ it "respects the provided options" do
27
+ excerpter = ThinkingSphinx::Excerpter.new('index', 'all words',
28
+ :before_match => '<b>', :chunk_separator => ' -- ')
29
+
30
+ expect(Riddle::Query).to receive(:snippets).
31
+ with('all of the words', 'index', 'all words', {
32
+ :before_match => '<b>', :after_match => '</span>',
33
+ :chunk_separator => ' -- '
34
+ }).
35
+ and_return('CALL SNIPPETS')
36
+
37
+ excerpter.excerpt!('all of the words')
38
+ end
39
+
40
+ it "sends the snippets call to Sphinx" do
41
+ expect(connection).to receive(:execute).with('CALL SNIPPETS').
42
+ and_return([{'snippet' => ''}])
43
+
44
+ excerpter.excerpt!('all of the words')
45
+ end
46
+
47
+ it "returns the first value returned by Sphinx" do
48
+ allow(connection).to receive_messages :execute => [{'snippet' => 'some highlighted words'}]
49
+
50
+ expect(excerpter.excerpt!('all of the words')).to eq('some highlighted words')
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::FacetSearch do
6
+ let(:facet_search) { ThinkingSphinx::FacetSearch.new '', {} }
7
+ let(:batch) { double('batch', :searches => [], :populate => true) }
8
+ let(:index_set) { [] }
9
+ let(:index) { double('index', :facets => [property_a, property_b],
10
+ :name => 'foo_core') }
11
+ let(:property_a) { double('property', :name => 'price_bracket',
12
+ :multi? => false) }
13
+ let(:property_b) { double('property', :name => 'category_id',
14
+ :multi? => false) }
15
+ let(:configuration) { double 'configuration', :settings => {}, :index_set_class => double(:new => index_set) }
16
+
17
+ before :each do
18
+ stub_const 'ThinkingSphinx::BatchedSearch', double(:new => batch)
19
+ stub_const 'ThinkingSphinx::Search', DumbSearch
20
+ stub_const 'ThinkingSphinx::Middlewares::RAW_ONLY', double
21
+ stub_const 'ThinkingSphinx::Configuration',
22
+ double(:instance => configuration)
23
+
24
+ index_set << index << double('index', :facets => [], :name => 'bar_core')
25
+ end
26
+
27
+ DumbSearch = ::Struct.new(:query, :options) do
28
+ def raw
29
+ [{
30
+ 'sphinx_internal_class' => 'Foo',
31
+ 'price_bracket' => 3,
32
+ 'tag_ids' => '1,2',
33
+ 'category_id' => 11,
34
+ "sphinx_internal_count" => 5,
35
+ "sphinx_internal_group" => 2
36
+ }]
37
+ end
38
+ end
39
+
40
+ describe '#[]' do
41
+ it "populates facet results" do
42
+ expect(facet_search[:price_bracket]).to eq({3 => 5})
43
+ end
44
+ end
45
+
46
+ describe '#populate' do
47
+ it "queries on each facet with a grouped search in a batch" do
48
+ facet_search.populate
49
+
50
+ expect(batch.searches.detect { |search|
51
+ search.options[:group_by] == 'price_bracket'
52
+ }).not_to be_nil
53
+ end
54
+
55
+ it "limits query for a facet to just indices that have that facet" do
56
+ facet_search.populate
57
+
58
+ expect(batch.searches.detect { |search|
59
+ search.options[:indices] == ['foo_core']
60
+ }).not_to be_nil
61
+ end
62
+
63
+ it "limits facets to the specified set" do
64
+ facet_search.options[:facets] = [:category_id]
65
+
66
+ facet_search.populate
67
+
68
+ expect(batch.searches.collect { |search|
69
+ search.options[:group_by]
70
+ }).to eq(['category_id'])
71
+ end
72
+
73
+ it "aliases the class facet from sphinx_internal_class" do
74
+ allow(property_a).to receive_messages :name => 'sphinx_internal_class'
75
+
76
+ facet_search.populate
77
+
78
+ expect(facet_search[:class]).to eq({'Foo' => 5})
79
+ end
80
+
81
+ it "uses the @groupby value for MVAs" do
82
+ allow(property_a).to receive_messages :name => 'tag_ids', :multi? => true
83
+
84
+ facet_search.populate
85
+
86
+ expect(facet_search[:tag_ids]).to eq({2 => 5})
87
+ end
88
+
89
+ [:max_matches, :limit].each do |setting|
90
+ it "sets #{setting} in each search" do
91
+ facet_search.populate
92
+
93
+ batch.searches.each { |search|
94
+ expect(search.options[setting]).to eq(1000)
95
+ }
96
+ end
97
+
98
+ it "respects configured max_matches values for #{setting}" do
99
+ configuration.settings['max_matches'] = 1234
100
+
101
+ facet_search.populate
102
+
103
+ batch.searches.each { |search|
104
+ expect(search.options[setting]).to eq(1234)
105
+ }
106
+ end
107
+ end
108
+
109
+ [:limit, :per_page].each do |setting|
110
+ it "respects #{setting} option if set" do
111
+ facet_search = ThinkingSphinx::FacetSearch.new '', {setting => 42}
112
+
113
+ facet_search.populate
114
+
115
+ batch.searches.each { |search|
116
+ expect(search.options[setting]).to eq(42)
117
+ }
118
+ end
119
+
120
+ it "allows separate #{setting} and max_matches settings to support pagination" do
121
+ configuration.settings['max_matches'] = 500
122
+ facet_search = ThinkingSphinx::FacetSearch.new '', {setting => 10}
123
+
124
+ facet_search.populate
125
+
126
+ batch.searches.each do |search|
127
+ expect(search.options[setting]).to eq(10)
128
+ expect(search.options[:max_matches]).to eq(500)
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe ThinkingSphinx::Hooks::GuardPresence do
6
+ let(:subject) do
7
+ ThinkingSphinx::Hooks::GuardPresence.new configuration, stream
8
+ end
9
+ let(:configuration) { double "configuration", :indices_location => "/path" }
10
+ let(:stream) { double "stream", :puts => nil }
11
+
12
+ describe "#call" do
13
+ it "outputs nothing if no guard files exist" do
14
+ allow(Dir).to receive(:[]).with('/path/ts-*.tmp').and_return([])
15
+
16
+ expect(stream).not_to receive(:puts)
17
+
18
+ subject.call
19
+ end
20
+
21
+ it "outputs a warning if a guard file exists" do
22
+ allow(Dir).to receive(:[]).with('/path/ts-*.tmp').
23
+ and_return(['/path/ts-foo.tmp'])
24
+
25
+ expect(stream).to receive(:puts)
26
+
27
+ subject.call
28
+ end
29
+ end
30
+ end