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,230 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::RealTime::Index do
6
+ let(:index) { ThinkingSphinx::RealTime::Index.new :user }
7
+ let(:config) { double('config', :settings => {},
8
+ :indices_location => 'location', :next_offset => 8,
9
+ :index_set_class => index_set_class) }
10
+ let(:index_set_class) { double(:index_set_class, :reference_name => :user) }
11
+
12
+ before :each do
13
+ allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
14
+ end
15
+
16
+ describe '#add_attribute' do
17
+ let(:attribute) { double('attribute', name: 'my_attribute') }
18
+
19
+ it "appends attributes to the collection" do
20
+ index.add_attribute attribute
21
+
22
+ expect(index.attributes.collect(&:name)).to include('my_attribute')
23
+ end
24
+
25
+ it "replaces attributes with the same name" do
26
+ index.add_attribute double('attribute', name: 'my_attribute')
27
+ index.add_attribute attribute
28
+
29
+ matching = index.attributes.select { |attr| attr.name == attribute.name }
30
+
31
+ expect(matching).to eq([attribute])
32
+ end
33
+ end
34
+
35
+ describe '#add_field' do
36
+ let(:field) { double('field', name: 'my_field') }
37
+
38
+ it "appends fields to the collection" do
39
+ index.add_field field
40
+
41
+ expect(index.fields.collect(&:name)).to include('my_field')
42
+ end
43
+
44
+ it "replaces fields with the same name" do
45
+ index.add_field double('field', name: 'my_field')
46
+ index.add_field field
47
+
48
+ matching = index.fields.select { |fld| fld.name == field.name }
49
+
50
+ expect(matching).to eq([field])
51
+ end
52
+ end
53
+
54
+ describe '#attributes' do
55
+ it "has the internal id attribute by default" do
56
+ expect(index.attributes.collect(&:name)).to include('sphinx_internal_id')
57
+ end
58
+
59
+ it "has the class name attribute by default" do
60
+ expect(index.attributes.collect(&:name)).to include('sphinx_internal_class')
61
+ end
62
+
63
+ it "has the internal deleted attribute by default" do
64
+ expect(index.attributes.collect(&:name)).to include('sphinx_deleted')
65
+ end
66
+
67
+ it "does not have an internal updated_at attribute by default" do
68
+ expect(index.attributes.collect(&:name)).to_not include('sphinx_updated_at')
69
+ end
70
+
71
+ it "has an internal updated_at attribute if real_time_tidy is true" do
72
+ config.settings["real_time_tidy"] = true
73
+
74
+ expect(index.attributes.collect(&:name)).to include('sphinx_updated_at')
75
+ end
76
+ end
77
+
78
+ describe '#delta?' do
79
+ it "always returns false" do
80
+ expect(index).not_to be_delta
81
+ end
82
+ end
83
+
84
+ describe '#document_id_for_key' do
85
+ it "calculates the document id based on offset and number of indices" do
86
+ allow(config).to receive_message_chain(:indices, :count).and_return(5)
87
+ allow(config).to receive_messages :next_offset => 7
88
+
89
+ expect(index.document_id_for_key(123)).to eq(622)
90
+ end
91
+ end
92
+
93
+ describe '#fields' do
94
+ it "has the internal class field by default" do
95
+ expect(index.fields.collect(&:name)).to include('sphinx_internal_class_name')
96
+ end
97
+ end
98
+
99
+ describe '#interpret_definition!' do
100
+ let(:block) { double('block') }
101
+
102
+ before :each do
103
+ index.definition_block = block
104
+ end
105
+
106
+ it "interprets the definition block" do
107
+ expect(ThinkingSphinx::RealTime::Interpreter).to receive(:translate!).
108
+ with(index, block)
109
+
110
+ index.interpret_definition!
111
+ end
112
+
113
+ it "only interprets the definition block once" do
114
+ expect(ThinkingSphinx::RealTime::Interpreter).to receive(:translate!).
115
+ once
116
+
117
+ index.interpret_definition!
118
+ index.interpret_definition!
119
+ end
120
+ end
121
+
122
+ describe '#model' do
123
+ let(:model) { double('model', :primary_key => :id) }
124
+
125
+ it "translates symbol references to model class" do
126
+ allow(ActiveSupport::Inflector).to receive_messages(:constantize => model)
127
+
128
+ expect(index.model).to eq(model)
129
+ end
130
+
131
+ it "memoizes the result" do
132
+ expect(ActiveSupport::Inflector).to receive(:constantize).with('User').once.
133
+ and_return(model)
134
+
135
+ index.model
136
+ index.model
137
+ end
138
+ end
139
+
140
+ describe '#morphology' do
141
+ before :each do
142
+ skip
143
+ end
144
+
145
+ context 'with a render' do
146
+ it "defaults to nil" do
147
+ begin
148
+ index.render
149
+ rescue Riddle::Configuration::ConfigurationError
150
+ end
151
+
152
+ expect(index.morphology).to be_nil
153
+ end
154
+
155
+ it "reads from the settings file if provided" do
156
+ config.settings['morphology'] = 'stem_en'
157
+
158
+ begin
159
+ index.render
160
+ rescue Riddle::Configuration::ConfigurationError
161
+ end
162
+
163
+ expect(index.morphology).to eq('stem_en')
164
+ end
165
+ end
166
+ end
167
+
168
+ describe '#name' do
169
+ it "always uses the core suffix" do
170
+ index = ThinkingSphinx::RealTime::Index.new :user
171
+ expect(index.name).to eq('user_core')
172
+ end
173
+ end
174
+
175
+ describe '#offset' do
176
+ before :each do
177
+ allow(config).to receive_messages :next_offset => 4
178
+ end
179
+
180
+ it "uses the next offset value from the configuration" do
181
+ expect(index.offset).to eq(4)
182
+ end
183
+
184
+ it "uses the reference to get a unique offset" do
185
+ expect(config).to receive(:next_offset).with(:user).and_return(2)
186
+
187
+ index.offset
188
+ end
189
+ end
190
+
191
+ describe '#render' do
192
+ before :each do
193
+ allow(FileUtils).to receive_messages :mkdir_p => true
194
+ end
195
+
196
+ it "interprets the provided definition" do
197
+ expect(index).to receive(:interpret_definition!).at_least(:once)
198
+
199
+ begin
200
+ index.render
201
+ rescue Riddle::Configuration::ConfigurationError
202
+ # Ignoring underlying validation error.
203
+ end
204
+ end
205
+ end
206
+
207
+ describe '#scope' do
208
+ let(:model) { double('model', :primary_key => :id) }
209
+
210
+ it "returns the model by default" do
211
+ allow(ActiveSupport::Inflector).to receive_messages(:constantize => model)
212
+
213
+ expect(index.scope).to eq(model)
214
+ end
215
+
216
+ it "returns the evaluated scope if provided" do
217
+ index.scope = lambda { :foo }
218
+
219
+ expect(index.scope).to eq(:foo)
220
+ end
221
+ end
222
+
223
+ describe '#unique_attribute_names' do
224
+ it "returns all attribute names" do
225
+ expect(index.unique_attribute_names).to eq([
226
+ 'sphinx_internal_id', 'sphinx_internal_class', 'sphinx_deleted'
227
+ ])
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,203 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::RealTime::Interpreter do
6
+ let(:instance) {
7
+ ThinkingSphinx::RealTime::Interpreter.new index, block
8
+ }
9
+ let(:model) { double('model') }
10
+ let(:index) { Struct.new(:attributes, :fields, :options).new([], [], {}) }
11
+ let(:block) { Proc.new { } }
12
+
13
+ before :each do
14
+ allow(index).to receive_messages(:add_attribute => nil, :add_field => nil)
15
+ end
16
+
17
+ describe '.translate!' do
18
+ let(:instance) { double('interpreter', :translate! => true) }
19
+
20
+ it "creates a new interpreter instance with the given block and index" do
21
+ expect(ThinkingSphinx::RealTime::Interpreter).to receive(:new).
22
+ with(index, block).and_return(instance)
23
+
24
+ ThinkingSphinx::RealTime::Interpreter.translate! index, block
25
+ end
26
+
27
+ it "calls translate! on the instance" do
28
+ allow(ThinkingSphinx::RealTime::Interpreter).to receive_messages(:new => instance)
29
+ expect(instance).to receive(:translate!)
30
+
31
+ ThinkingSphinx::RealTime::Interpreter.translate! index, block
32
+ end
33
+ end
34
+
35
+ describe '#has' do
36
+ let(:column) { double('column') }
37
+ let(:attribute) { double('attribute') }
38
+
39
+ before :each do
40
+ allow(ThinkingSphinx::RealTime::Attribute).to receive_messages :new => attribute
41
+ end
42
+
43
+ it "creates a new attribute with the provided column" do
44
+ expect(ThinkingSphinx::RealTime::Attribute).to receive(:new).
45
+ with(column, {}).and_return(attribute)
46
+
47
+ instance.has column
48
+ end
49
+
50
+ it "passes through options to the attribute" do
51
+ expect(ThinkingSphinx::RealTime::Attribute).to receive(:new).
52
+ with(column, { :as => :other_name }).and_return(attribute)
53
+
54
+ instance.has column, :as => :other_name
55
+ end
56
+
57
+ it "adds an attribute to the index" do
58
+ expect(index).to receive(:add_attribute).with(attribute)
59
+
60
+ instance.has column
61
+ end
62
+
63
+ it "adds multiple attributes when passed multiple columns" do
64
+ expect(index).to receive(:add_attribute).with(attribute).twice
65
+
66
+ instance.has column, column
67
+ end
68
+ end
69
+
70
+ describe '#indexes' do
71
+ let(:column) { double('column') }
72
+ let(:field) { double('field') }
73
+
74
+ before :each do
75
+ allow(ThinkingSphinx::RealTime::Field).to receive_messages :new => field
76
+ end
77
+
78
+ it "creates a new field with the provided column" do
79
+ expect(ThinkingSphinx::RealTime::Field).to receive(:new).
80
+ with(column, {}).and_return(field)
81
+
82
+ instance.indexes column
83
+ end
84
+
85
+ it "passes through options to the field" do
86
+ expect(ThinkingSphinx::RealTime::Field).to receive(:new).
87
+ with(column, { :as => :other_name }).and_return(field)
88
+
89
+ instance.indexes column, :as => :other_name
90
+ end
91
+
92
+ it "adds a field to the index" do
93
+ expect(index).to receive(:add_field).with(field)
94
+
95
+ instance.indexes column
96
+ end
97
+
98
+ it "adds multiple fields when passed multiple columns" do
99
+ expect(index).to receive(:add_field).with(field).twice
100
+
101
+ instance.indexes column, column
102
+ end
103
+
104
+ context 'sortable' do
105
+ let(:attribute) { double('attribute') }
106
+
107
+ before :each do
108
+ allow(ThinkingSphinx::RealTime::Attribute).to receive_messages :new => attribute
109
+
110
+ allow(column).to receive_messages :__name => :col
111
+ end
112
+
113
+ it "adds the _sort suffix to the field's name" do
114
+ expect(ThinkingSphinx::RealTime::Attribute).to receive(:new).
115
+ with(column, { :as => :col_sort, :type => :string }).
116
+ and_return(attribute)
117
+
118
+ instance.indexes column, :sortable => true
119
+ end
120
+
121
+ it "respects given aliases" do
122
+ expect(ThinkingSphinx::RealTime::Attribute).to receive(:new).
123
+ with(column, { :as => :other_sort, :type => :string }).
124
+ and_return(attribute)
125
+
126
+ instance.indexes column, :sortable => true, :as => :other
127
+ end
128
+
129
+ it "respects symbols instead of columns" do
130
+ expect(ThinkingSphinx::RealTime::Attribute).to receive(:new).
131
+ with(:title, { :as => :title_sort, :type => :string }).
132
+ and_return(attribute)
133
+
134
+ instance.indexes :title, :sortable => true
135
+ end
136
+
137
+ it "adds an attribute to the index" do
138
+ expect(index).to receive(:add_attribute).with(attribute)
139
+
140
+ instance.indexes column, :sortable => true
141
+ end
142
+ end
143
+ end
144
+
145
+ describe '#method_missing' do
146
+ let(:column) { double('column') }
147
+
148
+ before :each do
149
+ allow(ThinkingSphinx::ActiveRecord::Column).to receive_messages(:new => column)
150
+ end
151
+
152
+ it "returns a new column for the given method" do
153
+ expect(instance.id).to eq(column)
154
+ end
155
+
156
+ it "should initialise the column with the method name and arguments" do
157
+ expect(ThinkingSphinx::ActiveRecord::Column).to receive(:new).
158
+ with(:users, :posts, :subject).and_return(column)
159
+
160
+ instance.users(:posts, :subject)
161
+ end
162
+ end
163
+
164
+ describe '#scope' do
165
+ it "passes the scope block through to the index" do
166
+ expect(index).to receive(:scope=).with(instance_of(Proc))
167
+
168
+ instance.scope { :foo }
169
+ end
170
+ end
171
+
172
+ describe '#set_property' do
173
+ before :each do
174
+ allow(index.class).to receive_messages :settings => [:morphology]
175
+ end
176
+
177
+ it 'saves other settings as index options' do
178
+ instance.set_property :field_weights => {:name => 10}
179
+
180
+ expect(index.options[:field_weights]).to eq({:name => 10})
181
+ end
182
+
183
+ context 'index settings' do
184
+ it "sets the provided setting" do
185
+ expect(index).to receive(:morphology=).with('stem_en')
186
+
187
+ instance.set_property :morphology => 'stem_en'
188
+ end
189
+ end
190
+ end
191
+
192
+ describe '#translate!' do
193
+ it "returns the block evaluated within the context of the interpreter" do
194
+ block = Proc.new {
195
+ __id__
196
+ }
197
+
198
+ interpreter = ThinkingSphinx::RealTime::Interpreter.new index, block
199
+ expect(interpreter.translate!).
200
+ to eq(interpreter.__id__)
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe ThinkingSphinx::RealTime::TranscribeInstance do
6
+ let(:subject) do
7
+ ThinkingSphinx::RealTime::TranscribeInstance.call(
8
+ instance, index, [property_a, property_b, property_c]
9
+ )
10
+ end
11
+ let(:instance) { double :id => 43 }
12
+ let(:index) { double :document_id_for_key => 46, :primary_key => :id }
13
+ let(:property_a) { double :translate => 'A' }
14
+ let(:property_b) { double :translate => 'B' }
15
+ let(:property_c) { double :translate => 'C' }
16
+
17
+ it 'returns an array of each translated property, and the document id' do
18
+ expect(subject).to eq([46, 'A', 'B', 'C'])
19
+ end
20
+
21
+ it 'raises an error if something goes wrong' do
22
+ allow(property_b).to receive(:translate).and_raise(StandardError)
23
+
24
+ expect { subject }.to raise_error(ThinkingSphinx::TranscriptionError)
25
+ end
26
+
27
+ it 'notes the instance and property in the wrapper error' do
28
+ allow(property_b).to receive(:translate).and_raise(StandardError)
29
+
30
+ expect { subject }.to raise_error do |wrapper|
31
+ expect(wrapper.instance).to eq(instance)
32
+ expect(wrapper.property).to eq(property_b)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe ThinkingSphinx::RealTime::Transcriber do
6
+ let(:subject) { ThinkingSphinx::RealTime::Transcriber.new index }
7
+ let(:index) { double 'index', :name => 'foo_core', :conditions => [],
8
+ :fields => [double(:name => 'field_a'), double(:name => 'field_b')],
9
+ :attributes => [double(:name => 'attr_a'), double(:name => 'attr_b')],
10
+ :primary_key => :id }
11
+ let(:insert) { double :replace! => replace }
12
+ let(:replace) { double :to_sql => 'REPLACE QUERY' }
13
+ let(:connection) { double :execute => true }
14
+ let(:instance_a) { double :id => 48, :persisted? => true }
15
+ let(:instance_b) { double :id => 49, :persisted? => true }
16
+ let(:properties_a) { double }
17
+ let(:properties_b) { double }
18
+
19
+ before :each do
20
+ allow(Riddle::Query::Insert).to receive(:new).and_return(insert)
21
+ allow(ThinkingSphinx::Connection).to receive(:take).and_yield(connection)
22
+ allow(ThinkingSphinx::RealTime::TranscribeInstance).to receive(:call).
23
+ with(instance_a, index, anything).and_return(properties_a)
24
+ allow(ThinkingSphinx::RealTime::TranscribeInstance).to receive(:call).
25
+ with(instance_b, index, anything).and_return(properties_b)
26
+ end
27
+
28
+ it "generates a SphinxQL command" do
29
+ expect(Riddle::Query::Insert).to receive(:new).with(
30
+ 'foo_core',
31
+ ['id', 'field_a', 'field_b', 'attr_a', 'attr_b'],
32
+ [properties_a, properties_b]
33
+ )
34
+
35
+ subject.copy instance_a, instance_b
36
+ end
37
+
38
+ it "executes the SphinxQL command" do
39
+ expect(connection).to receive(:execute).with('REPLACE QUERY')
40
+
41
+ subject.copy instance_a, instance_b
42
+ end
43
+
44
+ it "deletes previous records" do
45
+ expect(connection).to receive(:execute).
46
+ with('DELETE FROM foo_core WHERE sphinx_internal_id IN (48, 49)')
47
+
48
+ subject.copy instance_a, instance_b
49
+ end
50
+
51
+ it "skips instances that aren't in the database" do
52
+ allow(instance_a).to receive(:persisted?).and_return(false)
53
+
54
+ expect(Riddle::Query::Insert).to receive(:new).with(
55
+ 'foo_core',
56
+ ['id', 'field_a', 'field_b', 'attr_a', 'attr_b'],
57
+ [properties_b]
58
+ )
59
+
60
+ subject.copy instance_a, instance_b
61
+ end
62
+
63
+ it "skips instances that fail a symbol condition" do
64
+ index.conditions << :ok?
65
+ allow(instance_a).to receive(:ok?).and_return(true)
66
+ allow(instance_b).to receive(:ok?).and_return(false)
67
+
68
+ expect(Riddle::Query::Insert).to receive(:new).with(
69
+ 'foo_core',
70
+ ['id', 'field_a', 'field_b', 'attr_a', 'attr_b'],
71
+ [properties_a]
72
+ )
73
+
74
+ subject.copy instance_a, instance_b
75
+ end
76
+
77
+ it "skips instances that fail a Proc condition" do
78
+ index.conditions << Proc.new { |instance| instance.ok? }
79
+ allow(instance_a).to receive(:ok?).and_return(true)
80
+ allow(instance_b).to receive(:ok?).and_return(false)
81
+
82
+ expect(Riddle::Query::Insert).to receive(:new).with(
83
+ 'foo_core',
84
+ ['id', 'field_a', 'field_b', 'attr_a', 'attr_b'],
85
+ [properties_a]
86
+ )
87
+
88
+ subject.copy instance_a, instance_b
89
+ end
90
+
91
+ it "skips instances that throw an error while transcribing values" do
92
+ error = ThinkingSphinx::TranscriptionError.new
93
+ error.instance = instance_a
94
+ error.inner_exception = StandardError.new
95
+
96
+ allow(ThinkingSphinx::RealTime::TranscribeInstance).to receive(:call).
97
+ with(instance_a, index, anything).
98
+ and_raise(error)
99
+ allow(ThinkingSphinx.output).to receive(:puts).and_return(nil)
100
+
101
+ expect(Riddle::Query::Insert).to receive(:new).with(
102
+ 'foo_core',
103
+ ['id', 'field_a', 'field_b', 'attr_a', 'attr_b'],
104
+ [properties_b]
105
+ )
106
+
107
+ subject.copy instance_a, instance_b
108
+ end
109
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::RealTime::Translator do
6
+ let(:subject) { ThinkingSphinx::RealTime::Translator.call object, column }
7
+ let(:object) { double }
8
+ let(:column) { double :__stack => [], :__name => :title }
9
+
10
+ it "converts non-UTF-8 strings to UTF-8" do
11
+ allow(object).to receive(:title).
12
+ and_return "hello".dup.force_encoding("ASCII-8BIT")
13
+
14
+ expect(subject).to eq("hello")
15
+ expect(subject.encoding.name).to eq("UTF-8")
16
+ end
17
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::Scopes do
6
+ let(:model) {
7
+ Class.new do
8
+ include ThinkingSphinx::Scopes
9
+
10
+ def self.search(query = nil, options = {})
11
+ ThinkingSphinx::Search.new(query, options)
12
+ end
13
+ end
14
+ }
15
+
16
+ describe '#method_missing' do
17
+ before :each do
18
+ model.sphinx_scopes[:foo] = Proc.new { {:with => {:foo => :bar}} }
19
+ end
20
+
21
+ it "implements respond_to" do
22
+ expect(model).to respond_to(:foo)
23
+ end
24
+
25
+ it "creates new search" do
26
+ expect(model.foo.class).to eq(ThinkingSphinx::Search)
27
+ end
28
+
29
+ it "passes block result to constructor" do
30
+ expect(model.foo.options[:with]).to eq({:foo => :bar})
31
+ end
32
+
33
+ it "passes non-scopes through to the standard method error call" do
34
+ expect { model.bar }.to raise_error(NoMethodError)
35
+ end
36
+ end
37
+
38
+ describe '#sphinx_scope' do
39
+ it "saves the given block with a name" do
40
+ model.sphinx_scope(:foo) { 27 }
41
+ expect(model.sphinx_scopes[:foo].call).to eq(27)
42
+ end
43
+ end
44
+
45
+ describe '#default_sphinx_scope' do
46
+ it "gets and sets the default scope depending on the argument" do
47
+ model.default_sphinx_scope :foo
48
+ expect(model.default_sphinx_scope).to eq(:foo)
49
+ end
50
+ end
51
+ end