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,170 +1,103 @@
1
- module ThinkingSphinx
2
- class FacetSearch < Hash
3
- attr_accessor :args, :options
4
-
5
- def initialize(*args)
6
- ThinkingSphinx.context.define_indexes
7
-
8
- @options = args.extract_options!
9
- @args = args
10
-
11
- set_default_options
12
-
13
- populate
14
- end
15
-
16
- def for(hash = {})
17
- for_options = {:with => {}}.merge(options)
18
-
19
- hash.each do |key, value|
20
- attrib = ThinkingSphinx::Facet.attribute_name_from_value(key, value)
21
- for_options[:with][attrib] = underlying_value key, value
22
- end
23
-
24
- ThinkingSphinx.search *(args + [for_options])
25
- end
26
-
27
- def facet_names
28
- @facet_names ||= begin
29
- names = options[:all_facets] ?
30
- facet_names_for_all_classes : facet_names_common_to_all_classes
31
-
32
- names.delete class_facet unless options[:class_facet]
33
- names
34
- end
35
- end
36
-
37
- private
38
-
39
- def set_default_options
40
- options[:all_facets] ||= false
41
- if options[:class_facet].nil?
42
- options[:class_facet] = ((options[:classes] || []).length != 1)
43
- end
44
- end
45
-
46
- def populate
47
- return if facet_names.empty?
48
-
49
- ThinkingSphinx::Search.bundle_searches(facet_names) { |sphinx, name|
50
- sphinx.search *(args + [facet_search_options(name)])
51
- }.each_with_index { |search, index|
52
- add_from_results facet_names[index], search
53
- }
54
- end
55
-
56
- def facet_search_options(facet_name)
57
- options.merge(
58
- :group_function => :attr,
59
- :limit => max_matches,
60
- :max_matches => max_matches,
61
- :page => 1,
62
- :group_by => facet_name,
63
- :ids_only => !translate?(facet_name)
1
+ class ThinkingSphinx::FacetSearch
2
+ include Enumerable
3
+
4
+ attr_reader :query, :options
5
+
6
+ def initialize(query = nil, options = {})
7
+ query, options = nil, query if query.is_a?(Hash)
8
+ @query, @options = query, options
9
+ @hash = {}
10
+ end
11
+
12
+ def [](key)
13
+ populate
14
+
15
+ @hash[key]
16
+ end
17
+
18
+ def each(&block)
19
+ populate
20
+
21
+ @hash.each(&block)
22
+ end
23
+
24
+ def for(facet_values)
25
+ filter_facets = facet_values.keys.collect { |key|
26
+ facets.detect { |facet| facet.name == key.to_s }
27
+ }
28
+
29
+ ThinkingSphinx::Search.new query, options.merge(
30
+ :indices => index_names_for(*filter_facets)
31
+ ).merge(Filter.new(facets, facet_values).to_hash)
32
+ end
33
+
34
+ def populate
35
+ return if @populated
36
+
37
+ batch = ThinkingSphinx::BatchedSearch.new
38
+ facets.each do |facet|
39
+ search = ThinkingSphinx::Search.new query, options.merge(
40
+ :select => '*, @groupby, @count',
41
+ :group_by => facet.name,
42
+ :indices => index_names_for(facet)
64
43
  )
65
- end
66
-
67
- def facet_classes
68
- (
69
- options[:classes] || ThinkingSphinx.context.indexed_models.collect { |model|
70
- model.constantize
71
- }
72
- ).select { |klass| klass.sphinx_facets.any? }
73
- end
74
-
75
- def all_facets
76
- facet_classes.collect { |klass|
77
- klass.sphinx_facets
78
- }.flatten.select { |facet|
79
- options[:facets].blank? || Array(options[:facets]).include?(facet.name)
80
- }
81
- end
82
-
83
- def facet_names_for_all_classes
84
- all_facets.group_by { |facet|
85
- facet.name
86
- }.collect { |name, facets|
87
- if facets.collect { |facet| facet.type }.uniq.length > 1
88
- raise "Facet #{name} exists in more than one model with different types"
89
- end
90
- facets.first.attribute_name
44
+ batch.searches << search
45
+ end
46
+
47
+ batch.populate ThinkingSphinx::Middlewares::RAW_ONLY
48
+
49
+ facets.each_with_index do |facet, index|
50
+ @hash[facet.name.to_sym] = facet.results_from batch.searches[index].raw
51
+ end
52
+
53
+ @hash[:class] = @hash[:sphinx_internal_class]
54
+
55
+ @populated = true
56
+ end
57
+
58
+ def to_hash
59
+ populate
60
+
61
+ @hash
62
+ end
63
+
64
+ private
65
+
66
+ def facets
67
+ @facets ||= begin
68
+ properties = indices.collect(&:facets).flatten
69
+ properties.group_by(&:name).collect { |name, matches|
70
+ ThinkingSphinx::Facet.new name, matches
91
71
  }
92
72
  end
93
-
94
- def facet_names_common_to_all_classes
95
- facet_names_for_all_classes.select { |name|
96
- facet_classes.all? { |klass|
97
- klass.sphinx_facets.detect { |facet|
98
- facet.attribute_name == name
99
- }
100
- }
73
+ end
74
+
75
+ def index_names_for(*facets)
76
+ indices.select { |index|
77
+ facet_names = index.facets.collect(&:name)
78
+ facets.all? { |facet|
79
+ facet_names.include?(facet.name)
101
80
  }
102
- end
103
-
104
- def translate?(name)
105
- facet = facet_from_name(name)
106
- facet.translate? || facet.float?
107
- end
108
-
109
- def config
110
- ThinkingSphinx::Configuration.instance
111
- end
112
-
113
- def max_matches
114
- @max_matches ||= config.configuration.searchd.max_matches || 1000
115
- end
116
-
117
- # example: facet = country_facet; name = :country
118
- def add_from_results(facet, search)
119
- name = ThinkingSphinx::Facet.name_for(facet)
120
- facet = facet_from_name(facet)
121
-
122
- self[name] ||= {}
123
-
124
- return if search.empty?
125
-
126
- search.each_with_match do |result, match|
127
- facet_value = facet.value(result, match[:attributes])
128
-
129
- self[name][facet_value] ||= 0
130
- self[name][facet_value] += match[:attributes]["@count"]
131
- end
132
- end
133
-
134
- def underlying_value(key, value)
135
- case value
136
- when Array
137
- value.collect { |item| underlying_value(key, item) }
138
- when String
139
- value.to_crc32
140
- else
141
- value
142
- end
143
- end
144
-
145
- def facet_from_object(object, name)
146
- facet = nil
147
- klass = object.class
148
-
149
- while klass != ::ActiveRecord::Base && facet.nil?
150
- facet = klass.sphinx_facets.detect { |facet|
151
- facet.attribute_name == name
152
- }
153
- klass = klass.superclass
154
- end
155
-
156
- facet
157
- end
158
-
159
- def facet_from_name(name)
160
- name = ThinkingSphinx::Facet.name_for(name)
161
- all_facets.detect { |facet|
162
- facet.name == name
81
+ }.collect &:name
82
+ end
83
+
84
+ def indices
85
+ @indices ||= ThinkingSphinx::IndexSet.new options[:classes],
86
+ options[:indices]
87
+ end
88
+
89
+ class Filter
90
+ def initialize(facets, hash)
91
+ @facets, @hash = facets, hash
92
+ end
93
+
94
+ def to_hash
95
+ @hash.keys.inject({}) { |options, key|
96
+ type = @facets.detect { |facet| facet.name == key.to_s }.filter_type
97
+ options[type] ||= {}
98
+ options[type][key] = @hash[key]
99
+ options
163
100
  }
164
101
  end
165
-
166
- def class_facet
167
- Riddle.loaded_version.to_i < 2 ? 'class_crc' : 'sphinx_internal_class'
168
- end
169
102
  end
170
103
  end
@@ -1,159 +1,55 @@
1
- require 'thinking_sphinx/index/builder'
2
- require 'thinking_sphinx/index/faux_column'
1
+ class ThinkingSphinx::Index
2
+ attr_reader :reference, :options, :block
3
3
 
4
- module ThinkingSphinx
5
- class Index
6
- attr_accessor :name, :model, :sources, :delta_object, :additional_indices
7
-
8
- # Create a new index instance by passing in the model it is tied to, and
9
- # a block to build it with (optional but recommended). For documentation
10
- # on the syntax for inside the block, the Builder class is what you want.
11
- #
12
- # Quick Example:
13
- #
14
- # Index.new(User) do
15
- # indexes login, email
16
- #
17
- # has created_at
18
- #
19
- # set_property :delta => true
20
- # end
21
- #
22
- def initialize(model, &block)
23
- @name = self.class.name_for model
24
- @model = model
25
- @sources = []
26
- @options = {}
27
- @delta_object = nil
28
- @additional_indices = []
29
- end
30
-
31
- def fields
32
- @sources.collect { |source| source.fields }.flatten
33
- end
34
-
35
- def attributes
36
- @sources.collect { |source| source.attributes }.flatten
37
- end
38
-
39
- def core_name
40
- "#{name}_core"
41
- end
42
-
43
- def delta_name
44
- "#{name}_delta"
45
- end
46
-
47
- def all_names
48
- names = [core_name]
49
- names << delta_name if delta?
50
-
51
- names
52
- end
53
-
54
- def self.name_for(model)
55
- model.name.underscore.tr(':/\\', '_')
56
- end
57
-
58
- def prefix_fields
59
- fields.select { |field| field.prefixes }
60
- end
61
-
62
- def infix_fields
63
- fields.select { |field| field.infixes }
64
- end
65
-
66
- def local_options
67
- @options
68
- end
69
-
70
- def options
71
- all_index_options = config.index_options.clone
72
- @options.keys.select { |key|
73
- ThinkingSphinx::Configuration::IndexOptions.include?(key.to_s) ||
74
- ThinkingSphinx::Configuration::CustomOptions.include?(key.to_s)
75
- }.each { |key| all_index_options[key.to_sym] = @options[key] }
76
- all_index_options
77
- end
78
-
79
- def delta?
80
- !@delta_object.nil?
81
- end
82
-
83
- def to_riddle(offset)
84
- indexes = [to_riddle_for_core(offset)]
85
- indexes << to_riddle_for_delta(offset) if delta?
86
- indexes << to_riddle_for_distributed
87
- end
88
-
89
- private
90
-
91
- def adapter
92
- @adapter ||= @model.sphinx_database_adapter
4
+ def self.define(reference, options = {}, &block)
5
+ new(reference, options, &block).indices.each do |index|
6
+ ThinkingSphinx::Configuration.instance.indices << index
93
7
  end
8
+ end
94
9
 
95
- def utf8?
96
- options[:charset_type] == "utf-8"
97
- end
98
-
99
- def sql_query_pre_for_delta
100
- [""]
101
- end
102
-
103
- def config
104
- @config ||= ThinkingSphinx::Configuration.instance
105
- end
106
-
107
- def to_riddle_for_core(offset)
108
- index = Riddle::Configuration::Index.new core_name
109
- index.path = File.join config.searchd_file_path, index.name
110
-
111
- set_configuration_options_for_indexes index
112
- set_field_settings_for_indexes index
113
-
114
- sources.each_with_index do |source, i|
115
- index.sources << source.to_riddle_for_core(offset, i)
116
- end
10
+ def initialize(reference, options, &block)
11
+ @reference, @options, @block = reference, options, block
12
+ end
117
13
 
118
- index
14
+ def indices
15
+ if options[:delta]
16
+ delta_indices
17
+ else
18
+ [single_index]
119
19
  end
20
+ end
120
21
 
121
- def to_riddle_for_delta(offset)
122
- index = Riddle::Configuration::Index.new delta_name
123
- index.parent = core_name
124
- index.path = File.join config.searchd_file_path, index.name
125
-
126
- sources.each_with_index do |source, i|
127
- index.sources << source.to_riddle_for_delta(offset, i)
128
- end
22
+ private
129
23
 
130
- index
24
+ def index_class
25
+ case options[:with]
26
+ when :active_record
27
+ ThinkingSphinx::ActiveRecord::Index
28
+ when :real_time
29
+ ThinkingSphinx::RealTime::Index
30
+ else
31
+ raise "Unknown index type: #{options[:with]}"
131
32
  end
33
+ end
132
34
 
133
- def to_riddle_for_distributed
134
- index = Riddle::Configuration::DistributedIndex.new name
135
- index.local_indices << core_name
136
- index.local_indices += additional_indices
137
- index.local_indices.unshift delta_name if delta?
138
- index
35
+ def single_index
36
+ index_class.new(reference, options).tap do |index|
37
+ index.definition_block = block
139
38
  end
39
+ end
140
40
 
141
- def set_configuration_options_for_indexes(index)
142
- config.index_options.each do |key, value|
143
- method = "#{key}=".to_sym
144
- index.send(method, value) if index.respond_to?(method)
145
- end
146
-
147
- options.each do |key, value|
148
- index.send("#{key}=".to_sym, value) if ThinkingSphinx::Configuration::IndexOptions.include?(key.to_s) && !value.nil?
41
+ def delta_indices
42
+ [false, true].collect do |delta|
43
+ index_class.new(
44
+ reference,
45
+ options.merge(:delta? => delta, :delta_processor => processor)
46
+ ).tap do |index|
47
+ index.definition_block = block
149
48
  end
150
49
  end
50
+ end
151
51
 
152
- def set_field_settings_for_indexes(index)
153
- field_names = lambda { |field| field.unique_name.to_s }
154
-
155
- index.prefix_field_names += prefix_fields.collect(&field_names)
156
- index.infix_field_names += infix_fields.collect(&field_names)
157
- end
52
+ def processor
53
+ @processor ||= ThinkingSphinx::Deltas.processor_for options.delete(:delta)
158
54
  end
159
55
  end