thinking-sphinx 3.4.2 → 4.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 (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,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ThinkingSphinx::Commands
4
+ #
5
+ end
6
+
7
+ require 'thinking_sphinx/commands/base'
8
+ require 'thinking_sphinx/commands/clear_real_time'
9
+ require 'thinking_sphinx/commands/clear_sql'
10
+ require 'thinking_sphinx/commands/configure'
11
+ require 'thinking_sphinx/commands/index_sql'
12
+ require 'thinking_sphinx/commands/index_real_time'
13
+ require 'thinking_sphinx/commands/merge'
14
+ require 'thinking_sphinx/commands/merge_and_update'
15
+ require 'thinking_sphinx/commands/prepare'
16
+ require 'thinking_sphinx/commands/rotate'
17
+ require 'thinking_sphinx/commands/running'
18
+ require 'thinking_sphinx/commands/start_attached'
19
+ require 'thinking_sphinx/commands/start_detached'
20
+ require 'thinking_sphinx/commands/stop'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Commands::Base
2
4
  include ThinkingSphinx::WithOutput
3
5
 
@@ -15,6 +17,12 @@ class ThinkingSphinx::Commands::Base
15
17
 
16
18
  delegate :controller, :to => :configuration
17
19
 
20
+ def command(command, extra_options = {})
21
+ ThinkingSphinx::Commander.call(
22
+ command, configuration, options.merge(extra_options), stream
23
+ )
24
+ end
25
+
18
26
  def command_output(output)
19
27
  return "See above\n" if output.nil?
20
28
 
@@ -30,7 +38,7 @@ The Sphinx #{type} command failed:
30
38
  Output: #{command_output result.output}
31
39
  There may be more information about the failure in #{configuration.searchd.log}.
32
40
  TXT
33
- exit result.status
41
+ exit(result.status || 1)
34
42
  end
35
43
 
36
44
  def log(message)
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Commands::ClearRealTime < ThinkingSphinx::Commands::Base
4
+ def call
5
+ options[:indices].each do |index|
6
+ index.render
7
+ Dir["#{index.path}.*"].each { |path| FileUtils.rm path }
8
+ end
9
+
10
+ FileUtils.rm_r(binlog_path) if File.exists?(binlog_path)
11
+ end
12
+
13
+ private
14
+
15
+ def binlog_path
16
+ configuration.searchd.binlog_path
17
+ end
18
+
19
+ def type
20
+ 'clear_realtime'
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Commands::ClearSQL < ThinkingSphinx::Commands::Base
4
+ def call
5
+ options[:indices].each do |index|
6
+ index.render
7
+ Dir["#{index.path}.*"].each { |path| FileUtils.rm path }
8
+ end
9
+
10
+ FileUtils.rm_r Dir["#{configuration.indices_location}/ts-*.tmp"]
11
+ end
12
+
13
+ private
14
+
15
+ def type
16
+ 'clear_sql'
17
+ end
18
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Commands::Configure < ThinkingSphinx::Commands::Base
2
4
  def call
3
5
  log "Generating configuration to #{configuration.configuration_file}"
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Commands::IndexRealTime < ThinkingSphinx::Commands::Base
4
+ def call
5
+ options[:indices].each do |index|
6
+ ThinkingSphinx::RealTime::Populator.populate index
7
+
8
+ command :rotate
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ def type
15
+ 'indexing'
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Commands::IndexSQL < ThinkingSphinx::Commands::Base
4
+ def call
5
+ if indices.empty?
6
+ ThinkingSphinx.before_index_hooks.each { |hook| hook.call }
7
+ end
8
+
9
+ configuration.indexing_strategy.call(indices) do |index_names|
10
+ configuration.guarding_strategy.call(index_names) do |names|
11
+ controller.index *names, :verbose => options[:verbose]
12
+ end
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def indices
19
+ options[:indices] || []
20
+ end
21
+
22
+ def type
23
+ 'indexing'
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Commands::Merge < ThinkingSphinx::Commands::Base
4
+ def call
5
+ return unless indices_exist?
6
+
7
+ controller.merge(
8
+ options[:core_index].name,
9
+ options[:delta_index].name,
10
+ :filters => options[:filters],
11
+ :verbose => options[:verbose]
12
+ )
13
+ end
14
+
15
+ private
16
+
17
+ delegate :controller, :to => :configuration
18
+
19
+ def indices_exist?
20
+ File.exist?("#{options[:core_index].path}.spi") &&
21
+ File.exist?("#{options[:delta_index].path}.spi")
22
+ end
23
+
24
+ def type
25
+ 'merging'
26
+ end
27
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Commands::MergeAndUpdate < ThinkingSphinx::Commands::Base
4
+ def call
5
+ configuration.preload_indices
6
+ configuration.render
7
+
8
+ index_pairs.each do |(core_index, delta_index)|
9
+ command :merge,
10
+ :core_index => core_index,
11
+ :delta_index => delta_index,
12
+ :filters => {:sphinx_deleted => 0}
13
+
14
+ core_index.model.where(:delta => true).update_all(:delta => false)
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ delegate :controller, :to => :configuration
21
+
22
+ def core_indices
23
+ indices.select { |index| !index.delta? }.select do |index|
24
+ name_filters.empty? ||
25
+ name_filters.include?(index.name.gsub(/_core$/, ''))
26
+ end
27
+ end
28
+
29
+ def delta_for(core_index)
30
+ name = core_index.name.gsub(/_core$/, "_delta")
31
+ indices.detect { |index| index.name == name }
32
+ end
33
+
34
+ def index_pairs
35
+ core_indices.collect { |core_index|
36
+ [core_index, delta_for(core_index)]
37
+ }
38
+ end
39
+
40
+ def indices
41
+ @indices ||= configuration.indices.select { |index|
42
+ index.type == "plain" && index.options[:delta_processor]
43
+ }
44
+ end
45
+
46
+ def indices_exist?(*indices)
47
+ indices.all? { |index| File.exist?("#{index.path}.spi") }
48
+ end
49
+
50
+ def name_filters
51
+ @name_filters ||= options[:index_names] || []
52
+ end
53
+
54
+ def type
55
+ 'merging_and_updating'
56
+ end
57
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Commands::Prepare < ThinkingSphinx::Commands::Base
4
+ def call
5
+ FileUtils.mkdir_p configuration.indices_location
6
+ end
7
+
8
+ private
9
+
10
+ def type
11
+ 'prepare'
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Commands::Rotate < ThinkingSphinx::Commands::Base
4
+ def call
5
+ controller.rotate
6
+ end
7
+
8
+ private
9
+
10
+ def type
11
+ 'rotate'
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::Commands::Running < ThinkingSphinx::Commands::Base
4
+ def call
5
+ controller.running?
6
+ end
7
+
8
+ private
9
+
10
+ def type
11
+ 'running'
12
+ end
13
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Commands::StartAttached < ThinkingSphinx::Commands::Base
2
4
  def call
3
5
  FileUtils.mkdir_p configuration.indices_location
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Commands::StartDetached < ThinkingSphinx::Commands::Base
2
4
  def call
3
5
  FileUtils.mkdir_p configuration.indices_location
4
6
 
5
7
  result = controller.start :verbose => options[:verbose]
6
8
 
7
- if controller.running?
9
+ if command :running
8
10
  log "Started searchd successfully (pid: #{controller.pid})."
9
11
  else
10
12
  handle_failure result
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Commands::Stop < ThinkingSphinx::Commands::Base
2
4
  def call
3
- unless controller.running?
5
+ unless command :running
4
6
  log 'searchd is not currently running.'
5
7
  return
6
8
  end
7
9
 
8
10
  pid = controller.pid
9
- until !controller.running? do
11
+ until !command :running do
10
12
  controller.stop options
11
13
  sleep(0.5)
12
14
  end
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pathname'
2
4
 
3
5
  class ThinkingSphinx::Configuration < Riddle::Configuration
4
6
  attr_accessor :configuration_file, :indices_location, :version, :batch_size
5
7
  attr_reader :index_paths
6
- attr_writer :controller, :index_set_class, :indexing_strategy
8
+ attr_writer :controller, :index_set_class, :indexing_strategy,
9
+ :guarding_strategy
7
10
 
8
11
  delegate :environment, :to => :framework
9
12
 
@@ -29,7 +32,7 @@ class ThinkingSphinx::Configuration < Riddle::Configuration
29
32
 
30
33
  def controller
31
34
  @controller ||= begin
32
- rc = ThinkingSphinx::Controller.new self, configuration_file
35
+ rc = Riddle::Controller.new self, configuration_file
33
36
  rc.bin_path = bin_path.gsub(/([^\/])$/, '\1/') if bin_path.present?
34
37
  rc
35
38
  end
@@ -58,6 +61,10 @@ class ThinkingSphinx::Configuration < Riddle::Configuration
58
61
  end
59
62
  end
60
63
 
64
+ def guarding_strategy
65
+ @guarding_strategy ||= ThinkingSphinx::Guard::Files
66
+ end
67
+
61
68
  def index_set_class
62
69
  @index_set_class ||= ThinkingSphinx::IndexSet
63
70
  end
@@ -104,18 +111,15 @@ class ThinkingSphinx::Configuration < Riddle::Configuration
104
111
  end
105
112
 
106
113
  def settings
107
- @settings ||= File.exists?(settings_file) ? settings_to_hash : {}
114
+ @settings ||= ThinkingSphinx::Settings.call self
108
115
  end
109
116
 
110
117
  def setup
111
- @configuration_file = settings['configuration_file'] || framework_root.join(
112
- 'config', "#{environment}.sphinx.conf"
113
- ).to_s
114
- @index_paths = engine_index_paths + [framework_root.join('app', 'indices').to_s]
115
- @indices_location = settings['indices_location'] || framework_root.join(
116
- 'db', 'sphinx', environment
117
- ).to_s
118
- @version = settings['version'] || '2.1.4'
118
+ @configuration_file = settings['configuration_file']
119
+ @index_paths = engine_index_paths +
120
+ [Pathname.new(framework.root).join('app', 'indices').to_s]
121
+ @indices_location = settings['indices_location']
122
+ @version = settings['version'] || '2.2.11'
119
123
  @batch_size = settings['batch_size'] || 1000
120
124
 
121
125
  if settings['common_sphinx_configuration']
@@ -143,27 +147,14 @@ class ThinkingSphinx::Configuration < Riddle::Configuration
143
147
  end
144
148
 
145
149
  def configure_searchd
146
- configure_searchd_log_files
147
-
148
- searchd.binlog_path = tmp_path.join('binlog', environment).to_s
149
- searchd.address = settings['address'].presence || Defaults::ADDRESS
150
- searchd.mysql41 = settings['mysql41'] || settings['port'] || Defaults::PORT
151
- searchd.workers = 'threads'
152
- searchd.mysql_version_string = '5.5.21' if RUBY_PLATFORM == 'java'
153
- end
154
-
155
- def configure_searchd_log_files
156
- searchd.pid_file = log_root.join("#{environment}.sphinx.pid").to_s
157
- searchd.log = log_root.join("#{environment}.searchd.log").to_s
158
- searchd.query_log = log_root.join("#{environment}.searchd.query.log").to_s
159
- end
150
+ searchd.socket = "#{settings["socket"]}:mysql41" if socket?
160
151
 
161
- def framework_root
162
- Pathname.new(framework.root)
163
- end
152
+ if tcp?
153
+ searchd.address = settings['address'].presence || Defaults::ADDRESS
154
+ searchd.mysql41 = settings['mysql41'] || settings['port'] || Defaults::PORT
155
+ end
164
156
 
165
- def log_root
166
- real_path 'log'
157
+ searchd.mysql_version_string = '5.5.21' if RUBY_PLATFORM == 'java'
167
158
  end
168
159
 
169
160
  def normalise
@@ -175,26 +166,13 @@ class ThinkingSphinx::Configuration < Riddle::Configuration
175
166
  ThinkingSphinx::Configuration::MinimumFields.new(indices).reconcile
176
167
  end
177
168
 
178
- def real_path(*arguments)
179
- path = framework_root.join(*arguments)
180
- path.exist? ? path.realpath : path
181
- end
182
-
183
169
  def reset
184
170
  @settings = nil
185
171
  setup
186
172
  end
187
173
 
188
- def settings_file
189
- framework_root.join 'config', 'thinking_sphinx.yml'
190
- end
191
-
192
- def settings_to_hash
193
- input = File.read settings_file
194
- input = ERB.new(input).result if defined?(ERB)
195
-
196
- contents = YAML.load input
197
- contents && contents[environment] || {}
174
+ def socket?
175
+ settings["socket"].present?
198
176
  end
199
177
 
200
178
  def sphinx_sections
@@ -203,8 +181,11 @@ class ThinkingSphinx::Configuration < Riddle::Configuration
203
181
  sections
204
182
  end
205
183
 
206
- def tmp_path
207
- real_path 'tmp'
184
+ def tcp?
185
+ settings["socket"].nil? ||
186
+ settings["address"].present? ||
187
+ settings["mysql41"].present? ||
188
+ settings["port"].present?
208
189
  end
209
190
 
210
191
  def verify