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
@@ -1,213 +1,111 @@
1
- Dir[File.join(File.dirname(__FILE__), '../vendor/*/lib')].each do |path|
2
- $LOAD_PATH.unshift path
1
+ # frozen_string_literal: true
2
+
3
+ if RUBY_PLATFORM == 'java'
4
+ require 'java'
5
+ require 'jdbc/mysql'
6
+ Jdbc::MySQL.load_driver
7
+ else
8
+ require 'mysql2'
3
9
  end
4
10
 
5
- require 'active_record'
6
11
  require 'riddle'
7
- require 'after_commit'
8
- require 'yaml'
9
- require 'cgi'
10
-
11
- require 'thinking_sphinx/core/array'
12
- require 'thinking_sphinx/core/string'
13
- require 'thinking_sphinx/property'
14
- require 'thinking_sphinx/active_record'
15
- require 'thinking_sphinx/association'
16
- require 'thinking_sphinx/attribute'
17
- require 'thinking_sphinx/configuration'
18
- require 'thinking_sphinx/excerpter'
19
- require 'thinking_sphinx/facet'
20
- require 'thinking_sphinx/class_facet'
21
- require 'thinking_sphinx/facet_search'
22
- require 'thinking_sphinx/field'
23
- require 'thinking_sphinx/index'
24
- require 'thinking_sphinx/source'
25
- require 'thinking_sphinx/rails_additions'
26
- require 'thinking_sphinx/search'
27
- require 'thinking_sphinx/search_methods'
28
- require 'thinking_sphinx/deltas'
29
-
30
- require 'thinking_sphinx/adapters/abstract_adapter'
31
- require 'thinking_sphinx/adapters/mysql_adapter'
32
- require 'thinking_sphinx/adapters/postgresql_adapter'
33
-
34
- ActiveRecord::Base.send(:include, ThinkingSphinx::ActiveRecord)
35
-
36
- Merb::Plugins.add_rakefiles(
37
- File.join(File.dirname(__FILE__), "thinking_sphinx", "tasks")
38
- ) if defined?(Merb)
12
+ require 'riddle/2.1.0'
13
+ require 'middleware'
14
+ require 'active_record'
15
+ require 'innertube'
16
+ require 'active_support/core_ext/module/delegation'
17
+ require 'active_support/core_ext/module/attribute_accessors'
39
18
 
40
19
  module ThinkingSphinx
41
- # A ConnectionError will get thrown when a connection to Sphinx can't be
42
- # made.
43
- class ConnectionError < StandardError
44
- end
45
-
46
- # A StaleIdsException is thrown by Collection.instances_from_matches if there
47
- # are records in Sphinx but not in the database, so the search can be retried.
48
- class StaleIdsException < StandardError
49
- attr_accessor :ids
50
- def initialize(ids)
51
- self.ids = ids
52
- end
53
- end
54
-
55
- # The current version of Thinking Sphinx.
56
- #
57
- # @return [String] The version number as a string
58
- #
59
- def self.version
60
- hash = YAML.load_file File.join(File.dirname(__FILE__), '../VERSION.yml')
61
- [hash[:major], hash[:minor], hash[:patch]].join('.')
62
- end
63
-
64
- # The collection of indexed models. Keep in mind that Rails lazily loads
65
- # its classes, so this may not actually be populated with _all_ the models
66
- # that have Sphinx indexes.
67
- def self.indexed_models
68
- @@indexed_models ||= []
69
- end
70
-
71
- def self.unique_id_expression(offset = nil)
72
- "* #{ThinkingSphinx.indexed_models.size} + #{offset || 0}"
73
- end
74
-
75
- # Check if index definition is disabled.
76
- #
77
- def self.define_indexes?
78
- @@define_indexes = true unless defined?(@@define_indexes)
79
- @@define_indexes == true
80
- end
81
-
82
- # Enable/disable indexes - you may want to do this while migrating data.
83
- #
84
- # ThinkingSphinx.define_indexes = false
85
- #
86
- def self.define_indexes=(value)
87
- @@define_indexes = value
20
+ def self.count(query = '', options = {})
21
+ search_for_ids(query, options).total_entries
88
22
  end
89
23
 
90
- @@deltas_enabled = nil
91
-
92
- # Check if delta indexing is enabled.
93
- #
94
- def self.deltas_enabled?
95
- @@deltas_enabled = (ThinkingSphinx::Configuration.environment != 'test') if @@deltas_enabled.nil?
96
- @@deltas_enabled
97
- end
98
-
99
- # Enable/disable all delta indexing.
100
- #
101
- # ThinkingSphinx.deltas_enabled = false
102
- #
103
- def self.deltas_enabled=(value)
104
- @@deltas_enabled = value
24
+ def self.facets(query = '', options = {})
25
+ ThinkingSphinx::FacetSearch.new query, options
105
26
  end
106
27
 
107
- @@updates_enabled = nil
108
-
109
- # Check if updates are enabled. True by default, unless within the test
110
- # environment.
111
- #
112
- def self.updates_enabled?
113
- @@updates_enabled = (ThinkingSphinx::Configuration.environment != 'test') if @@updates_enabled.nil?
114
- @@updates_enabled
28
+ def self.search(query = '', options = {})
29
+ ThinkingSphinx::Search.new query, options
115
30
  end
116
31
 
117
- # Enable/disable updates to Sphinx
118
- #
119
- # ThinkingSphinx.updates_enabled = false
120
- #
121
- def self.updates_enabled=(value)
122
- @@updates_enabled = value
32
+ def self.search_for_ids(query = '', options = {})
33
+ search = ThinkingSphinx::Search.new query, options
34
+ ThinkingSphinx::Search::Merger.new(search).merge! nil, :ids_only => true
123
35
  end
124
36
 
125
- @@suppress_delta_output = false
126
-
127
- def self.suppress_delta_output?
128
- @@suppress_delta_output
37
+ def self.none
38
+ ThinkingSphinx::Search.new nil, :none => true
129
39
  end
130
40
 
131
- def self.suppress_delta_output=(value)
132
- @@suppress_delta_output = value
133
- end
134
-
135
- @@use_group_by_shortcut = nil
136
- # Checks to see if MySQL will allow simplistic GROUP BY statements. If not,
137
- # or if not using MySQL, this will return false.
138
- #
139
- def self.use_group_by_shortcut?
140
- @@use_group_by_shortcut ||= !!(
141
- mysql? && ::ActiveRecord::Base.connection.select_all(
142
- "SELECT @@global.sql_mode, @@session.sql_mode;"
143
- ).all? { |key,value| value.nil? || value[/ONLY_FULL_GROUP_BY/].nil? }
144
- )
41
+ def self.before_index_hooks
42
+ @before_index_hooks
145
43
  end
146
44
 
147
- @@remote_sphinx = false
45
+ @before_index_hooks = []
148
46
 
149
- # An indication of whether Sphinx is running on a remote machine instead of
150
- # the same machine.
151
- #
152
- def self.remote_sphinx?
153
- @@remote_sphinx
47
+ def self.output
48
+ @output
154
49
  end
155
50
 
156
- # Tells Thinking Sphinx that Sphinx is running on a different machine, and
157
- # thus it can't reliably guess whether it is running or not (ie: the
158
- # #sphinx_running? method), and so just assumes it is.
159
- #
160
- # Useful for multi-machine deployments. Set it in your production.rb file.
161
- #
162
- # ThinkingSphinx.remote_sphinx = true
163
- #
164
- def self.remote_sphinx=(value)
165
- @@remote_sphinx = value
166
- end
167
-
168
- # Check if Sphinx is running. If remote_sphinx is set to true (indicating
169
- # Sphinx is on a different machine), this will always return true, and you
170
- # will have to handle any connection errors yourself.
171
- #
172
- def self.sphinx_running?
173
- remote_sphinx? || sphinx_running_by_pid?
174
- end
51
+ @output = STDOUT
175
52
 
176
- # Check if Sphinx is actually running, provided the pid is on the same
177
- # machine as this code.
178
- #
179
- def self.sphinx_running_by_pid?
180
- !!sphinx_pid && pid_active?(sphinx_pid)
53
+ def self.rake_interface
54
+ @rake_interface ||= ThinkingSphinx::RakeInterface
181
55
  end
182
56
 
183
- def self.sphinx_pid
184
- if File.exists?(ThinkingSphinx::Configuration.instance.pid_file)
185
- File.read(ThinkingSphinx::Configuration.instance.pid_file)[/\d+/]
186
- else
187
- nil
188
- end
57
+ def self.rake_interface=(interface)
58
+ @rake_interface = interface
189
59
  end
190
60
 
191
- def self.pid_active?(pid)
192
- !!Process.kill(0, pid.to_i)
193
- rescue Exception => e
194
- false
195
- end
61
+ module Hooks; end
62
+ module IndexingStrategies; end
63
+ module Subscribers; end
64
+ end
196
65
 
197
- def self.microsoft?
198
- RUBY_PLATFORM =~ /mswin/
199
- end
66
+ # Core
67
+ require 'thinking_sphinx/attribute_types'
68
+ require 'thinking_sphinx/batched_search'
69
+ require 'thinking_sphinx/callbacks'
70
+ require 'thinking_sphinx/core'
71
+ require 'thinking_sphinx/with_output'
72
+ require 'thinking_sphinx/commander'
73
+ require 'thinking_sphinx/commands'
74
+ require 'thinking_sphinx/configuration'
75
+ require 'thinking_sphinx/connection'
76
+ require 'thinking_sphinx/deletion'
77
+ require 'thinking_sphinx/errors'
78
+ require 'thinking_sphinx/excerpter'
79
+ require 'thinking_sphinx/facet'
80
+ require 'thinking_sphinx/facet_search'
81
+ require 'thinking_sphinx/float_formatter'
82
+ require 'thinking_sphinx/frameworks'
83
+ require 'thinking_sphinx/guard'
84
+ require 'thinking_sphinx/hooks/guard_presence'
85
+ require 'thinking_sphinx/index'
86
+ require 'thinking_sphinx/indexing_strategies/all_at_once'
87
+ require 'thinking_sphinx/indexing_strategies/one_at_a_time'
88
+ require 'thinking_sphinx/index_set'
89
+ require 'thinking_sphinx/interfaces'
90
+ require 'thinking_sphinx/masks'
91
+ require 'thinking_sphinx/middlewares'
92
+ require 'thinking_sphinx/panes'
93
+ require 'thinking_sphinx/processor'
94
+ require 'thinking_sphinx/query'
95
+ require 'thinking_sphinx/rake_interface'
96
+ require 'thinking_sphinx/scopes'
97
+ require 'thinking_sphinx/search'
98
+ require 'thinking_sphinx/settings'
99
+ require 'thinking_sphinx/subscribers/populator_subscriber'
100
+ require 'thinking_sphinx/test'
101
+ require 'thinking_sphinx/utf8'
102
+ require 'thinking_sphinx/wildcard'
103
+ # Extended
104
+ require 'thinking_sphinx/deltas'
105
+ require 'thinking_sphinx/distributed'
106
+ require 'thinking_sphinx/logger'
107
+ require 'thinking_sphinx/real_time'
200
108
 
201
- def self.jruby?
202
- defined?(JRUBY_VERSION)
203
- end
109
+ require 'thinking_sphinx/railtie' if defined?(Rails::Railtie)
204
110
 
205
- def self.mysql?
206
- ::ActiveRecord::Base.connection.class.name.demodulize == "MysqlAdapter" ||
207
- ::ActiveRecord::Base.connection.class.name.demodulize == "MysqlplusAdapter" || (
208
- jruby? && ::ActiveRecord::Base.connection.config[:adapter] == "jdbcmysql"
209
- )
210
- end
211
-
212
- extend ThinkingSphinx::SearchMethods::ClassMethods
213
- end
111
+ ThinkingSphinx.before_index_hooks << ThinkingSphinx::Hooks::GuardPresence
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'acceptance/spec_helper'
4
+
5
+ describe 'Scoping association search calls by foreign keys', :live => true do
6
+ describe 'for ActiveRecord indices' do
7
+ it "limits results to those matching the foreign key" do
8
+ pat = User.create :name => 'Pat'
9
+ melbourne = Article.create :title => 'Guide to Melbourne', :user => pat
10
+ paul = User.create :name => 'Paul'
11
+ dublin = Article.create :title => 'Guide to Dublin', :user => paul
12
+ index
13
+
14
+ expect(pat.articles.search('Guide').to_a).to eq([melbourne])
15
+ end
16
+
17
+ it "limits id-only results to those matching the foreign key" do
18
+ pat = User.create :name => 'Pat'
19
+ melbourne = Article.create :title => 'Guide to Melbourne', :user => pat
20
+ paul = User.create :name => 'Paul'
21
+ dublin = Article.create :title => 'Guide to Dublin', :user => paul
22
+ index
23
+
24
+ expect(pat.articles.search_for_ids('Guide').to_a).to eq([melbourne.id])
25
+ end
26
+ end
27
+
28
+ describe 'for real-time indices' do
29
+ it "limits results to those matching the foreign key" do
30
+ porsche = Manufacturer.create :name => 'Porsche'
31
+ spyder = Car.create :name => '918 Spyder', :manufacturer => porsche
32
+
33
+ audi = Manufacturer.create :name => 'Audi'
34
+ r_eight = Car.create :name => 'R8 Spyder', :manufacturer => audi
35
+
36
+ expect(porsche.cars.search('Spyder').to_a).to eq([spyder])
37
+ end
38
+
39
+ it "limits id-only results to those matching the foreign key" do
40
+ porsche = Manufacturer.create :name => 'Porsche'
41
+ spyder = Car.create :name => '918 Spyder', :manufacturer => porsche
42
+
43
+ audi = Manufacturer.create :name => 'Audi'
44
+ r_eight = Car.create :name => 'R8 Spyder', :manufacturer => audi
45
+
46
+ expect(porsche.cars.search_for_ids('Spyder').to_a).to eq([spyder.id])
47
+ end
48
+ end
49
+
50
+ describe 'with has_many :through associations' do
51
+ it 'limits results to those matching the foreign key' do
52
+ pancakes = Product.create :name => 'Low fat Pancakes'
53
+ waffles = Product.create :name => 'Low fat Waffles'
54
+
55
+ food = Category.create :name => 'food'
56
+ flat = Category.create :name => 'flat'
57
+
58
+ pancakes.categories << food
59
+ pancakes.categories << flat
60
+ waffles.categories << food
61
+
62
+ expect(flat.products.search('Low').to_a).to eq([pancakes])
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'acceptance/spec_helper'
4
+
5
+ describe 'Accessing attributes directly via search results', :live => true do
6
+ it "allows access to attribute values" do
7
+ Book.create! :title => 'American Gods', :publishing_year => 2001
8
+ index
9
+
10
+ search = Book.search('gods')
11
+ search.context[:panes] << ThinkingSphinx::Panes::AttributesPane
12
+
13
+ expect(search.first.sphinx_attributes['publishing_year']).to eq(2001)
14
+ end
15
+
16
+ it "provides direct access to the search weight/relevance scores" do
17
+ Book.create! :title => 'American Gods', :publishing_year => 2001
18
+ index
19
+
20
+ search = Book.search 'gods', :select => "*, weight()"
21
+ search.context[:panes] << ThinkingSphinx::Panes::WeightPane
22
+
23
+ if ENV["SPHINX_ENGINE"] == "sphinx" && ENV["SPHINX_VERSION"].to_f > 3.3
24
+ expect(search.first.weight).to eq(20_000.0)
25
+ else
26
+ expect(search.first.weight).to eq(2500)
27
+ end
28
+ end
29
+
30
+ it "provides direct access to the weight with alternative primary keys" do
31
+ album = Album.create! :name => 'Sing to the Moon', :artist => 'Laura Mvula'
32
+
33
+ search = Album.search 'sing', :select => "*, weight()"
34
+ search.context[:panes] << ThinkingSphinx::Panes::WeightPane
35
+
36
+ expect(search.first.weight).to be >= 1000
37
+ end
38
+
39
+ it "can enumerate with the weight" do
40
+ gods = Book.create! :title => 'American Gods', :publishing_year => 2001
41
+ index
42
+
43
+ search = Book.search 'gods', :select => "*, weight()"
44
+ search.masks << ThinkingSphinx::Masks::WeightEnumeratorMask
45
+
46
+ if ENV["SPHINX_ENGINE"] == "sphinx" && ENV["SPHINX_VERSION"].to_f > 3.3
47
+ expectations = [[gods, 20_000.0]]
48
+ else
49
+ expectations = [[gods, 2500]]
50
+ end
51
+ search.each_with_weight do |result, weight|
52
+ expectation = expectations.shift
53
+
54
+ expect(result).to eq(expectation.first)
55
+ expect(weight).to eq(expectation.last)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'acceptance/spec_helper'
4
+
5
+ describe 'Update attributes automatically where possible', :live => true do
6
+ it "updates boolean values" do
7
+ article = Article.create :title => 'Pancakes', :published => false
8
+ index
9
+
10
+ expect(Article.search('pancakes', :with => {:published => true})).to be_empty
11
+
12
+ article.published = true
13
+ article.save
14
+
15
+ expect(Article.search('pancakes', :with => {:published => true}).to_a)
16
+ .to eq([article])
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'acceptance/spec_helper'
4
+
5
+ describe 'Executing multiple searches in one Sphinx call', :live => true do
6
+ it "returns results matching the given queries" do
7
+ pancakes = Article.create! :title => 'Pancakes'
8
+ waffles = Article.create! :title => 'Waffles'
9
+ index
10
+
11
+ batch = ThinkingSphinx::BatchedSearch.new
12
+ batch.searches << Article.search('pancakes')
13
+ batch.searches << Article.search('waffles')
14
+
15
+ batch.populate
16
+
17
+ expect(batch.searches.first).to include(pancakes)
18
+ expect(batch.searches.first).not_to include(waffles)
19
+
20
+ expect(batch.searches.last).to include(waffles)
21
+ expect(batch.searches.last).not_to include(pancakes)
22
+ end
23
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'acceptance/spec_helper'
4
+
5
+ describe '64 bit integer support' do
6
+ it "ensures all internal id attributes are big ints if one is" do
7
+ large_index = ThinkingSphinx::ActiveRecord::Index.new(:tweet)
8
+ large_index.definition_block = Proc.new {
9
+ indexes text
10
+ }
11
+
12
+ small_index = ThinkingSphinx::ActiveRecord::Index.new(:article)
13
+ small_index.definition_block = Proc.new {
14
+ indexes title
15
+ }
16
+
17
+ real_time_index = ThinkingSphinx::RealTime::Index.new(:product)
18
+ real_time_index.definition_block = Proc.new {
19
+ indexes name
20
+ }
21
+
22
+ ThinkingSphinx::Configuration::ConsistentIds.new(
23
+ [small_index, large_index, real_time_index]
24
+ ).reconcile
25
+
26
+ expect(large_index.sources.first.attributes.detect { |attribute|
27
+ attribute.name == 'sphinx_internal_id'
28
+ }.type).to eq(:bigint)
29
+
30
+ expect(small_index.sources.first.attributes.detect { |attribute|
31
+ attribute.name == 'sphinx_internal_id'
32
+ }.type).to eq(:bigint)
33
+
34
+ expect(real_time_index.attributes.detect { |attribute|
35
+ attribute.name == 'sphinx_internal_id'
36
+ }.type).to eq(:bigint)
37
+ end
38
+ end
39
+
40
+ describe '64 bit document ids', :live => true do
41
+ context 'with ActiveRecord' do
42
+ it 'handles large 32 bit integers with an offset multiplier' do
43
+ user = User.create! :name => 'Pat'
44
+ user.update_column :id, 980190962
45
+
46
+ index
47
+
48
+ expect(User.search('pat').to_a).to eq([user])
49
+ end
50
+ end
51
+
52
+ context 'with Real-Time' do
53
+ it 'handles large 32 bit integers with an offset multiplier' do
54
+ product = Product.create! :name => "Widget"
55
+ product.update :id => 980190962
56
+ expect(
57
+ Product.search('widget', :indices => ['product_core']).to_a
58
+ ).to eq([product])
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require 'acceptance/spec_helper'
5
+
6
+ describe 'Accessing excerpts for methods on a search result', :live => true do
7
+ it "returns excerpts for a given method" do
8
+ Book.create! :title => 'American Gods', :publishing_year => 2001
9
+ index
10
+
11
+ search = Book.search('gods')
12
+ search.context[:panes] << ThinkingSphinx::Panes::ExcerptsPane
13
+
14
+ expect(search.first.excerpts.title).
15
+ to eq('American <span class="match">Gods</span>')
16
+ end
17
+
18
+ it "handles UTF-8 text for excerpts" do
19
+ Book.create! :title => 'Война и миръ', :publishing_year => 1869
20
+ index
21
+
22
+ search = Book.search 'миръ'
23
+ search.context[:panes] << ThinkingSphinx::Panes::ExcerptsPane
24
+
25
+ expect(search.first.excerpts.title).
26
+ to eq('Война и <span class="match">миръ</span>')
27
+ end if ENV['SPHINX_VERSION'].try :[], /2.2.\d/
28
+
29
+ it "does not include class names in excerpts" do
30
+ Book.create! :title => 'The Graveyard Book'
31
+ index
32
+
33
+ search = Book.search('graveyard')
34
+ search.context[:panes] << ThinkingSphinx::Panes::ExcerptsPane
35
+
36
+ expect(search.first.excerpts.title).
37
+ to eq('The <span class="match">Graveyard</span> Book')
38
+ end
39
+
40
+ it "respects the star option with queries" do
41
+ Article.create! :title => 'Something'
42
+ index
43
+
44
+ search = Article.search('thin', :star => true)
45
+ search.context[:panes] << ThinkingSphinx::Panes::ExcerptsPane
46
+
47
+ expect(search.first.excerpts.title).
48
+ to eq('<span class="match">Something</span>')
49
+ end
50
+ end