thinking-sphinx 3.1.4 → 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 (347) hide show
  1. checksums.yaml +5 -5
  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 +7 -2
  6. data/.travis.yml +31 -16
  7. data/Appraisals +68 -12
  8. data/CHANGELOG.markdown +782 -0
  9. data/Gemfile +13 -4
  10. data/Procfile.support +2 -0
  11. data/README.textile +41 -27
  12. data/Rakefile +2 -0
  13. data/bin/console +15 -0
  14. data/bin/loadsphinx +99 -0
  15. data/bin/testmatrix +48 -0
  16. data/lib/thinking/sphinx.rb +2 -0
  17. data/lib/thinking-sphinx.rb +2 -0
  18. data/lib/thinking_sphinx/active_record/association.rb +2 -0
  19. data/lib/thinking_sphinx/active_record/association_proxy/attribute_finder.rb +3 -1
  20. data/lib/thinking_sphinx/active_record/association_proxy/attribute_matcher.rb +2 -0
  21. data/lib/thinking_sphinx/active_record/association_proxy.rb +3 -2
  22. data/lib/thinking_sphinx/active_record/attribute/sphinx_presenter.rb +3 -1
  23. data/lib/thinking_sphinx/active_record/attribute/type.rb +20 -4
  24. data/lib/thinking_sphinx/active_record/attribute/values.rb +2 -0
  25. data/lib/thinking_sphinx/active_record/attribute.rb +2 -0
  26. data/lib/thinking_sphinx/active_record/base.rb +43 -11
  27. data/lib/thinking_sphinx/active_record/callbacks/association_delta_callbacks.rb +21 -0
  28. data/lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb +15 -9
  29. data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +20 -5
  30. data/lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb +18 -4
  31. data/lib/thinking_sphinx/active_record/column.rb +2 -0
  32. data/lib/thinking_sphinx/active_record/column_sql_presenter.rb +7 -1
  33. data/lib/thinking_sphinx/active_record/database_adapters/abstract_adapter.rb +2 -0
  34. data/lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb +9 -1
  35. data/lib/thinking_sphinx/active_record/database_adapters/postgresql_adapter.rb +2 -0
  36. data/lib/thinking_sphinx/active_record/database_adapters.rb +3 -1
  37. data/lib/thinking_sphinx/active_record/depolymorph/association_reflection.rb +32 -0
  38. data/lib/thinking_sphinx/active_record/depolymorph/base_reflection.rb +32 -0
  39. data/lib/thinking_sphinx/active_record/depolymorph/conditions_reflection.rb +40 -0
  40. data/lib/thinking_sphinx/active_record/depolymorph/overridden_reflection.rb +50 -0
  41. data/lib/thinking_sphinx/active_record/depolymorph/scoped_reflection.rb +26 -0
  42. data/lib/thinking_sphinx/active_record/field.rb +2 -0
  43. data/lib/thinking_sphinx/active_record/filter_reflection.rb +13 -71
  44. data/lib/thinking_sphinx/active_record/index.rb +7 -5
  45. data/lib/thinking_sphinx/active_record/interpreter.rb +6 -4
  46. data/lib/thinking_sphinx/active_record/join_association.rb +5 -1
  47. data/lib/thinking_sphinx/active_record/log_subscriber.rb +22 -3
  48. data/lib/thinking_sphinx/active_record/polymorpher.rb +2 -0
  49. data/lib/thinking_sphinx/active_record/property.rb +2 -0
  50. data/lib/thinking_sphinx/active_record/property_query.rb +4 -1
  51. data/lib/thinking_sphinx/active_record/property_sql_presenter.rb +2 -0
  52. data/lib/thinking_sphinx/active_record/simple_many_query.rb +2 -0
  53. data/lib/thinking_sphinx/active_record/source_joins.rb +68 -0
  54. data/lib/thinking_sphinx/active_record/sql_builder/clause_builder.rb +2 -0
  55. data/lib/thinking_sphinx/active_record/sql_builder/query.rb +13 -0
  56. data/lib/thinking_sphinx/active_record/sql_builder/statement.rb +2 -0
  57. data/lib/thinking_sphinx/active_record/sql_builder.rb +5 -18
  58. data/lib/thinking_sphinx/active_record/sql_source/template.rb +5 -3
  59. data/lib/thinking_sphinx/active_record/sql_source.rb +35 -9
  60. data/lib/thinking_sphinx/active_record.rb +14 -1
  61. data/lib/thinking_sphinx/attribute_types.rb +72 -0
  62. data/lib/thinking_sphinx/batched_search.rb +2 -0
  63. data/lib/thinking_sphinx/callbacks/appender.rb +63 -0
  64. data/lib/thinking_sphinx/callbacks.rb +29 -0
  65. data/lib/thinking_sphinx/capistrano/v2.rb +2 -0
  66. data/lib/thinking_sphinx/capistrano/v3.rb +2 -0
  67. data/lib/thinking_sphinx/capistrano.rb +2 -0
  68. data/lib/thinking_sphinx/commander.rb +27 -0
  69. data/lib/thinking_sphinx/commands/base.rb +53 -0
  70. data/lib/thinking_sphinx/commands/clear_real_time.rb +22 -0
  71. data/lib/thinking_sphinx/commands/clear_sql.rb +18 -0
  72. data/lib/thinking_sphinx/commands/configure.rb +15 -0
  73. data/lib/thinking_sphinx/commands/index_real_time.rb +15 -0
  74. data/lib/thinking_sphinx/commands/index_sql.rb +25 -0
  75. data/lib/thinking_sphinx/commands/merge.rb +27 -0
  76. data/lib/thinking_sphinx/commands/merge_and_update.rb +57 -0
  77. data/lib/thinking_sphinx/commands/prepare.rb +15 -0
  78. data/lib/thinking_sphinx/commands/rotate.rb +13 -0
  79. data/lib/thinking_sphinx/commands/running.rb +15 -0
  80. data/lib/thinking_sphinx/commands/start_attached.rb +22 -0
  81. data/lib/thinking_sphinx/commands/start_detached.rb +21 -0
  82. data/lib/thinking_sphinx/commands/stop.rb +24 -0
  83. data/lib/thinking_sphinx/commands.rb +20 -0
  84. data/lib/thinking_sphinx/configuration/consistent_ids.rb +2 -0
  85. data/lib/thinking_sphinx/configuration/defaults.rb +2 -0
  86. data/lib/thinking_sphinx/configuration/distributed_indices.rb +3 -1
  87. data/lib/thinking_sphinx/configuration/duplicate_names.rb +36 -0
  88. data/lib/thinking_sphinx/configuration/minimum_fields.rb +17 -12
  89. data/lib/thinking_sphinx/configuration.rb +90 -74
  90. data/lib/thinking_sphinx/connection/client.rb +74 -0
  91. data/lib/thinking_sphinx/connection/jruby.rb +58 -0
  92. data/lib/thinking_sphinx/connection/mri.rb +26 -0
  93. data/lib/thinking_sphinx/connection.rb +13 -114
  94. data/lib/thinking_sphinx/core/field.rb +2 -0
  95. data/lib/thinking_sphinx/core/index.rb +22 -2
  96. data/lib/thinking_sphinx/core/interpreter.rb +2 -0
  97. data/lib/thinking_sphinx/core/property.rb +2 -0
  98. data/lib/thinking_sphinx/core/settings.rb +2 -0
  99. data/lib/thinking_sphinx/core.rb +2 -0
  100. data/lib/thinking_sphinx/deletion.rb +33 -13
  101. data/lib/thinking_sphinx/deltas/default_delta.rb +3 -1
  102. data/lib/thinking_sphinx/deltas/delete_job.rb +16 -4
  103. data/lib/thinking_sphinx/deltas/index_job.rb +14 -2
  104. data/lib/thinking_sphinx/deltas.rb +2 -0
  105. data/lib/thinking_sphinx/distributed/index.rb +25 -3
  106. data/lib/thinking_sphinx/distributed.rb +2 -0
  107. data/lib/thinking_sphinx/errors.rb +47 -3
  108. data/lib/thinking_sphinx/excerpter.rb +2 -0
  109. data/lib/thinking_sphinx/facet.rb +4 -3
  110. data/lib/thinking_sphinx/facet_search.rb +4 -2
  111. data/lib/thinking_sphinx/float_formatter.rb +2 -0
  112. data/lib/thinking_sphinx/frameworks/plain.rb +2 -0
  113. data/lib/thinking_sphinx/frameworks/rails.rb +2 -0
  114. data/lib/thinking_sphinx/frameworks.rb +2 -0
  115. data/lib/thinking_sphinx/guard/file.rb +3 -1
  116. data/lib/thinking_sphinx/guard/files.rb +2 -0
  117. data/lib/thinking_sphinx/guard/none.rb +7 -0
  118. data/lib/thinking_sphinx/guard.rb +3 -0
  119. data/lib/thinking_sphinx/hooks/guard_presence.rb +34 -0
  120. data/lib/thinking_sphinx/index.rb +2 -0
  121. data/lib/thinking_sphinx/index_set.rb +27 -4
  122. data/lib/thinking_sphinx/indexing_strategies/all_at_once.rb +9 -0
  123. data/lib/thinking_sphinx/indexing_strategies/one_at_a_time.rb +16 -0
  124. data/lib/thinking_sphinx/interfaces/base.rb +13 -0
  125. data/lib/thinking_sphinx/interfaces/daemon.rb +27 -0
  126. data/lib/thinking_sphinx/interfaces/real_time.rb +46 -0
  127. data/lib/thinking_sphinx/interfaces/sql.rb +53 -0
  128. data/lib/thinking_sphinx/interfaces.rb +10 -0
  129. data/lib/thinking_sphinx/logger.rb +2 -0
  130. data/lib/thinking_sphinx/masks/group_enumerators_mask.rb +6 -4
  131. data/lib/thinking_sphinx/masks/pagination_mask.rb +2 -0
  132. data/lib/thinking_sphinx/masks/scopes_mask.rb +8 -0
  133. data/lib/thinking_sphinx/masks/weight_enumerator_mask.rb +3 -1
  134. data/lib/thinking_sphinx/masks.rb +2 -0
  135. data/lib/thinking_sphinx/middlewares/active_record_translator.rb +32 -9
  136. data/lib/thinking_sphinx/middlewares/geographer.rb +2 -0
  137. data/lib/thinking_sphinx/middlewares/glazier.rb +14 -1
  138. data/lib/thinking_sphinx/middlewares/ids_only.rb +2 -0
  139. data/lib/thinking_sphinx/middlewares/inquirer.rb +3 -1
  140. data/lib/thinking_sphinx/middlewares/middleware.rb +2 -0
  141. data/lib/thinking_sphinx/middlewares/sphinxql.rb +18 -16
  142. data/lib/thinking_sphinx/middlewares/stale_id_checker.rb +3 -1
  143. data/lib/thinking_sphinx/middlewares/stale_id_filter.rb +4 -2
  144. data/lib/thinking_sphinx/middlewares/valid_options.rb +25 -0
  145. data/lib/thinking_sphinx/middlewares.rb +7 -3
  146. data/lib/thinking_sphinx/panes/attributes_pane.rb +2 -0
  147. data/lib/thinking_sphinx/panes/distance_pane.rb +2 -0
  148. data/lib/thinking_sphinx/panes/excerpts_pane.rb +2 -0
  149. data/lib/thinking_sphinx/panes/weight_pane.rb +3 -1
  150. data/lib/thinking_sphinx/panes.rb +2 -0
  151. data/lib/thinking_sphinx/processor.rb +71 -0
  152. data/lib/thinking_sphinx/query.rb +2 -0
  153. data/lib/thinking_sphinx/railtie.rb +29 -2
  154. data/lib/thinking_sphinx/rake_interface.rb +14 -69
  155. data/lib/thinking_sphinx/real_time/attribute.rb +9 -1
  156. data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +17 -7
  157. data/lib/thinking_sphinx/real_time/field.rb +2 -0
  158. data/lib/thinking_sphinx/real_time/index/template.rb +19 -1
  159. data/lib/thinking_sphinx/real_time/index.rb +11 -5
  160. data/lib/thinking_sphinx/real_time/interpreter.rb +10 -6
  161. data/lib/thinking_sphinx/real_time/populator.rb +12 -14
  162. data/lib/thinking_sphinx/real_time/processor.rb +36 -0
  163. data/lib/thinking_sphinx/real_time/property.rb +3 -5
  164. data/lib/thinking_sphinx/real_time/transcribe_instance.rb +38 -0
  165. data/lib/thinking_sphinx/real_time/transcriber.rb +63 -15
  166. data/lib/thinking_sphinx/real_time/translator.rb +39 -0
  167. data/lib/thinking_sphinx/real_time.rb +22 -1
  168. data/lib/thinking_sphinx/scopes.rb +6 -0
  169. data/lib/thinking_sphinx/search/batch_inquirer.rb +2 -0
  170. data/lib/thinking_sphinx/search/context.rb +11 -0
  171. data/lib/thinking_sphinx/search/glaze.rb +2 -0
  172. data/lib/thinking_sphinx/search/merger.rb +2 -0
  173. data/lib/thinking_sphinx/search/query.rb +9 -1
  174. data/lib/thinking_sphinx/search/stale_ids_exception.rb +7 -3
  175. data/lib/thinking_sphinx/search.rb +30 -2
  176. data/lib/thinking_sphinx/settings.rb +128 -0
  177. data/lib/thinking_sphinx/sinatra.rb +3 -1
  178. data/lib/thinking_sphinx/subscribers/populator_subscriber.rb +19 -5
  179. data/lib/thinking_sphinx/tasks.rb +55 -28
  180. data/lib/thinking_sphinx/test.rb +3 -1
  181. data/lib/thinking_sphinx/utf8.rb +2 -0
  182. data/lib/thinking_sphinx/wildcard.rb +3 -1
  183. data/lib/thinking_sphinx/with_output.rb +13 -0
  184. data/lib/thinking_sphinx.rb +35 -4
  185. data/spec/acceptance/association_scoping_spec.rb +7 -5
  186. data/spec/acceptance/attribute_access_spec.rb +29 -12
  187. data/spec/acceptance/attribute_updates_spec.rb +5 -3
  188. data/spec/acceptance/batch_searching_spec.rb +6 -4
  189. data/spec/acceptance/big_integers_spec.rb +9 -7
  190. data/spec/acceptance/excerpts_spec.rb +11 -10
  191. data/spec/acceptance/facets_spec.rb +29 -16
  192. data/spec/acceptance/geosearching_spec.rb +22 -10
  193. data/spec/acceptance/grouping_by_attributes_spec.rb +30 -28
  194. data/spec/acceptance/index_options_spec.rb +18 -16
  195. data/spec/acceptance/indexing_spec.rb +5 -3
  196. data/spec/acceptance/merging_spec.rb +90 -0
  197. data/spec/acceptance/paginating_search_results_spec.rb +21 -3
  198. data/spec/acceptance/real_time_updates_spec.rb +103 -5
  199. data/spec/acceptance/remove_deleted_records_spec.rb +64 -8
  200. data/spec/acceptance/search_counts_spec.rb +4 -2
  201. data/spec/acceptance/search_for_just_ids_spec.rb +4 -2
  202. data/spec/acceptance/searching_across_models_spec.rb +15 -6
  203. data/spec/acceptance/searching_across_schemas_spec.rb +12 -10
  204. data/spec/acceptance/searching_on_fields_spec.rb +11 -9
  205. data/spec/acceptance/searching_with_filters_spec.rb +35 -20
  206. data/spec/acceptance/searching_with_sti_spec.rb +11 -9
  207. data/spec/acceptance/searching_within_a_model_spec.rb +44 -17
  208. data/spec/acceptance/sorting_search_results_spec.rb +21 -19
  209. data/spec/acceptance/spec_helper.rb +2 -13
  210. data/spec/acceptance/specifying_sql_spec.rb +118 -62
  211. data/spec/acceptance/sphinx_scopes_spec.rb +30 -21
  212. data/spec/acceptance/sql_deltas_spec.rb +35 -9
  213. data/spec/acceptance/support/database_cleaner.rb +3 -1
  214. data/spec/acceptance/support/sphinx_controller.rb +25 -9
  215. data/spec/acceptance/support/sphinx_helpers.rb +17 -2
  216. data/spec/acceptance/suspended_deltas_spec.rb +14 -12
  217. data/spec/fixtures/database.yml +1 -1
  218. data/spec/internal/app/indices/admin_person_index.rb +6 -0
  219. data/spec/internal/app/indices/album_index.rb +9 -0
  220. data/spec/internal/app/indices/animal_index.rb +2 -0
  221. data/spec/internal/app/indices/article_index.rb +10 -3
  222. data/spec/internal/app/indices/bird_index.rb +2 -0
  223. data/spec/internal/app/indices/book_index.rb +4 -1
  224. data/spec/internal/app/indices/car_index.rb +2 -0
  225. data/spec/internal/app/indices/city_index.rb +2 -0
  226. data/spec/internal/app/indices/colour_index.rb +7 -0
  227. data/spec/internal/app/indices/product_index.rb +3 -2
  228. data/spec/internal/app/indices/tee_index.rb +3 -1
  229. data/spec/internal/app/indices/user_index.rb +2 -0
  230. data/spec/internal/app/models/admin/person.rb +6 -0
  231. data/spec/internal/app/models/album.rb +25 -0
  232. data/spec/internal/app/models/animal.rb +3 -0
  233. data/spec/internal/app/models/article.rb +4 -0
  234. data/spec/internal/app/models/bird.rb +3 -0
  235. data/spec/internal/app/models/book.rb +9 -5
  236. data/spec/internal/app/models/car.rb +3 -1
  237. data/spec/internal/app/models/categorisation.rb +10 -1
  238. data/spec/internal/app/models/category.rb +2 -0
  239. data/spec/internal/app/models/city.rb +4 -0
  240. data/spec/internal/app/models/colour.rb +4 -0
  241. data/spec/internal/app/models/event.rb +2 -0
  242. data/spec/internal/app/models/flightless_bird.rb +2 -0
  243. data/spec/internal/app/models/genre.rb +2 -0
  244. data/spec/internal/app/models/hardcover.rb +2 -0
  245. data/spec/internal/app/models/mammal.rb +2 -0
  246. data/spec/internal/app/models/manufacturer.rb +2 -0
  247. data/spec/internal/app/models/product.rb +3 -1
  248. data/spec/internal/app/models/tag.rb +2 -0
  249. data/spec/internal/app/models/tagging.rb +2 -0
  250. data/spec/internal/app/models/tee.rb +7 -0
  251. data/spec/internal/app/models/tweet.rb +2 -0
  252. data/spec/internal/app/models/user.rb +4 -0
  253. data/spec/internal/config/database.yml +12 -1
  254. data/spec/internal/db/schema.rb +13 -1
  255. data/spec/spec_helper.rb +12 -1
  256. data/spec/support/json_column.rb +35 -0
  257. data/spec/support/multi_schema.rb +5 -1
  258. data/spec/support/mysql.rb +25 -0
  259. data/spec/support/sphinx_yaml_helpers.rb +8 -1
  260. data/spec/thinking_sphinx/active_record/association_spec.rb +3 -1
  261. data/spec/thinking_sphinx/active_record/attribute/type_spec.rb +43 -38
  262. data/spec/thinking_sphinx/active_record/base_spec.rb +31 -29
  263. data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +81 -10
  264. data/spec/thinking_sphinx/active_record/callbacks/delta_callbacks_spec.rb +56 -29
  265. data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +27 -10
  266. data/spec/thinking_sphinx/active_record/column_spec.rb +15 -13
  267. data/spec/thinking_sphinx/active_record/column_sql_presenter_spec.rb +39 -0
  268. data/spec/thinking_sphinx/active_record/database_adapters/abstract_adapter_spec.rb +7 -5
  269. data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +26 -12
  270. data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +15 -13
  271. data/spec/thinking_sphinx/active_record/database_adapters_spec.rb +50 -48
  272. data/spec/thinking_sphinx/active_record/field_spec.rb +9 -7
  273. data/spec/thinking_sphinx/active_record/filter_reflection_spec.rb +113 -80
  274. data/spec/thinking_sphinx/active_record/index_spec.rb +41 -37
  275. data/spec/thinking_sphinx/active_record/interpreter_spec.rb +62 -59
  276. data/spec/thinking_sphinx/active_record/polymorpher_spec.rb +16 -14
  277. data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +69 -67
  278. data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +146 -154
  279. data/spec/thinking_sphinx/active_record/sql_source_spec.rb +185 -109
  280. data/spec/thinking_sphinx/attribute_types_spec.rb +52 -0
  281. data/spec/thinking_sphinx/commands/clear_real_time_spec.rb +46 -0
  282. data/spec/thinking_sphinx/commands/clear_sql_spec.rb +52 -0
  283. data/spec/thinking_sphinx/commands/configure_spec.rb +31 -0
  284. data/spec/thinking_sphinx/commands/index_real_time_spec.rb +33 -0
  285. data/spec/thinking_sphinx/commands/index_sql_spec.rb +86 -0
  286. data/spec/thinking_sphinx/commands/merge_and_update_spec.rb +106 -0
  287. data/spec/thinking_sphinx/commands/merge_spec.rb +48 -0
  288. data/spec/thinking_sphinx/commands/prepare_spec.rb +31 -0
  289. data/spec/thinking_sphinx/commands/running_spec.rb +30 -0
  290. data/spec/thinking_sphinx/commands/start_detached_spec.rb +67 -0
  291. data/spec/thinking_sphinx/commands/stop_spec.rb +63 -0
  292. data/spec/thinking_sphinx/configuration/minimum_fields_spec.rb +60 -0
  293. data/spec/thinking_sphinx/configuration_spec.rb +247 -94
  294. data/spec/thinking_sphinx/connection/mri_spec.rb +49 -0
  295. data/spec/thinking_sphinx/connection_spec.rb +15 -13
  296. data/spec/thinking_sphinx/deletion_spec.rb +17 -17
  297. data/spec/thinking_sphinx/deltas/default_delta_spec.rb +28 -21
  298. data/spec/thinking_sphinx/deltas_spec.rb +14 -12
  299. data/spec/thinking_sphinx/errors_spec.rb +59 -27
  300. data/spec/thinking_sphinx/excerpter_spec.rb +12 -9
  301. data/spec/thinking_sphinx/facet_search_spec.rb +24 -22
  302. data/spec/thinking_sphinx/hooks/guard_presence_spec.rb +30 -0
  303. data/spec/thinking_sphinx/index_set_spec.rb +59 -18
  304. data/spec/thinking_sphinx/index_spec.rb +28 -26
  305. data/spec/thinking_sphinx/interfaces/daemon_spec.rb +60 -0
  306. data/spec/thinking_sphinx/interfaces/real_time_spec.rb +109 -0
  307. data/spec/thinking_sphinx/interfaces/sql_spec.rb +122 -0
  308. data/spec/thinking_sphinx/masks/pagination_mask_spec.rb +22 -20
  309. data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +20 -18
  310. data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +45 -21
  311. data/spec/thinking_sphinx/middlewares/geographer_spec.rb +11 -9
  312. data/spec/thinking_sphinx/middlewares/glazier_spec.rb +12 -9
  313. data/spec/thinking_sphinx/middlewares/inquirer_spec.rb +9 -7
  314. data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +60 -58
  315. data/spec/thinking_sphinx/middlewares/stale_id_checker_spec.rb +7 -4
  316. data/spec/thinking_sphinx/middlewares/stale_id_filter_spec.rb +39 -17
  317. data/spec/thinking_sphinx/middlewares/valid_options_spec.rb +51 -0
  318. data/spec/thinking_sphinx/panes/attributes_pane_spec.rb +3 -1
  319. data/spec/thinking_sphinx/panes/distance_pane_spec.rb +6 -4
  320. data/spec/thinking_sphinx/panes/excerpts_pane_spec.rb +8 -6
  321. data/spec/thinking_sphinx/panes/weight_pane_spec.rb +4 -2
  322. data/spec/thinking_sphinx/rake_interface_spec.rb +17 -235
  323. data/spec/thinking_sphinx/real_time/attribute_spec.rb +15 -13
  324. data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +114 -28
  325. data/spec/thinking_sphinx/real_time/field_spec.rb +16 -14
  326. data/spec/thinking_sphinx/real_time/index_spec.rb +83 -32
  327. data/spec/thinking_sphinx/real_time/interpreter_spec.rb +44 -42
  328. data/spec/thinking_sphinx/real_time/transcribe_instance_spec.rb +35 -0
  329. data/spec/thinking_sphinx/real_time/transcriber_spec.rb +109 -0
  330. data/spec/thinking_sphinx/real_time/translator_spec.rb +17 -0
  331. data/spec/thinking_sphinx/scopes_spec.rb +11 -5
  332. data/spec/thinking_sphinx/search/glaze_spec.rb +17 -15
  333. data/spec/thinking_sphinx/search/query_spec.rb +19 -10
  334. data/spec/thinking_sphinx/search_spec.rb +30 -28
  335. data/spec/thinking_sphinx/wildcard_spec.rb +18 -11
  336. data/spec/thinking_sphinx_spec.rb +10 -7
  337. data/thinking-sphinx.gemspec +17 -10
  338. metadata +157 -49
  339. data/HISTORY +0 -248
  340. data/gemfiles/.gitignore +0 -1
  341. data/gemfiles/rails_3_2.gemfile +0 -11
  342. data/gemfiles/rails_4_0.gemfile +0 -11
  343. data/gemfiles/rails_4_1.gemfile +0 -11
  344. data/gemfiles/rails_4_2.gemfile +0 -11
  345. data/lib/thinking_sphinx/controller.rb +0 -10
  346. data/lib/thinking_sphinx/middlewares/utf8.rb +0 -27
  347. data/lib/thinking_sphinx/sphinxql.rb +0 -23
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::ActiveRecord::PropertySQLPresenter do
@@ -7,7 +9,7 @@ describe ThinkingSphinx::ActiveRecord::PropertySQLPresenter do
7
9
  let(:path) { double :aggregate? => false, :model => model }
8
10
 
9
11
  before :each do
10
- adapter.stub(:quote) { |column| column }
12
+ allow(adapter).to receive(:quote) { |column| column }
11
13
 
12
14
  stub_const 'Joiner::Path', double(:new => path)
13
15
  end
@@ -25,95 +27,95 @@ describe ThinkingSphinx::ActiveRecord::PropertySQLPresenter do
25
27
 
26
28
  describe '#to_group' do
27
29
  it "returns the column name as a string" do
28
- presenter.to_group.should == 'articles.title'
30
+ expect(presenter.to_group).to eq('articles.title')
29
31
  end
30
32
 
31
33
  it "gets the column's table alias from the associations object" do
32
- column.stub!(:__stack => [:users, :posts])
34
+ allow(column).to receive_messages(:__stack => [:users, :posts])
33
35
 
34
- associations.should_receive(:alias_for).with([:users, :posts]).
36
+ expect(associations).to receive(:alias_for).with([:users, :posts]).
35
37
  and_return('posts')
36
38
 
37
39
  presenter.to_group
38
40
  end
39
41
 
40
42
  it "returns nil if the property is an aggregate" do
41
- path.stub! :aggregate? => true
43
+ allow(path).to receive_messages :aggregate? => true
42
44
 
43
- presenter.to_group.should be_nil
45
+ expect(presenter.to_group).to be_nil
44
46
  end
45
47
 
46
48
  it "returns nil if the field is sourced via a separate query" do
47
- field.stub :source_type => 'query'
49
+ allow(field).to receive_messages :source_type => 'query'
48
50
 
49
- presenter.to_group.should be_nil
51
+ expect(presenter.to_group).to be_nil
50
52
  end
51
53
  end
52
54
 
53
55
  describe '#to_select' do
54
56
  it "returns the column name as a string" do
55
- presenter.to_select.should == 'articles.title AS title'
57
+ expect(presenter.to_select).to eq('articles.title AS title')
56
58
  end
57
59
 
58
60
  it "gets the column's table alias from the associations object" do
59
- column.stub!(:__stack => [:users, :posts])
61
+ allow(column).to receive_messages(:__stack => [:users, :posts])
60
62
 
61
- associations.should_receive(:alias_for).with([:users, :posts]).
63
+ expect(associations).to receive(:alias_for).with([:users, :posts]).
62
64
  and_return('posts')
63
65
 
64
66
  presenter.to_select
65
67
  end
66
68
 
67
69
  it "returns the column name with an alias when provided" do
68
- field.stub!(:name => :subject)
70
+ allow(field).to receive_messages(:name => :subject)
69
71
 
70
- presenter.to_select.should == 'articles.title AS subject'
72
+ expect(presenter.to_select).to eq('articles.title AS subject')
71
73
  end
72
74
 
73
75
  it "groups and concatenates aggregated columns" do
74
- adapter.stub :group_concatenate do |clause, separator|
76
+ allow(adapter).to receive :group_concatenate do |clause, separator|
75
77
  "GROUP_CONCAT(#{clause} SEPARATOR '#{separator}')"
76
78
  end
77
79
 
78
- path.stub! :aggregate? => true
80
+ allow(path).to receive_messages :aggregate? => true
79
81
 
80
- presenter.to_select.
81
- should == "GROUP_CONCAT(articles.title SEPARATOR ' ') AS title"
82
+ expect(presenter.to_select).
83
+ to eq("GROUP_CONCAT(articles.title SEPARATOR ' ') AS title")
82
84
  end
83
85
 
84
86
  it "concatenates multiple columns" do
85
- adapter.stub :concatenate do |clause, separator|
87
+ allow(adapter).to receive :concatenate do |clause, separator|
86
88
  "CONCAT_WS('#{separator}', #{clause})"
87
89
  end
88
90
 
89
- field.stub!(:columns => [column, column])
91
+ allow(field).to receive_messages(:columns => [column, column])
90
92
 
91
- presenter.to_select.
92
- should == "CONCAT_WS(' ', articles.title, articles.title) AS title"
93
+ expect(presenter.to_select).
94
+ to eq("CONCAT_WS(' ', articles.title, articles.title) AS title")
93
95
  end
94
96
 
95
97
  it "does not include columns that don't exist" do
96
- adapter.stub :concatenate do |clause, separator|
98
+ allow(adapter).to receive :concatenate do |clause, separator|
97
99
  "CONCAT_WS('#{separator}', #{clause})"
98
100
  end
99
101
 
100
- field.stub!(:columns => [column, double('column', :string? => false,
102
+ allow(field).to receive_messages(:columns => [column, double('column', :string? => false,
101
103
  :__stack => [], :__name => 'body')])
102
104
 
103
- presenter.to_select.
104
- should == "CONCAT_WS(' ', articles.title) AS title"
105
+ expect(presenter.to_select).
106
+ to eq("CONCAT_WS(' ', articles.title) AS title")
105
107
  end
106
108
 
107
109
  it "returns nil for query sourced fields" do
108
- field.stub :source_type => :query
110
+ allow(field).to receive_messages :source_type => :query
109
111
 
110
- presenter.to_select.should be_nil
112
+ expect(presenter.to_select).to be_nil
111
113
  end
112
114
 
113
115
  it "returns nil for ranged query sourced fields" do
114
- field.stub :source_type => :ranged_query
116
+ allow(field).to receive_messages :source_type => :ranged_query
115
117
 
116
- presenter.to_select.should be_nil
118
+ expect(presenter.to_select).to be_nil
117
119
  end
118
120
  end
119
121
  end
@@ -131,131 +133,131 @@ describe ThinkingSphinx::ActiveRecord::PropertySQLPresenter do
131
133
  :__name => 'created_at') }
132
134
 
133
135
  before :each do
134
- adapter.stub :cast_to_timestamp do |clause|
136
+ allow(adapter).to receive :cast_to_timestamp do |clause|
135
137
  "UNIX_TIMESTAMP(#{clause})"
136
138
  end
137
139
  end
138
140
 
139
141
  describe '#to_group' do
140
142
  it "returns the column name as a string" do
141
- presenter.to_group.should == 'articles.created_at'
143
+ expect(presenter.to_group).to eq('articles.created_at')
142
144
  end
143
145
 
144
146
  it "gets the column's table alias from the associations object" do
145
- column.stub!(:__stack => [:users, :posts])
147
+ allow(column).to receive_messages(:__stack => [:users, :posts])
146
148
 
147
- associations.should_receive(:alias_for).with([:users, :posts]).
149
+ expect(associations).to receive(:alias_for).with([:users, :posts]).
148
150
  and_return('posts')
149
151
 
150
152
  presenter.to_group
151
153
  end
152
154
 
153
155
  it "returns nil if the column is a string" do
154
- column.stub!(:string? => true)
156
+ allow(column).to receive_messages(:string? => true)
155
157
 
156
- presenter.to_group.should be_nil
158
+ expect(presenter.to_group).to be_nil
157
159
  end
158
160
 
159
161
  it "returns nil if the property is an aggregate" do
160
- path.stub! :aggregate? => true
162
+ allow(path).to receive_messages :aggregate? => true
161
163
 
162
- presenter.to_group.should be_nil
164
+ expect(presenter.to_group).to be_nil
163
165
  end
164
166
 
165
167
  it "returns nil if the attribute is sourced via a separate query" do
166
- attribute.stub :source_type => 'query'
168
+ allow(attribute).to receive_messages :source_type => 'query'
167
169
 
168
- presenter.to_group.should be_nil
170
+ expect(presenter.to_group).to be_nil
169
171
  end
170
172
  end
171
173
 
172
174
  describe '#to_select' do
173
175
  it "returns the column name as a string" do
174
- presenter.to_select.should == 'articles.created_at AS created_at'
176
+ expect(presenter.to_select).to eq('articles.created_at AS created_at')
175
177
  end
176
178
 
177
179
  it "gets the column's table alias from the associations object" do
178
- column.stub!(:__stack => [:users, :posts])
180
+ allow(column).to receive_messages(:__stack => [:users, :posts])
179
181
 
180
- associations.should_receive(:alias_for).with([:users, :posts]).
182
+ expect(associations).to receive(:alias_for).with([:users, :posts]).
181
183
  and_return('posts')
182
184
 
183
185
  presenter.to_select
184
186
  end
185
187
 
186
188
  it "returns the column name with an alias when provided" do
187
- attribute.stub!(:name => :creation_timestamp)
189
+ allow(attribute).to receive_messages(:name => :creation_timestamp)
188
190
 
189
- presenter.to_select.
190
- should == 'articles.created_at AS creation_timestamp'
191
+ expect(presenter.to_select).
192
+ to eq('articles.created_at AS creation_timestamp')
191
193
  end
192
194
 
193
195
  it "ensures datetime attributes are converted to timestamps" do
194
- attribute.stub :type => :timestamp
196
+ allow(attribute).to receive_messages :type => :timestamp
195
197
 
196
- presenter.to_select.
197
- should == 'UNIX_TIMESTAMP(articles.created_at) AS created_at'
198
+ expect(presenter.to_select).
199
+ to eq('UNIX_TIMESTAMP(articles.created_at) AS created_at')
198
200
  end
199
201
 
200
202
  it "does not include columns that don't exist" do
201
- adapter.stub :concatenate do |clause, separator|
203
+ allow(adapter).to receive :concatenate do |clause, separator|
202
204
  "CONCAT_WS('#{separator}', #{clause})"
203
205
  end
204
- adapter.stub :cast_to_string do |clause|
206
+ allow(adapter).to receive :cast_to_string do |clause|
205
207
  "CAST(#{clause} AS varchar)"
206
208
  end
207
209
 
208
- attribute.stub!(:columns => [column, double('column',
210
+ allow(attribute).to receive_messages(:columns => [column, double('column',
209
211
  :string? => false, :__stack => [], :__name => 'updated_at')])
210
212
 
211
- presenter.to_select.should == "CONCAT_WS(',', CAST(articles.created_at AS varchar)) AS created_at"
213
+ expect(presenter.to_select).to eq("CONCAT_WS(',', CAST(articles.created_at AS varchar)) AS created_at")
212
214
  end
213
215
 
214
216
  it "casts and concatenates multiple columns for attributes" do
215
- adapter.stub :concatenate do |clause, separator|
217
+ allow(adapter).to receive :concatenate do |clause, separator|
216
218
  "CONCAT_WS('#{separator}', #{clause})"
217
219
  end
218
- adapter.stub :cast_to_string do |clause|
220
+ allow(adapter).to receive :cast_to_string do |clause|
219
221
  "CAST(#{clause} AS varchar)"
220
222
  end
221
223
 
222
- attribute.stub!(:columns => [column, column])
224
+ allow(attribute).to receive_messages(:columns => [column, column])
223
225
 
224
- presenter.to_select.should == "CONCAT_WS(',', CAST(articles.created_at AS varchar), CAST(articles.created_at AS varchar)) AS created_at"
226
+ expect(presenter.to_select).to eq("CONCAT_WS(',', CAST(articles.created_at AS varchar), CAST(articles.created_at AS varchar)) AS created_at")
225
227
  end
226
228
 
227
229
  it "double-casts and concatenates multiple columns for timestamp attributes" do
228
- adapter.stub :concatenate do |clause, separator|
230
+ allow(adapter).to receive :concatenate do |clause, separator|
229
231
  "CONCAT_WS('#{separator}', #{clause})"
230
232
  end
231
- adapter.stub :cast_to_string do |clause|
233
+ allow(adapter).to receive :cast_to_string do |clause|
232
234
  "CAST(#{clause} AS varchar)"
233
235
  end
234
236
 
235
- attribute.stub :columns => [column, column], :type => :timestamp
237
+ allow(attribute).to receive_messages :columns => [column, column], :type => :timestamp
236
238
 
237
- presenter.to_select.should == "CONCAT_WS(',', CAST(UNIX_TIMESTAMP(articles.created_at) AS varchar), CAST(UNIX_TIMESTAMP(articles.created_at) AS varchar)) AS created_at"
239
+ expect(presenter.to_select).to eq("CONCAT_WS(',', CAST(UNIX_TIMESTAMP(articles.created_at) AS varchar), CAST(UNIX_TIMESTAMP(articles.created_at) AS varchar)) AS created_at")
238
240
  end
239
241
 
240
242
  it "does not split attribute clause for timestamp casting if it looks like a function call" do
241
- column.stub :__name => "COALESCE(articles.updated_at, articles.created_at)", :string? => true
243
+ allow(column).to receive_messages :__name => "COALESCE(articles.updated_at, articles.created_at)", :string? => true
242
244
 
243
- attribute.stub :name => 'mod_date', :columns => [column],
245
+ allow(attribute).to receive_messages :name => 'mod_date', :columns => [column],
244
246
  :type => :timestamp
245
247
 
246
- presenter.to_select.should == "UNIX_TIMESTAMP(COALESCE(articles.updated_at, articles.created_at)) AS mod_date"
248
+ expect(presenter.to_select).to eq("UNIX_TIMESTAMP(COALESCE(articles.updated_at, articles.created_at)) AS mod_date")
247
249
  end
248
250
 
249
251
  it "returns nil for query sourced attributes" do
250
- attribute.stub :source_type => :query
252
+ allow(attribute).to receive_messages :source_type => :query
251
253
 
252
- presenter.to_select.should be_nil
254
+ expect(presenter.to_select).to be_nil
253
255
  end
254
256
 
255
257
  it "returns nil for ranged query sourced attributes" do
256
- attribute.stub :source_type => :ranged_query
258
+ allow(attribute).to receive_messages :source_type => :ranged_query
257
259
 
258
- presenter.to_select.should be_nil
260
+ expect(presenter.to_select).to be_nil
259
261
  end
260
262
  end
261
263
  end