thinking-sphinx 3.4.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (333) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +20 -18
  3. data/Appraisals +28 -16
  4. data/CHANGELOG.markdown +538 -0
  5. data/Gemfile +9 -11
  6. data/README.textile +23 -31
  7. data/Rakefile +2 -0
  8. data/bin/console +2 -1
  9. data/bin/loadsphinx +29 -2
  10. data/lib/thinking-sphinx.rb +2 -0
  11. data/lib/thinking/sphinx.rb +2 -0
  12. data/lib/thinking_sphinx.rb +24 -13
  13. data/lib/thinking_sphinx/active_record.rb +10 -1
  14. data/lib/thinking_sphinx/active_record/association.rb +2 -0
  15. data/lib/thinking_sphinx/active_record/association_proxy.rb +2 -0
  16. data/lib/thinking_sphinx/active_record/association_proxy/attribute_finder.rb +2 -0
  17. data/lib/thinking_sphinx/active_record/association_proxy/attribute_matcher.rb +2 -0
  18. data/lib/thinking_sphinx/active_record/attribute.rb +2 -0
  19. data/lib/thinking_sphinx/active_record/attribute/sphinx_presenter.rb +2 -0
  20. data/lib/thinking_sphinx/active_record/attribute/type.rb +2 -0
  21. data/lib/thinking_sphinx/active_record/attribute/values.rb +2 -0
  22. data/lib/thinking_sphinx/active_record/base.rb +2 -0
  23. data/lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb +2 -0
  24. data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +2 -0
  25. data/lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb +2 -0
  26. data/lib/thinking_sphinx/active_record/column.rb +2 -0
  27. data/lib/thinking_sphinx/active_record/column_sql_presenter.rb +2 -0
  28. data/lib/thinking_sphinx/active_record/database_adapters.rb +2 -0
  29. data/lib/thinking_sphinx/active_record/database_adapters/abstract_adapter.rb +2 -0
  30. data/lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb +2 -0
  31. data/lib/thinking_sphinx/active_record/database_adapters/postgresql_adapter.rb +2 -0
  32. data/lib/thinking_sphinx/active_record/depolymorph/association_reflection.rb +32 -0
  33. data/lib/thinking_sphinx/active_record/depolymorph/base_reflection.rb +32 -0
  34. data/lib/thinking_sphinx/active_record/depolymorph/conditions_reflection.rb +40 -0
  35. data/lib/thinking_sphinx/active_record/depolymorph/overridden_reflection.rb +35 -0
  36. data/lib/thinking_sphinx/active_record/depolymorph/scoped_reflection.rb +26 -0
  37. data/lib/thinking_sphinx/active_record/field.rb +2 -0
  38. data/lib/thinking_sphinx/active_record/filter_reflection.rb +13 -71
  39. data/lib/thinking_sphinx/active_record/index.rb +2 -0
  40. data/lib/thinking_sphinx/active_record/interpreter.rb +2 -0
  41. data/lib/thinking_sphinx/active_record/join_association.rb +2 -0
  42. data/lib/thinking_sphinx/active_record/log_subscriber.rb +2 -0
  43. data/lib/thinking_sphinx/active_record/polymorpher.rb +2 -0
  44. data/lib/thinking_sphinx/active_record/property.rb +2 -0
  45. data/lib/thinking_sphinx/active_record/property_query.rb +2 -0
  46. data/lib/thinking_sphinx/active_record/property_sql_presenter.rb +2 -0
  47. data/lib/thinking_sphinx/active_record/simple_many_query.rb +2 -0
  48. data/lib/thinking_sphinx/active_record/source_joins.rb +2 -0
  49. data/lib/thinking_sphinx/active_record/sql_builder.rb +2 -0
  50. data/lib/thinking_sphinx/active_record/sql_builder/clause_builder.rb +2 -0
  51. data/lib/thinking_sphinx/active_record/sql_builder/query.rb +2 -0
  52. data/lib/thinking_sphinx/active_record/sql_builder/statement.rb +2 -0
  53. data/lib/thinking_sphinx/active_record/sql_source.rb +15 -3
  54. data/lib/thinking_sphinx/active_record/sql_source/template.rb +2 -0
  55. data/lib/thinking_sphinx/attribute_types.rb +2 -0
  56. data/lib/thinking_sphinx/batched_search.rb +2 -0
  57. data/lib/thinking_sphinx/callbacks.rb +2 -0
  58. data/lib/thinking_sphinx/capistrano.rb +2 -0
  59. data/lib/thinking_sphinx/capistrano/v2.rb +2 -0
  60. data/lib/thinking_sphinx/capistrano/v3.rb +2 -0
  61. data/lib/thinking_sphinx/commander.rb +27 -0
  62. data/lib/thinking_sphinx/commands.rb +20 -0
  63. data/lib/thinking_sphinx/commands/base.rb +9 -1
  64. data/lib/thinking_sphinx/commands/clear_real_time.rb +22 -0
  65. data/lib/thinking_sphinx/commands/clear_sql.rb +18 -0
  66. data/lib/thinking_sphinx/commands/configure.rb +2 -0
  67. data/lib/thinking_sphinx/commands/index_real_time.rb +17 -0
  68. data/lib/thinking_sphinx/commands/index_sql.rb +25 -0
  69. data/lib/thinking_sphinx/commands/merge.rb +27 -0
  70. data/lib/thinking_sphinx/commands/merge_and_update.rb +57 -0
  71. data/lib/thinking_sphinx/commands/prepare.rb +13 -0
  72. data/lib/thinking_sphinx/commands/rotate.rb +13 -0
  73. data/lib/thinking_sphinx/commands/running.rb +13 -0
  74. data/lib/thinking_sphinx/commands/start_attached.rb +2 -0
  75. data/lib/thinking_sphinx/commands/start_detached.rb +3 -1
  76. data/lib/thinking_sphinx/commands/stop.rb +4 -2
  77. data/lib/thinking_sphinx/configuration.rb +28 -47
  78. data/lib/thinking_sphinx/configuration/consistent_ids.rb +2 -0
  79. data/lib/thinking_sphinx/configuration/defaults.rb +2 -0
  80. data/lib/thinking_sphinx/configuration/distributed_indices.rb +2 -0
  81. data/lib/thinking_sphinx/configuration/duplicate_names.rb +2 -0
  82. data/lib/thinking_sphinx/configuration/minimum_fields.rb +2 -0
  83. data/lib/thinking_sphinx/connection.rb +4 -5
  84. data/lib/thinking_sphinx/connection/client.rb +21 -0
  85. data/lib/thinking_sphinx/connection/jruby.rb +7 -2
  86. data/lib/thinking_sphinx/connection/mri.rb +2 -4
  87. data/lib/thinking_sphinx/core.rb +2 -0
  88. data/lib/thinking_sphinx/core/field.rb +2 -0
  89. data/lib/thinking_sphinx/core/index.rb +4 -1
  90. data/lib/thinking_sphinx/core/interpreter.rb +2 -0
  91. data/lib/thinking_sphinx/core/property.rb +2 -0
  92. data/lib/thinking_sphinx/core/settings.rb +2 -0
  93. data/lib/thinking_sphinx/deletion.rb +2 -0
  94. data/lib/thinking_sphinx/deltas.rb +2 -0
  95. data/lib/thinking_sphinx/deltas/default_delta.rb +2 -0
  96. data/lib/thinking_sphinx/deltas/delete_job.rb +2 -0
  97. data/lib/thinking_sphinx/deltas/index_job.rb +9 -1
  98. data/lib/thinking_sphinx/distributed.rb +2 -0
  99. data/lib/thinking_sphinx/distributed/index.rb +2 -0
  100. data/lib/thinking_sphinx/errors.rb +9 -0
  101. data/lib/thinking_sphinx/excerpter.rb +2 -0
  102. data/lib/thinking_sphinx/facet.rb +4 -3
  103. data/lib/thinking_sphinx/facet_search.rb +4 -2
  104. data/lib/thinking_sphinx/float_formatter.rb +2 -0
  105. data/lib/thinking_sphinx/frameworks.rb +2 -0
  106. data/lib/thinking_sphinx/frameworks/plain.rb +2 -0
  107. data/lib/thinking_sphinx/frameworks/rails.rb +2 -0
  108. data/lib/thinking_sphinx/guard.rb +3 -0
  109. data/lib/thinking_sphinx/guard/file.rb +2 -0
  110. data/lib/thinking_sphinx/guard/files.rb +2 -0
  111. data/lib/thinking_sphinx/guard/none.rb +7 -0
  112. data/lib/thinking_sphinx/hooks/guard_presence.rb +34 -0
  113. data/lib/thinking_sphinx/index.rb +2 -0
  114. data/lib/thinking_sphinx/index_set.rb +2 -0
  115. data/lib/thinking_sphinx/indexing_strategies/all_at_once.rb +2 -0
  116. data/lib/thinking_sphinx/indexing_strategies/one_at_a_time.rb +2 -0
  117. data/lib/thinking_sphinx/interfaces.rb +10 -0
  118. data/lib/thinking_sphinx/interfaces/base.rb +13 -0
  119. data/lib/thinking_sphinx/interfaces/daemon.rb +6 -11
  120. data/lib/thinking_sphinx/interfaces/real_time.rb +19 -14
  121. data/lib/thinking_sphinx/interfaces/sql.rb +22 -10
  122. data/lib/thinking_sphinx/logger.rb +2 -0
  123. data/lib/thinking_sphinx/masks.rb +2 -0
  124. data/lib/thinking_sphinx/masks/group_enumerators_mask.rb +6 -4
  125. data/lib/thinking_sphinx/masks/pagination_mask.rb +2 -0
  126. data/lib/thinking_sphinx/masks/scopes_mask.rb +2 -0
  127. data/lib/thinking_sphinx/masks/weight_enumerator_mask.rb +3 -1
  128. data/lib/thinking_sphinx/middlewares.rb +5 -3
  129. data/lib/thinking_sphinx/middlewares/active_record_translator.rb +2 -0
  130. data/lib/thinking_sphinx/middlewares/geographer.rb +2 -0
  131. data/lib/thinking_sphinx/middlewares/glazier.rb +2 -0
  132. data/lib/thinking_sphinx/middlewares/ids_only.rb +2 -0
  133. data/lib/thinking_sphinx/middlewares/inquirer.rb +2 -0
  134. data/lib/thinking_sphinx/middlewares/middleware.rb +2 -0
  135. data/lib/thinking_sphinx/middlewares/sphinxql.rb +4 -2
  136. data/lib/thinking_sphinx/middlewares/stale_id_checker.rb +2 -0
  137. data/lib/thinking_sphinx/middlewares/stale_id_filter.rb +2 -0
  138. data/lib/thinking_sphinx/middlewares/valid_options.rb +2 -0
  139. data/lib/thinking_sphinx/panes.rb +2 -0
  140. data/lib/thinking_sphinx/panes/attributes_pane.rb +2 -0
  141. data/lib/thinking_sphinx/panes/distance_pane.rb +2 -0
  142. data/lib/thinking_sphinx/panes/excerpts_pane.rb +2 -0
  143. data/lib/thinking_sphinx/panes/weight_pane.rb +3 -1
  144. data/lib/thinking_sphinx/query.rb +2 -0
  145. data/lib/thinking_sphinx/railtie.rb +2 -0
  146. data/lib/thinking_sphinx/rake_interface.rb +3 -1
  147. data/lib/thinking_sphinx/real_time.rb +3 -0
  148. data/lib/thinking_sphinx/real_time/attribute.rb +2 -0
  149. data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +2 -0
  150. data/lib/thinking_sphinx/real_time/field.rb +2 -0
  151. data/lib/thinking_sphinx/real_time/index.rb +2 -0
  152. data/lib/thinking_sphinx/real_time/index/template.rb +2 -0
  153. data/lib/thinking_sphinx/real_time/interpreter.rb +2 -0
  154. data/lib/thinking_sphinx/real_time/populator.rb +2 -1
  155. data/lib/thinking_sphinx/real_time/property.rb +2 -0
  156. data/lib/thinking_sphinx/real_time/transcribe_instance.rb +38 -0
  157. data/lib/thinking_sphinx/real_time/transcriber.rb +18 -27
  158. data/lib/thinking_sphinx/real_time/translator.rb +3 -1
  159. data/lib/thinking_sphinx/scopes.rb +2 -0
  160. data/lib/thinking_sphinx/search.rb +2 -0
  161. data/lib/thinking_sphinx/search/batch_inquirer.rb +2 -0
  162. data/lib/thinking_sphinx/search/context.rb +2 -0
  163. data/lib/thinking_sphinx/search/glaze.rb +2 -0
  164. data/lib/thinking_sphinx/search/merger.rb +2 -0
  165. data/lib/thinking_sphinx/search/query.rb +2 -0
  166. data/lib/thinking_sphinx/search/stale_ids_exception.rb +2 -0
  167. data/lib/thinking_sphinx/settings.rb +110 -0
  168. data/lib/thinking_sphinx/sinatra.rb +2 -0
  169. data/lib/thinking_sphinx/subscribers/populator_subscriber.rb +18 -0
  170. data/lib/thinking_sphinx/tasks.rb +13 -46
  171. data/lib/thinking_sphinx/test.rb +2 -0
  172. data/lib/thinking_sphinx/utf8.rb +2 -0
  173. data/lib/thinking_sphinx/wildcard.rb +2 -0
  174. data/lib/thinking_sphinx/with_output.rb +2 -0
  175. data/spec/acceptance/association_scoping_spec.rb +2 -0
  176. data/spec/acceptance/attribute_access_spec.rb +4 -4
  177. data/spec/acceptance/attribute_updates_spec.rb +2 -0
  178. data/spec/acceptance/batch_searching_spec.rb +2 -0
  179. data/spec/acceptance/big_integers_spec.rb +2 -0
  180. data/spec/acceptance/connection_spec.rb +2 -0
  181. data/spec/acceptance/excerpts_spec.rb +1 -0
  182. data/spec/acceptance/facets_spec.rb +2 -3
  183. data/spec/acceptance/geosearching_spec.rb +3 -1
  184. data/spec/acceptance/grouping_by_attributes_spec.rb +2 -0
  185. data/spec/acceptance/index_options_spec.rb +2 -0
  186. data/spec/acceptance/indexing_spec.rb +2 -0
  187. data/spec/acceptance/merging_spec.rb +90 -0
  188. data/spec/acceptance/paginating_search_results_spec.rb +2 -0
  189. data/spec/acceptance/real_time_updates_spec.rb +2 -0
  190. data/spec/acceptance/remove_deleted_records_spec.rb +2 -0
  191. data/spec/acceptance/search_counts_spec.rb +2 -0
  192. data/spec/acceptance/search_for_just_ids_spec.rb +2 -0
  193. data/spec/acceptance/searching_across_models_spec.rb +2 -0
  194. data/spec/acceptance/searching_across_schemas_spec.rb +2 -0
  195. data/spec/acceptance/searching_on_fields_spec.rb +2 -0
  196. data/spec/acceptance/searching_with_filters_spec.rb +2 -0
  197. data/spec/acceptance/searching_with_sti_spec.rb +2 -0
  198. data/spec/acceptance/searching_within_a_model_spec.rb +2 -0
  199. data/spec/acceptance/sorting_search_results_spec.rb +2 -0
  200. data/spec/acceptance/spec_helper.rb +2 -13
  201. data/spec/acceptance/specifying_sql_spec.rb +2 -0
  202. data/spec/acceptance/sphinx_scopes_spec.rb +2 -0
  203. data/spec/acceptance/sql_deltas_spec.rb +2 -0
  204. data/spec/acceptance/support/database_cleaner.rb +2 -0
  205. data/spec/acceptance/support/sphinx_controller.rb +16 -5
  206. data/spec/acceptance/support/sphinx_helpers.rb +11 -0
  207. data/spec/acceptance/suspended_deltas_spec.rb +2 -0
  208. data/spec/internal/app/indices/admin_person_index.rb +2 -0
  209. data/spec/internal/app/indices/album_index.rb +2 -0
  210. data/spec/internal/app/indices/animal_index.rb +2 -0
  211. data/spec/internal/app/indices/article_index.rb +2 -0
  212. data/spec/internal/app/indices/bird_index.rb +2 -0
  213. data/spec/internal/app/indices/book_index.rb +2 -0
  214. data/spec/internal/app/indices/car_index.rb +2 -0
  215. data/spec/internal/app/indices/city_index.rb +2 -0
  216. data/spec/internal/app/indices/product_index.rb +2 -0
  217. data/spec/internal/app/indices/tee_index.rb +2 -0
  218. data/spec/internal/app/indices/user_index.rb +2 -0
  219. data/spec/internal/app/models/admin/person.rb +2 -0
  220. data/spec/internal/app/models/album.rb +2 -0
  221. data/spec/internal/app/models/animal.rb +2 -0
  222. data/spec/internal/app/models/article.rb +2 -0
  223. data/spec/internal/app/models/bird.rb +2 -0
  224. data/spec/internal/app/models/book.rb +2 -0
  225. data/spec/internal/app/models/car.rb +2 -0
  226. data/spec/internal/app/models/categorisation.rb +2 -0
  227. data/spec/internal/app/models/category.rb +2 -0
  228. data/spec/internal/app/models/city.rb +2 -0
  229. data/spec/internal/app/models/colour.rb +2 -0
  230. data/spec/internal/app/models/event.rb +2 -0
  231. data/spec/internal/app/models/flightless_bird.rb +2 -0
  232. data/spec/internal/app/models/genre.rb +2 -0
  233. data/spec/internal/app/models/hardcover.rb +2 -0
  234. data/spec/internal/app/models/mammal.rb +2 -0
  235. data/spec/internal/app/models/manufacturer.rb +2 -0
  236. data/spec/internal/app/models/product.rb +2 -0
  237. data/spec/internal/app/models/tag.rb +2 -0
  238. data/spec/internal/app/models/tagging.rb +2 -0
  239. data/spec/internal/app/models/tee.rb +2 -0
  240. data/spec/internal/app/models/tweet.rb +2 -0
  241. data/spec/internal/app/models/user.rb +2 -0
  242. data/spec/internal/db/schema.rb +2 -0
  243. data/spec/spec_helper.rb +4 -1
  244. data/spec/support/json_column.rb +3 -5
  245. data/spec/support/multi_schema.rb +2 -0
  246. data/spec/support/mysql.rb +25 -0
  247. data/spec/support/sphinx_yaml_helpers.rb +2 -0
  248. data/spec/thinking_sphinx/active_record/association_spec.rb +2 -0
  249. data/spec/thinking_sphinx/active_record/attribute/type_spec.rb +2 -0
  250. data/spec/thinking_sphinx/active_record/base_spec.rb +2 -0
  251. data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +2 -0
  252. data/spec/thinking_sphinx/active_record/callbacks/delta_callbacks_spec.rb +2 -0
  253. data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +2 -0
  254. data/spec/thinking_sphinx/active_record/column_spec.rb +2 -0
  255. data/spec/thinking_sphinx/active_record/column_sql_presenter_spec.rb +2 -0
  256. data/spec/thinking_sphinx/active_record/database_adapters/abstract_adapter_spec.rb +2 -0
  257. data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +2 -0
  258. data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +2 -0
  259. data/spec/thinking_sphinx/active_record/database_adapters_spec.rb +2 -0
  260. data/spec/thinking_sphinx/active_record/field_spec.rb +2 -0
  261. data/spec/thinking_sphinx/active_record/filter_reflection_spec.rb +100 -79
  262. data/spec/thinking_sphinx/active_record/index_spec.rb +16 -1
  263. data/spec/thinking_sphinx/active_record/interpreter_spec.rb +2 -0
  264. data/spec/thinking_sphinx/active_record/polymorpher_spec.rb +2 -0
  265. data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +2 -0
  266. data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +2 -0
  267. data/spec/thinking_sphinx/active_record/sql_source_spec.rb +2 -0
  268. data/spec/thinking_sphinx/attribute_types_spec.rb +2 -0
  269. data/spec/thinking_sphinx/commands/clear_real_time_spec.rb +46 -0
  270. data/spec/thinking_sphinx/commands/clear_sql_spec.rb +52 -0
  271. data/spec/thinking_sphinx/commands/configure_spec.rb +2 -0
  272. data/spec/thinking_sphinx/commands/index_real_time_spec.rb +33 -0
  273. data/spec/thinking_sphinx/commands/index_sql_spec.rb +86 -0
  274. data/spec/thinking_sphinx/commands/merge_and_update_spec.rb +106 -0
  275. data/spec/thinking_sphinx/commands/merge_spec.rb +48 -0
  276. data/spec/thinking_sphinx/commands/prepare_spec.rb +23 -0
  277. data/spec/thinking_sphinx/commands/start_detached_spec.rb +2 -0
  278. data/spec/thinking_sphinx/commands/stop_spec.rb +13 -4
  279. data/spec/thinking_sphinx/configuration/minimum_fields_spec.rb +2 -0
  280. data/spec/thinking_sphinx/configuration_spec.rb +132 -6
  281. data/spec/thinking_sphinx/connection_spec.rb +2 -0
  282. data/spec/thinking_sphinx/deletion_spec.rb +2 -0
  283. data/spec/thinking_sphinx/deltas/default_delta_spec.rb +8 -1
  284. data/spec/thinking_sphinx/deltas_spec.rb +2 -0
  285. data/spec/thinking_sphinx/errors_spec.rb +2 -0
  286. data/spec/thinking_sphinx/excerpter_spec.rb +2 -0
  287. data/spec/thinking_sphinx/facet_search_spec.rb +8 -6
  288. data/spec/thinking_sphinx/hooks/guard_presence_spec.rb +30 -0
  289. data/spec/thinking_sphinx/index_set_spec.rb +2 -0
  290. data/spec/thinking_sphinx/index_spec.rb +2 -0
  291. data/spec/thinking_sphinx/interfaces/daemon_spec.rb +19 -11
  292. data/spec/thinking_sphinx/interfaces/real_time_spec.rb +43 -43
  293. data/spec/thinking_sphinx/interfaces/sql_spec.rb +76 -52
  294. data/spec/thinking_sphinx/masks/pagination_mask_spec.rb +2 -0
  295. data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +2 -0
  296. data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +2 -0
  297. data/spec/thinking_sphinx/middlewares/geographer_spec.rb +2 -0
  298. data/spec/thinking_sphinx/middlewares/glazier_spec.rb +2 -0
  299. data/spec/thinking_sphinx/middlewares/inquirer_spec.rb +2 -0
  300. data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +2 -1
  301. data/spec/thinking_sphinx/middlewares/stale_id_checker_spec.rb +2 -0
  302. data/spec/thinking_sphinx/middlewares/stale_id_filter_spec.rb +2 -0
  303. data/spec/thinking_sphinx/middlewares/valid_options_spec.rb +2 -0
  304. data/spec/thinking_sphinx/panes/attributes_pane_spec.rb +2 -0
  305. data/spec/thinking_sphinx/panes/distance_pane_spec.rb +2 -0
  306. data/spec/thinking_sphinx/panes/excerpts_pane_spec.rb +2 -0
  307. data/spec/thinking_sphinx/panes/weight_pane_spec.rb +3 -1
  308. data/spec/thinking_sphinx/rake_interface_spec.rb +10 -8
  309. data/spec/thinking_sphinx/real_time/attribute_spec.rb +2 -0
  310. data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +2 -0
  311. data/spec/thinking_sphinx/real_time/field_spec.rb +2 -0
  312. data/spec/thinking_sphinx/real_time/index_spec.rb +14 -0
  313. data/spec/thinking_sphinx/real_time/interpreter_spec.rb +2 -0
  314. data/spec/thinking_sphinx/real_time/transcribe_instance_spec.rb +35 -0
  315. data/spec/thinking_sphinx/real_time/transcriber_spec.rb +101 -0
  316. data/spec/thinking_sphinx/real_time/translator_spec.rb +17 -0
  317. data/spec/thinking_sphinx/scopes_spec.rb +2 -0
  318. data/spec/thinking_sphinx/search/glaze_spec.rb +2 -0
  319. data/spec/thinking_sphinx/search/query_spec.rb +2 -0
  320. data/spec/thinking_sphinx/search_spec.rb +2 -0
  321. data/spec/thinking_sphinx/wildcard_spec.rb +2 -0
  322. data/spec/thinking_sphinx_spec.rb +2 -0
  323. data/thinking-sphinx.gemspec +7 -5
  324. metadata +62 -25
  325. data/HISTORY +0 -326
  326. data/bin/literals +0 -9
  327. data/lib/thinking_sphinx/commands/index.rb +0 -11
  328. data/lib/thinking_sphinx/controller.rb +0 -12
  329. data/lib/thinking_sphinx/middlewares/attribute_typer.rb +0 -48
  330. data/lib/thinking_sphinx/middlewares/utf8.rb +0 -27
  331. data/lib/thinking_sphinx/sphinxql.rb +0 -23
  332. data/spec/thinking_sphinx/commands/index_spec.rb +0 -26
  333. data/spec/thinking_sphinx/middlewares/attribute_typer_spec.rb +0 -42
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::ActiveRecord::Depolymorph::BaseReflection
4
+ def initialize(reflection, name, class_name)
5
+ @reflection = reflection
6
+ @name = name
7
+ @class_name = class_name
8
+
9
+ @options = reflection.options.clone
10
+ end
11
+
12
+ def call
13
+ # Should be implemented by subclasses.
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :reflection, :name, :class_name
19
+
20
+ def klass
21
+ reflection.class
22
+ end
23
+
24
+ def options
25
+ @options.delete :polymorphic
26
+ @options[:class_name] = class_name
27
+ @options[:foreign_key] ||= "#{reflection.name}_id"
28
+ @options[:foreign_type] = reflection.foreign_type
29
+
30
+ @options
31
+ end
32
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The conditions approach is only available in Rails 3. This behaviour is
4
+ # superseded by ScopedReflection for Rails 4.0.
5
+ class ThinkingSphinx::ActiveRecord::Depolymorph::ConditionsReflection <
6
+ ThinkingSphinx::ActiveRecord::Depolymorph::BaseReflection
7
+
8
+ def call
9
+ klass.new reflection.macro, name, options, active_record
10
+ end
11
+
12
+ private
13
+
14
+ delegate :foreign_type, :active_record, :to => :reflection
15
+
16
+ def condition
17
+ "::ts_join_alias::.#{quoted_foreign_type} = '#{class_name}'"
18
+ end
19
+
20
+ def options
21
+ super
22
+
23
+ case @options[:conditions]
24
+ when nil
25
+ @options[:conditions] = condition
26
+ when Array
27
+ @options[:conditions] << condition
28
+ when Hash
29
+ @options[:conditions].merge! foreign_type => @options[:class_name]
30
+ else
31
+ @options[:conditions] = "#{@options[:conditions]} AND #{condition}"
32
+ end
33
+
34
+ @options
35
+ end
36
+
37
+ def quoted_foreign_type
38
+ active_record.connection.quote_column_name foreign_type
39
+ end
40
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This overriding approach is only available in Rails 5.2+. This behaviour
4
+ # was preceded by AssociationReflection for Rails 4.1-5.1.
5
+ class ThinkingSphinx::ActiveRecord::Depolymorph::OverriddenReflection <
6
+ ThinkingSphinx::ActiveRecord::Depolymorph::BaseReflection
7
+
8
+ module JoinConstraint
9
+ def build_join_constraint(table, foreign_table)
10
+ super.and(
11
+ foreign_table[options[:foreign_type]].eq(
12
+ options[:class_name].constantize.base_class.name
13
+ )
14
+ )
15
+ end
16
+ end
17
+
18
+ def self.overridden_classes
19
+ @overridden_classes ||= {}
20
+ end
21
+
22
+ def call
23
+ klass.new name, nil, options, reflection.active_record
24
+ end
25
+
26
+ private
27
+
28
+ def klass
29
+ self.class.overridden_classes[reflection.class] ||= begin
30
+ subclass = Class.new reflection.class
31
+ subclass.include JoinConstraint
32
+ subclass
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This scoped approach is only available in Rails 4.0. This behaviour is
4
+ # superseded by AssociationReflection for Rails 4.1, and was preceded by
5
+ # ConditionsReflection for Rails 3.2.
6
+ class ThinkingSphinx::ActiveRecord::Depolymorph::ScopedReflection <
7
+ ThinkingSphinx::ActiveRecord::Depolymorph::BaseReflection
8
+
9
+ def call
10
+ klass.new reflection.macro, name, scope, options,
11
+ reflection.active_record
12
+ end
13
+
14
+ private
15
+
16
+ def scope
17
+ lambda { |association|
18
+ reflection = association.reflection
19
+ klass = reflection.class_name.constantize
20
+ where(
21
+ association.parent.aliased_table_name.to_sym =>
22
+ {reflection.foreign_type => klass.base_class.name}
23
+ )
24
+ }
25
+ end
26
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::Field <
2
4
  ThinkingSphinx::ActiveRecord::Property
3
5
  include ThinkingSphinx::Core::Field
@@ -1,76 +1,18 @@
1
- class ThinkingSphinx::ActiveRecord::FilterReflection
2
- attr_reader :reflection, :class_name
3
-
4
- delegate :foreign_type, :active_record, :to => :reflection
5
-
6
- def self.call(reflection, name, class_name)
7
- filter = new(reflection, class_name)
8
- klass = reflection.class
9
- arity = klass.instance_method(:initialize).arity
10
-
11
- if defined?(ActiveRecord::Reflection::MacroReflection) && arity == 4
12
- klass.new name, filter.scope, filter.options, reflection.active_record
13
- elsif reflection.respond_to?(:scope)
14
- klass.new reflection.macro, name, filter.scope, filter.options,
15
- reflection.active_record
16
- else
17
- klass.new reflection.macro, name, filter.options,
18
- reflection.active_record
19
- end
20
- end
21
-
22
- def initialize(reflection, class_name)
23
- @reflection, @class_name = reflection, class_name
24
- @options = reflection.options.clone
25
- end
26
-
27
- def options
28
- @options.delete :polymorphic
29
- @options[:class_name] = class_name
30
- @options[:foreign_key] ||= "#{reflection.name}_id"
31
- @options[:foreign_type] = reflection.foreign_type
32
-
33
- if reflection.respond_to?(:scope)
34
- @options[:sphinx_internal_filtered] = true
35
- return @options
36
- end
1
+ # frozen_string_literal: true
37
2
 
38
- case @options[:conditions]
39
- when nil
40
- @options[:conditions] = condition
41
- when Array
42
- @options[:conditions] << condition
43
- when Hash
44
- @options[:conditions].merge!(reflection.foreign_type => @options[:class_name])
45
- else
46
- @options[:conditions] << " AND #{condition}"
47
- end
48
-
49
- @options
50
- end
51
-
52
- def scope
53
- if ::Joiner::Joins.instance_methods.include?(:join_association_class)
54
- return nil
55
- end
56
-
57
- lambda { |association|
58
- reflection = association.reflection
59
- klass = reflection.class_name.constantize
60
- where(
61
- association.parent.aliased_table_name.to_sym =>
62
- {reflection.foreign_type => klass.base_class.name}
63
- )
64
- }
65
- end
66
-
67
- private
68
-
69
- def condition
70
- "::ts_join_alias::.#{quoted_foreign_type} = '#{class_name}'"
3
+ class ThinkingSphinx::ActiveRecord::FilterReflection
4
+ ReflectionGenerator = case ActiveRecord::VERSION::STRING.to_f
5
+ when 5.2..7.0
6
+ ThinkingSphinx::ActiveRecord::Depolymorph::OverriddenReflection
7
+ when 4.1..5.1
8
+ ThinkingSphinx::ActiveRecord::Depolymorph::AssociationReflection
9
+ when 4.0
10
+ ThinkingSphinx::ActiveRecord::Depolymorph::ScopedReflection
11
+ when 3.2
12
+ ThinkingSphinx::ActiveRecord::Depolymorph::ConditionsReflection
71
13
  end
72
14
 
73
- def quoted_foreign_type
74
- active_record.connection.quote_column_name foreign_type
15
+ def self.call(reflection, name, class_name)
16
+ ReflectionGenerator.new(reflection, name, class_name).call
75
17
  end
76
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::Index < Riddle::Configuration::Index
2
4
  include ThinkingSphinx::Core::Index
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::Interpreter <
2
4
  ::ThinkingSphinx::Core::Interpreter
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::JoinAssociation <
2
4
  ::ActiveRecord::Associations::JoinDependency::JoinAssociation
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::LogSubscriber < ActiveSupport::LogSubscriber
2
4
  def guard(event)
3
5
  identifier = color 'Sphinx', GREEN, true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::Polymorpher
2
4
  def initialize(source, column, class_names)
3
5
  @source, @column, @class_names = source, column, class_names
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::Property
2
4
  include ThinkingSphinx::Core::Property
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::PropertyQuery
2
4
  def initialize(property, source, type = nil)
3
5
  @property, @source, @type = property, source, type
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::PropertySQLPresenter
2
4
  attr_reader :property, :adapter, :associations
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::SimpleManyQuery <
2
4
  ThinkingSphinx::ActiveRecord::PropertyQuery
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::SourceJoins
2
4
  def self.call(model, source)
3
5
  new(model, source).call
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ThinkingSphinx
2
4
  module ActiveRecord
3
5
  class SQLBuilder
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ThinkingSphinx
2
4
  module ActiveRecord
3
5
  class SQLBuilder::ClauseBuilder
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ThinkingSphinx
2
4
  module ActiveRecord
3
5
  class SQLBuilder::Query
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'thinking_sphinx/active_record/sql_builder/clause_builder'
2
4
 
3
5
  module ThinkingSphinx
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ThinkingSphinx
2
4
  module ActiveRecord
3
5
  class SQLSource < Riddle::Configuration::SQLSource
4
6
  include ThinkingSphinx::Core::Settings
5
- attr_reader :model, :database_settings, :options
7
+
8
+ attr_reader :model, :options
6
9
  attr_accessor :fields, :attributes, :associations, :conditions,
7
10
  :groupings, :polymorphs
8
11
 
@@ -12,9 +15,8 @@ module ThinkingSphinx
12
15
 
13
16
  def initialize(model, options = {})
14
17
  @model = model
15
- @database_settings = model.connection.instance_variable_get(:@config).clone
16
18
  @options = {
17
- :utf8? => (@database_settings[:encoding].to_s[/^utf8/])
19
+ :utf8? => (database_settings[:encoding].to_s[/^utf8/])
18
20
  }.merge options
19
21
 
20
22
  @fields = []
@@ -132,6 +134,16 @@ module ThinkingSphinx
132
134
  ThinkingSphinx::Configuration.instance
133
135
  end
134
136
 
137
+ def database_settings
138
+ @database_settings ||= begin
139
+ if model.connection.respond_to?(:config)
140
+ model.connection.config.clone
141
+ else
142
+ model.connection.instance_variable_get(:@config).clone
143
+ end
144
+ end
145
+ end
146
+
135
147
  def prepare_for_render
136
148
  polymorphs.each &:morph!
137
149
  append_presenter_to_attribute_array
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::ActiveRecord::SQLSource::Template
2
4
  attr_reader :source
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::AttributeTypes
2
4
  def self.call
3
5
  @call ||= new.call
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::BatchedSearch
2
4
  attr_accessor :searches
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Callbacks
2
4
  attr_reader :instance
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  if defined?(Capistrano::VERSION)
2
4
  if Gem::Version.new(Capistrano::VERSION).release >= Gem::Version.new('3.0.0')
3
5
  recipe_version = 3
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capistrano::Configuration.instance(:must_exist).load do
2
4
  _cset(:thinking_sphinx_roles) { :db }
3
5
  _cset(:thinking_sphinx_options) { {:roles => fetch(:thinking_sphinx_roles)} }
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  namespace :load do
2
4
  task :defaults do
3
5
  set :thinking_sphinx_roles, :db
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Commander
4
+ def self.call(command, configuration, options, stream = STDOUT)
5
+ raise ThinkingSphinx::UnknownCommand unless registry.keys.include?(command)
6
+
7
+ registry[command].call configuration, options, stream
8
+ end
9
+
10
+ def self.registry
11
+ @registry ||= {
12
+ :clear_real_time => ThinkingSphinx::Commands::ClearRealTime,
13
+ :clear_sql => ThinkingSphinx::Commands::ClearSQL,
14
+ :configure => ThinkingSphinx::Commands::Configure,
15
+ :index_sql => ThinkingSphinx::Commands::IndexSQL,
16
+ :index_real_time => ThinkingSphinx::Commands::IndexRealTime,
17
+ :merge => ThinkingSphinx::Commands::Merge,
18
+ :merge_and_update => ThinkingSphinx::Commands::MergeAndUpdate,
19
+ :prepare => ThinkingSphinx::Commands::Prepare,
20
+ :rotate => ThinkingSphinx::Commands::Rotate,
21
+ :running => ThinkingSphinx::Commands::Running,
22
+ :start_attached => ThinkingSphinx::Commands::StartAttached,
23
+ :start_detached => ThinkingSphinx::Commands::StartDetached,
24
+ :stop => ThinkingSphinx::Commands::Stop
25
+ }
26
+ end
27
+ end