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,507 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::ActiveRecord::SQLSource do
6
+ let(:model) { double('model', :connection => connection,
7
+ :name => 'User', :column_names => [], :inheritance_column => 'type',
8
+ :primary_key => :id) }
9
+ let(:connection) {
10
+ double('connection', :instance_variable_get => db_config) }
11
+ let(:db_config) { {:host => 'localhost', :user => 'root',
12
+ :database => 'default'} }
13
+ let(:source) { ThinkingSphinx::ActiveRecord::SQLSource.new(model,
14
+ :position => 3, :primary_key => model.primary_key || :id ) }
15
+ let(:adapter) { double('adapter') }
16
+
17
+ before :each do
18
+ allow(ThinkingSphinx::ActiveRecord::DatabaseAdapters::MySQLAdapter).
19
+ to receive_messages(:=== => true)
20
+ allow(ThinkingSphinx::ActiveRecord::DatabaseAdapters).
21
+ to receive_messages(:adapter_for => adapter)
22
+ end
23
+
24
+ describe '#adapter' do
25
+ it "returns a database adapter for the model" do
26
+ expect(ThinkingSphinx::ActiveRecord::DatabaseAdapters).
27
+ to receive(:adapter_for).with(model).and_return(adapter)
28
+
29
+ expect(source.adapter).to eq(adapter)
30
+ end
31
+ end
32
+
33
+ describe '#add_attribute' do
34
+ let(:attribute) { double('attribute', name: 'my_attribute') }
35
+
36
+ it "appends attributes to the collection" do
37
+ source.add_attribute attribute
38
+
39
+ expect(source.attributes.collect(&:name)).to include('my_attribute')
40
+ end
41
+
42
+ it "replaces attributes with the same name" do
43
+ source.add_attribute double('attribute', name: 'my_attribute')
44
+ source.add_attribute attribute
45
+
46
+ matching = source.attributes.select { |attr| attr.name == attribute.name }
47
+
48
+ expect(matching).to eq([attribute])
49
+ end
50
+ end
51
+
52
+ describe '#add_field' do
53
+ let(:field) { double('field', name: 'my_field') }
54
+
55
+ it "appends fields to the collection" do
56
+ source.add_field field
57
+
58
+ expect(source.fields.collect(&:name)).to include('my_field')
59
+ end
60
+
61
+ it "replaces fields with the same name" do
62
+ source.add_field double('field', name: 'my_field')
63
+ source.add_field field
64
+
65
+ matching = source.fields.select { |fld| fld.name == field.name }
66
+
67
+ expect(matching).to eq([field])
68
+ end
69
+ end
70
+
71
+ describe '#attributes' do
72
+ it "has the internal id attribute by default" do
73
+ expect(source.attributes.collect(&:name)).to include('sphinx_internal_id')
74
+ end
75
+
76
+ it "has the class name attribute by default" do
77
+ expect(source.attributes.collect(&:name)).to include('sphinx_internal_class')
78
+ end
79
+
80
+ it "has the internal deleted attribute by default" do
81
+ expect(source.attributes.collect(&:name)).to include('sphinx_deleted')
82
+ end
83
+
84
+ it "marks the internal class attribute as a facet" do
85
+ expect(source.attributes.detect { |attribute|
86
+ attribute.name == 'sphinx_internal_class'
87
+ }.options[:facet]).to be_truthy
88
+ end
89
+ end
90
+
91
+ describe '#delta_processor' do
92
+ let(:processor_class) { double('processor class', :try => processor) }
93
+ let(:processor) { double('processor') }
94
+ let(:source) {
95
+ ThinkingSphinx::ActiveRecord::SQLSource.new model,
96
+ :delta_processor => processor_class,
97
+ :primary_key => model.primary_key || :id
98
+ }
99
+ let(:source_with_options) {
100
+ ThinkingSphinx::ActiveRecord::SQLSource.new model,
101
+ :delta_processor => processor_class,
102
+ :delta_options => { :opt_key => :opt_value },
103
+ :primary_key => model.primary_key || :id
104
+ }
105
+
106
+ it "loads the processor with the adapter" do
107
+ expect(processor_class).to receive(:try).with(:new, adapter, {}).
108
+ and_return processor
109
+
110
+ source.delta_processor
111
+ end
112
+
113
+ it "returns the given processor" do
114
+ expect(source.delta_processor).to eq(processor)
115
+ end
116
+
117
+ it "passes given options to the processor" do
118
+ expect(processor_class).to receive(:try).with(:new, adapter, {:opt_key => :opt_value})
119
+ source_with_options.delta_processor
120
+ end
121
+ end
122
+
123
+ describe '#delta?' do
124
+ it "returns the given delta setting" do
125
+ source = ThinkingSphinx::ActiveRecord::SQLSource.new model,
126
+ :delta? => true,
127
+ :primary_key => model.primary_key || :id
128
+
129
+ expect(source).to be_a_delta
130
+ end
131
+ end
132
+
133
+ describe '#disable_range?' do
134
+ it "returns the given range setting" do
135
+ source = ThinkingSphinx::ActiveRecord::SQLSource.new model,
136
+ :disable_range? => true,
137
+ :primary_key => model.primary_key || :id
138
+
139
+ expect(source.disable_range?).to be_truthy
140
+ end
141
+ end
142
+
143
+ describe '#fields' do
144
+ it "has the internal class field by default" do
145
+ expect(source.fields.collect(&:name)).
146
+ to include('sphinx_internal_class_name')
147
+ end
148
+
149
+ it "sets the sphinx class field to use a string of the class name" do
150
+ expect(source.fields.detect { |field|
151
+ field.name == 'sphinx_internal_class_name'
152
+ }.columns.first.__name).to eq("'User'")
153
+ end
154
+
155
+ it "uses the inheritance column if it exists for the sphinx class field" do
156
+ allow(adapter).to receive_messages :quoted_table_name => '"users"', :quote => '"type"'
157
+ allow(adapter).to receive(:convert_blank) { |clause, default|
158
+ "coalesce(nullif(#{clause}, ''), #{default})"
159
+ }
160
+ allow(model).to receive_messages :column_names => ['type'], :sti_name => 'User'
161
+
162
+ expect(source.fields.detect { |field|
163
+ field.name == 'sphinx_internal_class_name'
164
+ }.columns.first.__name).
165
+ to eq("coalesce(nullif(\"users\".\"type\", ''), 'User')")
166
+ end
167
+ end
168
+
169
+ describe '#name' do
170
+ it "defaults to the model name downcased with the given position" do
171
+ expect(source.name).to eq('user_3')
172
+ end
173
+
174
+ it "allows for custom names, but adds the position suffix" do
175
+ source = ThinkingSphinx::ActiveRecord::SQLSource.new model,
176
+ :name => 'people', :position => 2, :primary_key => model.primary_key || :id
177
+
178
+ expect(source.name).to eq('people_2')
179
+ end
180
+ end
181
+
182
+ describe '#offset' do
183
+ it "returns the given offset" do
184
+ source = ThinkingSphinx::ActiveRecord::SQLSource.new model,
185
+ :offset => 12, :primary_key => model.primary_key || :id
186
+
187
+ expect(source.offset).to eq(12)
188
+ end
189
+ end
190
+
191
+ describe '#options' do
192
+ it "defaults to having utf8? set to false" do
193
+ expect(source.options[:utf8?]).to be_falsey
194
+ end
195
+
196
+ it "sets utf8? to true if the database encoding is utf8" do
197
+ db_config[:encoding] = 'utf8'
198
+
199
+ expect(source.options[:utf8?]).to be_truthy
200
+ end
201
+
202
+ it "sets utf8? to true if the database encoding starts with utf8" do
203
+ db_config[:encoding] = 'utf8mb4'
204
+
205
+ expect(source.options[:utf8?]).to be_truthy
206
+ end
207
+
208
+ describe "#primary key" do
209
+ let(:model) { double('model', :connection => connection,
210
+ :name => 'User', :column_names => [], :inheritance_column => 'type') }
211
+ let(:source) { ThinkingSphinx::ActiveRecord::SQLSource.new(model,
212
+ :position => 3, :primary_key => :custom_key) }
213
+ let(:template) { ThinkingSphinx::ActiveRecord::SQLSource::Template.new(source) }
214
+
215
+ it 'template should allow primary key from options' do
216
+ template.apply
217
+ template.source.attributes.collect(&:columns) == :custom_key
218
+ end
219
+ end
220
+ end
221
+
222
+ describe '#render' do
223
+ let(:builder) { double('builder', :sql_query_pre => [],
224
+ :sql_query_post_index => [], :sql_query => 'query',
225
+ :sql_query_range => 'range', :sql_query_info => 'info') }
226
+ let(:config) { double('config', :settings => {}) }
227
+ let(:presenter) { double('presenter', :collection_type => :uint) }
228
+ let(:template) { double('template', :apply => true) }
229
+
230
+ before :each do
231
+ allow(ThinkingSphinx::ActiveRecord::SQLBuilder).to receive_messages :new => builder
232
+ allow(ThinkingSphinx::ActiveRecord::Attribute::SphinxPresenter).to receive_messages :new => presenter
233
+ allow(ThinkingSphinx::ActiveRecord::SQLSource::Template).to receive_messages :new => template
234
+ allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
235
+ end
236
+
237
+ it "uses the builder's sql_query value" do
238
+ allow(builder).to receive_messages :sql_query => 'select * from table'
239
+
240
+ source.render
241
+
242
+ expect(source.sql_query).to eq('select * from table')
243
+ end
244
+
245
+ it "uses the builder's sql_query_range value" do
246
+ allow(builder).to receive_messages :sql_query_range => 'select 0, 10 from table'
247
+
248
+ source.render
249
+
250
+ expect(source.sql_query_range).to eq('select 0, 10 from table')
251
+ end
252
+
253
+ it "appends the builder's sql_query_pre value" do
254
+ allow(builder).to receive_messages :sql_query_pre => ['Change Setting']
255
+
256
+ source.render
257
+
258
+ expect(source.sql_query_pre).to eq(['Change Setting'])
259
+ end
260
+
261
+ it "adds fields with attributes to sql_field_string" do
262
+ source.fields << double('field', :name => 'title', :source_type => nil,
263
+ :with_attribute? => true, :file? => false, :wordcount? => false)
264
+
265
+ source.render
266
+
267
+ expect(source.sql_field_string).to include('title')
268
+ end
269
+
270
+ it "adds any joined or file fields" do
271
+ source.fields << double('field', :name => 'title', :file? => true,
272
+ :with_attribute? => false, :wordcount? => false, :source_type => nil)
273
+
274
+ source.render
275
+
276
+ expect(source.sql_file_field).to include('title')
277
+ end
278
+
279
+ it "adds wordcounted fields to sql_field_str2wordcount" do
280
+ source.fields << double('field', :name => 'title', :source_type => nil,
281
+ :with_attribute? => false, :file? => false, :wordcount? => true)
282
+
283
+ source.render
284
+
285
+ expect(source.sql_field_str2wordcount).to include('title')
286
+ end
287
+
288
+ it "adds any joined fields" do
289
+ allow(ThinkingSphinx::ActiveRecord::PropertyQuery).to receive_messages(
290
+ :new => double(:to_s => 'query for title')
291
+ )
292
+ source.fields << double('field', :name => 'title',
293
+ :source_type => :query, :with_attribute? => false, :file? => false,
294
+ :wordcount? => false)
295
+
296
+ source.render
297
+
298
+ expect(source.sql_joined_field).to include('query for title')
299
+ end
300
+
301
+ it "adds integer attributes to sql_attr_uint" do
302
+ source.attributes << double('attribute')
303
+ allow(presenter).to receive_messages :declaration => 'count', :collection_type => :uint
304
+
305
+ source.render
306
+
307
+ expect(source.sql_attr_uint).to include('count')
308
+ end
309
+
310
+ it "adds boolean attributes to sql_attr_bool" do
311
+ source.attributes << double('attribute')
312
+ allow(presenter).to receive_messages :declaration => 'published', :collection_type => :bool
313
+
314
+ source.render
315
+
316
+ expect(source.sql_attr_bool).to include('published')
317
+ end
318
+
319
+ it "adds string attributes to sql_attr_string" do
320
+ source.attributes << double('attribute')
321
+ allow(presenter).to receive_messages :declaration => 'name', :collection_type => :string
322
+
323
+ source.render
324
+
325
+ expect(source.sql_attr_string).to include('name')
326
+ end
327
+
328
+ it "adds timestamp attributes to sql_attr_uint" do
329
+ source.attributes << double('attribute')
330
+ allow(presenter).to receive_messages :declaration => 'created_at',
331
+ :collection_type => :uint
332
+
333
+ source.render
334
+
335
+ expect(source.sql_attr_uint).to include('created_at')
336
+ end
337
+
338
+ it "adds float attributes to sql_attr_float" do
339
+ source.attributes << double('attribute')
340
+ allow(presenter).to receive_messages :declaration => 'rating', :collection_type => :float
341
+
342
+ source.render
343
+
344
+ expect(source.sql_attr_float).to include('rating')
345
+ end
346
+
347
+ it "adds bigint attributes to sql_attr_bigint" do
348
+ source.attributes << double('attribute')
349
+ allow(presenter).to receive_messages :declaration => 'super_id', :collection_type => :bigint
350
+
351
+ source.render
352
+
353
+ expect(source.sql_attr_bigint).to include('super_id')
354
+ end
355
+
356
+ it "adds ordinal strings to sql_attr_str2ordinal" do
357
+ source.attributes << double('attribute')
358
+ allow(presenter).to receive_messages :declaration => 'name', :collection_type => :str2ordinal
359
+
360
+ source.render
361
+
362
+ expect(source.sql_attr_str2ordinal).to include('name')
363
+ end
364
+
365
+ it "adds multi-value attributes to sql_attr_multi" do
366
+ source.attributes << double('attribute')
367
+ allow(presenter).to receive_messages :declaration => 'uint tag_ids from field',
368
+ :collection_type => :multi
369
+
370
+ source.render
371
+
372
+ expect(source.sql_attr_multi).to include('uint tag_ids from field')
373
+ end
374
+
375
+ it "adds word count attributes to sql_attr_str2wordcount" do
376
+ source.attributes << double('attribute')
377
+ allow(presenter).to receive_messages :declaration => 'name', :collection_type => :str2wordcount
378
+
379
+ source.render
380
+
381
+ expect(source.sql_attr_str2wordcount).to include('name')
382
+ end
383
+
384
+ it "adds json attributes to sql_attr_json" do
385
+ source.attributes << double('attribute')
386
+ allow(presenter).to receive_messages :declaration => 'json', :collection_type => :json
387
+
388
+ source.render
389
+
390
+ expect(source.sql_attr_json).to include('json')
391
+ end
392
+
393
+ it "adds relevant settings from thinking_sphinx.yml" do
394
+ config.settings['mysql_ssl_cert'] = 'foo.cert'
395
+ config.settings['morphology'] = 'stem_en' # should be ignored
396
+
397
+ source.render
398
+
399
+ expect(source.mysql_ssl_cert).to eq('foo.cert')
400
+ end
401
+ end
402
+
403
+ describe '#set_database_settings' do
404
+ it "sets the sql_host setting from the model's database settings" do
405
+ source.set_database_settings :host => '12.34.56.78'
406
+
407
+ expect(source.sql_host).to eq('12.34.56.78')
408
+ end
409
+
410
+ it "defaults sql_host to localhost if the model has no host" do
411
+ source.set_database_settings :host => nil
412
+
413
+ expect(source.sql_host).to eq('localhost')
414
+ end
415
+
416
+ it "sets the sql_user setting from the model's database settings" do
417
+ source.set_database_settings :username => 'pat'
418
+
419
+ expect(source.sql_user).to eq('pat')
420
+ end
421
+
422
+ it "uses the user setting if username is not set in the model" do
423
+ source.set_database_settings :username => nil, :user => 'pat'
424
+
425
+ expect(source.sql_user).to eq('pat')
426
+ end
427
+
428
+ it "sets the sql_pass setting from the model's database settings" do
429
+ source.set_database_settings :password => 'swordfish'
430
+
431
+ expect(source.sql_pass).to eq('swordfish')
432
+ end
433
+
434
+ it "escapes hashes in the password for sql_pass" do
435
+ source.set_database_settings :password => 'sword#fish'
436
+
437
+ expect(source.sql_pass).to eq('sword\#fish')
438
+ end
439
+
440
+ it "sets the sql_db setting from the model's database settings" do
441
+ source.set_database_settings :database => 'rails_app'
442
+
443
+ expect(source.sql_db).to eq('rails_app')
444
+ end
445
+
446
+ it "sets the sql_port setting from the model's database settings" do
447
+ source.set_database_settings :port => 5432
448
+
449
+ expect(source.sql_port).to eq(5432)
450
+ end
451
+
452
+ it "sets the sql_sock setting from the model's database settings" do
453
+ source.set_database_settings :socket => '/unix/socket'
454
+
455
+ expect(source.sql_sock).to eq('/unix/socket')
456
+ end
457
+
458
+ it "sets the mysql_ssl_cert from the model's database settings" do
459
+ source.set_database_settings :sslcert => '/path/to/cert.pem'
460
+
461
+ expect(source.mysql_ssl_cert).to eq '/path/to/cert.pem'
462
+ end
463
+
464
+ it "sets the mysql_ssl_key from the model's database settings" do
465
+ source.set_database_settings :sslkey => '/path/to/key.pem'
466
+
467
+ expect(source.mysql_ssl_key).to eq '/path/to/key.pem'
468
+ end
469
+
470
+ it "sets the mysql_ssl_ca from the model's database settings" do
471
+ source.set_database_settings :sslca => '/path/to/ca.pem'
472
+
473
+ expect(source.mysql_ssl_ca).to eq '/path/to/ca.pem'
474
+ end
475
+ end
476
+
477
+ describe '#type' do
478
+ it "is mysql when using the MySQL Adapter" do
479
+ allow(ThinkingSphinx::ActiveRecord::DatabaseAdapters::MySQLAdapter).
480
+ to receive_messages(:=== => true)
481
+ allow(ThinkingSphinx::ActiveRecord::DatabaseAdapters::PostgreSQLAdapter).
482
+ to receive_messages(:=== => false)
483
+
484
+ expect(source.type).to eq('mysql')
485
+ end
486
+
487
+ it "is pgsql when using the PostgreSQL Adapter" do
488
+ allow(ThinkingSphinx::ActiveRecord::DatabaseAdapters::MySQLAdapter).
489
+ to receive_messages(:=== => false)
490
+ allow(ThinkingSphinx::ActiveRecord::DatabaseAdapters::PostgreSQLAdapter).
491
+ to receive_messages(:=== => true)
492
+
493
+ expect(source.type).to eq('pgsql')
494
+ end
495
+
496
+ it "raises an exception for any other adapter" do
497
+ allow(ThinkingSphinx::ActiveRecord::DatabaseAdapters::MySQLAdapter).
498
+ to receive_messages(:=== => false)
499
+ allow(ThinkingSphinx::ActiveRecord::DatabaseAdapters::PostgreSQLAdapter).
500
+ to receive_messages(:=== => false)
501
+
502
+ expect { source.type }.to raise_error(
503
+ ThinkingSphinx::UnknownDatabaseAdapter
504
+ )
505
+ end
506
+ end
507
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe ThinkingSphinx::AttributeTypes do
6
+ let(:configuration) {
7
+ double('configuration', :configuration_file => 'sphinx.conf')
8
+ }
9
+
10
+ before :each do
11
+ allow(ThinkingSphinx::Configuration).to receive(:instance).
12
+ and_return(configuration)
13
+
14
+ allow(File).to receive(:exist?).with('sphinx.conf').and_return(true)
15
+ allow(File).to receive(:read).with('sphinx.conf').and_return(<<-CONF)
16
+ index plain_index
17
+ {
18
+ source = plain_source
19
+ }
20
+
21
+ source plain_source
22
+ {
23
+ type = mysql
24
+ sql_attr_uint = customer_id
25
+ sql_attr_float = price
26
+ sql_attr_multi = uint comment_ids from field
27
+ }
28
+
29
+ index rt_index
30
+ {
31
+ type = rt
32
+ rt_attr_uint = user_id
33
+ rt_attr_multi = comment_ids
34
+ }
35
+ CONF
36
+ end
37
+
38
+ it 'returns an empty hash if no configuration file exists' do
39
+ allow(File).to receive(:exist?).with('sphinx.conf').and_return(false)
40
+
41
+ expect(ThinkingSphinx::AttributeTypes.new.call).to eq({})
42
+ end
43
+
44
+ it 'returns all known attributes' do
45
+ expect(ThinkingSphinx::AttributeTypes.new.call).to eq({
46
+ 'customer_id' => [:uint],
47
+ 'price' => [:float],
48
+ 'comment_ids' => [:uint],
49
+ 'user_id' => [:uint]
50
+ })
51
+ end
52
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe ThinkingSphinx::Commands::ClearRealTime do
6
+ let(:command) { ThinkingSphinx::Commands::ClearRealTime.new(
7
+ configuration, {:indices => [users_index, parts_index]}, stream
8
+ ) }
9
+ let(:configuration) { double 'configuration', :searchd => double(:binlog_path => '/path/to/binlog') }
10
+ let(:stream) { double :puts => nil }
11
+ let(:users_index) { double :path => '/path/to/my/index/users', :render => true }
12
+ let(:parts_index) { double :path => '/path/to/my/index/parts', :render => true }
13
+
14
+ before :each do
15
+ allow(Dir).to receive(:[]).with('/path/to/my/index/users.*').
16
+ and_return(['users.a', 'users.b'])
17
+ allow(Dir).to receive(:[]).with('/path/to/my/index/parts.*').
18
+ and_return(['parts.a', 'parts.b'])
19
+
20
+ allow(FileUtils).to receive_messages :rm_rf => true,
21
+ :rm => true
22
+ allow(File).to receive_messages :exist? => true
23
+ end
24
+
25
+ it 'finds each file for real-time indices' do
26
+ expect(Dir).to receive(:[]).with('/path/to/my/index/users.*').
27
+ and_return([])
28
+
29
+ command.call
30
+ end
31
+
32
+ it "removes the directory for the binlog files" do
33
+ expect(FileUtils).to receive(:rm_rf).with('/path/to/binlog')
34
+
35
+ command.call
36
+ end
37
+
38
+ it "removes each file for real-time indices" do
39
+ expect(FileUtils).to receive(:rm).with('users.a')
40
+ expect(FileUtils).to receive(:rm).with('users.b')
41
+ expect(FileUtils).to receive(:rm).with('parts.a')
42
+ expect(FileUtils).to receive(:rm).with('parts.b')
43
+
44
+ command.call
45
+ end
46
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe ThinkingSphinx::Commands::ClearSQL do
6
+ let(:command) { ThinkingSphinx::Commands::ClearSQL.new(
7
+ configuration, {:indices => [users_index, parts_index]}, stream
8
+ ) }
9
+ let(:configuration) { double 'configuration', :preload_indices => true,
10
+ :render => true, :indices => [users_index, parts_index],
11
+ :indices_location => '/path/to/indices' }
12
+ let(:stream) { double :puts => nil }
13
+
14
+ let(:users_index) { double(:name => 'users', :type => 'plain',
15
+ :render => true, :path => '/path/to/my/index/users') }
16
+ let(:parts_index) { double(:name => 'users', :type => 'plain',
17
+ :render => true, :path => '/path/to/my/index/parts') }
18
+
19
+ before :each do
20
+ allow(Dir).to receive(:[]).with('/path/to/my/index/users.*').
21
+ and_return(['users.a', 'users.b'])
22
+ allow(Dir).to receive(:[]).with('/path/to/my/index/parts.*').
23
+ and_return(['parts.a', 'parts.b'])
24
+ allow(Dir).to receive(:[]).with('/path/to/indices/ts-*.tmp').
25
+ and_return(['/path/to/indices/ts-foo.tmp'])
26
+
27
+ allow(FileUtils).to receive_messages :rm_rf => true, :rm => true
28
+ allow(File).to receive_messages :exist? => true
29
+ end
30
+
31
+ it 'finds each file for sql-backed indices' do
32
+ expect(Dir).to receive(:[]).with('/path/to/my/index/users.*').
33
+ and_return([])
34
+
35
+ command.call
36
+ end
37
+
38
+ it "removes each file for real-time indices" do
39
+ expect(FileUtils).to receive(:rm).with('users.a')
40
+ expect(FileUtils).to receive(:rm).with('users.b')
41
+ expect(FileUtils).to receive(:rm).with('parts.a')
42
+ expect(FileUtils).to receive(:rm).with('parts.b')
43
+
44
+ command.call
45
+ end
46
+
47
+ it "removes any indexing guard files" do
48
+ expect(FileUtils).to receive(:rm_rf).with(["/path/to/indices/ts-foo.tmp"])
49
+
50
+ command.call
51
+ end
52
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe ThinkingSphinx::Commands::Configure do
6
+ let(:command) { ThinkingSphinx::Commands::Configure.new(
7
+ configuration, {}, stream
8
+ ) }
9
+ let(:configuration) { double 'configuration' }
10
+ let(:stream) { double :puts => nil }
11
+
12
+ before :each do
13
+ allow(configuration).to receive_messages(
14
+ :configuration_file => '/path/to/foo.conf',
15
+ :render_to_file => true
16
+ )
17
+ end
18
+
19
+ it "renders the configuration to a file" do
20
+ expect(configuration).to receive(:render_to_file)
21
+
22
+ command.call
23
+ end
24
+
25
+ it "prints a message stating the file is being generated" do
26
+ expect(stream).to receive(:puts).
27
+ with('Generating configuration to /path/to/foo.conf')
28
+
29
+ command.call
30
+ end
31
+ end