thinking-sphinx 2.1.0 → 3.0.0.pre

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 (352) hide show
  1. data/.gitignore +8 -0
  2. data/.travis.yml +13 -0
  3. data/Appraisals +7 -0
  4. data/Gemfile +10 -0
  5. data/HISTORY +2 -267
  6. data/LICENCE +1 -1
  7. data/README.textile +194 -226
  8. data/Rakefile +24 -0
  9. data/gemfiles/.gitignore +1 -0
  10. data/gemfiles/rails_3_1.gemfile +11 -0
  11. data/gemfiles/rails_3_2.gemfile +11 -0
  12. data/lib/thinking-sphinx.rb +1 -1
  13. data/lib/thinking_sphinx.rb +34 -292
  14. data/lib/thinking_sphinx/active_record.rb +22 -383
  15. data/lib/thinking_sphinx/active_record/association.rb +9 -0
  16. data/lib/thinking_sphinx/active_record/association_proxy.rb +68 -0
  17. data/lib/thinking_sphinx/active_record/associations.rb +68 -0
  18. data/lib/thinking_sphinx/active_record/attribute.rb +20 -0
  19. data/lib/thinking_sphinx/active_record/attribute/sphinx_presenter.rb +32 -0
  20. data/lib/thinking_sphinx/active_record/attribute/type.rb +79 -0
  21. data/lib/thinking_sphinx/active_record/attribute/values.rb +18 -0
  22. data/lib/thinking_sphinx/active_record/base.rb +36 -0
  23. data/lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb +31 -0
  24. data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +55 -0
  25. data/lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb +59 -0
  26. data/lib/thinking_sphinx/active_record/column.rb +30 -0
  27. data/lib/thinking_sphinx/active_record/database_adapters.rb +51 -0
  28. data/lib/thinking_sphinx/active_record/database_adapters/abstract_adapter.rb +13 -0
  29. data/lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb +23 -0
  30. data/lib/thinking_sphinx/active_record/database_adapters/postgresql_adapter.rb +25 -0
  31. data/lib/thinking_sphinx/active_record/field.rb +11 -0
  32. data/lib/thinking_sphinx/active_record/index.rb +55 -0
  33. data/lib/thinking_sphinx/active_record/interpreter.rb +47 -0
  34. data/lib/thinking_sphinx/active_record/log_subscriber.rb +10 -58
  35. data/lib/thinking_sphinx/active_record/property.rb +28 -0
  36. data/lib/thinking_sphinx/active_record/property_sql_presenter.rb +60 -0
  37. data/lib/thinking_sphinx/active_record/sql_builder.rb +159 -0
  38. data/lib/thinking_sphinx/active_record/sql_source.rb +138 -0
  39. data/lib/thinking_sphinx/active_record/sql_source/template.rb +46 -0
  40. data/lib/thinking_sphinx/batched_search.rb +26 -0
  41. data/lib/thinking_sphinx/callbacks.rb +15 -0
  42. data/lib/thinking_sphinx/configuration.rb +80 -331
  43. data/lib/thinking_sphinx/configuration/consistent_ids.rb +31 -0
  44. data/lib/thinking_sphinx/configuration/defaults.rb +5 -0
  45. data/lib/thinking_sphinx/core.rb +6 -0
  46. data/lib/thinking_sphinx/core/index.rb +68 -0
  47. data/lib/thinking_sphinx/core/interpreter.rb +19 -0
  48. data/lib/thinking_sphinx/deltas.rb +35 -26
  49. data/lib/thinking_sphinx/deltas/default_delta.rb +56 -56
  50. data/lib/thinking_sphinx/excerpter.rb +23 -21
  51. data/lib/thinking_sphinx/facet.rb +22 -127
  52. data/lib/thinking_sphinx/facet_search.rb +95 -162
  53. data/lib/thinking_sphinx/index.rb +39 -143
  54. data/lib/thinking_sphinx/index_set.rb +51 -0
  55. data/lib/thinking_sphinx/masks.rb +8 -0
  56. data/lib/thinking_sphinx/masks/group_enumerators_mask.rb +23 -0
  57. data/lib/thinking_sphinx/masks/pagination_mask.rb +60 -0
  58. data/lib/thinking_sphinx/masks/scopes_mask.rb +35 -0
  59. data/lib/thinking_sphinx/masks/weight_enumerator_mask.rb +11 -0
  60. data/lib/thinking_sphinx/middlewares.rb +36 -0
  61. data/lib/thinking_sphinx/middlewares/active_record_translator.rb +73 -0
  62. data/lib/thinking_sphinx/middlewares/geographer.rb +53 -0
  63. data/lib/thinking_sphinx/middlewares/glazier.rb +39 -0
  64. data/lib/thinking_sphinx/middlewares/ids_only.rb +13 -0
  65. data/lib/thinking_sphinx/middlewares/inquirer.rb +62 -0
  66. data/lib/thinking_sphinx/middlewares/middleware.rb +9 -0
  67. data/lib/thinking_sphinx/middlewares/sphinxql.rb +149 -0
  68. data/lib/thinking_sphinx/middlewares/stale_id_checker.rb +45 -0
  69. data/lib/thinking_sphinx/middlewares/stale_id_filter.rb +46 -0
  70. data/lib/thinking_sphinx/panes.rb +8 -0
  71. data/lib/thinking_sphinx/panes/attributes_pane.rb +9 -0
  72. data/lib/thinking_sphinx/panes/distance_pane.rb +13 -0
  73. data/lib/thinking_sphinx/panes/excerpts_pane.rb +37 -0
  74. data/lib/thinking_sphinx/panes/weight_pane.rb +9 -0
  75. data/lib/thinking_sphinx/railtie.rb +6 -40
  76. data/lib/thinking_sphinx/rake_interface.rb +47 -0
  77. data/lib/thinking_sphinx/real_time.rb +11 -0
  78. data/lib/thinking_sphinx/real_time/attribute.rb +5 -0
  79. data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +48 -0
  80. data/lib/thinking_sphinx/real_time/field.rb +3 -0
  81. data/lib/thinking_sphinx/real_time/index.rb +47 -0
  82. data/lib/thinking_sphinx/real_time/index/template.rb +33 -0
  83. data/lib/thinking_sphinx/real_time/interpreter.rb +23 -0
  84. data/lib/thinking_sphinx/real_time/property.rb +16 -0
  85. data/lib/thinking_sphinx/scopes.rb +22 -0
  86. data/lib/thinking_sphinx/search.rb +90 -1028
  87. data/lib/thinking_sphinx/search/batch_inquirer.rb +27 -0
  88. data/lib/thinking_sphinx/search/context.rb +26 -0
  89. data/lib/thinking_sphinx/search/glaze.rb +32 -0
  90. data/lib/thinking_sphinx/search/merger.rb +24 -0
  91. data/lib/thinking_sphinx/search/query.rb +43 -0
  92. data/lib/thinking_sphinx/search/stale_ids_exception.rb +11 -0
  93. data/lib/thinking_sphinx/search/translator.rb +50 -0
  94. data/lib/thinking_sphinx/tasks.rb +22 -125
  95. data/lib/thinking_sphinx/test.rb +9 -19
  96. data/sketchpad.rb +58 -0
  97. data/spec/acceptance/association_scoping_spec.rb +23 -0
  98. data/spec/acceptance/attribute_access_spec.rb +39 -0
  99. data/spec/acceptance/attribute_updates_spec.rb +16 -0
  100. data/spec/acceptance/batch_searching_spec.rb +21 -0
  101. data/spec/acceptance/big_integers_spec.rb +27 -0
  102. data/spec/acceptance/excerpts_spec.rb +14 -0
  103. data/spec/acceptance/facets_spec.rb +122 -0
  104. data/spec/acceptance/geosearching_spec.rb +39 -0
  105. data/spec/acceptance/grouping_by_attributes_spec.rb +77 -0
  106. data/spec/acceptance/paginating_search_results_spec.rb +24 -0
  107. data/spec/acceptance/remove_deleted_records_spec.rb +23 -0
  108. data/spec/acceptance/search_counts_spec.rb +18 -0
  109. data/spec/acceptance/search_for_just_ids_spec.rb +19 -0
  110. data/spec/acceptance/searching_across_models_spec.rb +28 -0
  111. data/spec/acceptance/searching_on_fields_spec.rb +56 -0
  112. data/spec/acceptance/searching_with_filters_spec.rb +109 -0
  113. data/spec/acceptance/searching_with_sti_spec.rb +55 -0
  114. data/spec/acceptance/searching_within_a_model_spec.rb +52 -0
  115. data/spec/acceptance/sorting_search_results_spec.rb +41 -0
  116. data/spec/acceptance/spec_helper.rb +4 -0
  117. data/spec/acceptance/specifying_sql_spec.rb +62 -0
  118. data/spec/acceptance/sphinx_scopes_spec.rb +49 -0
  119. data/spec/acceptance/sql_deltas_spec.rb +43 -0
  120. data/spec/acceptance/support/database_cleaner.rb +11 -0
  121. data/spec/acceptance/support/sphinx_controller.rb +39 -0
  122. data/spec/acceptance/support/sphinx_helpers.rb +24 -0
  123. data/spec/acceptance/suspended_deltas_spec.rb +20 -0
  124. data/spec/internal/.gitignore +1 -0
  125. data/spec/internal/app/indices/animal_index.rb +3 -0
  126. data/spec/internal/app/indices/article_index.rb +24 -0
  127. data/spec/internal/app/indices/book_index.rb +8 -0
  128. data/spec/internal/app/indices/city_index.rb +6 -0
  129. data/spec/internal/app/indices/product_index.rb +3 -0
  130. data/spec/internal/app/indices/tee_index.rb +4 -0
  131. data/spec/internal/app/indices/user_index.rb +5 -0
  132. data/spec/internal/app/models/animal.rb +2 -0
  133. data/spec/internal/app/models/article.rb +5 -0
  134. data/spec/internal/app/models/bird.rb +2 -0
  135. data/spec/internal/app/models/book.rb +11 -0
  136. data/spec/internal/app/models/city.rb +2 -0
  137. data/spec/internal/app/models/colour.rb +3 -0
  138. data/spec/internal/app/models/flightless_bird.rb +2 -0
  139. data/spec/internal/app/models/mammal.rb +2 -0
  140. data/spec/internal/app/models/product.rb +3 -0
  141. data/spec/internal/app/models/tag.rb +4 -0
  142. data/{features/thinking_sphinx → spec/internal/app}/models/tagging.rb +1 -1
  143. data/spec/internal/app/models/tee.rb +3 -0
  144. data/spec/internal/app/models/tweet.rb +3 -0
  145. data/spec/internal/app/models/user.rb +3 -0
  146. data/spec/internal/config/database.yml +5 -0
  147. data/spec/internal/db/schema.rb +65 -0
  148. data/spec/internal/log/.gitignore +1 -0
  149. data/spec/spec_helper.rb +8 -49
  150. data/spec/support/sphinx_yaml_helpers.rb +9 -0
  151. data/spec/thinking_sphinx/active_record/association_spec.rb +12 -0
  152. data/spec/thinking_sphinx/active_record/associations_spec.rb +184 -0
  153. data/spec/thinking_sphinx/active_record/attribute/type_spec.rb +147 -0
  154. data/spec/thinking_sphinx/active_record/base_spec.rb +61 -0
  155. data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +80 -0
  156. data/spec/thinking_sphinx/active_record/callbacks/delta_callbacks_spec.rb +147 -0
  157. data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +69 -0
  158. data/spec/thinking_sphinx/active_record/column_spec.rb +47 -0
  159. data/spec/thinking_sphinx/active_record/database_adapters/abstract_adapter_spec.rb +31 -0
  160. data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +43 -0
  161. data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +45 -0
  162. data/spec/thinking_sphinx/active_record/database_adapters_spec.rb +108 -0
  163. data/spec/thinking_sphinx/active_record/field_spec.rb +36 -0
  164. data/spec/thinking_sphinx/active_record/index_spec.rb +208 -0
  165. data/spec/thinking_sphinx/active_record/interpreter_spec.rb +293 -0
  166. data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +162 -0
  167. data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +666 -0
  168. data/spec/thinking_sphinx/active_record/sql_source_spec.rb +401 -0
  169. data/spec/thinking_sphinx/configuration_spec.rb +264 -171
  170. data/spec/thinking_sphinx/deltas/default_delta_spec.rb +116 -0
  171. data/spec/thinking_sphinx/deltas_spec.rb +58 -0
  172. data/spec/thinking_sphinx/excerpter_spec.rb +40 -38
  173. data/spec/thinking_sphinx/facet_search_spec.rb +49 -151
  174. data/spec/thinking_sphinx/index_set_spec.rb +68 -0
  175. data/spec/thinking_sphinx/index_spec.rb +91 -155
  176. data/spec/thinking_sphinx/masks/pagination_mask_spec.rb +121 -0
  177. data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +68 -0
  178. data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +132 -0
  179. data/spec/thinking_sphinx/middlewares/geographer_spec.rb +89 -0
  180. data/spec/thinking_sphinx/middlewares/glazier_spec.rb +62 -0
  181. data/spec/thinking_sphinx/middlewares/inquirer_spec.rb +55 -0
  182. data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +271 -0
  183. data/spec/thinking_sphinx/middlewares/stale_id_checker_spec.rb +47 -0
  184. data/spec/thinking_sphinx/middlewares/stale_id_filter_spec.rb +91 -0
  185. data/spec/thinking_sphinx/panes/attributes_pane_spec.rb +21 -0
  186. data/spec/thinking_sphinx/panes/distance_pane_spec.rb +41 -0
  187. data/spec/thinking_sphinx/panes/excerpts_pane_spec.rb +53 -0
  188. data/spec/thinking_sphinx/panes/weight_pane_spec.rb +20 -0
  189. data/spec/thinking_sphinx/rake_interface_spec.rb +147 -0
  190. data/spec/thinking_sphinx/real_time/attribute_spec.rb +62 -0
  191. data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +76 -0
  192. data/spec/thinking_sphinx/real_time/field_spec.rb +54 -0
  193. data/spec/thinking_sphinx/real_time/index_spec.rb +154 -0
  194. data/spec/thinking_sphinx/real_time/interpreter_spec.rb +147 -0
  195. data/spec/thinking_sphinx/scopes_spec.rb +38 -0
  196. data/spec/thinking_sphinx/search/glaze_spec.rb +55 -0
  197. data/spec/thinking_sphinx/search/query_spec.rb +46 -0
  198. data/spec/thinking_sphinx/search_spec.rb +65 -1357
  199. data/spec/thinking_sphinx_spec.rb +19 -182
  200. data/thinking-sphinx.gemspec +33 -0
  201. metadata +318 -431
  202. data/features/abstract_inheritance.feature +0 -10
  203. data/features/alternate_primary_key.feature +0 -27
  204. data/features/attribute_transformation.feature +0 -22
  205. data/features/attribute_updates.feature +0 -79
  206. data/features/deleting_instances.feature +0 -70
  207. data/features/direct_attributes.feature +0 -11
  208. data/features/excerpts.feature +0 -21
  209. data/features/extensible_delta_indexing.feature +0 -9
  210. data/features/facets.feature +0 -88
  211. data/features/facets_across_model.feature +0 -29
  212. data/features/field_sorting.feature +0 -18
  213. data/features/handling_edits.feature +0 -97
  214. data/features/retry_stale_indexes.feature +0 -24
  215. data/features/searching_across_models.feature +0 -20
  216. data/features/searching_by_index.feature +0 -41
  217. data/features/searching_by_model.feature +0 -175
  218. data/features/searching_with_find_arguments.feature +0 -56
  219. data/features/sphinx_detection.feature +0 -25
  220. data/features/sphinx_scopes.feature +0 -68
  221. data/features/step_definitions/alpha_steps.rb +0 -16
  222. data/features/step_definitions/beta_steps.rb +0 -7
  223. data/features/step_definitions/common_steps.rb +0 -205
  224. data/features/step_definitions/extensible_delta_indexing_steps.rb +0 -7
  225. data/features/step_definitions/facet_steps.rb +0 -96
  226. data/features/step_definitions/find_arguments_steps.rb +0 -36
  227. data/features/step_definitions/gamma_steps.rb +0 -15
  228. data/features/step_definitions/scope_steps.rb +0 -19
  229. data/features/step_definitions/search_steps.rb +0 -94
  230. data/features/step_definitions/sphinx_steps.rb +0 -35
  231. data/features/sti_searching.feature +0 -19
  232. data/features/support/env.rb +0 -24
  233. data/features/support/lib/generic_delta_handler.rb +0 -8
  234. data/features/thinking_sphinx/database.example.yml +0 -3
  235. data/features/thinking_sphinx/db/.gitignore +0 -1
  236. data/features/thinking_sphinx/db/fixtures/alphas.rb +0 -8
  237. data/features/thinking_sphinx/db/fixtures/authors.rb +0 -1
  238. data/features/thinking_sphinx/db/fixtures/betas.rb +0 -11
  239. data/features/thinking_sphinx/db/fixtures/boxes.rb +0 -9
  240. data/features/thinking_sphinx/db/fixtures/categories.rb +0 -1
  241. data/features/thinking_sphinx/db/fixtures/cats.rb +0 -3
  242. data/features/thinking_sphinx/db/fixtures/comments.rb +0 -24
  243. data/features/thinking_sphinx/db/fixtures/developers.rb +0 -31
  244. data/features/thinking_sphinx/db/fixtures/dogs.rb +0 -3
  245. data/features/thinking_sphinx/db/fixtures/extensible_betas.rb +0 -10
  246. data/features/thinking_sphinx/db/fixtures/foxes.rb +0 -3
  247. data/features/thinking_sphinx/db/fixtures/gammas.rb +0 -10
  248. data/features/thinking_sphinx/db/fixtures/music.rb +0 -4
  249. data/features/thinking_sphinx/db/fixtures/people.rb +0 -1001
  250. data/features/thinking_sphinx/db/fixtures/post_keywords.txt +0 -1
  251. data/features/thinking_sphinx/db/fixtures/posts.rb +0 -10
  252. data/features/thinking_sphinx/db/fixtures/robots.rb +0 -8
  253. data/features/thinking_sphinx/db/fixtures/tags.rb +0 -27
  254. data/features/thinking_sphinx/db/migrations/create_alphas.rb +0 -8
  255. data/features/thinking_sphinx/db/migrations/create_animals.rb +0 -5
  256. data/features/thinking_sphinx/db/migrations/create_authors.rb +0 -3
  257. data/features/thinking_sphinx/db/migrations/create_authors_posts.rb +0 -6
  258. data/features/thinking_sphinx/db/migrations/create_betas.rb +0 -5
  259. data/features/thinking_sphinx/db/migrations/create_boxes.rb +0 -5
  260. data/features/thinking_sphinx/db/migrations/create_categories.rb +0 -3
  261. data/features/thinking_sphinx/db/migrations/create_comments.rb +0 -10
  262. data/features/thinking_sphinx/db/migrations/create_developers.rb +0 -7
  263. data/features/thinking_sphinx/db/migrations/create_extensible_betas.rb +0 -5
  264. data/features/thinking_sphinx/db/migrations/create_gammas.rb +0 -3
  265. data/features/thinking_sphinx/db/migrations/create_genres.rb +0 -3
  266. data/features/thinking_sphinx/db/migrations/create_music.rb +0 -6
  267. data/features/thinking_sphinx/db/migrations/create_people.rb +0 -13
  268. data/features/thinking_sphinx/db/migrations/create_posts.rb +0 -6
  269. data/features/thinking_sphinx/db/migrations/create_robots.rb +0 -4
  270. data/features/thinking_sphinx/db/migrations/create_taggings.rb +0 -5
  271. data/features/thinking_sphinx/db/migrations/create_tags.rb +0 -4
  272. data/features/thinking_sphinx/models/alpha.rb +0 -23
  273. data/features/thinking_sphinx/models/andrew.rb +0 -17
  274. data/features/thinking_sphinx/models/animal.rb +0 -5
  275. data/features/thinking_sphinx/models/author.rb +0 -3
  276. data/features/thinking_sphinx/models/beta.rb +0 -13
  277. data/features/thinking_sphinx/models/box.rb +0 -8
  278. data/features/thinking_sphinx/models/cat.rb +0 -3
  279. data/features/thinking_sphinx/models/category.rb +0 -4
  280. data/features/thinking_sphinx/models/comment.rb +0 -10
  281. data/features/thinking_sphinx/models/developer.rb +0 -21
  282. data/features/thinking_sphinx/models/dog.rb +0 -3
  283. data/features/thinking_sphinx/models/extensible_beta.rb +0 -9
  284. data/features/thinking_sphinx/models/fox.rb +0 -5
  285. data/features/thinking_sphinx/models/gamma.rb +0 -5
  286. data/features/thinking_sphinx/models/genre.rb +0 -3
  287. data/features/thinking_sphinx/models/medium.rb +0 -5
  288. data/features/thinking_sphinx/models/music.rb +0 -10
  289. data/features/thinking_sphinx/models/person.rb +0 -24
  290. data/features/thinking_sphinx/models/post.rb +0 -22
  291. data/features/thinking_sphinx/models/robot.rb +0 -12
  292. data/features/thinking_sphinx/models/tag.rb +0 -3
  293. data/lib/cucumber/thinking_sphinx/external_world.rb +0 -12
  294. data/lib/cucumber/thinking_sphinx/internal_world.rb +0 -137
  295. data/lib/cucumber/thinking_sphinx/sql_logger.rb +0 -28
  296. data/lib/thinking_sphinx/action_controller.rb +0 -31
  297. data/lib/thinking_sphinx/active_record/attribute_updates.rb +0 -54
  298. data/lib/thinking_sphinx/active_record/collection_proxy.rb +0 -47
  299. data/lib/thinking_sphinx/active_record/collection_proxy_with_scopes.rb +0 -27
  300. data/lib/thinking_sphinx/active_record/delta.rb +0 -67
  301. data/lib/thinking_sphinx/active_record/has_many_association.rb +0 -44
  302. data/lib/thinking_sphinx/active_record/has_many_association_with_scopes.rb +0 -21
  303. data/lib/thinking_sphinx/active_record/scopes.rb +0 -110
  304. data/lib/thinking_sphinx/adapters/abstract_adapter.rb +0 -94
  305. data/lib/thinking_sphinx/adapters/mysql_adapter.rb +0 -62
  306. data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +0 -188
  307. data/lib/thinking_sphinx/association.rb +0 -230
  308. data/lib/thinking_sphinx/attribute.rb +0 -405
  309. data/lib/thinking_sphinx/auto_version.rb +0 -40
  310. data/lib/thinking_sphinx/bundled_search.rb +0 -40
  311. data/lib/thinking_sphinx/class_facet.rb +0 -20
  312. data/lib/thinking_sphinx/connection.rb +0 -71
  313. data/lib/thinking_sphinx/context.rb +0 -81
  314. data/lib/thinking_sphinx/core/string.rb +0 -15
  315. data/lib/thinking_sphinx/deltas/delete_job.rb +0 -16
  316. data/lib/thinking_sphinx/deltas/index_job.rb +0 -17
  317. data/lib/thinking_sphinx/deploy/capistrano.rb +0 -99
  318. data/lib/thinking_sphinx/field.rb +0 -98
  319. data/lib/thinking_sphinx/index/builder.rb +0 -315
  320. data/lib/thinking_sphinx/index/faux_column.rb +0 -118
  321. data/lib/thinking_sphinx/join.rb +0 -37
  322. data/lib/thinking_sphinx/property.rb +0 -187
  323. data/lib/thinking_sphinx/search_methods.rb +0 -439
  324. data/lib/thinking_sphinx/sinatra.rb +0 -7
  325. data/lib/thinking_sphinx/source.rb +0 -194
  326. data/lib/thinking_sphinx/source/internal_properties.rb +0 -51
  327. data/lib/thinking_sphinx/source/sql.rb +0 -174
  328. data/spec/fixtures/data.sql +0 -32
  329. data/spec/fixtures/database.yml.default +0 -3
  330. data/spec/fixtures/models.rb +0 -164
  331. data/spec/fixtures/structure.sql +0 -146
  332. data/spec/sphinx_helper.rb +0 -60
  333. data/spec/support/rails.rb +0 -25
  334. data/spec/thinking_sphinx/active_record/delta_spec.rb +0 -123
  335. data/spec/thinking_sphinx/active_record/has_many_association_spec.rb +0 -173
  336. data/spec/thinking_sphinx/active_record/scopes_spec.rb +0 -177
  337. data/spec/thinking_sphinx/active_record_spec.rb +0 -573
  338. data/spec/thinking_sphinx/adapters/abstract_adapter_spec.rb +0 -163
  339. data/spec/thinking_sphinx/association_spec.rb +0 -250
  340. data/spec/thinking_sphinx/attribute_spec.rb +0 -552
  341. data/spec/thinking_sphinx/auto_version_spec.rb +0 -103
  342. data/spec/thinking_sphinx/connection_spec.rb +0 -77
  343. data/spec/thinking_sphinx/context_spec.rb +0 -127
  344. data/spec/thinking_sphinx/core/array_spec.rb +0 -9
  345. data/spec/thinking_sphinx/core/string_spec.rb +0 -9
  346. data/spec/thinking_sphinx/facet_spec.rb +0 -359
  347. data/spec/thinking_sphinx/field_spec.rb +0 -127
  348. data/spec/thinking_sphinx/index/builder_spec.rb +0 -532
  349. data/spec/thinking_sphinx/index/faux_column_spec.rb +0 -36
  350. data/spec/thinking_sphinx/search_methods_spec.rb +0 -156
  351. data/spec/thinking_sphinx/source_spec.rb +0 -267
  352. data/spec/thinking_sphinx/test_spec.rb +0 -20
@@ -0,0 +1,9 @@
1
+ class ThinkingSphinx::Middlewares::Middleware
2
+ def initialize(app)
3
+ @app = app
4
+ end
5
+
6
+ private
7
+
8
+ attr_reader :app, :context
9
+ end
@@ -0,0 +1,149 @@
1
+ class ThinkingSphinx::Middlewares::SphinxQL <
2
+ ThinkingSphinx::Middlewares::Middleware
3
+
4
+ SELECT_OPTIONS = [:field_weights, :ranker]
5
+
6
+ def call(contexts)
7
+ contexts.each do |context|
8
+ Inner.new(context).call
9
+ end
10
+
11
+ app.call contexts
12
+ end
13
+
14
+ private
15
+
16
+ class Inner
17
+ def initialize(context)
18
+ @context = context
19
+ end
20
+
21
+ def call
22
+ context[:indices] = indices
23
+ context[:sphinxql] = statement
24
+
25
+ if group_attribute.present?
26
+ context.search.masks << ThinkingSphinx::Masks::GroupEnumeratorsMask
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :context
33
+
34
+ def classes
35
+ options[:classes] || []
36
+ end
37
+
38
+ def classes_and_descendants
39
+ classes + descendants
40
+ end
41
+
42
+ def class_condition
43
+ '(' + classes_and_descendants.collect(&:name).join('|') + ')'
44
+ end
45
+
46
+ def descendants
47
+ @descendants ||= options[:skip_sti] ? [] : descendants_from_tables
48
+ end
49
+
50
+ def descendants_from_tables
51
+ classes.select { |klass|
52
+ klass.column_names.include?(klass.inheritance_column)
53
+ }.collect { |klass|
54
+ klass.connection.select_values(<<-SQL).compact.each(&:constantize)
55
+ SELECT DISTINCT #{klass.inheritance_column}
56
+ FROM #{klass.table_name}
57
+ SQL
58
+ klass.descendants
59
+ }.flatten
60
+ end
61
+
62
+ def exclusive_filters
63
+ @exclusive_filters ||= (options[:without] || {}).tap do |without|
64
+ if options[:without_ids].present? && options[:without_ids].any?
65
+ without[:sphinx_internal_id] = options[:without_ids]
66
+ end
67
+ end
68
+ end
69
+
70
+ def extended_query
71
+ conditions = options[:conditions] || {}
72
+ conditions[:sphinx_internal_class] = class_condition if classes.any?
73
+ @extended_query ||= begin
74
+ ThinkingSphinx::Search::Query.new(context.search.query, conditions,
75
+ options[:star]).to_s
76
+ end
77
+ end
78
+
79
+ def group_attribute
80
+ options[:group_by] ? options[:group_by].to_s : nil
81
+ end
82
+
83
+ def group_order_clause
84
+ case options[:order_group_by]
85
+ when Symbol
86
+ "#{options[:order_group_by]} ASC"
87
+ else
88
+ options[:order_group_by]
89
+ end
90
+ end
91
+
92
+ def inclusive_filters
93
+ @inclusive_filters ||= (options[:with] || {}).tap do |with|
94
+ with[:sphinx_deleted] = false
95
+ end
96
+ end
97
+
98
+ def index_names
99
+ indices.collect(&:name)
100
+ end
101
+
102
+ def indices
103
+ @indices ||= ThinkingSphinx::IndexSet.new classes, options[:indices]
104
+ end
105
+
106
+ def options
107
+ context.search.options
108
+ end
109
+
110
+ def order_clause
111
+ case options[:order]
112
+ when Symbol
113
+ "#{options[:order]} ASC"
114
+ else
115
+ options[:order]
116
+ end
117
+ end
118
+
119
+ def select_options
120
+ @select_options ||= options.keys.inject({}) do |hash, key|
121
+ hash[key] = options[key] if SELECT_OPTIONS.include?(key)
122
+ hash
123
+ end
124
+ end
125
+
126
+ def statement
127
+ Riddle::Query::Select.new.tap do |select|
128
+ select.from *index_names.collect { |index| "`#{index}`" }
129
+ select.values values if values.present?
130
+ select.matching extended_query if extended_query.present?
131
+ select.where inclusive_filters if inclusive_filters.any?
132
+ select.where_all options[:with_all] if options[:with_all]
133
+ select.where_not exclusive_filters if exclusive_filters.any?
134
+ select.where_not_all options[:without_all] if options[:without_all]
135
+ select.order_by order_clause if order_clause.present?
136
+ select.group_by group_attribute if group_attribute.present?
137
+ select.order_within_group_by group_order_clause if group_order_clause.present?
138
+ select.offset context.search.offset
139
+ select.limit context.search.per_page
140
+ select.with_options select_options if select_options.keys.any?
141
+ end
142
+ end
143
+
144
+ def values
145
+ options[:select] ||= '*, @groupby, @count' if group_attribute.present?
146
+ options[:select]
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,45 @@
1
+ class ThinkingSphinx::Middlewares::StaleIdChecker <
2
+ ThinkingSphinx::Middlewares::Middleware
3
+
4
+ def call(contexts)
5
+ contexts.each do |context|
6
+ Inner.new(context).call
7
+ end
8
+
9
+ app.call contexts
10
+ end
11
+
12
+ private
13
+
14
+ class Inner
15
+ def initialize(context)
16
+ @context = context
17
+ end
18
+
19
+ def call
20
+ raise_exception if context[:results].any?(&:nil?)
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :context
26
+
27
+ def actual_ids
28
+ context[:results].compact.collect(&:id)
29
+ end
30
+
31
+ def expected_ids
32
+ context[:raw].collect { |row| row['sphinx_internal_id'].to_i }
33
+ end
34
+
35
+ def raise_exception
36
+ raise ThinkingSphinx::Search::StaleIdsException, stale_ids
37
+ end
38
+
39
+ def stale_ids
40
+ # Currently only works with single-model queries. Has at no point done
41
+ # otherwise, but such an improvement would be nice.
42
+ expected_ids - actual_ids
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,46 @@
1
+ class ThinkingSphinx::Middlewares::StaleIdFilter <
2
+ ThinkingSphinx::Middlewares::Middleware
3
+
4
+ def call(contexts)
5
+ @context = contexts.first
6
+ @stale_ids = []
7
+ @retries = stale_retries
8
+
9
+ begin
10
+ app.call contexts
11
+ rescue ThinkingSphinx::Search::StaleIdsException => error
12
+ raise error if @retries <= 0
13
+
14
+ append_stale_ids error.ids
15
+ @context.log :message, log_message
16
+
17
+ @retries -= 1 and retry
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def append_stale_ids(ids)
24
+ @stale_ids |= ids
25
+
26
+ context.search.options[:without_ids] ||= []
27
+ context.search.options[:without_ids] |= ids
28
+ end
29
+
30
+ def log_message
31
+ 'Stale Ids (%s %s left): %s' % [
32
+ @retries, (@retries == 1 ? 'try' : 'tries'), @stale_ids.join(', ')
33
+ ]
34
+ end
35
+
36
+ def stale_retries
37
+ case context.search.options[:retry_stale]
38
+ when nil, TrueClass
39
+ 2
40
+ when FalseClass
41
+ 0
42
+ else
43
+ context.search.options[:retry_stale].to_i
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,8 @@
1
+ module ThinkingSphinx::Panes
2
+ #
3
+ end
4
+
5
+ require 'thinking_sphinx/panes/attributes_pane'
6
+ require 'thinking_sphinx/panes/distance_pane'
7
+ require 'thinking_sphinx/panes/excerpts_pane'
8
+ require 'thinking_sphinx/panes/weight_pane'
@@ -0,0 +1,9 @@
1
+ class ThinkingSphinx::Panes::AttributesPane
2
+ def initialize(context, object, raw)
3
+ @raw = raw
4
+ end
5
+
6
+ def sphinx_attributes
7
+ @raw
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ class ThinkingSphinx::Panes::DistancePane
2
+ def initialize(context, object, raw)
3
+ @raw = raw
4
+ end
5
+
6
+ def distance
7
+ @raw['geodist'].to_f
8
+ end
9
+
10
+ def geodist
11
+ @raw['geodist'].to_f
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ class ThinkingSphinx::Panes::ExcerptsPane
2
+ def initialize(context, object, raw)
3
+ @context, @object = context, object
4
+ end
5
+
6
+ def excerpts
7
+ @excerpt_glazing ||= Excerpts.new @object, excerpter
8
+ end
9
+
10
+ private
11
+
12
+ def excerpter
13
+ @excerpter ||= ThinkingSphinx::Excerpter.new(
14
+ @context[:indices].first.name,
15
+ excerpt_words,
16
+ @context.search.options[:excerpts] || {}
17
+ )
18
+ end
19
+
20
+ def excerpt_words
21
+ @excerpt_words ||= @context[:meta].keys.select { |key|
22
+ key[/^keyword\[/]
23
+ }.sort.collect { |key| @context[:meta][key] }.join(' ')
24
+ end
25
+
26
+ class Excerpts
27
+ def initialize(object, excerpter)
28
+ @object, @excerpter = object, excerpter
29
+ end
30
+
31
+ private
32
+
33
+ def method_missing(method, *args, &block)
34
+ @excerpter.excerpt! @object.send(method, *args, &block).to_s
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,9 @@
1
+ class ThinkingSphinx::Panes::WeightPane
2
+ def initialize(context, object, raw)
3
+ @raw = raw
4
+ end
5
+
6
+ def weight
7
+ @raw['@weight']
8
+ end
9
+ end
@@ -1,43 +1,9 @@
1
- require 'thinking_sphinx'
2
- require 'rails'
3
-
4
- module ThinkingSphinx
5
- class Railtie < Rails::Railtie
6
-
7
- initializer 'thinking_sphinx.sphinx' do
8
- ThinkingSphinx::AutoVersion.detect
9
- end
10
-
11
- initializer "thinking_sphinx.active_record" do
12
- ActiveSupport.on_load :active_record do
13
- include ThinkingSphinx::ActiveRecord
14
- end
15
- end
16
-
17
- initializer "thinking_sphinx.action_controller" do
18
- ActiveSupport.on_load :action_controller do
19
- require 'thinking_sphinx/action_controller'
20
- include ThinkingSphinx::ActionController
21
- end
22
- end
23
-
24
- initializer "thinking_sphinx.set_app_root" do |app|
25
- ThinkingSphinx::Configuration.instance.reset # Rails has setup app now
26
- end
27
-
28
- config.to_prepare do
29
- # ActiveRecord::Base.to_crc32s is dependant on the subclasses being loaded
30
- # consistently. When the environment is reset, subclasses/descendants will
31
- # be lost but our context will not reload them for us.
32
- #
33
- # We reset the context which causes the subclasses/descendants to be
34
- # reloaded next time the context is called.
35
- #
36
- ThinkingSphinx.reset_context!
37
- end
1
+ class ThinkingSphinx::Railtie < Rails::Railtie
2
+ ActiveSupport.on_load :active_record do
3
+ include ThinkingSphinx::ActiveRecord::Base
4
+ end
38
5
 
39
- rake_tasks do
40
- load File.expand_path('../tasks.rb', __FILE__)
41
- end
6
+ rake_tasks do
7
+ load File.expand_path('../tasks.rb', __FILE__)
42
8
  end
43
9
  end
@@ -0,0 +1,47 @@
1
+ class ThinkingSphinx::RakeInterface
2
+ def configure
3
+ puts "Generating configuration to #{config.configuration_file}"
4
+ config.render_to_file
5
+ end
6
+
7
+ def index(reconfigure = true)
8
+ configure if reconfigure
9
+ FileUtils.mkdir_p config.indices_location
10
+ controller.index :verbose => true
11
+ end
12
+
13
+ def start
14
+ raise RuntimeError, 'searchd is already running' if controller.running?
15
+
16
+ controller.start
17
+
18
+ if controller.running?
19
+ puts "Started searchd successfully (pid: #{controller.pid})."
20
+ else
21
+ puts "Failed to start searchd. Check the log files for more information."
22
+ end
23
+ end
24
+
25
+ def stop
26
+ unless controller.running?
27
+ puts 'searchd is not currently running.' and return
28
+ end
29
+
30
+ pid = controller.pid
31
+ until controller.stop do
32
+ sleep(0.5)
33
+ end
34
+
35
+ puts "Stopped searchd daemon (pid: #{pid})."
36
+ end
37
+
38
+ private
39
+
40
+ def config
41
+ ThinkingSphinx::Configuration.instance
42
+ end
43
+
44
+ def controller
45
+ config.controller
46
+ end
47
+ end
@@ -0,0 +1,11 @@
1
+ module ThinkingSphinx::RealTime
2
+ module Callbacks; end
3
+ end
4
+
5
+ require 'thinking_sphinx/real_time/property'
6
+ require 'thinking_sphinx/real_time/attribute'
7
+ require 'thinking_sphinx/real_time/field'
8
+ require 'thinking_sphinx/real_time/index'
9
+ require 'thinking_sphinx/real_time/interpreter'
10
+
11
+ require 'thinking_sphinx/real_time/callbacks/real_time_callbacks'