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
@@ -1,137 +0,0 @@
1
- require 'cucumber/thinking_sphinx/sql_logger'
2
-
3
- module Cucumber
4
- module ThinkingSphinx
5
- class InternalWorld
6
- attr_accessor :temporary_directory, :migrations_directory,
7
- :models_directory, :fixtures_directory, :database_file
8
- attr_accessor :adapter, :database, :username,
9
- :password, :host
10
-
11
- def initialize
12
- pwd = Dir.pwd
13
- @temporary_directory = "#{pwd}/tmp"
14
- @migrations_directory = "#{pwd}/features/thinking_sphinx/db/migrations"
15
- @models_directory = "#{pwd}/features/thinking_sphinx/models"
16
- @fixtures_directory = "#{pwd}/features/thinking_sphinx/db/fixtures"
17
- @database_file = "#{pwd}/features/thinking_sphinx/database.yml"
18
-
19
- @adapter = (ENV['DATABASE'] || 'mysql').gsub /^mysql$/, 'mysql2'
20
- @database = 'thinking_sphinx'
21
- @username = ENV['USER']
22
- @host = 'localhost'
23
-
24
- if @adapter[/mysql/]
25
- @username = 'root'
26
- elsif ENV['TRAVIS']
27
- @username = 'postgres'
28
- end
29
- end
30
-
31
- def setup
32
- make_temporary_directory
33
-
34
- configure_cleanup
35
- configure_thinking_sphinx
36
- configure_active_record
37
-
38
- prepare_data
39
- setup_sphinx
40
-
41
- self
42
- end
43
-
44
- def configure_database
45
- ActiveRecord::Base.establish_connection database_settings
46
- self
47
- end
48
-
49
- private
50
-
51
- def config
52
- @config ||= ::ThinkingSphinx::Configuration.instance
53
- end
54
-
55
- def make_temporary_directory
56
- FileUtils.mkdir_p temporary_directory
57
- Dir["#{temporary_directory}/*"].each do |file|
58
- FileUtils.rm_rf file
59
- end
60
- end
61
-
62
- def configure_thinking_sphinx
63
- config.config_file = "#{temporary_directory}/sphinx.conf"
64
- config.searchd_log_file = "#{temporary_directory}/searchd.log"
65
- config.query_log_file = "#{temporary_directory}/searchd.query.log"
66
- config.pid_file = "#{temporary_directory}/searchd.pid"
67
- config.searchd_file_path = "#{temporary_directory}/indexes/"
68
-
69
- ::ThinkingSphinx.suppress_delta_output = true
70
- end
71
-
72
- def configure_cleanup
73
- Kernel.at_exit do
74
- ::ThinkingSphinx::Configuration.instance.controller.stop
75
- sleep(0.5) # Ensure Sphinx has shut down completely
76
- ::ThinkingSphinx::ActiveRecord::LogSubscriber.logger.close
77
- ::ActiveRecord::Base.logger.close
78
- end
79
- end
80
-
81
- def yaml_database_settings
82
- return {} unless File.exist?(@database_file)
83
-
84
- YAML.load open(@database_file)
85
- end
86
-
87
- def database_settings
88
- {
89
- 'adapter' => @adapter,
90
- 'database' => @database,
91
- 'username' => @username,
92
- 'password' => @password,
93
- 'host' => @host
94
- }.merge yaml_database_settings
95
- end
96
-
97
- def configure_active_record
98
- ::ActiveRecord::Base.logger = Logger.new(
99
- open("#{temporary_directory}/active_record.log", "a")
100
- )
101
-
102
- ::ThinkingSphinx::ActiveRecord::LogSubscriber.logger = Logger.new(
103
- open("#{temporary_directory}/active_record.log", "a")
104
- )
105
-
106
- ActiveRecord::Base.connection.class.send(
107
- :include, Cucumber::ThinkingSphinx::SqlLogger
108
- )
109
- end
110
-
111
- def prepare_data
112
- ::ThinkingSphinx.deltas_enabled = false
113
-
114
- load_files migrations_directory
115
- load_files models_directory
116
- load_files fixtures_directory
117
-
118
- ::ThinkingSphinx.deltas_enabled = true
119
- end
120
-
121
- def load_files(path)
122
- files = Dir["#{path}/*.rb"].sort!
123
- files.each do |file|
124
- require file.gsub(/\.rb$/, '')
125
- end
126
- end
127
-
128
- def setup_sphinx
129
- FileUtils.mkdir_p config.searchd_file_path
130
-
131
- config.build
132
- config.controller.index
133
- config.controller.start
134
- end
135
- end
136
- end
137
- end
@@ -1,28 +0,0 @@
1
- module Cucumber
2
- module ThinkingSphinx
3
- module SqlLogger
4
- IGNORED_SQL = [
5
- /^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/,
6
- /^SELECT @@ROWCOUNT/, /^SHOW FIELDS/
7
- ]
8
-
9
- if ActiveRecord::VERSION::STRING.to_f > 3.0
10
- def log(sql, name = 'SQL', binds = [])
11
- $queries_executed ||= []
12
- $queries_executed << sql unless IGNORED_SQL.any? { |r| sql =~ r }
13
- super sql, name, binds
14
- end
15
- else
16
- def self.included(base)
17
- base.send :alias_method_chain, :execute, :query_record
18
- end
19
-
20
- def execute_with_query_record(sql, name = 'SQL', &block)
21
- $queries_executed ||= []
22
- $queries_executed << sql unless IGNORED_SQL.any? { |r| sql =~ r }
23
- execute_without_query_record(sql, name, &block)
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,31 +0,0 @@
1
- module ThinkingSphinx
2
- module ActionController
3
- extend ActiveSupport::Concern
4
-
5
- protected
6
-
7
- attr_internal :query_runtime
8
-
9
- def cleanup_view_runtime
10
- log_subscriber = ThinkingSphinx::ActiveRecord::LogSubscriber
11
- query_runtime_pre_render = log_subscriber.reset_runtime
12
- runtime = super
13
- query_runtime_post_render = log_subscriber.reset_runtime
14
- self.query_runtime = query_runtime_pre_render + query_runtime_post_render
15
- runtime - query_runtime_post_render
16
- end
17
-
18
- def append_info_to_payload(payload)
19
- super
20
- payload[:query_runtime] = query_runtime
21
- end
22
-
23
- module ClassMethods
24
- def log_process_action(payload)
25
- messages, query_runtime = super, payload[:query_runtime]
26
- messages << ("Sphinx: %.1fms" % query_runtime.to_f) if query_runtime
27
- messages
28
- end
29
- end
30
- end
31
- end
@@ -1,54 +0,0 @@
1
- module ThinkingSphinx
2
- module ActiveRecord
3
- module AttributeUpdates
4
- def self.included(base)
5
- base.class_eval do
6
- after_save :update_attribute_values
7
- end
8
- end
9
-
10
- private
11
-
12
- def update_attribute_values
13
- return true unless ThinkingSphinx.updates_enabled? &&
14
- ThinkingSphinx.sphinx_running?
15
-
16
- self.class.sphinx_indexes.each do |index|
17
- attribute_pairs = attribute_values_for_index(index)
18
- attribute_names = attribute_pairs.keys
19
- attribute_values = attribute_names.collect { |key|
20
- attribute_pairs[key]
21
- }
22
-
23
- update_index index.core_name, attribute_names, attribute_values
24
- next unless index.delta?
25
- update_index index.delta_name, attribute_names, attribute_values
26
- end
27
-
28
- true
29
- end
30
-
31
- def updatable_attributes(index)
32
- index.attributes.select { |attrib| attrib.updatable? }
33
- end
34
-
35
- def attribute_values_for_index(index)
36
- updatable_attributes(index).inject({}) { |hash, attrib|
37
- hash[attrib.unique_name.to_s] = attrib.live_value self
38
- hash
39
- }
40
- end
41
-
42
- def update_index(index_name, attribute_names, attribute_values)
43
- ThinkingSphinx::Connection.take do |client|
44
- client.update index_name, attribute_names, {
45
- sphinx_document_id => attribute_values
46
- }
47
- end
48
- rescue Riddle::ConnectionError, Riddle::ResponseError,
49
- ThinkingSphinx::SphinxError, Errno::ETIMEDOUT
50
- # Not the end of the world if Sphinx isn't running.
51
- end
52
- end
53
- end
54
- end
@@ -1,47 +0,0 @@
1
- module ThinkingSphinx
2
- module ActiveRecord
3
- module CollectionProxy
4
- def search(*args)
5
- proxy_association.klass.search(*association_args(args))
6
- end
7
-
8
- def facets(*args)
9
- proxy_association.klass.facets(*association_args(args))
10
- end
11
-
12
- private
13
-
14
- def association_args(args)
15
- options = args.extract_options!
16
- options[:with] ||= {}
17
- options[:with].merge! default_filter
18
-
19
- args + [options]
20
- end
21
-
22
- def attribute_for_foreign_key
23
- if proxy_association.reflection.through_reflection
24
- foreign_key = proxy_association.reflection.through_reflection.foreign_key
25
- else
26
- foreign_key = proxy_association.reflection.foreign_key
27
- end
28
-
29
- proxy_association.klass.define_indexes
30
- (proxy_association.klass.sphinx_indexes || []).each do |index|
31
- attribute = index.attributes.detect { |attrib|
32
- attrib.columns.length == 1 &&
33
- attrib.columns.first.__name == foreign_key.to_sym ||
34
- attrib.alias == foreign_key.to_sym
35
- }
36
- return attribute unless attribute.nil?
37
- end
38
-
39
- raise "Missing Attribute for Foreign Key #{foreign_key}"
40
- end
41
-
42
- def default_filter
43
- {attribute_for_foreign_key.unique_name => proxy_association.owner.id}
44
- end
45
- end
46
- end
47
- end
@@ -1,27 +0,0 @@
1
- module ThinkingSphinx
2
- module ActiveRecord
3
- module CollectionProxyWithScopes
4
- def self.included(base)
5
- base.class_eval do
6
- alias_method_chain :method_missing, :sphinx_scopes
7
- alias_method_chain :respond_to?, :sphinx_scopes
8
- end
9
- end
10
-
11
- def method_missing_with_sphinx_scopes(method, *args, &block)
12
- klass = proxy_association.klass
13
- if klass.respond_to?(:sphinx_scopes) && klass.sphinx_scopes.include?(method)
14
- klass.search(:with => default_filter).send(method, *args, &block)
15
- else
16
- method_missing_without_sphinx_scopes(method, *args, &block)
17
- end
18
- end
19
-
20
- def respond_to_with_sphinx_scopes?(method)
21
- proxy_association.klass.respond_to?(:sphinx_scopes) &&
22
- proxy_association.klass.sphinx_scopes.include?(method) ||
23
- respond_to_without_sphinx_scopes?(method)
24
- end
25
- end
26
- end
27
- end
@@ -1,67 +0,0 @@
1
- module ThinkingSphinx
2
- module ActiveRecord
3
- # This module contains all the delta-related code for models. There isn't
4
- # really anything you need to call manually in here - except perhaps
5
- # index_delta, but not sure what reason why.
6
- #
7
- module Delta
8
- # Code for after_commit callback is written by Eli Miller:
9
- # http://elimiller.blogspot.com/2007/06/proper-cache-expiry-with-aftercommit.html
10
- # with slight modification from Joost Hietbrink.
11
- #
12
- def self.included(base)
13
- base.class_eval do
14
- class << self
15
- # Build the delta index for the related model. This won't be called
16
- # if running in the test environment.
17
- #
18
- def index_delta(instance = nil)
19
- delta_objects.each { |obj| obj.index(self, instance) }
20
- end
21
-
22
- def delta_objects
23
- self.sphinx_indexes.collect(&:delta_object).compact
24
- end
25
- end
26
-
27
- def toggled_delta?
28
- self.class.delta_objects.any? { |obj| obj.toggled(self) }
29
- end
30
-
31
- private
32
-
33
- # Set the delta value for the model to be true.
34
- def toggle_delta
35
- self.class.delta_objects.each { |obj|
36
- obj.toggle(self)
37
- } if should_toggle_delta?
38
- end
39
-
40
- # Build the delta index for the related model. This won't be called
41
- # if running in the test environment.
42
- #
43
- def index_delta
44
- self.class.index_delta(self) if self.class.delta_objects.any? { |obj|
45
- obj.toggled(self)
46
- }
47
- end
48
-
49
- def should_toggle_delta?
50
- return fire_delta? if respond_to?(:fire_delta?)
51
-
52
- self.new_record? || indexed_data_changed?
53
- end
54
-
55
- def indexed_data_changed?
56
- sphinx_indexes.any? { |index|
57
- index.fields.any? { |field| field.changed?(self) } ||
58
- index.attributes.any? { |attrib|
59
- attrib.public? && attrib.changed?(self) && !attrib.updatable?
60
- }
61
- }
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end
@@ -1,44 +0,0 @@
1
- module ThinkingSphinx
2
- module ActiveRecord
3
- module HasManyAssociation
4
- def search(*args)
5
- @reflection.klass.search(*association_args(args))
6
- end
7
-
8
- def facets(*args)
9
- @reflection.klass.facets(*association_args(args))
10
- end
11
-
12
- private
13
-
14
- def association_args(args)
15
- options = args.extract_options!
16
- options[:with] ||= {}
17
- options[:with].merge! default_filter
18
-
19
- args + [options]
20
- end
21
-
22
- def attribute_for_foreign_key
23
- foreign_key = @reflection.primary_key_name
24
- stack = [@reflection.options[:through]].compact
25
-
26
- @reflection.klass.define_indexes
27
- (@reflection.klass.sphinx_indexes || []).each do |index|
28
- attribute = index.attributes.detect { |attrib|
29
- attrib.columns.length == 1 &&
30
- attrib.columns.first.__name == foreign_key.to_sym ||
31
- attrib.alias == foreign_key.to_sym
32
- }
33
- return attribute unless attribute.nil?
34
- end
35
-
36
- raise "Missing Attribute for Foreign Key #{foreign_key}"
37
- end
38
-
39
- def default_filter
40
- {attribute_for_foreign_key.unique_name => @owner.id}
41
- end
42
- end
43
- end
44
- end
@@ -1,21 +0,0 @@
1
- module ThinkingSphinx
2
- module ActiveRecord
3
- module HasManyAssociationWithScopes
4
- def method_missing(method, *args, &block)
5
- if responds_to_scope(method)
6
- @reflection.klass.
7
- search(:with => default_filter).
8
- send(method, *args, &block)
9
- else
10
- super
11
- end
12
- end
13
-
14
- private
15
- def responds_to_scope(scope)
16
- @reflection.klass.respond_to?(:sphinx_scopes) &&
17
- @reflection.klass.sphinx_scopes.include?(scope)
18
- end
19
- end
20
- end
21
- end