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,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe ThinkingSphinx::Commands::Prepare do
6
+ let(:command) { ThinkingSphinx::Commands::Prepare.new(
7
+ configuration, {}, stream
8
+ ) }
9
+ let(:configuration) { double 'configuration',
10
+ :indices_location => '/path/to/indices'
11
+ }
12
+ let(:stream) { double :puts => nil }
13
+
14
+ before :each do
15
+ allow(FileUtils).to receive_messages :mkdir_p => true
16
+ end
17
+
18
+ it "creates the directory for the index files" do
19
+ expect(FileUtils).to receive(:mkdir_p).with('/path/to/indices')
20
+
21
+ command.call
22
+ end
23
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe ThinkingSphinx::Commands::StartDetached do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe ThinkingSphinx::Commands::Stop do
@@ -7,13 +9,18 @@ RSpec.describe ThinkingSphinx::Commands::Stop do
7
9
  let(:configuration) { double 'configuration', :controller => controller }
8
10
  let(:controller) { double 'controller', :stop => true, :pid => 101 }
9
11
  let(:stream) { double :puts => nil }
12
+ let(:commander) { double :call => nil }
10
13
 
11
14
  before :each do
12
- allow(controller).to receive(:running?).and_return(true, true, false)
15
+ stub_const 'ThinkingSphinx::Commander', commander
16
+
17
+ allow(commander).to receive(:call).
18
+ with(:running, configuration, {}, stream).and_return(true, true, false)
13
19
  end
14
20
 
15
21
  it "prints a message if the daemon is not already running" do
16
- allow(controller).to receive_messages :running? => false
22
+ allow(commander).to receive(:call).
23
+ with(:running, configuration, {}, stream).and_return(false)
17
24
 
18
25
  expect(stream).to receive(:puts).with('searchd is not currently running.').
19
26
  and_return(nil)
@@ -24,7 +31,8 @@ RSpec.describe ThinkingSphinx::Commands::Stop do
24
31
  end
25
32
 
26
33
  it "does not try to stop the daemon if it's not running" do
27
- allow(controller).to receive_messages :running? => false
34
+ allow(commander).to receive(:call).
35
+ with(:running, configuration, {}, stream).and_return(false)
28
36
 
29
37
  expect(controller).to_not receive(:stop)
30
38
 
@@ -44,7 +52,8 @@ RSpec.describe ThinkingSphinx::Commands::Stop do
44
52
  end
45
53
 
46
54
  it "should retry stopping the daemon until it stops" do
47
- allow(controller).to receive(:running?).
55
+ allow(commander).to receive(:call).
56
+ with(:running, configuration, {}, stream).
48
57
  and_return(true, true, true, false)
49
58
 
50
59
  expect(controller).to receive(:stop).twice
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe ThinkingSphinx::Configuration::MinimumFields do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Configuration do
@@ -112,6 +114,53 @@ describe ThinkingSphinx::Configuration do
112
114
 
113
115
  expect(config.indices_location).to eq('/my/index/files')
114
116
  end
117
+
118
+ it "respects relative paths" do
119
+ write_configuration 'indices_location' => 'my/index/files'
120
+
121
+ expect(config.indices_location).to eq('my/index/files')
122
+ end
123
+
124
+ it "translates relative paths to absolute if config requests it" do
125
+ write_configuration(
126
+ 'indices_location' => 'my/index/files',
127
+ 'absolute_paths' => true
128
+ )
129
+
130
+ expect(config.indices_location).to eq(
131
+ File.join(config.framework.root, 'my/index/files')
132
+ )
133
+ end
134
+
135
+ it "respects paths that are already absolute" do
136
+ write_configuration(
137
+ 'indices_location' => '/my/index/files',
138
+ 'absolute_paths' => true
139
+ )
140
+
141
+ expect(config.indices_location).to eq('/my/index/files')
142
+ end
143
+
144
+ it "translates linked directories" do
145
+ write_configuration(
146
+ 'indices_location' => 'mine/index/files',
147
+ 'absolute_paths' => true
148
+ )
149
+
150
+ framework = ThinkingSphinx::Frameworks.current
151
+ local_path = File.join framework.root, "mine"
152
+ linked_path = File.join framework.root, "my"
153
+
154
+ FileUtils.mkdir_p linked_path
155
+ `ln -s #{linked_path} #{local_path}`
156
+
157
+ expect(config.indices_location).to eq(
158
+ File.join(config.framework.root, "my/index/files")
159
+ )
160
+
161
+ FileUtils.rm local_path
162
+ FileUtils.rmdir linked_path
163
+ end
115
164
  end
116
165
 
117
166
  describe '#initialize' do
@@ -342,6 +391,33 @@ describe ThinkingSphinx::Configuration do
342
391
  end
343
392
  end
344
393
 
394
+ describe '#log' do
395
+ it "defaults to an environment-specific file" do
396
+ expect(config.searchd.log).to eq(
397
+ File.join(config.framework.root, "log/test.searchd.log")
398
+ )
399
+ end
400
+
401
+ it "translates linked directories" do
402
+ framework = ThinkingSphinx::Frameworks.current
403
+ log_path = File.join framework.root, "log"
404
+ linked_path = File.join framework.root, "logging"
405
+ log_exists = File.exist? log_path
406
+
407
+ FileUtils.mv log_path, "#{log_path}-tmp" if log_exists
408
+ FileUtils.mkdir_p linked_path
409
+ `ln -s #{linked_path} #{log_path}`
410
+
411
+ expect(config.searchd.log).to eq(
412
+ File.join(config.framework.root, "logging/test.searchd.log")
413
+ )
414
+
415
+ FileUtils.rm log_path
416
+ FileUtils.rmdir linked_path
417
+ FileUtils.mv "#{log_path}-tmp", log_path if log_exists
418
+ end unless RUBY_PLATFORM == "java"
419
+ end
420
+
345
421
  describe '#mysql41' do
346
422
  it "defaults to 9306" do
347
423
  expect(config.searchd.mysql41).to eq(9306)
@@ -359,6 +435,56 @@ describe ThinkingSphinx::Configuration do
359
435
  expect(config.searchd.mysql41).to eq(9307)
360
436
  end
361
437
  end
438
+
439
+ describe "#socket" do
440
+ it "does not set anything by default" do
441
+ expect(config.searchd.socket).to be_nil
442
+ end
443
+
444
+ it "ignores unspecified address and port when socket is set" do
445
+ write_configuration("socket" => "/my/socket")
446
+
447
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
448
+ expect(config.searchd.address).to be_nil
449
+ expect(config.searchd.mysql41).to be_nil
450
+ end
451
+
452
+ it "allows address and socket settings" do
453
+ write_configuration("socket" => "/my/socket", "address" => "1.1.1.1")
454
+
455
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
456
+ expect(config.searchd.address).to eq("1.1.1.1")
457
+ expect(config.searchd.mysql41).to eq(9306)
458
+ end
459
+
460
+ it "allows mysql41 and socket settings" do
461
+ write_configuration("socket" => "/my/socket", "mysql41" => 9307)
462
+
463
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
464
+ expect(config.searchd.address).to eq("127.0.0.1")
465
+ expect(config.searchd.mysql41).to eq(9307)
466
+ end
467
+
468
+ it "allows port and socket settings" do
469
+ write_configuration("socket" => "/my/socket", "port" => 9307)
470
+
471
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
472
+ expect(config.searchd.address).to eq("127.0.0.1")
473
+ expect(config.searchd.mysql41).to eq(9307)
474
+ end
475
+
476
+ it "allows address, mysql41 and socket settings" do
477
+ write_configuration(
478
+ "socket" => "/my/socket",
479
+ "address" => "1.2.3.4",
480
+ "mysql41" => 9307
481
+ )
482
+
483
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
484
+ expect(config.searchd.address).to eq("1.2.3.4")
485
+ expect(config.searchd.mysql41).to eq(9307)
486
+ end
487
+ end
362
488
  end
363
489
 
364
490
  describe '#settings' do
@@ -390,11 +516,11 @@ describe ThinkingSphinx::Configuration do
390
516
  config.settings
391
517
  end
392
518
 
393
- it "returns an empty hash when no settings for the environment exist" do
519
+ it "returns the default hash when no settings for the environment exist" do
394
520
  allow(File).to receive_messages :read => {'test' => {'foo' => 'bar'}}.to_yaml
395
521
  allow(Rails).to receive_messages :env => 'staging'
396
522
 
397
- expect(config.settings).to eq({})
523
+ expect(config.settings.class).to eq(Hash)
398
524
  end
399
525
  end
400
526
 
@@ -409,15 +535,15 @@ describe ThinkingSphinx::Configuration do
409
535
  config.settings
410
536
  end
411
537
 
412
- it "returns an empty hash" do
413
- expect(config.settings).to eq({})
538
+ it "returns a hash" do
539
+ expect(config.settings.class).to eq(Hash)
414
540
  end
415
541
  end
416
542
  end
417
543
 
418
544
  describe '#version' do
419
- it "defaults to 2.1.4" do
420
- expect(config.version).to eq('2.1.4')
545
+ it "defaults to 2.2.11" do
546
+ expect(config.version).to eq('2.2.11')
421
547
  end
422
548
 
423
549
  it "respects supplied YAML versions" do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Connection do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Deletion do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Deltas::DefaultDelta do
@@ -68,13 +70,18 @@ describe ThinkingSphinx::Deltas::DefaultDelta do
68
70
  let(:config) { double('config', :controller => controller,
69
71
  :settings => {}) }
70
72
  let(:controller) { double('controller') }
73
+ let(:commander) { double('commander', :call => true) }
71
74
 
72
75
  before :each do
76
+ stub_const 'ThinkingSphinx::Commander', commander
77
+
73
78
  allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
74
79
  end
75
80
 
76
81
  it "indexes the given index" do
77
- expect(controller).to receive(:index).with('foo_delta', :verbose => false)
82
+ expect(commander).to receive(:call).with(
83
+ :index_sql, config, :indices => ['foo_delta'], :verbose => false
84
+ )
78
85
 
79
86
  delta.index double('index', :name => 'foo_delta')
80
87
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Deltas do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::SphinxError do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Excerpter do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::FacetSearch do
@@ -25,12 +27,12 @@ describe ThinkingSphinx::FacetSearch do
25
27
  DumbSearch = ::Struct.new(:query, :options) do
26
28
  def raw
27
29
  [{
28
- 'sphinx_internal_class' => 'Foo',
29
- 'price_bracket' => 3,
30
- 'tag_ids' => '1,2',
31
- 'category_id' => 11,
32
- ThinkingSphinx::SphinxQL.count[:column] => 5,
33
- ThinkingSphinx::SphinxQL.group_by[:column] => 2
30
+ 'sphinx_internal_class' => 'Foo',
31
+ 'price_bracket' => 3,
32
+ 'tag_ids' => '1,2',
33
+ 'category_id' => 11,
34
+ "sphinx_internal_count" => 5,
35
+ "sphinx_internal_group" => 2
34
36
  }]
35
37
  end
36
38
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe ThinkingSphinx::Hooks::GuardPresence do
6
+ let(:subject) do
7
+ ThinkingSphinx::Hooks::GuardPresence.new configuration, stream
8
+ end
9
+ let(:configuration) { double "configuration", :indices_location => "/path" }
10
+ let(:stream) { double "stream", :puts => nil }
11
+
12
+ describe "#call" do
13
+ it "outputs nothing if no guard files exist" do
14
+ allow(Dir).to receive(:[]).with('/path/ts-*.tmp').and_return([])
15
+
16
+ expect(stream).not_to receive(:puts)
17
+
18
+ subject.call
19
+ end
20
+
21
+ it "outputs a warning if a guard file exists" do
22
+ allow(Dir).to receive(:[]).with('/path/ts-*.tmp').
23
+ and_return(['/path/ts-foo.tmp'])
24
+
25
+ expect(stream).to receive(:puts)
26
+
27
+ subject.call
28
+ end
29
+ end
30
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ThinkingSphinx; end
2
4
 
3
5
  require 'active_support/core_ext/string/inflections'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Index do
@@ -1,28 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe ThinkingSphinx::Interfaces::Daemon do
4
- let(:configuration) { double 'configuration', :controller => controller }
5
- let(:controller) { double 'controller', :running? => false }
6
+ let(:configuration) { double 'configuration' }
6
7
  let(:stream) { double 'stream', :puts => true }
8
+ let(:commander) { double :call => nil }
7
9
  let(:interface) {
8
10
  ThinkingSphinx::Interfaces::Daemon.new(configuration, {}, stream)
9
11
  }
10
12
 
11
- describe '#start' do
12
- let(:command) { double 'command', :call => true }
13
+ before :each do
14
+ stub_const 'ThinkingSphinx::Commander', commander
13
15
 
14
- before :each do
15
- stub_const 'ThinkingSphinx::Commands::StartDetached', command
16
- end
16
+ allow(commander).to receive(:call).
17
+ with(:running, configuration, {}, stream).and_return(false)
18
+ end
17
19
 
20
+ describe '#start' do
18
21
  it "starts the daemon" do
19
- expect(command).to receive(:call)
22
+ expect(commander).to receive(:call).with(
23
+ :start_detached, configuration, {}, stream
24
+ )
20
25
 
21
26
  interface.start
22
27
  end
23
28
 
24
29
  it "raises an error if the daemon is already running" do
25
- allow(controller).to receive_messages :running? => true
30
+ allow(commander).to receive(:call).
31
+ with(:running, configuration, {}, stream).and_return(true)
26
32
 
27
33
  expect {
28
34
  interface.start
@@ -32,7 +38,8 @@ RSpec.describe ThinkingSphinx::Interfaces::Daemon do
32
38
 
33
39
  describe '#status' do
34
40
  it "reports when the daemon is running" do
35
- allow(controller).to receive_messages :running? => true
41
+ allow(commander).to receive(:call).
42
+ with(:running, configuration, {}, stream).and_return(true)
36
43
 
37
44
  expect(stream).to receive(:puts).
38
45
  with('The Sphinx daemon searchd is currently running.')
@@ -41,7 +48,8 @@ RSpec.describe ThinkingSphinx::Interfaces::Daemon do
41
48
  end
42
49
 
43
50
  it "reports when the daemon is not running" do
44
- allow(controller).to receive_messages :running? => false
51
+ allow(commander).to receive(:call).
52
+ with(:running, configuration, {}, stream).and_return(false)
45
53
 
46
54
  expect(stream).to receive(:puts).
47
55
  with('The Sphinx daemon searchd is not currently running.')