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,141 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require 'acceptance/spec_helper'
5
+
6
+ describe 'Faceted searching', :live => true do
7
+ it "provides facet breakdowns across marked integer attributes" do
8
+ blue = Colour.create! :name => 'blue'
9
+ red = Colour.create! :name => 'red'
10
+ green = Colour.create! :name => 'green'
11
+
12
+ Tee.create! :colour => blue
13
+ Tee.create! :colour => blue
14
+ Tee.create! :colour => red
15
+ Tee.create! :colour => green
16
+ Tee.create! :colour => green
17
+ Tee.create! :colour => green
18
+ index
19
+
20
+ expect(Tee.facets.to_hash[:colour_id]).to eq({
21
+ blue.id => 2, red.id => 1, green.id => 3
22
+ })
23
+ end
24
+
25
+ it "provides facet breakdowns across classes" do
26
+ Tee.create!
27
+ Tee.create!
28
+ City.create!
29
+ Article.create!
30
+ index
31
+
32
+ expect(ThinkingSphinx.facets.to_hash[:class]).to eq({
33
+ 'Tee' => 2, 'City' => 1, 'Article' => 1
34
+ })
35
+ end
36
+
37
+ it "handles field facets" do
38
+ Book.create! :title => 'American Gods', :author => 'Neil Gaiman'
39
+ Book.create! :title => 'Anansi Boys', :author => 'Neil Gaiman'
40
+ Book.create! :title => 'Snuff', :author => 'Terry Pratchett'
41
+ Book.create! :title => '1Q84', :author => '村上 春樹'
42
+ index
43
+
44
+ expect(Book.facets.to_hash[:author]).to eq({
45
+ 'Neil Gaiman' => 2, 'Terry Pratchett' => 1, '村上 春樹' => 1
46
+ })
47
+ end
48
+
49
+ it "handles MVA facets" do
50
+ pancakes = Tag.create! :name => 'pancakes'
51
+ waffles = Tag.create! :name => 'waffles'
52
+
53
+ user = User.create!
54
+ Tagging.create! :article => Article.create!(:user => user),
55
+ :tag => pancakes
56
+ Tagging.create! :article => Article.create!(:user => user),
57
+ :tag => waffles
58
+
59
+ user = User.create!
60
+ Tagging.create! :article => Article.create!(:user => user),
61
+ :tag => pancakes
62
+ index
63
+
64
+ expect(User.facets.to_hash[:tag_ids]).to eq({
65
+ pancakes.id => 2, waffles.id => 1
66
+ })
67
+ end
68
+
69
+ it "can filter on integer facet results" do
70
+ blue = Colour.create! :name => 'blue'
71
+ red = Colour.create! :name => 'red'
72
+
73
+ b1 = Tee.create! :colour => blue
74
+ b2 = Tee.create! :colour => blue
75
+ r1 = Tee.create! :colour => red
76
+ index
77
+
78
+ expect(Tee.facets.for(:colour_id => blue.id).to_a).to eq([b1, b2])
79
+ end
80
+
81
+ it "can filter on MVA facet results" do
82
+ pancakes = Tag.create! :name => 'pancakes'
83
+ waffles = Tag.create! :name => 'waffles'
84
+
85
+ u1 = User.create!
86
+ Tagging.create! :article => Article.create!(:user => u1), :tag => pancakes
87
+ Tagging.create! :article => Article.create!(:user => u1), :tag => waffles
88
+
89
+ u2 = User.create!
90
+ Tagging.create! :article => Article.create!(:user => u2), :tag => pancakes
91
+ index
92
+
93
+ expect(User.facets.for(:tag_ids => waffles.id).to_a).to eq([u1])
94
+ end
95
+
96
+ it "can filter on string facet results" do
97
+ gods = Book.create! :title => 'American Gods', :author => 'Neil Gaiman'
98
+ boys = Book.create! :title => 'Anansi Boys', :author => 'Neil Gaiman'
99
+ snuff = Book.create! :title => 'Snuff', :author => 'Terry Pratchett'
100
+ index
101
+
102
+ expect(Book.facets.for(:author => 'Neil Gaiman').to_a).to eq([gods, boys])
103
+ end
104
+
105
+ it "allows enumeration" do
106
+ blue = Colour.create! :name => 'blue'
107
+ red = Colour.create! :name => 'red'
108
+
109
+ b1 = Tee.create! :colour => blue
110
+ b2 = Tee.create! :colour => blue
111
+ r1 = Tee.create! :colour => red
112
+ index
113
+
114
+ calls = 0
115
+ expectations = [
116
+ [:sphinx_internal_class, {'Tee' => 3}],
117
+ [:colour_id, {blue.id => 2, red.id => 1}],
118
+ [:class, {'Tee' => 3}]
119
+ ]
120
+ Tee.facets.each do |facet, hash|
121
+ expect(facet).to eq(expectations[calls].first)
122
+ expect(hash).to eq(expectations[calls].last)
123
+
124
+ calls += 1
125
+ end
126
+ end
127
+
128
+ it "can be called on distributed indices" do
129
+ blue = Colour.create! :name => 'blue'
130
+ green = Colour.create! :name => 'green'
131
+
132
+ Tee.create! :colour => blue
133
+ Tee.create! :colour => blue
134
+ Tee.create! :colour => green
135
+ index
136
+
137
+ expect(Tee.facets(:indices => ["tee"]).to_hash[:colour_id]).to eq({
138
+ blue.id => 2, green.id => 1
139
+ })
140
+ end
141
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'acceptance/spec_helper'
4
+
5
+ describe 'Searching by latitude and longitude', :live => true do
6
+ it "orders by distance" do
7
+ mel = City.create :name => 'Melbourne', :lat => -0.6599720, :lng => 2.530082
8
+ syd = City.create :name => 'Sydney', :lat => -0.5909679, :lng => 2.639131
9
+ bri = City.create :name => 'Brisbane', :lat => -0.4794031, :lng => 2.670838
10
+ index
11
+
12
+ expect(City.search(:geo => [-0.616241, 2.602712], :order => 'geodist ASC').
13
+ to_a).to eq([syd, mel, bri])
14
+ end
15
+
16
+ it "filters by distance" do
17
+ mel = City.create :name => 'Melbourne', :lat => -0.6599720, :lng => 2.530082
18
+ syd = City.create :name => 'Sydney', :lat => -0.5909679, :lng => 2.639131
19
+ bri = City.create :name => 'Brisbane', :lat => -0.4794031, :lng => 2.670838
20
+ index
21
+
22
+ expect(City.search(
23
+ :geo => [-0.616241, 2.602712],
24
+ :with => {:geodist => 0.0..470_000.0}
25
+ ).to_a).to eq([mel, syd])
26
+ end
27
+
28
+ it "provides the distance for each search result" do
29
+ mel = City.create :name => 'Melbourne', :lat => -0.6599720, :lng => 2.530082
30
+ syd = City.create :name => 'Sydney', :lat => -0.5909679, :lng => 2.639131
31
+ bri = City.create :name => 'Brisbane', :lat => -0.4794031, :lng => 2.670838
32
+ index
33
+
34
+ cities = City.search(:geo => [-0.616241, 2.602712], :order => 'geodist ASC')
35
+ if ENV.fetch('SPHINX_VERSION', '2.1.2').to_f > 2.1
36
+ expected = {:mysql => 249907.171875, :postgresql => 249912.03125}
37
+ else
38
+ expected = {:mysql => 250326.906250, :postgresql => 250331.234375}
39
+ end
40
+
41
+ adapter = nil
42
+
43
+ if ActiveRecord::VERSION::STRING.to_f > 6.0
44
+ adapter = ActiveRecord::Base.configurations.configs_for.first.adapter
45
+ elsif ActiveRecord::VERSION::STRING.to_f > 5.2
46
+ adapter = ActiveRecord::Base.configurations.configs_for.first.config["adapter"]
47
+ else
48
+ adapter = ActiveRecord::Base.configurations['test']['adapter']
49
+ end
50
+
51
+ if adapter[/postgres/]
52
+ expect(cities.first.geodist).to be_within(0.01).of(expected[:postgresql])
53
+ else # mysql
54
+ expect(cities.first.geodist).to be_within(0.01).of(expected[:mysql])
55
+ end
56
+ end
57
+
58
+ it "handles custom select clauses that refer to the distance" do
59
+ mel = City.create :name => 'Melbourne', :lat => -0.6599720, :lng => 2.530082
60
+ syd = City.create :name => 'Sydney', :lat => -0.5909679, :lng => 2.639131
61
+ bri = City.create :name => 'Brisbane', :lat => -0.4794031, :lng => 2.670838
62
+ index
63
+
64
+ expect(City.search(
65
+ :geo => [-0.616241, 2.602712],
66
+ :with => {:geodist => 0.0..470_000.0},
67
+ :select => "*, geodist as custom_weight"
68
+ ).to_a).to eq([mel, syd])
69
+ end
70
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'acceptance/spec_helper'
4
+
5
+ describe 'Grouping search results by attributes', :live => true do
6
+ it "groups by the provided attribute" do
7
+ snuff = Book.create! :title => 'Snuff', :publishing_year => 2011
8
+ earth = Book.create! :title => 'The Long Earth', :publishing_year => 2012
9
+ dodger = Book.create! :title => 'Dodger', :publishing_year => 2012
10
+
11
+ index
12
+
13
+ expect(Book.search(:group_by => :publishing_year).to_a).to eq([snuff, earth])
14
+ end
15
+
16
+ it "allows sorting within the group" do
17
+ snuff = Book.create! :title => 'Snuff', :publishing_year => 2011
18
+ earth = Book.create! :title => 'The Long Earth', :publishing_year => 2012
19
+ dodger = Book.create! :title => 'Dodger', :publishing_year => 2012
20
+
21
+ index
22
+
23
+ expect(Book.search(:group_by => :publishing_year, :order_group_by => 'title ASC').to_a).
24
+ to eq([snuff, dodger])
25
+ end
26
+
27
+ it "allows enumerating by count" do
28
+ snuff = Book.create! :title => 'Snuff', :publishing_year => 2011
29
+ earth = Book.create! :title => 'The Long Earth', :publishing_year => 2012
30
+ dodger = Book.create! :title => 'Dodger', :publishing_year => 2012
31
+
32
+ index
33
+
34
+ expectations = [[snuff, 1], [earth, 2]]
35
+
36
+ Book.search(:group_by => :publishing_year).each_with_count do |book, count|
37
+ expectation = expectations.shift
38
+
39
+ expect(book).to eq(expectation.first)
40
+ expect(count).to eq(expectation.last)
41
+ end
42
+ end
43
+
44
+ it "allows enumerating by group" do
45
+ snuff = Book.create! :title => 'Snuff', :publishing_year => 2011
46
+ earth = Book.create! :title => 'The Long Earth', :publishing_year => 2012
47
+ dodger = Book.create! :title => 'Dodger', :publishing_year => 2012
48
+
49
+ index
50
+
51
+ expectations = [[snuff, 2011], [earth, 2012]]
52
+
53
+ Book.search(:group_by => :publishing_year).each_with_group do |book, group|
54
+ expectation = expectations.shift
55
+
56
+ expect(book).to eq(expectation.first)
57
+ expect(group).to eq(expectation.last)
58
+ end
59
+ end
60
+
61
+ it "allows enumerating by group and count" do
62
+ snuff = Book.create! :title => 'Snuff', :publishing_year => 2011
63
+ earth = Book.create! :title => 'The Long Earth', :publishing_year => 2012
64
+ dodger = Book.create! :title => 'Dodger', :publishing_year => 2012
65
+
66
+ index
67
+
68
+ expectations = [[snuff, 2011, 1], [earth, 2012, 2]]
69
+ search = Book.search(:group_by => :publishing_year)
70
+
71
+ search.each_with_group_and_count do |book, group, count|
72
+ expectation = expectations.shift
73
+
74
+ expect(book).to eq(expectation[0])
75
+ expect(group).to eq(expectation[1])
76
+ expect(count).to eq(expectation[2])
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'acceptance/spec_helper'
4
+
5
+ describe 'Index options' do
6
+ let(:index) { ThinkingSphinx::ActiveRecord::Index.new(:article) }
7
+
8
+ %w( infix prefix ).each do |type|
9
+ context "all fields are #{type}ed" do
10
+ before :each do
11
+ index.definition_block = Proc.new {
12
+ indexes title
13
+ set_property "min_#{type}_len".to_sym => 3
14
+ }
15
+ index.render
16
+ end
17
+
18
+ it "keeps #{type}_fields blank" do
19
+ expect(index.send("#{type}_fields")).to be_nil
20
+ end
21
+
22
+ it "sets min_#{type}_len" do
23
+ expect(index.send("min_#{type}_len")).to eq(3)
24
+ end
25
+ end
26
+
27
+ context "some fields are #{type}ed" do
28
+ before :each do
29
+ index.definition_block = Proc.new {
30
+ indexes title, "#{type}es".to_sym => true
31
+ indexes content
32
+ set_property "min_#{type}_len".to_sym => 3
33
+ }
34
+ index.render
35
+ end
36
+
37
+ it "#{type}_fields should contain the field" do
38
+ expect(index.send("#{type}_fields")).to eq('title')
39
+ end
40
+
41
+ it "sets min_#{type}_len" do
42
+ expect(index.send("min_#{type}_len")).to eq(3)
43
+ end
44
+ end
45
+ end
46
+
47
+ context "multiple source definitions" do
48
+ before :each do
49
+ index.definition_block = Proc.new {
50
+ define_source do
51
+ indexes title
52
+ end
53
+
54
+ define_source do
55
+ indexes title, content
56
+ end
57
+ }
58
+ index.render
59
+ end
60
+
61
+ it "stores each source definition" do
62
+ expect(index.sources.length).to eq(2)
63
+ end
64
+
65
+ it "treats each source as separate" do
66
+ expect(index.sources.first.fields.length).to eq(2)
67
+ expect(index.sources.last.fields.length).to eq(3)
68
+ end
69
+ end
70
+
71
+ context 'wordcount fields and attributes' do
72
+ before :each do
73
+ index.definition_block = Proc.new {
74
+ indexes title, :wordcount => true
75
+
76
+ has content, :type => :wordcount
77
+ }
78
+ index.render
79
+ end
80
+
81
+ it "declares wordcount fields" do
82
+ expect(index.sources.first.sql_field_str2wordcount).to eq(['title'])
83
+ end
84
+
85
+ it "declares wordcount attributes" do
86
+ expect(index.sources.first.sql_attr_str2wordcount).to eq(['content'])
87
+ end
88
+ end
89
+
90
+ context 'respecting source options' do
91
+ before :each do
92
+ index.definition_block = Proc.new {
93
+ indexes title
94
+
95
+ set_property :sql_range_step => 5
96
+ set_property :disable_range? => true
97
+ set_property :sql_query_pre => ["DO STUFF"]
98
+ }
99
+ index.render
100
+ end
101
+
102
+ it "allows for core source settings" do
103
+ expect(index.sources.first.sql_range_step).to eq(5)
104
+ end
105
+
106
+ it "allows for source options" do
107
+ expect(index.sources.first.disable_range?).to be_truthy
108
+ end
109
+
110
+ it "respects sql_query_pre values" do
111
+ expect(index.sources.first.sql_query_pre).to include("DO STUFF")
112
+ end
113
+ end
114
+
115
+ context 'respecting index options over core configuration' do
116
+ before :each do
117
+ ThinkingSphinx::Configuration.instance.settings['min_infix_len'] = 2
118
+ ThinkingSphinx::Configuration.instance.settings['sql_range_step'] = 2
119
+
120
+ index.definition_block = Proc.new {
121
+ indexes title
122
+
123
+ set_property :min_infix_len => 1
124
+ set_property :sql_range_step => 20
125
+ }
126
+ index.render
127
+ end
128
+
129
+ after :each do
130
+ ThinkingSphinx::Configuration.instance.settings.delete 'min_infix_len'
131
+ ThinkingSphinx::Configuration.instance.settings.delete 'sql_range_step'
132
+ end
133
+
134
+ it "prioritises index-level options over YAML options" do
135
+ expect(index.min_infix_len).to eq(1)
136
+ end
137
+
138
+ it "prioritises index-level source options" do
139
+ expect(index.sources.first.sql_range_step).to eq(20)
140
+ end
141
+
142
+ it "keeps index-level options prioritised when rendered again" do
143
+ index.render
144
+
145
+ expect(index.min_infix_len).to eq(1)
146
+ end
147
+
148
+ it "keeps index-level options prioritised when rendered again" do
149
+ index.render
150
+
151
+ expect(index.sources.first.sql_range_step).to eq(20)
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'acceptance/spec_helper'
4
+
5
+ describe 'Indexing', :live => true do
6
+ it "does not index files where the temp file exists" do
7
+ path = Rails.root.join('db/sphinx/test/ts-article_core.tmp')
8
+ FileUtils.mkdir_p Rails.root.join('db/sphinx/test')
9
+ FileUtils.touch path
10
+
11
+ article = Article.create! :title => 'Pancakes'
12
+ index 'article_core'
13
+ expect(Article.search).to be_empty
14
+
15
+ FileUtils.rm path
16
+ end
17
+
18
+ it "indexes files when other indices are already being processed" do
19
+ path = Rails.root.join('db/sphinx/test/ts-book_core.tmp')
20
+ FileUtils.mkdir_p Rails.root.join('db/sphinx/test')
21
+ FileUtils.touch path
22
+
23
+ article = Article.create! :title => 'Pancakes'
24
+ index 'article_core'
25
+ expect(Article.search).not_to be_empty
26
+
27
+ FileUtils.rm path
28
+ end
29
+
30
+ it "cleans up temp files even when an exception is raised" do
31
+ FileUtils.mkdir_p Rails.root.join('db/sphinx/test')
32
+
33
+ index 'article_core'
34
+
35
+ file = Rails.root.join('db/sphinx/test/ts-article_core.tmp')
36
+ expect(File.exist?(file)).to be_falsey
37
+ end
38
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "acceptance/spec_helper"
4
+
5
+ describe "Merging deltas", :live => true do
6
+ it "merges in new records" do
7
+ guards = Book.create(
8
+ :title => "Guards! Guards!", :author => "Terry Pratchett"
9
+ )
10
+ sleep 0.25
11
+
12
+ expect(
13
+ Book.search("Terry Pratchett", :indices => ["book_delta"]).to_a
14
+ ).to eq([guards])
15
+ expect(
16
+ Book.search("Terry Pratchett", :indices => ["book_core"]).to_a
17
+ ).to be_empty
18
+
19
+ merge
20
+ guards.reload
21
+
22
+ expect(
23
+ Book.search("Terry Pratchett", :indices => ["book_core"]).to_a
24
+ ).to eq([guards])
25
+ expect(guards.delta).to eq(false)
26
+ end
27
+
28
+ it "merges in changed records" do
29
+ race = Book.create(
30
+ :title => "The Hate Space", :author => "Maxine Beneba Clarke"
31
+ )
32
+ index
33
+ expect(
34
+ Book.search("Space", :indices => ["book_core"]).to_a
35
+ ).to eq([race])
36
+
37
+ race.reload.update :title => "The Hate Race"
38
+ sleep 0.25
39
+ expect(
40
+ Book.search("Race", :indices => ["book_delta"]).to_a
41
+ ).to eq([race])
42
+ expect(
43
+ Book.search("Race", :indices => ["book_core"]).to_a
44
+ ).to be_empty
45
+
46
+ merge
47
+ race.reload
48
+
49
+ expect(
50
+ Book.search("Race", :indices => ["book_core"]).to_a
51
+ ).to eq([race])
52
+ expect(
53
+ Book.search("Race", :indices => ["book_delta"]).to_a
54
+ ).to eq([race])
55
+ expect(
56
+ Book.search("Space", :indices => ["book_core"]).to_a
57
+ ).to be_empty
58
+ expect(race.delta).to eq(false)
59
+ end
60
+
61
+ it "maintains existing records" do
62
+ race = Book.create(
63
+ :title => "The Hate Race", :author => "Maxine Beneba Clarke"
64
+ )
65
+ index
66
+
67
+ soil = Book.create(
68
+ :title => "Foreign Soil", :author => "Maxine Beneba Clarke"
69
+ )
70
+ sleep 0.25
71
+ expect(
72
+ Book.search("Soil", :indices => ["book_delta"]).to_a
73
+ ).to eq([soil])
74
+ expect(
75
+ Book.search("Soil", :indices => ["book_core"]).to_a
76
+ ).to be_empty
77
+ expect(
78
+ Book.search("Race", :indices => ["book_core"]).to_a
79
+ ).to eq([race])
80
+
81
+ merge
82
+
83
+ expect(
84
+ Book.search("Soil", :indices => ["book_core"]).to_a
85
+ ).to eq([soil])
86
+ expect(
87
+ Book.search("Race", :indices => ["book_core"]).to_a
88
+ ).to eq([race])
89
+ end
90
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'acceptance/spec_helper'
4
+
5
+ describe 'Paginating search results', :live => true do
6
+ it "tracks how many results there are in total" do
7
+ expect(Article.search.total_entries).to be_zero
8
+
9
+ 21.times { |number| Article.create :title => "Article #{number}" }
10
+ index
11
+
12
+ if ENV["SPHINX_ENGINE"] == "manticore" && ENV["SPHINX_VERSION"].to_f >= 4.0
13
+ # I suspect this is a bug in Manticore?
14
+ expect(Article.search.total_entries).to eq(22)
15
+ else
16
+ expect(Article.search.total_entries).to eq(21)
17
+ end
18
+ end
19
+
20
+ it "paginates the result set by default" do
21
+ expect(Article.search.total_entries).to be_zero
22
+
23
+ 21.times { |number| Article.create :title => "Article #{number}" }
24
+ index
25
+
26
+ expect(Article.search.length).to eq(20)
27
+ end
28
+
29
+ it "tracks the number of pages" do
30
+ expect(Article.search.total_entries).to be_zero
31
+
32
+ 21.times { |number| Article.create :title => "Article #{number}" }
33
+ index
34
+
35
+ if ENV["SPHINX_ENGINE"] == "manticore" && ENV["SPHINX_VERSION"].to_f >= 4.0
36
+ # I suspect this is a bug in Manticore?
37
+ expect(Article.search.total_pages).to eq(1)
38
+ else
39
+ expect(Article.search.total_pages).to eq(2)
40
+ end
41
+ end
42
+ end