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,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