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,31 @@
1
+ class ThinkingSphinx::Configuration::ConsistentIds
2
+ def initialize(indices)
3
+ @indices = indices
4
+ end
5
+
6
+ def reconcile
7
+ return unless sphinx_internal_ids.any? { |attribute|
8
+ attribute.type == :bigint
9
+ }
10
+
11
+ sphinx_internal_ids.each do |attribute|
12
+ attribute.type = :bigint
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def attributes
19
+ @attributes = sources.collect(&:attributes).flatten
20
+ end
21
+
22
+ def sphinx_internal_ids
23
+ @sphinx_internal_ids ||= attributes.select { |attribute|
24
+ attribute.name == 'sphinx_internal_id'
25
+ }
26
+ end
27
+
28
+ def sources
29
+ @sources ||= @indices.collect(&:sources).flatten
30
+ end
31
+ end
@@ -0,0 +1,5 @@
1
+ module ThinkingSphinx::Configuration::Defaults
2
+ ADDRESS = '127.0.0.1'
3
+ PORT = 9306
4
+ PANES = []
5
+ end
@@ -0,0 +1,6 @@
1
+ module ThinkingSphinx::Core
2
+ #
3
+ end
4
+
5
+ require 'thinking_sphinx/core/index'
6
+ require 'thinking_sphinx/core/interpreter'
@@ -0,0 +1,68 @@
1
+ module ThinkingSphinx::Core::Index
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ attr_reader :reference, :offset
6
+ attr_writer :definition_block
7
+ end
8
+
9
+ def initialize(reference, options = {})
10
+ @reference = reference
11
+ @docinfo = :extern
12
+ @options = options
13
+ @offset = config.next_offset(reference)
14
+
15
+ super "#{options[:name] || reference}_#{name_suffix}"
16
+ end
17
+
18
+ def delta?
19
+ false
20
+ end
21
+
22
+ def document_id_for_key(key)
23
+ key * config.indices.count + offset
24
+ end
25
+
26
+ def interpret_definition!
27
+ return if @interpreted_definition || @definition_block.nil?
28
+
29
+ @interpreted_definition = true
30
+ interpreter.translate! self, @definition_block
31
+ end
32
+
33
+ def model
34
+ @model ||= reference.to_s.camelize.constantize
35
+ end
36
+
37
+ def render
38
+ pre_render
39
+
40
+ @path ||= config.indices_location.join(name)
41
+
42
+ super
43
+ end
44
+
45
+ def sources
46
+ interpret_definition!
47
+ super
48
+ end
49
+
50
+ private
51
+
52
+ def config
53
+ ThinkingSphinx::Configuration.instance
54
+ end
55
+
56
+ def name_suffix
57
+ 'core'
58
+ end
59
+
60
+ def pre_render
61
+ self.class.settings.each do |setting|
62
+ value = config.settings[setting.to_s]
63
+ send("#{setting}=", value) unless value.nil?
64
+ end
65
+
66
+ interpret_definition!
67
+ end
68
+ end
@@ -0,0 +1,19 @@
1
+ class ThinkingSphinx::Core::Interpreter < BasicObject
2
+ def self.translate!(index, block)
3
+ new(index, block).translate!
4
+ end
5
+
6
+ def initialize(index, block)
7
+ @index = index
8
+
9
+ mod = ::Module.new
10
+ mod.send :define_method, :translate!, block
11
+ mod.send :extend_object, self
12
+ end
13
+
14
+ private
15
+
16
+ def method_missing(method, *args)
17
+ ::ThinkingSphinx::ActiveRecord::Column.new method, *args
18
+ end
19
+ end
@@ -1,30 +1,39 @@
1
- require 'thinking_sphinx/deltas/default_delta'
2
- require 'thinking_sphinx/deltas/delete_job'
3
- require 'thinking_sphinx/deltas/index_job'
1
+ module ThinkingSphinx::Deltas
2
+ def self.config
3
+ ThinkingSphinx::Configuration.instance
4
+ end
5
+ def self.processor_for(delta)
6
+ case delta
7
+ when TrueClass
8
+ ThinkingSphinx::Deltas::DefaultDelta
9
+ when Class
10
+ delta
11
+ else
12
+ nil
13
+ end
14
+ end
15
+
16
+ def self.resume!
17
+ @suspended = false
18
+ end
19
+
20
+ def self.suspend(reference, &block)
21
+ suspend!
22
+ yield
23
+ resume!
4
24
 
5
- module ThinkingSphinx
6
- module Deltas
7
- def self.parse(index)
8
- delta_option = index.local_options.delete(:delta)
9
- case delta_option
10
- when TrueClass, :default
11
- DefaultDelta.new index, index.local_options
12
- when :delayed
13
- DelayedDelta.new index, index.local_options
14
- when :datetime
15
- DatetimeDelta.new index, index.local_options
16
- when FalseClass, nil
17
- nil
18
- else
19
- if delta_option.is_a?(String)
20
- delta_option = Kernel.const_get(delta_option)
21
- end
22
- if delta_option.ancestors.include?(ThinkingSphinx::Deltas::DefaultDelta)
23
- delta_option.new index, index.local_options
24
- else
25
- raise "Unknown delta type"
26
- end
27
- end
25
+ config.indices_for_references(reference).each do |index|
26
+ index.delta_processor.index index
28
27
  end
29
28
  end
29
+
30
+ def self.suspend!
31
+ @suspended = true
32
+ end
33
+
34
+ def self.suspended?
35
+ @suspended
36
+ end
30
37
  end
38
+
39
+ require 'thinking_sphinx/deltas/default_delta'
@@ -1,58 +1,58 @@
1
- module ThinkingSphinx
2
- module Deltas
3
- class DefaultDelta
4
- attr_accessor :column
5
-
6
- def initialize(index, options)
7
- @index = index
8
- @column = options.delete(:delta_column) || :delta
9
- end
10
-
11
- def index(model, instance = nil)
12
- return true unless ThinkingSphinx.updates_enabled? &&
13
- ThinkingSphinx.deltas_enabled?
14
- return true if instance && !toggled(instance)
15
-
16
- update_delta_indexes model
17
- delete_from_core model, instance if instance
18
-
19
- true
20
- end
21
-
22
- def toggle(instance)
23
- instance.send "#{@column}=", true
24
- end
25
-
26
- def toggled(instance)
27
- instance.send "#{@column}"
28
- end
29
-
30
- def reset_query(model)
31
- "UPDATE #{model.quoted_table_name} SET " +
32
- "#{model.connection.quote_column_name(@column.to_s)} = #{adapter.boolean(false)} " +
33
- "WHERE #{model.connection.quote_column_name(@column.to_s)} = #{adapter.boolean(true)}"
34
- end
35
-
36
- def clause(model, toggled)
37
- "#{model.quoted_table_name}.#{model.connection.quote_column_name(@column.to_s)}" +
38
- " = #{adapter.boolean(toggled)}"
39
- end
40
-
41
- private
42
-
43
- def update_delta_indexes(model)
44
- ThinkingSphinx::Deltas::IndexJob.new(model.delta_index_names).perform
45
- end
46
-
47
- def delete_from_core(model, instance)
48
- ThinkingSphinx::Deltas::DeleteJob.new(
49
- model.core_index_names, instance.sphinx_document_id
50
- ).perform
51
- end
52
-
53
- def adapter
54
- @adapter = @index.model.sphinx_database_adapter
55
- end
56
- end
1
+ class ThinkingSphinx::Deltas::DefaultDelta
2
+ attr_reader :adapter, :options
3
+
4
+ def initialize(adapter, options = {})
5
+ @adapter, @options = adapter, options
6
+ end
7
+
8
+ def clause(delta_source = false)
9
+ "#{adapter.quoted_table_name}.#{quoted_column} = #{adapter.boolean_value delta_source}"
10
+ end
11
+
12
+ def delete(index, instance)
13
+ config.connection.query Riddle::Query.update(
14
+ index.name, index.document_id_for_key(instance.id),
15
+ :sphinx_deleted => true
16
+ )
17
+ rescue Mysql2::Error => error
18
+ # This isn't vital, so don't raise the error.
19
+ end
20
+
21
+ def index(index)
22
+ controller.index index.name, :verbose => !config.settings['quiet_deltas']
23
+ end
24
+
25
+ def reset_query
26
+ (<<-SQL).strip.gsub(/\n\s*/, ' ')
27
+ UPDATE #{adapter.quoted_table_name}
28
+ SET #{quoted_column} = #{adapter.boolean_value false}
29
+ WHERE #{quoted_column} = #{adapter.boolean_value true}
30
+ SQL
31
+ end
32
+
33
+ def toggle(instance)
34
+ instance.send "#{column}=", true
35
+ end
36
+
37
+ def toggled?(instance)
38
+ instance.send "#{column}?"
39
+ end
40
+
41
+ private
42
+
43
+ def column
44
+ options[:column] || :delta
45
+ end
46
+
47
+ def config
48
+ ThinkingSphinx::Configuration.instance
49
+ end
50
+
51
+ def controller
52
+ config.controller
53
+ end
54
+
55
+ def quoted_column
56
+ adapter.quote column
57
57
  end
58
58
  end
@@ -1,23 +1,25 @@
1
- module ThinkingSphinx
2
- class Excerpter
3
- CoreMethods = %w( kind_of? object_id respond_to? respond_to_missing? should
4
- should_not stub! )
5
- # Hide most methods, to allow them to be passed through to the instance.
6
- instance_methods.select { |method|
7
- method.to_s[/^__/].nil? && !CoreMethods.include?(method.to_s)
8
- }.each { |method|
9
- undef_method method
10
- }
11
-
12
- def initialize(search, instance)
13
- @search = search
14
- @instance = instance
15
- end
16
-
17
- def method_missing(method, *args, &block)
18
- string = @instance.send(method, *args, &block).to_s
19
-
20
- @search.excerpt_for(string, @instance.class)
21
- end
1
+ class ThinkingSphinx::Excerpter
2
+ DefaultOptions = {
3
+ :before_match => '<span class="match">',
4
+ :after_match => '</span>',
5
+ :chunk_separator => ' &#8230; ' # ellipsis
6
+ }
7
+
8
+ attr_accessor :index, :words, :options
9
+
10
+ def initialize(index, words, options = {})
11
+ @index, @words = index, words
12
+ @options = DefaultOptions.merge(options)
13
+ end
14
+
15
+ def excerpt!(text)
16
+ connection.query(Riddle::Query.snippets(text, index, words, options)).
17
+ first['snippet']
18
+ end
19
+
20
+ private
21
+
22
+ def connection
23
+ @connection ||= ThinkingSphinx::Configuration.instance.connection
22
24
  end
23
25
  end
@@ -1,135 +1,30 @@
1
- module ThinkingSphinx
2
- class Facet
3
- attr_reader :property, :value_source
1
+ class ThinkingSphinx::Facet
2
+ attr_reader :name
4
3
 
5
- def initialize(property, value_source = nil)
6
- @property = property
7
- @value_source = value_source
8
-
9
- if property.columns.length != 1
10
- raise "Can't translate Facets on multiple-column field or attribute"
11
- end
12
- end
13
-
14
- def self.name_for(facet)
15
- case facet
16
- when Facet
17
- facet.name
18
- when String, Symbol
19
- return :class if facet.to_s == 'sphinx_internal_class'
20
- facet.to_s.gsub(/(_facet|_crc)$/,'').to_sym
21
- end
22
- end
23
-
24
- def self.attribute_name_for(name)
25
- name.to_s == 'class' ? 'class_crc' : "#{name}_facet"
26
- end
27
-
28
- def self.attribute_name_from_value(name, value)
29
- case value
30
- when String
31
- attribute_name_for(name)
32
- when Array
33
- if value.all? { |val| val.is_a?(Integer) }
34
- name
35
- else
36
- attribute_name_for(name)
37
- end
38
- else
39
- name
40
- end
41
- end
42
-
43
- def self.translate?(property)
44
- return true if property.is_a?(Field)
45
-
46
- case property.type
47
- when :string
48
- true
49
- when :integer, :boolean, :datetime, :float
50
- false
51
- when :multi
52
- !property.all_ints?
53
- end
54
- end
55
-
56
- def name
57
- property.unique_name
58
- end
59
-
60
- def attribute_name
61
- if translate?
62
- Facet.attribute_name_for(@property.unique_name)
63
- else
64
- @property.unique_name.to_s
65
- end
66
- end
67
-
68
- def translate?
69
- Facet.translate?(@property)
70
- end
71
-
72
- def type
73
- @property.is_a?(Field) ? :string : @property.type
74
- end
75
-
76
- def float?
77
- @property.type == :float
78
- end
79
-
80
- def value(object, attribute_hash)
81
- attribute_value = attribute_hash['@groupby']
82
- return translate(object, attribute_value) if translate? || float?
83
-
84
- case @property.type
85
- when :datetime
86
- Time.at(attribute_value)
87
- when :boolean
88
- attribute_value > 0
89
- else
90
- attribute_value
91
- end
92
- end
93
-
94
- def to_s
95
- name
96
- end
97
-
98
- private
99
-
100
- def translate(object, attribute_value)
101
- objects = source_objects(object)
102
- return if objects.blank?
4
+ def initialize(name, properties)
5
+ @name, @properties = name, properties
6
+ end
103
7
 
104
- method = value_source || column.__name
105
- object = objects.one? ? objects.first : objects.detect { |item|
106
- result = item.send(method)
107
- case result
108
- when String
109
- result.to_crc32 == attribute_value
110
- when NilClass
111
- false
112
- else
113
- result == attribute_value
114
- end
115
- }
8
+ def filter_type
9
+ use_field? ? :conditions : :with
10
+ end
116
11
 
117
- object.try(method)
118
- end
12
+ def results_from(raw)
13
+ raw.inject({}) { |hash, row|
14
+ hash[row[group_column]] = row['@count']
15
+ hash
16
+ }
17
+ end
119
18
 
120
- def source_objects(object)
121
- column.__stack.each { |method|
122
- object = Array(object).collect { |item|
123
- item.send(method)
124
- }.flatten.compact
19
+ private
125
20
 
126
- return nil if object.empty?
127
- }
128
- Array(object)
129
- end
21
+ def group_column
22
+ @properties.any?(&:multi?) ? '@groupby' : name
23
+ end
130
24
 
131
- def column
132
- @property.columns.first
133
- end
25
+ def use_field?
26
+ @properties.any? { |property|
27
+ property.type.nil? || property.type == :string
28
+ }
134
29
  end
135
30
  end