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,51 @@
1
+ class ThinkingSphinx::IndexSet
2
+ include Enumerable
3
+
4
+ def initialize(classes, index_names, configuration = nil)
5
+ @classes = classes || []
6
+ @index_names = index_names
7
+ @configuration = configuration || ThinkingSphinx::Configuration.instance
8
+ end
9
+
10
+ def ancestors
11
+ classes_and_ancestors - classes
12
+ end
13
+
14
+ def each(&block)
15
+ indices.each { |index| yield index }
16
+ end
17
+
18
+ def to_a
19
+ indices
20
+ end
21
+
22
+ private
23
+
24
+ def classes_and_ancestors
25
+ @classes_and_ancestors ||= @classes.collect { |model|
26
+ model.ancestors.take_while { |klass|
27
+ klass != ActiveRecord::Base
28
+ }.select { |klass|
29
+ klass.class == Class
30
+ }
31
+ }.flatten
32
+ end
33
+
34
+ def indices
35
+ @configuration.preload_indices
36
+
37
+ return @configuration.indices.select { |index|
38
+ @index_names.include?(index.name)
39
+ } if @index_names && @index_names.any?
40
+
41
+ return @configuration.indices if @classes.empty?
42
+
43
+ @configuration.indices_for_references(*references)
44
+ end
45
+
46
+ def references
47
+ classes_and_ancestors.collect { |klass|
48
+ klass.name.underscore.to_sym
49
+ }
50
+ end
51
+ end
@@ -0,0 +1,8 @@
1
+ module ThinkingSphinx::Masks
2
+ #
3
+ end
4
+
5
+ require 'thinking_sphinx/masks/group_enumerators_mask'
6
+ require 'thinking_sphinx/masks/pagination_mask'
7
+ require 'thinking_sphinx/masks/scopes_mask'
8
+ require 'thinking_sphinx/masks/weight_enumerator_mask'
@@ -0,0 +1,23 @@
1
+ class ThinkingSphinx::Masks::GroupEnumeratorsMask
2
+ def initialize(search)
3
+ @search = search
4
+ end
5
+
6
+ def each_with_count(&block)
7
+ @search.raw.each_with_index do |row, index|
8
+ yield @search[index], row['@count']
9
+ end
10
+ end
11
+
12
+ def each_with_group(&block)
13
+ @search.raw.each_with_index do |row, index|
14
+ yield @search[index], row['@groupby']
15
+ end
16
+ end
17
+
18
+ def each_with_group_and_count(&block)
19
+ @search.raw.each_with_index do |row, index|
20
+ yield @search[index], row['@groupby'], row['@count']
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,60 @@
1
+ class ThinkingSphinx::Masks::PaginationMask
2
+ def initialize(search)
3
+ @search = search
4
+ end
5
+
6
+ def current_page
7
+ search.options[:page] = 1 if search.options[:page].blank?
8
+ search.options[:page].to_i
9
+ end
10
+
11
+ def first_page?
12
+ current_page == 1
13
+ end
14
+
15
+ def last_page?
16
+ next_page.nil?
17
+ end
18
+
19
+ def next_page
20
+ current_page >= total_pages ? nil : current_page + 1
21
+ end
22
+
23
+ def next_page?
24
+ !next_page.nil?
25
+ end
26
+
27
+ def page(number)
28
+ search.options[:page] = number
29
+ search
30
+ end
31
+
32
+ def per(limit)
33
+ search.options[:limit] = limit
34
+ search
35
+ end
36
+
37
+ def previous_page
38
+ current_page == 1 ? nil : current_page - 1
39
+ end
40
+
41
+ def total_entries
42
+ search.meta['total_found'].to_i
43
+ end
44
+
45
+ alias_method :total_count, :total_entries
46
+ alias_method :count, :total_entries
47
+
48
+ def total_pages
49
+ return 0 if search.meta['total'].nil?
50
+
51
+ @total_pages ||= (search.meta['total'].to_i / search.per_page.to_f).ceil
52
+ end
53
+
54
+ alias_method :page_count, :total_pages
55
+ alias_method :num_pages, :total_pages
56
+
57
+ private
58
+
59
+ attr_reader :search
60
+ end
@@ -0,0 +1,35 @@
1
+ class ThinkingSphinx::Masks::ScopesMask
2
+ def initialize(search)
3
+ @search = search
4
+ end
5
+
6
+ def respond_to?(method, include_private = false)
7
+ super || can_apply_scope?(method)
8
+ end
9
+
10
+ def search(query = nil, options = {})
11
+ query, options = nil, query if query.is_a?(Hash)
12
+ ThinkingSphinx::Search::Merger.new(@search).merge! query, options
13
+ end
14
+
15
+ private
16
+
17
+ def apply_scope(scope, *args)
18
+ search *sphinx_scopes[scope].call(*args)
19
+ end
20
+
21
+ def can_apply_scope?(scope)
22
+ @search.options[:classes].present? &&
23
+ @search.options[:classes].length == 1 &&
24
+ @search.options[:classes].first.respond_to?(:sphinx_scopes) &&
25
+ sphinx_scopes[scope].present?
26
+ end
27
+
28
+ def method_missing(method, *args, &block)
29
+ apply_scope method, *args
30
+ end
31
+
32
+ def sphinx_scopes
33
+ @search.options[:classes].first.sphinx_scopes
34
+ end
35
+ end
@@ -0,0 +1,11 @@
1
+ class ThinkingSphinx::Masks::WeightEnumeratorMask
2
+ def initialize(search)
3
+ @search = search
4
+ end
5
+
6
+ def each_with_weight(&block)
7
+ @search.raw.each_with_index do |row, index|
8
+ yield @search[index], row['@weight']
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,36 @@
1
+ module ThinkingSphinx::Middlewares
2
+ #
3
+ end
4
+
5
+ require 'thinking_sphinx/middlewares/middleware'
6
+ require 'thinking_sphinx/middlewares/active_record_translator'
7
+ require 'thinking_sphinx/middlewares/geographer'
8
+ require 'thinking_sphinx/middlewares/glazier'
9
+ require 'thinking_sphinx/middlewares/ids_only'
10
+ require 'thinking_sphinx/middlewares/inquirer'
11
+ require 'thinking_sphinx/middlewares/sphinxql'
12
+ require 'thinking_sphinx/middlewares/stale_id_checker'
13
+ require 'thinking_sphinx/middlewares/stale_id_filter'
14
+
15
+ ThinkingSphinx::Middlewares::DEFAULT = ::Middleware::Builder.new do
16
+ use ThinkingSphinx::Middlewares::StaleIdFilter
17
+ use ThinkingSphinx::Middlewares::SphinxQL
18
+ use ThinkingSphinx::Middlewares::Geographer
19
+ use ThinkingSphinx::Middlewares::Inquirer
20
+ use ThinkingSphinx::Middlewares::ActiveRecordTranslator
21
+ use ThinkingSphinx::Middlewares::StaleIdChecker
22
+ use ThinkingSphinx::Middlewares::Glazier
23
+ end
24
+
25
+ ThinkingSphinx::Middlewares::RAW_ONLY = ::Middleware::Builder.new do
26
+ use ThinkingSphinx::Middlewares::SphinxQL
27
+ use ThinkingSphinx::Middlewares::Geographer
28
+ use ThinkingSphinx::Middlewares::Inquirer
29
+ end
30
+
31
+ ThinkingSphinx::Middlewares::IDS_ONLY = ::Middleware::Builder.new do
32
+ use ThinkingSphinx::Middlewares::SphinxQL
33
+ use ThinkingSphinx::Middlewares::Geographer
34
+ use ThinkingSphinx::Middlewares::Inquirer
35
+ use ThinkingSphinx::Middlewares::IdsOnly
36
+ end
@@ -0,0 +1,73 @@
1
+ class ThinkingSphinx::Middlewares::ActiveRecordTranslator <
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
+ results_for_models # load now to avoid segfaults
21
+ context[:results] = context[:results].collect { |row| result_for row }
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :context
27
+
28
+ def ids_for_model(model_name)
29
+ context[:results].select { |row|
30
+ row['sphinx_internal_class'] == model_name
31
+ }.collect { |row|
32
+ row['sphinx_internal_id']
33
+ }
34
+ end
35
+
36
+ def model_names
37
+ @model_names ||= context[:results].collect { |row|
38
+ row['sphinx_internal_class']
39
+ }.uniq
40
+ end
41
+
42
+ def reset_memos
43
+ @model_names = nil
44
+ @results_for_models = nil
45
+ end
46
+
47
+ def result_for(row)
48
+ results_for_models[row['sphinx_internal_class']].detect { |record|
49
+ record.id == row['sphinx_internal_id']
50
+ }
51
+ end
52
+
53
+ def results_for_models
54
+ @results_for_models ||= model_names.inject({}) { |hash, name|
55
+ ids = ids_for_model(name)
56
+ relation = name.constantize.unscoped
57
+
58
+ relation = relation.includes sql_options[:include] if sql_options[:include]
59
+ relation = relation.joins sql_options[:joins] if sql_options[:joins]
60
+ relation = relation.order sql_options[:order] if sql_options[:order]
61
+ relation = relation.select sql_options[:select] if sql_options[:select]
62
+
63
+ hash[name] = relation.where(:id => ids)
64
+
65
+ hash
66
+ }
67
+ end
68
+
69
+ def sql_options
70
+ context.search.options[:sql] || {}
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,53 @@
1
+ class ThinkingSphinx::Middlewares::Geographer <
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
+ class Inner
13
+ def initialize(context)
14
+ @context = context
15
+ end
16
+
17
+ def call
18
+ return unless geo
19
+
20
+ context[:sphinxql].values geodist_clause
21
+ context[:panes] << ThinkingSphinx::Panes::DistancePane
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :context
27
+
28
+ def attribute_names
29
+ @attribute_names ||= context[:indices].collect(&:unique_attribute_names).
30
+ flatten.uniq
31
+ end
32
+
33
+ def geo
34
+ context.search.options[:geo]
35
+ end
36
+
37
+ def geodist_clause
38
+ "GEODIST(#{geo.first}, #{geo.last}, #{latitude_attribute}, #{longitude_attribute}) AS geodist"
39
+ end
40
+
41
+ def latitude_attribute
42
+ context.search.options[:latitude_attr] ||
43
+ attribute_names.detect { |attribute| attribute == 'lat' } ||
44
+ attribute_names.detect { |attribute| attribute == 'latitude' } || 'lat'
45
+ end
46
+
47
+ def longitude_attribute
48
+ context.search.options[:longitude_attr] ||
49
+ attribute_names.detect { |attribute| attribute == 'lng' } ||
50
+ attribute_names.detect { |attribute| attribute == 'longitude' } || 'lng'
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,39 @@
1
+ class ThinkingSphinx::Middlewares::Glazier <
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
+ return if context[:panes].empty?
21
+
22
+ context[:results] = context[:results].collect { |result|
23
+ ThinkingSphinx::Search::Glaze.new context, result, row_for(result),
24
+ context[:panes]
25
+ }
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :context
31
+
32
+ def row_for(result)
33
+ context[:raw].detect { |row|
34
+ row['sphinx_internal_class'] == result.class.name &&
35
+ row['sphinx_internal_id'] == result.id
36
+ }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,13 @@
1
+ class ThinkingSphinx::Middlewares::IdsOnly <
2
+ ThinkingSphinx::Middlewares::Middleware
3
+
4
+ def call(contexts)
5
+ contexts.each do |context|
6
+ context[:results] = context[:results].collect { |row|
7
+ row['sphinx_internal_id']
8
+ }
9
+ end
10
+
11
+ app.call contexts
12
+ end
13
+ end
@@ -0,0 +1,62 @@
1
+ class ThinkingSphinx::Middlewares::Inquirer <
2
+ ThinkingSphinx::Middlewares::Middleware
3
+
4
+ def call(contexts)
5
+ @contexts = contexts
6
+ @batch = nil
7
+
8
+ contexts.first.log :query, combined_queries do
9
+ batch.results
10
+ end
11
+
12
+ index = 0
13
+ contexts.each do |context|
14
+ Inner.new(context).call batch.results[index], batch.results[index + 1]
15
+
16
+ index += 2
17
+ end
18
+
19
+ app.call contexts
20
+ end
21
+
22
+ private
23
+
24
+ def batch
25
+ @batch ||= begin
26
+ batch = ThinkingSphinx::Search::BatchInquirer.new
27
+
28
+ @contexts.each do |context|
29
+ batch.append_query context[:sphinxql].to_sql
30
+ batch.append_query Riddle::Query.meta
31
+ end
32
+
33
+ batch
34
+ end
35
+ end
36
+
37
+ def combined_queries
38
+ @contexts.collect { |context| context[:sphinxql].to_sql }.join('; ')
39
+ end
40
+
41
+ class Inner
42
+ def initialize(context)
43
+ @context = context
44
+ end
45
+
46
+ def call(raw_results, meta_results)
47
+ context[:results] = raw_results
48
+ context[:raw] = raw_results
49
+ context[:meta] = meta_results.inject({}) { |hash, row|
50
+ hash[row['Variable_name']] = row['Value']
51
+ hash
52
+ }
53
+
54
+ total = context[:meta]['total_found']
55
+ context.log :message, "Found #{total} result#{'s' unless total == 1}"
56
+ end
57
+
58
+ private
59
+
60
+ attr_reader :context
61
+ end
62
+ end