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,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Manufacturer < ActiveRecord::Base
4
+ has_many :cars
5
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Product < ActiveRecord::Base
4
+ has_many :categorisations
5
+ has_many :categories, :through => :categorisations
6
+
7
+ ThinkingSphinx::Callbacks.append(self, :behaviours => [:real_time])
8
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Tag < ActiveRecord::Base
4
+ has_many :taggings
5
+ has_many :articles, :through => :taggings
6
+ end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Tagging < ActiveRecord::Base
2
4
  belongs_to :tag
3
- belongs_to :taggable, :polymorphic => true
5
+ belongs_to :article
4
6
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Tee < ActiveRecord::Base
4
+ belongs_to :colour
5
+
6
+ ThinkingSphinx::Callbacks.append(self, :behaviours => [:sql])
7
+ ThinkingSphinx::Callbacks.append(
8
+ self, behaviours: [:sql, :deltas], :path => [:colour]
9
+ )
10
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Tweet < ActiveRecord::Base
4
+ self.primary_key = :id
5
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class User < ActiveRecord::Base
4
+ has_many :articles
5
+
6
+ ThinkingSphinx::Callbacks.append(self, :behaviours => [:sql])
7
+
8
+ default_scope { order(:id) }
9
+ scope :recent, lambda { where('created_at > ?', 1.week.ago) }
10
+ end
@@ -0,0 +1,17 @@
1
+ test:
2
+ adapter: <%= ENV['DATABASE'] || 'mysql2' %>
3
+ database: thinking_sphinx
4
+ username: <%= ENV['DATABASE'] == 'postgresql' ? 'postgres' : 'root' %>
5
+ <% if ENV["DATABASE_PASSWORD"] %>
6
+ password: <%= ENV["DATABASE_PASSWORD"] %>
7
+ <% end %>
8
+ <% if ENV["DATABASE_PORT"] %>
9
+ host: 127.0.0.1
10
+ port: <%= ENV["DATABASE_PORT"] %>
11
+ <% elsif ENV["CI"] %>
12
+ password: thinking_sphinx
13
+ host: 127.0.0.1
14
+ port: <%= ENV['DATABASE'] == 'postgresql' ? 5432 : 3306 %>
15
+ <% end %>
16
+ min_messages: warning
17
+ encoding: utf8
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Schema.define do
4
+ create_table(:admin_people, :force => true) do |t|
5
+ t.string :name
6
+ t.timestamps null: false
7
+ end
8
+
9
+ create_table(:albums, :force => true, :id => false) do |t|
10
+ t.string :id
11
+ t.integer :integer_id
12
+ t.string :name
13
+ t.string :artist
14
+ t.boolean :delta, :default => true, :null => false
15
+ end
16
+
17
+ create_table(:animals, :force => true) do |t|
18
+ t.string :name
19
+ t.string :type
20
+ end
21
+
22
+ create_table(:articles, :force => true) do |t|
23
+ t.string :title
24
+ t.text :content
25
+ t.boolean :published
26
+ t.integer :user_id
27
+ t.timestamps null: false
28
+ end
29
+
30
+ create_table(:manufacturers, :force => true) do |t|
31
+ t.string :name
32
+ end
33
+
34
+ create_table(:cars, :force => true) do |t|
35
+ t.integer :manufacturer_id
36
+ t.string :name
37
+ end
38
+
39
+ create_table(:books, :force => true) do |t|
40
+ t.string :title
41
+ t.string :author
42
+ t.integer :publishing_year
43
+ t.string :blurb_file
44
+ t.boolean :delta, :default => true, :null => false
45
+ t.string :type, :default => 'Book', :null => false
46
+ t.timestamps null: false
47
+ end
48
+
49
+ create_table(:books_genres, :force => true, :id => false) do |t|
50
+ t.integer :book_id
51
+ t.integer :genre_id
52
+ end
53
+
54
+ create_table(:categories, :force => true) do |t|
55
+ t.string :name
56
+ end
57
+
58
+ create_table(:categorisations, :force => true) do |t|
59
+ t.integer :category_id
60
+ t.integer :product_id
61
+ end
62
+
63
+ create_table(:cities, :force => true) do |t|
64
+ t.string :name
65
+ t.float :lat
66
+ t.float :lng
67
+ end
68
+
69
+ create_table(:colours, :force => true) do |t|
70
+ t.string :name
71
+ t.boolean :delta, :null => false, :default => true
72
+ t.timestamps null: false
73
+ end
74
+
75
+ create_table(:events, :force => true) do |t|
76
+ t.string :eventable_type
77
+ t.integer :eventable_id
78
+ end
79
+
80
+ create_table(:genres, :force => true) do |t|
81
+ t.string :name
82
+ end
83
+
84
+ create_table(:products, :force => true) do |t|
85
+ t.string :name
86
+ t.json :options if ::JSONColumn.call
87
+ end
88
+
89
+ create_table(:taggings, :force => true) do |t|
90
+ t.integer :tag_id
91
+ t.integer :article_id
92
+ t.timestamps null: false
93
+ end
94
+
95
+ create_table(:tags, :force => true) do |t|
96
+ t.string :name
97
+ t.timestamps null: false
98
+ end
99
+
100
+ create_table(:tees, :force => true) do |t|
101
+ t.integer :colour_id
102
+ t.timestamps null: false
103
+ end
104
+
105
+ create_table(:tweets, :force => true, :id => false) do |t|
106
+ t.column :id, :bigint, :null => false
107
+ t.string :text
108
+ t.timestamps null: false
109
+ end
110
+
111
+ create_table(:users, :force => true) do |t|
112
+ t.string :name
113
+ t.timestamps null: false
114
+ end
115
+ end
File without changes
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ require 'logger'
6
+
7
+ Bundler.require :default, :development
8
+
9
+ root = File.expand_path File.dirname(__FILE__)
10
+ require "#{root}/support/multi_schema"
11
+ require "#{root}/support/json_column"
12
+ require "#{root}/support/mysql"
13
+ require 'thinking_sphinx/railtie'
14
+
15
+ Combustion.initialize! :active_record
16
+
17
+ MultiSchema.new.create 'thinking_sphinx'
18
+
19
+ require "#{root}/support/sphinx_yaml_helpers"
20
+
21
+ RSpec.configure do |config|
22
+ # enable filtering for examples
23
+ config.filter_run :wip => nil
24
+ config.run_all_when_everything_filtered = true
25
+
26
+ config.around :each, :live do |example|
27
+ example.run_with_retry :retry => 3
28
+ end
29
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ class JSONColumn
4
+ include ActiveRecord::ConnectionAdapters
5
+
6
+ def self.call
7
+ new.call
8
+ end
9
+
10
+ def call
11
+ ruby? && postgresql? && column?
12
+ end
13
+
14
+ private
15
+
16
+ def column?
17
+ (
18
+ ActiveRecord::ConnectionAdapters.constants.include?(:PostgreSQLAdapter) &&
19
+ PostgreSQLAdapter.constants.include?(:TableDefinition) &&
20
+ PostgreSQLAdapter::TableDefinition.instance_methods.include?(:json)
21
+ ) || (
22
+ ActiveRecord::ConnectionAdapters.constants.include?(:PostgreSQL) &&
23
+ PostgreSQL.constants.include?(:ColumnMethods) &&
24
+ PostgreSQL::ColumnMethods.instance_methods.include?(:json)
25
+ )
26
+ end
27
+
28
+ def postgresql?
29
+ ENV['DATABASE'] == 'postgresql'
30
+ end
31
+
32
+ def ruby?
33
+ RUBY_PLATFORM != 'java'
34
+ end
35
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MultiSchema
4
+ def active?
5
+ ENV['DATABASE'] == 'postgresql'
6
+ end
7
+
8
+ def create(schema_name)
9
+ return unless active?
10
+
11
+ unless connection.schema_exists? schema_name
12
+ connection.execute %Q{CREATE SCHEMA "#{schema_name}"}
13
+ end
14
+
15
+ switch schema_name
16
+ load Rails.root.join('db', 'schema.rb')
17
+ end
18
+
19
+ def current
20
+ connection.schema_search_path
21
+ end
22
+
23
+ def switch(schema_name)
24
+ connection.schema_search_path = %Q{"#{schema_name}"}
25
+ connection.clear_query_cache
26
+ end
27
+
28
+ private
29
+
30
+ def connection
31
+ ActiveRecord::Base.connection
32
+ end
33
+
34
+ class IndexSet < ThinkingSphinx::IndexSet
35
+ private
36
+
37
+ def indices
38
+ return super if index_names.any?
39
+
40
+ prefixed = !multi_schema.current.include?('public')
41
+ super.select { |index|
42
+ prefixed ? index.name[/_two_core$/] : index.name[/_two_core$/].nil?
43
+ }
44
+ end
45
+
46
+ def multi_schema
47
+ @multi_schema ||= MultiSchema.new
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # New versions of MySQL don't allow NULL values for primary keys, but old
4
+ # versions of Rails do. To use both at the same time, we need to update Rails'
5
+ # default primary key type to no longer have a default NULL value.
6
+ #
7
+ class PatchAdapter
8
+ def call
9
+ return unless using_mysql? && using_rails_pre_4_1?
10
+
11
+ require 'active_record/connection_adapters/abstract_mysql_adapter'
12
+ ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::
13
+ NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
14
+ end
15
+
16
+ def using_mysql?
17
+ ENV.fetch('DATABASE', 'mysql2') == 'mysql2'
18
+ end
19
+
20
+ def using_rails_pre_4_1?
21
+ ActiveRecord::VERSION::STRING.to_f < 4.1
22
+ end
23
+ end
24
+
25
+ PatchAdapter.new.call
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SphinxYamlHelpers
4
+ def write_configuration(hash)
5
+ allow(File).to receive(:read).and_return({'test' => hash}.to_yaml)
6
+ allow(File).to receive(:exist?).and_wrap_original do |original, path|
7
+ next true if path.to_s == File.absolute_path("config/thinking_sphinx.yml", Rails.root.to_s)
8
+
9
+ original.call(path)
10
+ end
11
+ end
12
+ end
13
+
14
+ RSpec.configure do |config|
15
+ config.include SphinxYamlHelpers
16
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::ActiveRecord::Association do
6
+ let(:association) { ThinkingSphinx::ActiveRecord::Association.new column }
7
+ let(:column) { double('column', :__stack => [:users], :__name => :post) }
8
+
9
+ describe '#stack' do
10
+ it "returns the column's stack and name" do
11
+ expect(association.stack).to eq([:users, :post])
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,165 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ThinkingSphinx
4
+ module ActiveRecord
5
+ class Attribute; end
6
+ end
7
+ end
8
+
9
+ require 'thinking_sphinx/errors'
10
+ require 'thinking_sphinx/active_record/attribute/type'
11
+
12
+ describe ThinkingSphinx::ActiveRecord::Attribute::Type do
13
+ let(:type) {
14
+ ThinkingSphinx::ActiveRecord::Attribute::Type.new attribute, model }
15
+ let(:attribute) { double('attribute', :columns => [column], :options => {}) }
16
+ let(:model) { double('model', :columns => [db_column]) }
17
+ let(:column) { double('column', :__name => :created_at, :string? => false,
18
+ :__stack => []) }
19
+ let(:db_column) { double('column', :name => 'created_at',
20
+ :type => :integer) }
21
+
22
+ describe '#multi?' do
23
+ let(:association) { double('association', :klass => double) }
24
+
25
+ before :each do
26
+ column.__stack << :foo
27
+
28
+ allow(model).to receive(:reflect_on_association).and_return(association)
29
+ end
30
+
31
+ it "returns true if there are has_many associations" do
32
+ allow(association).to receive(:macro).and_return(:has_many)
33
+
34
+ expect(type).to be_multi
35
+ end
36
+
37
+ it "returns true if there are has_and_belongs_to_many associations" do
38
+ allow(association).to receive(:macro).and_return(:has_and_belongs_to_many)
39
+
40
+ expect(type).to be_multi
41
+ end
42
+
43
+ it "returns false if there are no associations" do
44
+ column.__stack.clear
45
+
46
+ expect(type).not_to be_multi
47
+ end
48
+
49
+ it "returns false if there are only belongs_to associations" do
50
+ allow(association).to receive(:macro).and_return(:belongs_to)
51
+
52
+ expect(type).not_to be_multi
53
+ end
54
+
55
+ it "returns false if there are only has_one associations" do
56
+ allow(association).to receive(:macro).and_return(:has_one)
57
+
58
+ expect(type).not_to be_multi
59
+ end
60
+
61
+ it "returns true if deeper associations have many" do
62
+ column.__stack << :bar
63
+ deep_association = double(:klass => double, :macro => :has_many)
64
+
65
+ allow(association).to receive(:macro).and_return(:belongs_to)
66
+ allow(association).to receive(:klass).and_return(
67
+ double(:reflect_on_association => deep_association)
68
+ )
69
+
70
+ expect(type).to be_multi
71
+ end
72
+
73
+ it "respects the provided setting" do
74
+ attribute.options[:multi] = true
75
+
76
+ expect(type).to be_multi
77
+ end
78
+ end
79
+
80
+ describe '#type' do
81
+ it "returns the type option provided" do
82
+ attribute.options[:type] = :datetime
83
+
84
+ expect(type.type).to eq(:datetime)
85
+ end
86
+
87
+ it "detects integer types from the database" do
88
+ allow(db_column).to receive_messages(:type => :integer, :sql_type => 'integer(11)')
89
+
90
+ expect(type.type).to eq(:integer)
91
+ end
92
+
93
+ it "detects boolean types from the database" do
94
+ allow(db_column).to receive_messages(:type => :boolean)
95
+
96
+ expect(type.type).to eq(:boolean)
97
+ end
98
+
99
+ it "detects datetime types from the database as timestamps" do
100
+ allow(db_column).to receive_messages(:type => :datetime)
101
+
102
+ expect(type.type).to eq(:timestamp)
103
+ end
104
+
105
+ it "detects date types from the database as timestamps" do
106
+ allow(db_column).to receive_messages(:type => :date)
107
+
108
+ expect(type.type).to eq(:timestamp)
109
+ end
110
+
111
+ it "detects string types from the database" do
112
+ allow(db_column).to receive_messages(:type => :string)
113
+
114
+ expect(type.type).to eq(:string)
115
+ end
116
+
117
+ it "detects text types from the database as strings" do
118
+ allow(db_column).to receive_messages(:type => :text)
119
+
120
+ expect(type.type).to eq(:string)
121
+ end
122
+
123
+ it "detects float types from the database" do
124
+ allow(db_column).to receive_messages(:type => :float)
125
+
126
+ expect(type.type).to eq(:float)
127
+ end
128
+
129
+ it "detects decimal types from the database as floats" do
130
+ allow(db_column).to receive_messages(:type => :decimal)
131
+
132
+ expect(type.type).to eq(:float)
133
+ end
134
+
135
+ it "detects big ints as big ints" do
136
+ allow(db_column).to receive_messages :type => :bigint
137
+
138
+ expect(type.type).to eq(:bigint)
139
+ end
140
+
141
+ it "detects large integers as big ints" do
142
+ allow(db_column).to receive_messages :type => :integer, :sql_type => 'bigint(20)'
143
+
144
+ expect(type.type).to eq(:bigint)
145
+ end
146
+
147
+ it "detects JSON" do
148
+ allow(db_column).to receive_messages :type => :json
149
+
150
+ expect(type.type).to eq(:json)
151
+ end
152
+
153
+ it "respects provided type setting" do
154
+ attribute.options[:type] = :timestamp
155
+
156
+ expect(type.type).to eq(:timestamp)
157
+ end
158
+
159
+ it 'raises an error if the database column does not exist' do
160
+ model.columns.clear
161
+
162
+ expect { type.type }.to raise_error(ThinkingSphinx::MissingColumnError)
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::ActiveRecord::Base do
6
+ let(:model) {
7
+ Class.new(ActiveRecord::Base) do
8
+ include ThinkingSphinx::ActiveRecord::Base
9
+
10
+ def self.name; 'Model'; end
11
+ end
12
+ }
13
+ let(:sub_model) {
14
+ Class.new(model) do
15
+ def self.name; 'SubModel'; end
16
+ end
17
+ }
18
+
19
+ describe '.facets' do
20
+ it "returns a new search object" do
21
+ expect(model.facets).to be_a(ThinkingSphinx::FacetSearch)
22
+ end
23
+
24
+ it "passes through arguments to the search object" do
25
+ expect(model.facets('pancakes').query).to eq('pancakes')
26
+ end
27
+
28
+ it "scopes the search to a given model" do
29
+ expect(model.facets('pancakes').options[:classes]).to eq([model])
30
+ end
31
+
32
+ it "merges the :classes option with the model" do
33
+ expect(model.facets('pancakes', :classes => [sub_model]).
34
+ options[:classes]).to eq([sub_model, model])
35
+ end
36
+
37
+ it "applies the default scope if there is one" do
38
+ allow(model).to receive_messages :default_sphinx_scope => :default,
39
+ :sphinx_scopes => {:default => Proc.new { {:order => :created_at} }}
40
+
41
+ expect(model.facets.options[:order]).to eq(:created_at)
42
+ end
43
+
44
+ it "does not apply a default scope if one is not set" do
45
+ allow(model).to receive_messages :default_sphinx_scope => nil,
46
+ :default => {:order => :created_at}
47
+
48
+ expect(model.facets.options[:order]).to be_nil
49
+ end
50
+ end
51
+
52
+ describe '.search' do
53
+ let(:stack) { double('stack', :call => true) }
54
+
55
+ before :each do
56
+ stub_const 'ThinkingSphinx::Middlewares::DEFAULT', stack
57
+ end
58
+
59
+ it "returns a new search object" do
60
+ expect(model.search).to be_a(ThinkingSphinx::Search)
61
+ end
62
+
63
+ it "passes through arguments to the search object" do
64
+ expect(model.search('pancakes').query).to eq('pancakes')
65
+ end
66
+
67
+ it "scopes the search to a given model" do
68
+ expect(model.search('pancakes').options[:classes]).to eq([model])
69
+ end
70
+
71
+ it "passes through options to the search object" do
72
+ expect(model.search('pancakes', populate: true).
73
+ options[:populate]).to be_truthy
74
+ end
75
+
76
+ it "should automatically populate when :populate is set to true" do
77
+ expect(stack).to receive(:call).and_return(true)
78
+
79
+ model.search('pancakes', populate: true)
80
+ end
81
+
82
+ it "merges the :classes option with the model" do
83
+ expect(model.search('pancakes', :classes => [sub_model]).
84
+ options[:classes]).to eq([sub_model, model])
85
+ end
86
+
87
+ it "respects provided middleware" do
88
+ expect(model.search(:middleware => ThinkingSphinx::Middlewares::RAW_ONLY).
89
+ options[:middleware]).to eq(ThinkingSphinx::Middlewares::RAW_ONLY)
90
+ end
91
+
92
+ it "respects provided masks" do
93
+ expect(model.search(:masks => [ThinkingSphinx::Masks::PaginationMask]).
94
+ masks).to eq([ThinkingSphinx::Masks::PaginationMask])
95
+ end
96
+
97
+ it "applies the default scope if there is one" do
98
+ allow(model).to receive_messages :default_sphinx_scope => :default,
99
+ :sphinx_scopes => {:default => Proc.new { {:order => :created_at} }}
100
+
101
+ expect(model.search.options[:order]).to eq(:created_at)
102
+ end
103
+
104
+ it "does not apply a default scope if one is not set" do
105
+ allow(model).to receive_messages :default_sphinx_scope => nil,
106
+ :default => {:order => :created_at}
107
+
108
+ expect(model.search.options[:order]).to be_nil
109
+ end
110
+ end
111
+
112
+ describe '.search_count' do
113
+ let(:search) { double('search', :options => {}, :total_entries => 12,
114
+ :populated? => false) }
115
+
116
+ before :each do
117
+ allow(ThinkingSphinx).to receive_messages :search => search
118
+ allow(FileUtils).to receive_messages :mkdir_p => true
119
+ end
120
+
121
+ it "returns the search object's total entries count" do
122
+ expect(model.search_count).to eq(search.total_entries)
123
+ end
124
+
125
+ it "scopes the search to a given model" do
126
+ model.search_count
127
+
128
+ expect(search.options[:classes]).to eq([model])
129
+ end
130
+ end
131
+ end