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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::RealTime::Interpreter <
2
4
  ::ThinkingSphinx::Core::Interpreter
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::RealTime::Populator
2
4
  def self.populate(index)
3
5
  new(index).populate
@@ -15,7 +17,6 @@ class ThinkingSphinx::RealTime::Populator
15
17
  instrument 'populated', :instances => instances
16
18
  end
17
19
 
18
- controller.rotate
19
20
  instrument 'finish_populating'
20
21
  end
21
22
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::RealTime::Property
2
4
  include ThinkingSphinx::Core::Property
3
5
 
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::RealTime::TranscribeInstance
4
+ def self.call(instance, index, properties)
5
+ new(instance, index, properties).call
6
+ end
7
+
8
+ def initialize(instance, index, properties)
9
+ @instance, @index, @properties = instance, index, properties
10
+ end
11
+
12
+ def call
13
+ properties.each_with_object([document_id]) do |property, instance_values|
14
+ begin
15
+ instance_values << property.translate(instance)
16
+ rescue StandardError => error
17
+ raise_wrapper error, property
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :instance, :index, :properties
25
+
26
+ def document_id
27
+ index.document_id_for_key instance.id
28
+ end
29
+
30
+ def raise_wrapper(error, property)
31
+ wrapper = ThinkingSphinx::TranscriptionError.new
32
+ wrapper.inner_exception = error
33
+ wrapper.instance = instance
34
+ wrapper.property = property
35
+
36
+ raise wrapper
37
+ end
38
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::RealTime::Transcriber
2
4
  def initialize(index)
3
5
  @index = index
@@ -9,9 +11,16 @@ class ThinkingSphinx::RealTime::Transcriber
9
11
  }
10
12
  return unless items.present?
11
13
 
12
- values = items.collect { |instance|
13
- TranscribeInstance.call(instance, index, properties)
14
- }
14
+ values = []
15
+ items.each do |instance|
16
+ begin
17
+ values << ThinkingSphinx::RealTime::TranscribeInstance.call(
18
+ instance, index, properties
19
+ )
20
+ rescue ThinkingSphinx::TranscriptionError => error
21
+ instrument 'error', :error => error
22
+ end
23
+ end
15
24
 
16
25
  insert = Riddle::Query::Insert.new index.name, columns, values
17
26
  sphinxql = insert.replace!.to_sql
@@ -23,30 +32,6 @@ class ThinkingSphinx::RealTime::Transcriber
23
32
  end
24
33
  end
25
34
 
26
- class TranscribeInstance
27
- def self.call(instance, index, properties)
28
- new(instance, index, properties).call
29
- end
30
-
31
- def initialize(instance, index, properties)
32
- @instance, @index, @properties = instance, index, properties
33
- end
34
-
35
- def call
36
- properties.each_with_object([document_id]) do |property, instance_values|
37
- instance_values << property.translate(instance)
38
- end
39
- end
40
-
41
- private
42
-
43
- attr_reader :instance, :index, :properties
44
-
45
- def document_id
46
- index.document_id_for_key instance.id
47
- end
48
- end
49
-
50
35
  private
51
36
 
52
37
  attr_reader :index
@@ -70,6 +55,12 @@ class ThinkingSphinx::RealTime::Transcriber
70
55
  }
71
56
  end
72
57
 
58
+ def instrument(message, options = {})
59
+ ActiveSupport::Notifications.instrument(
60
+ "#{message}.thinking_sphinx.real_time", options.merge(:index => index)
61
+ )
62
+ end
63
+
73
64
  def properties
74
65
  @properties ||= index.fields + index.attributes
75
66
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::RealTime::Translator
2
4
  def self.call(object, column)
3
5
  new(object, column).call
@@ -11,7 +13,7 @@ class ThinkingSphinx::RealTime::Translator
11
13
  return name unless name.is_a?(Symbol)
12
14
  return result unless result.is_a?(String)
13
15
 
14
- result.gsub "\u0000", ''
16
+ result.gsub("\u0000", '').force_encoding "UTF-8"
15
17
  end
16
18
 
17
19
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ThinkingSphinx::Scopes
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Search < Array
2
4
  CORE_METHODS = %w( == class class_eval extend frozen? id instance_eval
3
5
  instance_of? instance_values instance_variable_defined?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Search::BatchInquirer
2
4
  def initialize(&block)
3
5
  @queries = []
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Search::Context
2
4
  attr_reader :search, :configuration
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Search::Glaze < BasicObject
2
4
  def initialize(context, object, raw = {}, pane_classes = [])
3
5
  @object, @raw = object, raw
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Search::Merger
2
4
  attr_reader :search
3
5
 
@@ -1,4 +1,6 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
2
4
  class ThinkingSphinx::Search::Query
3
5
  attr_reader :keywords, :conditions, :star
4
6
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Search::StaleIdsException < StandardError
2
4
  attr_reader :ids, :context
3
5
 
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+
5
+ class ThinkingSphinx::Settings
6
+ ALWAYS_ABSOLUTE = %w[ socket ]
7
+ FILE_KEYS = %w[
8
+ indices_location configuration_file bin_path log query_log pid_file
9
+ binlog_path snippets_file_prefix sphinxql_state path stopwords wordforms
10
+ exceptions global_idf rlp_context rlp_root rlp_environment plugin_dir
11
+ lemmatizer_base mysql_ssl_cert mysql_ssl_key mysql_ssl_ca
12
+ ].freeze
13
+ DEFAULTS = {
14
+ "configuration_file" => "config/ENVIRONMENT.sphinx.conf",
15
+ "indices_location" => "db/sphinx/ENVIRONMENT",
16
+ "pid_file" => "log/ENVIRONMENT.sphinx.pid",
17
+ "log" => "log/ENVIRONMENT.searchd.log",
18
+ "query_log" => "log/ENVIRONMENT.searchd.query.log",
19
+ "binlog_path" => "tmp/binlog/ENVIRONMENT",
20
+ "workers" => "threads"
21
+ }.freeze
22
+
23
+ def self.call(configuration)
24
+ new(configuration).call
25
+ end
26
+
27
+ def initialize(configuration)
28
+ @configuration = configuration
29
+ end
30
+
31
+ def call
32
+ return defaults unless File.exists? file
33
+
34
+ merged.inject({}) do |hash, (key, value)|
35
+ if absolute_key?(key)
36
+ hash[key] = absolute value
37
+ else
38
+ hash[key] = value
39
+ end
40
+ hash
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ attr_reader :configuration
47
+
48
+ delegate :framework, :to => :configuration
49
+
50
+ def absolute(relative)
51
+ return relative if relative.nil?
52
+
53
+ real_path File.absolute_path(relative, framework.root)
54
+ end
55
+
56
+ def absolute_key?(key)
57
+ return true if ALWAYS_ABSOLUTE.include?(key)
58
+
59
+ merged["absolute_paths"] && file_keys.include?(key)
60
+ end
61
+
62
+ def defaults
63
+ DEFAULTS.inject({}) do |hash, (key, value)|
64
+ value = value.gsub("ENVIRONMENT", framework.environment)
65
+
66
+ if FILE_KEYS.include?(key)
67
+ hash[key] = absolute value
68
+ else
69
+ hash[key] = value
70
+ end
71
+
72
+ hash
73
+ end
74
+ end
75
+
76
+ def file
77
+ @file ||= Pathname.new(framework.root).join "config", "thinking_sphinx.yml"
78
+ end
79
+
80
+ def file_keys
81
+ @file_keys ||= FILE_KEYS + (original["file_keys"] || [])
82
+ end
83
+
84
+ def join(first, last)
85
+ return first if last.nil?
86
+
87
+ File.join first, last
88
+ end
89
+
90
+ def merged
91
+ @merged ||= defaults.merge original
92
+ end
93
+
94
+ def original
95
+ input = File.read file
96
+ input = ERB.new(input).result if defined?(ERB)
97
+
98
+ contents = YAML.load input
99
+ contents && contents[framework.environment] || {}
100
+ end
101
+
102
+ def real_path(base, nonexistent = nil)
103
+ if File.exist?(base)
104
+ join File.realpath(base), nonexistent
105
+ else
106
+ components = File.split base
107
+ real_path components.first, join(components.last, nonexistent)
108
+ end
109
+ end
110
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'thinking_sphinx'
2
4
 
3
5
  ActiveSupport.on_load :active_record do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThinkingSphinx::Subscribers::PopulatorSubscriber
2
4
  def self.attach_to(namespace)
3
5
  subscriber = new
@@ -16,6 +18,17 @@ class ThinkingSphinx::Subscribers::PopulatorSubscriber
16
18
  ActiveSupport::Notifications::Event.new(message, *args)
17
19
  end
18
20
 
21
+ def error(event)
22
+ error = event.payload[:error].inner_exception
23
+ instance = event.payload[:error].instance
24
+
25
+ puts <<-MESSAGE
26
+
27
+ Error transcribing #{instance.class} #{instance.id}:
28
+ #{error.message}
29
+ MESSAGE
30
+ end
31
+
19
32
  def start_populating(event)
20
33
  puts "Generating index files for #{event.payload[:index].name}"
21
34
  end
@@ -27,6 +40,11 @@ class ThinkingSphinx::Subscribers::PopulatorSubscriber
27
40
  def finish_populating(event)
28
41
  print "\n"
29
42
  end
43
+
44
+ private
45
+
46
+ delegate :output, :to => ThinkingSphinx
47
+ delegate :puts, :print, :to => :output
30
48
  end
31
49
 
32
50
  ThinkingSphinx::Subscribers::PopulatorSubscriber.attach_to(
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  namespace :ts do
2
4
  desc 'Generate the Sphinx configuration file'
3
5
  task :configure => :environment do
@@ -10,53 +12,14 @@ namespace :ts do
10
12
  desc 'Clear out Sphinx files'
11
13
  task :clear => ['ts:sql:clear', 'ts:rt:clear']
12
14
 
13
- desc 'DEPRECATED: Clear out real-time index files'
14
- task :clear_rt => :environment do
15
- puts <<-TXT
16
- The ts:clear_rt task is now deprecated due to the unified task approach, and
17
- invokes ts:rt:clear.
18
- * To delete all indices (both SQL-backed and real-time), use ts:clear.
19
- * To delete just real-time indices, use ts:rt:clear.
20
- * To delete just SQL-backed indices, use ts:sql:clear.
21
-
22
- TXT
23
-
24
- Rake::Task['ts:rt:clear'].invoke
25
- end
26
-
27
- desc 'DEPRECATED: Generate fresh index files for all indices'
28
- task :generate => :environment do
29
- puts <<-TXT
30
- The ts:generate task is now deprecated due to the unified task approach, and
31
- invokes ts:index.
32
- * To process all indices (both SQL-backed and real-time), use ts:index.
33
- * To process just real-time indices, use ts:rt:index.
34
- * To process just SQL-backed indices, use ts:sql:index.
35
-
36
- TXT
37
-
38
- Rake::Task['ts:index'].invoke
39
- end
15
+ desc "Merge all delta indices into their respective core indices"
16
+ task :merge => ["ts:sql:merge"]
40
17
 
41
18
  desc 'Delete and regenerate Sphinx files, restart the daemon'
42
19
  task :rebuild => [
43
20
  :stop, :clear, :configure, 'ts:sql:index', :start, 'ts:rt:index'
44
21
  ]
45
22
 
46
- desc 'DEPRECATED: Delete and regenerate Sphinx files, restart the daemon'
47
- task :regenerate do
48
- puts <<-TXT
49
- The ts:regenerate task is now deprecated due to the unified task approach, and
50
- invokes ts:rebuild.
51
- * To rebuild all indices (both SQL-backed and real-time), use ts:rebuild.
52
- * To rebuild just real-time indices, use ts:rt:rebuild.
53
- * To rebuild just SQL-backed indices, use ts:sql:rebuild.
54
-
55
- TXT
56
-
57
- Rake::Task['ts:rebuild'].invoke
58
- end
59
-
60
23
  desc 'Restart the Sphinx daemon'
61
24
  task :restart => [:stop, :start]
62
25
 
@@ -86,6 +49,10 @@ invokes ts:rebuild.
86
49
  interface.sql.index(ENV['INDEX_ONLY'] != 'true')
87
50
  end
88
51
 
52
+ task :merge => :environment do
53
+ interface.sql.merge
54
+ end
55
+
89
56
  desc 'Delete and regenerate SQL-backed Sphinx files, restart the daemon'
90
57
  task :rebuild => ['ts:stop', 'ts:sql:clear', 'ts:sql:index', 'ts:start']
91
58
  end
@@ -108,11 +75,11 @@ invokes ts:rebuild.
108
75
  end
109
76
 
110
77
  def interface
111
- @interface ||= ThinkingSphinx::RakeInterface.new(
112
- :verbose => Rake::FileUtilsExt.verbose_flag,
113
- :silent => Rake.application.options.silent,
114
- :nodetach => (ENV['NODETACH'] == 'true'),
115
- :index_filter => ENV['INDEX_FILTER']
78
+ @interface ||= ThinkingSphinx.rake_interface.new(
79
+ :verbose => Rake::FileUtilsExt.verbose_flag,
80
+ :silent => Rake.application.options.silent,
81
+ :nodetach => (ENV['NODETACH'] == 'true'),
82
+ :index_names => ENV.fetch('INDEX_FILTER', '').split(',')
116
83
  )
117
84
  end
118
85
  end