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,662 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ThinkingSphinx::ActiveRecord::SQLBuilder do
6
+ let(:source) { double('source', :model => model, :offset => 3,
7
+ :fields => [], :attributes => [], :disable_range? => false,
8
+ :delta_processor => nil, :conditions => [], :groupings => [],
9
+ :adapter => adapter, :associations => [], :primary_key => :id,
10
+ :options => {}, :properties => []) }
11
+ let(:model) { double('model', :connection => connection,
12
+ :descends_from_active_record? => true, :column_names => [],
13
+ :inheritance_column => 'type', :unscoped => relation,
14
+ :quoted_table_name => '`users`', :name => 'User') }
15
+ let(:connection) { double('connection') }
16
+ let(:relation) { double('relation') }
17
+ let(:config) { double('config', :indices => indices, :settings => {}) }
18
+ let(:indices) { double('indices', :count => 5) }
19
+ let(:presenter) { double('presenter', :to_select => '`name` AS `name`',
20
+ :to_group => '`name`') }
21
+ let(:adapter) { double('adapter',
22
+ :time_zone_query_pre => ['SET TIME ZONE']) }
23
+ let(:associations) { double('associations', :join_values => []) }
24
+ let(:builder) { ThinkingSphinx::ActiveRecord::SQLBuilder.new source }
25
+
26
+ before :each do
27
+ allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
28
+ allow(ThinkingSphinx::ActiveRecord::PropertySQLPresenter).to receive_messages :new => presenter
29
+ allow(Joiner::Joins).to receive_messages :new => associations
30
+ allow(relation).to receive_messages :select => relation, :where => relation, :group => relation,
31
+ :order => relation, :joins => relation, :to_sql => ''
32
+ allow(connection).to receive(:quote_column_name) { |column| "`#{column}`"}
33
+ end
34
+
35
+ describe 'sql_query' do
36
+ before :each do
37
+ allow(source).to receive_messages :type => 'mysql'
38
+ end
39
+
40
+ it "adds source associations to the joins of the query" do
41
+ source.associations << double('association',
42
+ :stack => [:user, :posts], :string? => false)
43
+
44
+ expect(associations).to receive(:add_join_to).with([:user, :posts])
45
+
46
+ builder.sql_query
47
+ end
48
+
49
+ it "adds string joins directly to the relation" do
50
+ source.associations << double('association',
51
+ :to_s => 'my string', :string? => true)
52
+
53
+ expect(relation).to receive(:joins).with(['my string']).and_return(relation)
54
+
55
+ builder.sql_query
56
+ end
57
+
58
+ context 'MySQL adapter' do
59
+ before :each do
60
+ allow(source).to receive_messages :type => 'mysql'
61
+ end
62
+
63
+ it "returns the relation's query" do
64
+ allow(relation).to receive_messages :to_sql => 'SELECT * FROM people'
65
+
66
+ expect(builder.sql_query).to eq('SELECT * FROM people')
67
+ end
68
+
69
+ it "ensures results aren't from cache" do
70
+ expect(relation).to receive(:select) do |string|
71
+ expect(string).to match(/^SQL_NO_CACHE /)
72
+ relation
73
+ end
74
+
75
+ builder.sql_query
76
+ end
77
+
78
+ it "adds the document id using the offset and index count" do
79
+ expect(relation).to receive(:select) do |string|
80
+ expect(string).to match(/`users`.`id` \* 5 \+ 3 AS `id`/)
81
+ relation
82
+ end
83
+
84
+ builder.sql_query
85
+ end
86
+
87
+ it "adds each field to the SELECT clause" do
88
+ source.fields << double('field')
89
+
90
+ expect(relation).to receive(:select) do |string|
91
+ expect(string).to match(/`name` AS `name`/)
92
+ relation
93
+ end
94
+
95
+ builder.sql_query
96
+ end
97
+
98
+ it "adds each attribute to the SELECT clause" do
99
+ source.attributes << double('attribute')
100
+ allow(presenter).to receive_messages(:to_select => '`created_at` AS `created_at`')
101
+
102
+ expect(relation).to receive(:select) do |string|
103
+ expect(string).to match(/`created_at` AS `created_at`/)
104
+ relation
105
+ end
106
+
107
+ builder.sql_query
108
+ end
109
+
110
+ it "limits results to a set range" do
111
+ expect(relation).to receive(:where) do |string|
112
+ expect(string).to match(/`users`.`id` BETWEEN \$start AND \$end/)
113
+ relation
114
+ end
115
+
116
+ builder.sql_query
117
+ end
118
+
119
+ it "shouldn't limit results to a range if ranges are disabled" do
120
+ allow(source).to receive_messages :disable_range? => true
121
+
122
+ expect(relation).to receive(:where) do |string|
123
+ expect(string).not_to match(/`users`.`id` BETWEEN \$start AND \$end/)
124
+ relation
125
+ end
126
+
127
+ builder.sql_query
128
+ end
129
+
130
+ it "adds source conditions" do
131
+ source.conditions << 'created_at > NOW()'
132
+
133
+ expect(relation).to receive(:where) do |string|
134
+ expect(string).to match(/created_at > NOW()/)
135
+ relation
136
+ end
137
+
138
+ builder.sql_query
139
+ end
140
+
141
+ it "groups by the primary key" do
142
+ expect(relation).to receive(:group) do |string|
143
+ expect(string).to match(/`users`.`id`/)
144
+ relation
145
+ end
146
+
147
+ builder.sql_query
148
+ end
149
+
150
+ it "groups each field" do
151
+ source.fields << double('field')
152
+
153
+ expect(relation).to receive(:group) do |string|
154
+ expect(string).to match(/`name`/)
155
+ relation
156
+ end
157
+
158
+ builder.sql_query
159
+ end
160
+
161
+ it "groups each attribute" do
162
+ source.attributes << double('attribute')
163
+ allow(presenter).to receive_messages(:to_group => '`created_at`')
164
+
165
+ expect(relation).to receive(:group) do |string|
166
+ expect(string).to match(/`created_at`/)
167
+ relation
168
+ end
169
+
170
+ builder.sql_query
171
+ end
172
+
173
+ it "groups by source groupings" do
174
+ source.groupings << '`latitude`'
175
+
176
+ expect(relation).to receive(:group) do |string|
177
+ expect(string).to match(/`latitude`/)
178
+ relation
179
+ end
180
+
181
+ builder.sql_query
182
+ end
183
+
184
+ it "orders by NULL" do
185
+ expect(relation).to receive(:order).with('NULL').and_return(relation)
186
+
187
+ builder.sql_query
188
+ end
189
+
190
+ context 'STI model' do
191
+ before :each do
192
+ model.column_names << 'type'
193
+ allow(model).to receive_messages :descends_from_active_record? => false
194
+ allow(model).to receive_messages :store_full_sti_class => true
195
+ end
196
+
197
+ it "groups by the inheritance column" do
198
+ expect(relation).to receive(:group) do |string|
199
+ expect(string).to match(/`users`.`type`/)
200
+ relation
201
+ end
202
+
203
+ builder.sql_query
204
+ end
205
+
206
+ context 'with a custom inheritance column' do
207
+ before :each do
208
+ model.column_names << 'custom_type'
209
+ allow(model).to receive_messages :inheritance_column => 'custom_type'
210
+ end
211
+
212
+ it "groups by the right column" do
213
+ expect(relation).to receive(:group) do |string|
214
+ expect(string).to match(/`users`.`custom_type`/)
215
+ relation
216
+ end
217
+
218
+ builder.sql_query
219
+ end
220
+ end
221
+ end
222
+
223
+ context 'with a delta processor' do
224
+ let(:processor) { double('processor') }
225
+
226
+ before :each do
227
+ allow(source).to receive_messages :delta_processor => processor
228
+ allow(source).to receive_messages :delta? => true
229
+ end
230
+
231
+ it "filters by the provided clause" do
232
+ expect(processor).to receive(:clause).with(true).and_return('`delta` = 1')
233
+ expect(relation).to receive(:where) do |string|
234
+ expect(string).to match(/`delta` = 1/)
235
+ relation
236
+ end
237
+
238
+ builder.sql_query
239
+ end
240
+ end
241
+ end
242
+
243
+ context 'PostgreSQL adapter' do
244
+ let(:presenter) { double('presenter', :to_select => '"name" AS "name"',
245
+ :to_group => '"name"') }
246
+
247
+ before :each do
248
+ allow(source).to receive_messages :type => 'pgsql'
249
+ allow(model).to receive_messages :quoted_table_name => '"users"'
250
+ allow(connection).to receive(:quote_column_name) { |column| "\"#{column}\""}
251
+ end
252
+
253
+ it "returns the relation's query" do
254
+ allow(relation).to receive_messages :to_sql => 'SELECT * FROM people'
255
+
256
+ expect(builder.sql_query).to eq('SELECT * FROM people')
257
+ end
258
+
259
+ it "adds the document id using the offset and index count" do
260
+ expect(relation).to receive(:select) do |string|
261
+ expect(string).to match(/"users"."id" \* 5 \+ 3 AS "id"/)
262
+ relation
263
+ end
264
+
265
+ builder.sql_query
266
+ end
267
+
268
+ it "adds each field to the SELECT clause" do
269
+ source.fields << double('field')
270
+
271
+ expect(relation).to receive(:select) do |string|
272
+ expect(string).to match(/"name" AS "name"/)
273
+ relation
274
+ end
275
+
276
+ builder.sql_query
277
+ end
278
+
279
+ it "adds each attribute to the SELECT clause" do
280
+ source.attributes << double('attribute')
281
+ allow(presenter).to receive_messages(:to_select => '"created_at" AS "created_at"')
282
+
283
+ expect(relation).to receive(:select) do |string|
284
+ expect(string).to match(/"created_at" AS "created_at"/)
285
+ relation
286
+ end
287
+
288
+ builder.sql_query
289
+ end
290
+
291
+ it "limits results to a set range" do
292
+ expect(relation).to receive(:where) do |string|
293
+ expect(string).to match(/"users"."id" BETWEEN \$start AND \$end/)
294
+ relation
295
+ end
296
+
297
+ builder.sql_query
298
+ end
299
+
300
+ it "shouldn't limit results to a range if ranges are disabled" do
301
+ allow(source).to receive_messages :disable_range? => true
302
+
303
+ expect(relation).to receive(:where) do |string|
304
+ expect(string).not_to match(/"users"."id" BETWEEN \$start AND \$end/)
305
+ relation
306
+ end
307
+
308
+ builder.sql_query
309
+ end
310
+
311
+ it "adds source conditions" do
312
+ source.conditions << 'created_at > NOW()'
313
+
314
+ expect(relation).to receive(:where) do |string|
315
+ expect(string).to match(/created_at > NOW()/)
316
+ relation
317
+ end
318
+
319
+ builder.sql_query
320
+ end
321
+
322
+ it "groups by the primary key" do
323
+ expect(relation).to receive(:group) do |string|
324
+ expect(string).to match(/"users"."id"/)
325
+ relation
326
+ end
327
+
328
+ builder.sql_query
329
+ end
330
+
331
+ it "groups each field" do
332
+ source.fields << double('field')
333
+
334
+ expect(relation).to receive(:group) do |string|
335
+ expect(string).to match(/"name"/)
336
+ relation
337
+ end
338
+
339
+ builder.sql_query
340
+ end
341
+
342
+ it "groups each attribute" do
343
+ source.attributes << double('attribute')
344
+ allow(presenter).to receive_messages(:to_group => '"created_at"')
345
+
346
+ expect(relation).to receive(:group) do |string|
347
+ expect(string).to match(/"created_at"/)
348
+ relation
349
+ end
350
+
351
+ builder.sql_query
352
+ end
353
+
354
+ it "groups by source groupings" do
355
+ source.groupings << '"latitude"'
356
+
357
+ expect(relation).to receive(:group) do |string|
358
+ expect(string).to match(/"latitude"/)
359
+ relation
360
+ end
361
+
362
+ builder.sql_query
363
+ end
364
+
365
+ it "has no ORDER clause" do
366
+ expect(relation).not_to receive(:order)
367
+
368
+ builder.sql_query
369
+ end
370
+
371
+ context 'group by shortcut' do
372
+ before :each do
373
+ source.options[:minimal_group_by?] = true
374
+ end
375
+
376
+ it "groups by the primary key" do
377
+ expect(relation).to receive(:group) do |string|
378
+ expect(string).to match(/"users"."id"/)
379
+ relation
380
+ end
381
+
382
+ builder.sql_query
383
+ end
384
+
385
+ it "does not group by fields" do
386
+ source.fields << double('field')
387
+
388
+ expect(relation).to receive(:group) do |string|
389
+ expect(string).not_to match(/"name"/)
390
+ relation
391
+ end
392
+
393
+ builder.sql_query
394
+ end
395
+
396
+ it "does not group by attributes" do
397
+ source.attributes << double('attribute')
398
+ allow(presenter).to receive_messages(:to_group => '"created_at"')
399
+
400
+ expect(relation).to receive(:group) do |string|
401
+ expect(string).not_to match(/"created_at"/)
402
+ relation
403
+ end
404
+
405
+ builder.sql_query
406
+ end
407
+
408
+ it "groups by source groupings" do
409
+ source.groupings << '"latitude"'
410
+
411
+ expect(relation).to receive(:group) do |string|
412
+ expect(string).to match(/"latitude"/)
413
+ relation
414
+ end
415
+
416
+ builder.sql_query
417
+ end
418
+ end
419
+
420
+ context 'group by shortcut in global configuration' do
421
+ before :each do
422
+ config.settings['minimal_group_by'] = true
423
+ end
424
+
425
+ it "groups by the primary key" do
426
+ expect(relation).to receive(:group) do |string|
427
+ expect(string).to match(/"users"."id"/)
428
+ relation
429
+ end
430
+
431
+ builder.sql_query
432
+ end
433
+
434
+ it "does not group by fields" do
435
+ source.fields << double('field')
436
+
437
+ expect(relation).to receive(:group) do |string|
438
+ expect(string).not_to match(/"name"/)
439
+ relation
440
+ end
441
+
442
+ builder.sql_query
443
+ end
444
+
445
+ it "does not group by attributes" do
446
+ source.attributes << double('attribute')
447
+ allow(presenter).to receive_messages(:to_group => '"created_at"')
448
+
449
+ expect(relation).to receive(:group) do |string|
450
+ expect(string).not_to match(/"created_at"/)
451
+ relation
452
+ end
453
+
454
+ builder.sql_query
455
+ end
456
+
457
+ it "groups by source groupings" do
458
+ source.groupings << '"latitude"'
459
+
460
+ expect(relation).to receive(:group) do |string|
461
+ expect(string).to match(/"latitude"/)
462
+ relation
463
+ end
464
+
465
+ builder.sql_query
466
+ end
467
+ end
468
+
469
+ context 'STI model' do
470
+ before :each do
471
+ model.column_names << 'type'
472
+ allow(model).to receive_messages :descends_from_active_record? => false
473
+ allow(model).to receive_messages :store_full_sti_class => true
474
+ end
475
+
476
+ it "groups by the inheritance column" do
477
+ expect(relation).to receive(:group) do |string|
478
+ expect(string).to match(/"users"."type"/)
479
+ relation
480
+ end
481
+
482
+ builder.sql_query
483
+ end
484
+
485
+ context 'with a custom inheritance column' do
486
+ before :each do
487
+ model.column_names << 'custom_type'
488
+ allow(model).to receive_messages :inheritance_column => 'custom_type'
489
+ end
490
+
491
+ it "groups by the right column" do
492
+ expect(relation).to receive(:group) do |string|
493
+ expect(string).to match(/"users"."custom_type"/)
494
+ relation
495
+ end
496
+
497
+ builder.sql_query
498
+ end
499
+ end
500
+ end
501
+
502
+ context 'with a delta processor' do
503
+ let(:processor) { double('processor') }
504
+
505
+ before :each do
506
+ allow(source).to receive_messages :delta_processor => processor
507
+ allow(source).to receive_messages :delta? => true
508
+ end
509
+
510
+ it "filters by the provided clause" do
511
+ expect(processor).to receive(:clause).with(true).and_return('"delta" = 1')
512
+ expect(relation).to receive(:where) do |string|
513
+ expect(string).to match(/"delta" = 1/)
514
+ relation
515
+ end
516
+
517
+ builder.sql_query
518
+ end
519
+ end
520
+ end
521
+ end
522
+
523
+ describe 'sql_query_pre' do
524
+ let(:processor) { double('processor', :reset_query => 'RESET DELTAS') }
525
+
526
+ before :each do
527
+ allow(source).to receive_messages :options => {}, :delta_processor => nil, :delta? => false
528
+ allow(adapter).to receive_messages :utf8_query_pre => ['SET UTF8']
529
+ end
530
+
531
+ it "adds a reset delta query if there is a delta processor and this is the core source" do
532
+ allow(source).to receive_messages :delta_processor => processor
533
+
534
+ expect(builder.sql_query_pre).to include('RESET DELTAS')
535
+ end
536
+
537
+ it "does not add a reset query if there is no delta processor" do
538
+ expect(builder.sql_query_pre).not_to include('RESET DELTAS')
539
+ end
540
+
541
+ it "does not add a reset query if this is a delta source" do
542
+ allow(source).to receive_messages :delta_processor => processor
543
+ allow(source).to receive_messages :delta? => true
544
+
545
+ expect(builder.sql_query_pre).not_to include('RESET DELTAS')
546
+ end
547
+
548
+ it "sets the group_concat_max_len value if set" do
549
+ source.options[:group_concat_max_len] = 123
550
+
551
+ expect(builder.sql_query_pre).
552
+ to include('SET SESSION group_concat_max_len = 123')
553
+ end
554
+
555
+ it "does not set the group_concat_max_len if not provided" do
556
+ source.options[:group_concat_max_len] = nil
557
+
558
+ expect(builder.sql_query_pre.select { |sql|
559
+ sql[/SET SESSION group_concat_max_len/]
560
+ }).to be_empty
561
+ end
562
+
563
+ it "sets the connection to use UTF-8 if required" do
564
+ source.options[:utf8?] = true
565
+
566
+ expect(builder.sql_query_pre).to include('SET UTF8')
567
+ end
568
+
569
+ it "does not set the connection to use UTF-8 if not required" do
570
+ source.options[:utf8?] = false
571
+
572
+ expect(builder.sql_query_pre).not_to include('SET UTF8')
573
+ end
574
+
575
+ it "adds a time-zone query by default" do
576
+ expect(builder.sql_query_pre).to include('SET TIME ZONE')
577
+ end
578
+
579
+ it "does not add a time-zone query if requested" do
580
+ config.settings['skip_time_zone'] = true
581
+
582
+ expect(builder.sql_query_pre).to_not include('SET TIME ZONE')
583
+ end
584
+ end
585
+
586
+ describe 'sql_query_range' do
587
+ before :each do
588
+ allow(adapter).to receive(:convert_nulls) { |string, default|
589
+ "ISNULL(#{string}, #{default})"
590
+ }
591
+ end
592
+
593
+ it "returns the relation's query" do
594
+ allow(relation).to receive_messages :to_sql => 'SELECT * FROM people'
595
+
596
+ expect(builder.sql_query_range).to eq('SELECT * FROM people')
597
+ end
598
+
599
+ it "returns nil if ranges are disabled" do
600
+ allow(source).to receive_messages :disable_range? => true
601
+
602
+ expect(builder.sql_query_range).to be_nil
603
+ end
604
+
605
+ it "selects the minimum primary key value, allowing for nulls" do
606
+ expect(relation).to receive(:select) do |string|
607
+ expect(string).to match(/ISNULL\(MIN\(`users`.`id`\), 1\)/)
608
+ relation
609
+ end
610
+
611
+ builder.sql_query_range
612
+ end
613
+
614
+ it "selects the maximum primary key value, allowing for nulls" do
615
+ expect(relation).to receive(:select) do |string|
616
+ expect(string).to match(/ISNULL\(MAX\(`users`.`id`\), 1\)/)
617
+ relation
618
+ end
619
+
620
+ builder.sql_query_range
621
+ end
622
+
623
+ it "shouldn't limit results to a range" do
624
+ expect(relation).to receive(:where) do |string|
625
+ expect(string).not_to match(/`users`.`id` BETWEEN \$start AND \$end/)
626
+ relation
627
+ end
628
+
629
+ builder.sql_query_range
630
+ end
631
+
632
+ it "does not add source conditions" do
633
+ source.conditions << 'created_at > NOW()'
634
+
635
+ expect(relation).to receive(:where) do |string|
636
+ expect(string).not_to match(/created_at > NOW()/)
637
+ relation
638
+ end
639
+
640
+ builder.sql_query_range
641
+ end
642
+
643
+ context 'with a delta processor' do
644
+ let(:processor) { double('processor') }
645
+
646
+ before :each do
647
+ allow(source).to receive_messages :delta_processor => processor
648
+ allow(source).to receive_messages :delta? => true
649
+ end
650
+
651
+ it "filters by the provided clause" do
652
+ expect(processor).to receive(:clause).with(true).and_return('`delta` = 1')
653
+ expect(relation).to receive(:where) do |string|
654
+ expect(string).to match(/`delta` = 1/)
655
+ relation
656
+ end
657
+
658
+ builder.sql_query_range
659
+ end
660
+ end
661
+ end
662
+ end