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.
- data/.gitignore +8 -0
- data/.travis.yml +13 -0
- data/Appraisals +7 -0
- data/Gemfile +10 -0
- data/HISTORY +2 -267
- data/LICENCE +1 -1
- data/README.textile +194 -226
- data/Rakefile +24 -0
- data/gemfiles/.gitignore +1 -0
- data/gemfiles/rails_3_1.gemfile +11 -0
- data/gemfiles/rails_3_2.gemfile +11 -0
- data/lib/thinking-sphinx.rb +1 -1
- data/lib/thinking_sphinx.rb +34 -292
- data/lib/thinking_sphinx/active_record.rb +22 -383
- data/lib/thinking_sphinx/active_record/association.rb +9 -0
- data/lib/thinking_sphinx/active_record/association_proxy.rb +68 -0
- data/lib/thinking_sphinx/active_record/associations.rb +68 -0
- data/lib/thinking_sphinx/active_record/attribute.rb +20 -0
- data/lib/thinking_sphinx/active_record/attribute/sphinx_presenter.rb +32 -0
- data/lib/thinking_sphinx/active_record/attribute/type.rb +79 -0
- data/lib/thinking_sphinx/active_record/attribute/values.rb +18 -0
- data/lib/thinking_sphinx/active_record/base.rb +36 -0
- data/lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb +31 -0
- data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +55 -0
- data/lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb +59 -0
- data/lib/thinking_sphinx/active_record/column.rb +30 -0
- data/lib/thinking_sphinx/active_record/database_adapters.rb +51 -0
- data/lib/thinking_sphinx/active_record/database_adapters/abstract_adapter.rb +13 -0
- data/lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb +23 -0
- data/lib/thinking_sphinx/active_record/database_adapters/postgresql_adapter.rb +25 -0
- data/lib/thinking_sphinx/active_record/field.rb +11 -0
- data/lib/thinking_sphinx/active_record/index.rb +55 -0
- data/lib/thinking_sphinx/active_record/interpreter.rb +47 -0
- data/lib/thinking_sphinx/active_record/log_subscriber.rb +10 -58
- data/lib/thinking_sphinx/active_record/property.rb +28 -0
- data/lib/thinking_sphinx/active_record/property_sql_presenter.rb +60 -0
- data/lib/thinking_sphinx/active_record/sql_builder.rb +159 -0
- data/lib/thinking_sphinx/active_record/sql_source.rb +138 -0
- data/lib/thinking_sphinx/active_record/sql_source/template.rb +46 -0
- data/lib/thinking_sphinx/batched_search.rb +26 -0
- data/lib/thinking_sphinx/callbacks.rb +15 -0
- data/lib/thinking_sphinx/configuration.rb +80 -331
- data/lib/thinking_sphinx/configuration/consistent_ids.rb +31 -0
- data/lib/thinking_sphinx/configuration/defaults.rb +5 -0
- data/lib/thinking_sphinx/core.rb +6 -0
- data/lib/thinking_sphinx/core/index.rb +68 -0
- data/lib/thinking_sphinx/core/interpreter.rb +19 -0
- data/lib/thinking_sphinx/deltas.rb +35 -26
- data/lib/thinking_sphinx/deltas/default_delta.rb +56 -56
- data/lib/thinking_sphinx/excerpter.rb +23 -21
- data/lib/thinking_sphinx/facet.rb +22 -127
- data/lib/thinking_sphinx/facet_search.rb +95 -162
- data/lib/thinking_sphinx/index.rb +39 -143
- data/lib/thinking_sphinx/index_set.rb +51 -0
- data/lib/thinking_sphinx/masks.rb +8 -0
- data/lib/thinking_sphinx/masks/group_enumerators_mask.rb +23 -0
- data/lib/thinking_sphinx/masks/pagination_mask.rb +60 -0
- data/lib/thinking_sphinx/masks/scopes_mask.rb +35 -0
- data/lib/thinking_sphinx/masks/weight_enumerator_mask.rb +11 -0
- data/lib/thinking_sphinx/middlewares.rb +36 -0
- data/lib/thinking_sphinx/middlewares/active_record_translator.rb +73 -0
- data/lib/thinking_sphinx/middlewares/geographer.rb +53 -0
- data/lib/thinking_sphinx/middlewares/glazier.rb +39 -0
- data/lib/thinking_sphinx/middlewares/ids_only.rb +13 -0
- data/lib/thinking_sphinx/middlewares/inquirer.rb +62 -0
- data/lib/thinking_sphinx/middlewares/middleware.rb +9 -0
- data/lib/thinking_sphinx/middlewares/sphinxql.rb +149 -0
- data/lib/thinking_sphinx/middlewares/stale_id_checker.rb +45 -0
- data/lib/thinking_sphinx/middlewares/stale_id_filter.rb +46 -0
- data/lib/thinking_sphinx/panes.rb +8 -0
- data/lib/thinking_sphinx/panes/attributes_pane.rb +9 -0
- data/lib/thinking_sphinx/panes/distance_pane.rb +13 -0
- data/lib/thinking_sphinx/panes/excerpts_pane.rb +37 -0
- data/lib/thinking_sphinx/panes/weight_pane.rb +9 -0
- data/lib/thinking_sphinx/railtie.rb +6 -40
- data/lib/thinking_sphinx/rake_interface.rb +47 -0
- data/lib/thinking_sphinx/real_time.rb +11 -0
- data/lib/thinking_sphinx/real_time/attribute.rb +5 -0
- data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +48 -0
- data/lib/thinking_sphinx/real_time/field.rb +3 -0
- data/lib/thinking_sphinx/real_time/index.rb +47 -0
- data/lib/thinking_sphinx/real_time/index/template.rb +33 -0
- data/lib/thinking_sphinx/real_time/interpreter.rb +23 -0
- data/lib/thinking_sphinx/real_time/property.rb +16 -0
- data/lib/thinking_sphinx/scopes.rb +22 -0
- data/lib/thinking_sphinx/search.rb +90 -1028
- data/lib/thinking_sphinx/search/batch_inquirer.rb +27 -0
- data/lib/thinking_sphinx/search/context.rb +26 -0
- data/lib/thinking_sphinx/search/glaze.rb +32 -0
- data/lib/thinking_sphinx/search/merger.rb +24 -0
- data/lib/thinking_sphinx/search/query.rb +43 -0
- data/lib/thinking_sphinx/search/stale_ids_exception.rb +11 -0
- data/lib/thinking_sphinx/search/translator.rb +50 -0
- data/lib/thinking_sphinx/tasks.rb +22 -125
- data/lib/thinking_sphinx/test.rb +9 -19
- data/sketchpad.rb +58 -0
- data/spec/acceptance/association_scoping_spec.rb +23 -0
- data/spec/acceptance/attribute_access_spec.rb +39 -0
- data/spec/acceptance/attribute_updates_spec.rb +16 -0
- data/spec/acceptance/batch_searching_spec.rb +21 -0
- data/spec/acceptance/big_integers_spec.rb +27 -0
- data/spec/acceptance/excerpts_spec.rb +14 -0
- data/spec/acceptance/facets_spec.rb +122 -0
- data/spec/acceptance/geosearching_spec.rb +39 -0
- data/spec/acceptance/grouping_by_attributes_spec.rb +77 -0
- data/spec/acceptance/paginating_search_results_spec.rb +24 -0
- data/spec/acceptance/remove_deleted_records_spec.rb +23 -0
- data/spec/acceptance/search_counts_spec.rb +18 -0
- data/spec/acceptance/search_for_just_ids_spec.rb +19 -0
- data/spec/acceptance/searching_across_models_spec.rb +28 -0
- data/spec/acceptance/searching_on_fields_spec.rb +56 -0
- data/spec/acceptance/searching_with_filters_spec.rb +109 -0
- data/spec/acceptance/searching_with_sti_spec.rb +55 -0
- data/spec/acceptance/searching_within_a_model_spec.rb +52 -0
- data/spec/acceptance/sorting_search_results_spec.rb +41 -0
- data/spec/acceptance/spec_helper.rb +4 -0
- data/spec/acceptance/specifying_sql_spec.rb +62 -0
- data/spec/acceptance/sphinx_scopes_spec.rb +49 -0
- data/spec/acceptance/sql_deltas_spec.rb +43 -0
- data/spec/acceptance/support/database_cleaner.rb +11 -0
- data/spec/acceptance/support/sphinx_controller.rb +39 -0
- data/spec/acceptance/support/sphinx_helpers.rb +24 -0
- data/spec/acceptance/suspended_deltas_spec.rb +20 -0
- data/spec/internal/.gitignore +1 -0
- data/spec/internal/app/indices/animal_index.rb +3 -0
- data/spec/internal/app/indices/article_index.rb +24 -0
- data/spec/internal/app/indices/book_index.rb +8 -0
- data/spec/internal/app/indices/city_index.rb +6 -0
- data/spec/internal/app/indices/product_index.rb +3 -0
- data/spec/internal/app/indices/tee_index.rb +4 -0
- data/spec/internal/app/indices/user_index.rb +5 -0
- data/spec/internal/app/models/animal.rb +2 -0
- data/spec/internal/app/models/article.rb +5 -0
- data/spec/internal/app/models/bird.rb +2 -0
- data/spec/internal/app/models/book.rb +11 -0
- data/spec/internal/app/models/city.rb +2 -0
- data/spec/internal/app/models/colour.rb +3 -0
- data/spec/internal/app/models/flightless_bird.rb +2 -0
- data/spec/internal/app/models/mammal.rb +2 -0
- data/spec/internal/app/models/product.rb +3 -0
- data/spec/internal/app/models/tag.rb +4 -0
- data/{features/thinking_sphinx → spec/internal/app}/models/tagging.rb +1 -1
- data/spec/internal/app/models/tee.rb +3 -0
- data/spec/internal/app/models/tweet.rb +3 -0
- data/spec/internal/app/models/user.rb +3 -0
- data/spec/internal/config/database.yml +5 -0
- data/spec/internal/db/schema.rb +65 -0
- data/spec/internal/log/.gitignore +1 -0
- data/spec/spec_helper.rb +8 -49
- data/spec/support/sphinx_yaml_helpers.rb +9 -0
- data/spec/thinking_sphinx/active_record/association_spec.rb +12 -0
- data/spec/thinking_sphinx/active_record/associations_spec.rb +184 -0
- data/spec/thinking_sphinx/active_record/attribute/type_spec.rb +147 -0
- data/spec/thinking_sphinx/active_record/base_spec.rb +61 -0
- data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +80 -0
- data/spec/thinking_sphinx/active_record/callbacks/delta_callbacks_spec.rb +147 -0
- data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +69 -0
- data/spec/thinking_sphinx/active_record/column_spec.rb +47 -0
- data/spec/thinking_sphinx/active_record/database_adapters/abstract_adapter_spec.rb +31 -0
- data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +43 -0
- data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +45 -0
- data/spec/thinking_sphinx/active_record/database_adapters_spec.rb +108 -0
- data/spec/thinking_sphinx/active_record/field_spec.rb +36 -0
- data/spec/thinking_sphinx/active_record/index_spec.rb +208 -0
- data/spec/thinking_sphinx/active_record/interpreter_spec.rb +293 -0
- data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +162 -0
- data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +666 -0
- data/spec/thinking_sphinx/active_record/sql_source_spec.rb +401 -0
- data/spec/thinking_sphinx/configuration_spec.rb +264 -171
- data/spec/thinking_sphinx/deltas/default_delta_spec.rb +116 -0
- data/spec/thinking_sphinx/deltas_spec.rb +58 -0
- data/spec/thinking_sphinx/excerpter_spec.rb +40 -38
- data/spec/thinking_sphinx/facet_search_spec.rb +49 -151
- data/spec/thinking_sphinx/index_set_spec.rb +68 -0
- data/spec/thinking_sphinx/index_spec.rb +91 -155
- data/spec/thinking_sphinx/masks/pagination_mask_spec.rb +121 -0
- data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +68 -0
- data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +132 -0
- data/spec/thinking_sphinx/middlewares/geographer_spec.rb +89 -0
- data/spec/thinking_sphinx/middlewares/glazier_spec.rb +62 -0
- data/spec/thinking_sphinx/middlewares/inquirer_spec.rb +55 -0
- data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +271 -0
- data/spec/thinking_sphinx/middlewares/stale_id_checker_spec.rb +47 -0
- data/spec/thinking_sphinx/middlewares/stale_id_filter_spec.rb +91 -0
- data/spec/thinking_sphinx/panes/attributes_pane_spec.rb +21 -0
- data/spec/thinking_sphinx/panes/distance_pane_spec.rb +41 -0
- data/spec/thinking_sphinx/panes/excerpts_pane_spec.rb +53 -0
- data/spec/thinking_sphinx/panes/weight_pane_spec.rb +20 -0
- data/spec/thinking_sphinx/rake_interface_spec.rb +147 -0
- data/spec/thinking_sphinx/real_time/attribute_spec.rb +62 -0
- data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +76 -0
- data/spec/thinking_sphinx/real_time/field_spec.rb +54 -0
- data/spec/thinking_sphinx/real_time/index_spec.rb +154 -0
- data/spec/thinking_sphinx/real_time/interpreter_spec.rb +147 -0
- data/spec/thinking_sphinx/scopes_spec.rb +38 -0
- data/spec/thinking_sphinx/search/glaze_spec.rb +55 -0
- data/spec/thinking_sphinx/search/query_spec.rb +46 -0
- data/spec/thinking_sphinx/search_spec.rb +65 -1357
- data/spec/thinking_sphinx_spec.rb +19 -182
- data/thinking-sphinx.gemspec +33 -0
- metadata +318 -431
- data/features/abstract_inheritance.feature +0 -10
- data/features/alternate_primary_key.feature +0 -27
- data/features/attribute_transformation.feature +0 -22
- data/features/attribute_updates.feature +0 -79
- data/features/deleting_instances.feature +0 -70
- data/features/direct_attributes.feature +0 -11
- data/features/excerpts.feature +0 -21
- data/features/extensible_delta_indexing.feature +0 -9
- data/features/facets.feature +0 -88
- data/features/facets_across_model.feature +0 -29
- data/features/field_sorting.feature +0 -18
- data/features/handling_edits.feature +0 -97
- data/features/retry_stale_indexes.feature +0 -24
- data/features/searching_across_models.feature +0 -20
- data/features/searching_by_index.feature +0 -41
- data/features/searching_by_model.feature +0 -175
- data/features/searching_with_find_arguments.feature +0 -56
- data/features/sphinx_detection.feature +0 -25
- data/features/sphinx_scopes.feature +0 -68
- data/features/step_definitions/alpha_steps.rb +0 -16
- data/features/step_definitions/beta_steps.rb +0 -7
- data/features/step_definitions/common_steps.rb +0 -205
- data/features/step_definitions/extensible_delta_indexing_steps.rb +0 -7
- data/features/step_definitions/facet_steps.rb +0 -96
- data/features/step_definitions/find_arguments_steps.rb +0 -36
- data/features/step_definitions/gamma_steps.rb +0 -15
- data/features/step_definitions/scope_steps.rb +0 -19
- data/features/step_definitions/search_steps.rb +0 -94
- data/features/step_definitions/sphinx_steps.rb +0 -35
- data/features/sti_searching.feature +0 -19
- data/features/support/env.rb +0 -24
- data/features/support/lib/generic_delta_handler.rb +0 -8
- data/features/thinking_sphinx/database.example.yml +0 -3
- data/features/thinking_sphinx/db/.gitignore +0 -1
- data/features/thinking_sphinx/db/fixtures/alphas.rb +0 -8
- data/features/thinking_sphinx/db/fixtures/authors.rb +0 -1
- data/features/thinking_sphinx/db/fixtures/betas.rb +0 -11
- data/features/thinking_sphinx/db/fixtures/boxes.rb +0 -9
- data/features/thinking_sphinx/db/fixtures/categories.rb +0 -1
- data/features/thinking_sphinx/db/fixtures/cats.rb +0 -3
- data/features/thinking_sphinx/db/fixtures/comments.rb +0 -24
- data/features/thinking_sphinx/db/fixtures/developers.rb +0 -31
- data/features/thinking_sphinx/db/fixtures/dogs.rb +0 -3
- data/features/thinking_sphinx/db/fixtures/extensible_betas.rb +0 -10
- data/features/thinking_sphinx/db/fixtures/foxes.rb +0 -3
- data/features/thinking_sphinx/db/fixtures/gammas.rb +0 -10
- data/features/thinking_sphinx/db/fixtures/music.rb +0 -4
- data/features/thinking_sphinx/db/fixtures/people.rb +0 -1001
- data/features/thinking_sphinx/db/fixtures/post_keywords.txt +0 -1
- data/features/thinking_sphinx/db/fixtures/posts.rb +0 -10
- data/features/thinking_sphinx/db/fixtures/robots.rb +0 -8
- data/features/thinking_sphinx/db/fixtures/tags.rb +0 -27
- data/features/thinking_sphinx/db/migrations/create_alphas.rb +0 -8
- data/features/thinking_sphinx/db/migrations/create_animals.rb +0 -5
- data/features/thinking_sphinx/db/migrations/create_authors.rb +0 -3
- data/features/thinking_sphinx/db/migrations/create_authors_posts.rb +0 -6
- data/features/thinking_sphinx/db/migrations/create_betas.rb +0 -5
- data/features/thinking_sphinx/db/migrations/create_boxes.rb +0 -5
- data/features/thinking_sphinx/db/migrations/create_categories.rb +0 -3
- data/features/thinking_sphinx/db/migrations/create_comments.rb +0 -10
- data/features/thinking_sphinx/db/migrations/create_developers.rb +0 -7
- data/features/thinking_sphinx/db/migrations/create_extensible_betas.rb +0 -5
- data/features/thinking_sphinx/db/migrations/create_gammas.rb +0 -3
- data/features/thinking_sphinx/db/migrations/create_genres.rb +0 -3
- data/features/thinking_sphinx/db/migrations/create_music.rb +0 -6
- data/features/thinking_sphinx/db/migrations/create_people.rb +0 -13
- data/features/thinking_sphinx/db/migrations/create_posts.rb +0 -6
- data/features/thinking_sphinx/db/migrations/create_robots.rb +0 -4
- data/features/thinking_sphinx/db/migrations/create_taggings.rb +0 -5
- data/features/thinking_sphinx/db/migrations/create_tags.rb +0 -4
- data/features/thinking_sphinx/models/alpha.rb +0 -23
- data/features/thinking_sphinx/models/andrew.rb +0 -17
- data/features/thinking_sphinx/models/animal.rb +0 -5
- data/features/thinking_sphinx/models/author.rb +0 -3
- data/features/thinking_sphinx/models/beta.rb +0 -13
- data/features/thinking_sphinx/models/box.rb +0 -8
- data/features/thinking_sphinx/models/cat.rb +0 -3
- data/features/thinking_sphinx/models/category.rb +0 -4
- data/features/thinking_sphinx/models/comment.rb +0 -10
- data/features/thinking_sphinx/models/developer.rb +0 -21
- data/features/thinking_sphinx/models/dog.rb +0 -3
- data/features/thinking_sphinx/models/extensible_beta.rb +0 -9
- data/features/thinking_sphinx/models/fox.rb +0 -5
- data/features/thinking_sphinx/models/gamma.rb +0 -5
- data/features/thinking_sphinx/models/genre.rb +0 -3
- data/features/thinking_sphinx/models/medium.rb +0 -5
- data/features/thinking_sphinx/models/music.rb +0 -10
- data/features/thinking_sphinx/models/person.rb +0 -24
- data/features/thinking_sphinx/models/post.rb +0 -22
- data/features/thinking_sphinx/models/robot.rb +0 -12
- data/features/thinking_sphinx/models/tag.rb +0 -3
- data/lib/cucumber/thinking_sphinx/external_world.rb +0 -12
- data/lib/cucumber/thinking_sphinx/internal_world.rb +0 -137
- data/lib/cucumber/thinking_sphinx/sql_logger.rb +0 -28
- data/lib/thinking_sphinx/action_controller.rb +0 -31
- data/lib/thinking_sphinx/active_record/attribute_updates.rb +0 -54
- data/lib/thinking_sphinx/active_record/collection_proxy.rb +0 -47
- data/lib/thinking_sphinx/active_record/collection_proxy_with_scopes.rb +0 -27
- data/lib/thinking_sphinx/active_record/delta.rb +0 -67
- data/lib/thinking_sphinx/active_record/has_many_association.rb +0 -44
- data/lib/thinking_sphinx/active_record/has_many_association_with_scopes.rb +0 -21
- data/lib/thinking_sphinx/active_record/scopes.rb +0 -110
- data/lib/thinking_sphinx/adapters/abstract_adapter.rb +0 -94
- data/lib/thinking_sphinx/adapters/mysql_adapter.rb +0 -62
- data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +0 -188
- data/lib/thinking_sphinx/association.rb +0 -230
- data/lib/thinking_sphinx/attribute.rb +0 -405
- data/lib/thinking_sphinx/auto_version.rb +0 -40
- data/lib/thinking_sphinx/bundled_search.rb +0 -40
- data/lib/thinking_sphinx/class_facet.rb +0 -20
- data/lib/thinking_sphinx/connection.rb +0 -71
- data/lib/thinking_sphinx/context.rb +0 -81
- data/lib/thinking_sphinx/core/string.rb +0 -15
- data/lib/thinking_sphinx/deltas/delete_job.rb +0 -16
- data/lib/thinking_sphinx/deltas/index_job.rb +0 -17
- data/lib/thinking_sphinx/deploy/capistrano.rb +0 -99
- data/lib/thinking_sphinx/field.rb +0 -98
- data/lib/thinking_sphinx/index/builder.rb +0 -315
- data/lib/thinking_sphinx/index/faux_column.rb +0 -118
- data/lib/thinking_sphinx/join.rb +0 -37
- data/lib/thinking_sphinx/property.rb +0 -187
- data/lib/thinking_sphinx/search_methods.rb +0 -439
- data/lib/thinking_sphinx/sinatra.rb +0 -7
- data/lib/thinking_sphinx/source.rb +0 -194
- data/lib/thinking_sphinx/source/internal_properties.rb +0 -51
- data/lib/thinking_sphinx/source/sql.rb +0 -174
- data/spec/fixtures/data.sql +0 -32
- data/spec/fixtures/database.yml.default +0 -3
- data/spec/fixtures/models.rb +0 -164
- data/spec/fixtures/structure.sql +0 -146
- data/spec/sphinx_helper.rb +0 -60
- data/spec/support/rails.rb +0 -25
- data/spec/thinking_sphinx/active_record/delta_spec.rb +0 -123
- data/spec/thinking_sphinx/active_record/has_many_association_spec.rb +0 -173
- data/spec/thinking_sphinx/active_record/scopes_spec.rb +0 -177
- data/spec/thinking_sphinx/active_record_spec.rb +0 -573
- data/spec/thinking_sphinx/adapters/abstract_adapter_spec.rb +0 -163
- data/spec/thinking_sphinx/association_spec.rb +0 -250
- data/spec/thinking_sphinx/attribute_spec.rb +0 -552
- data/spec/thinking_sphinx/auto_version_spec.rb +0 -103
- data/spec/thinking_sphinx/connection_spec.rb +0 -77
- data/spec/thinking_sphinx/context_spec.rb +0 -127
- data/spec/thinking_sphinx/core/array_spec.rb +0 -9
- data/spec/thinking_sphinx/core/string_spec.rb +0 -9
- data/spec/thinking_sphinx/facet_spec.rb +0 -359
- data/spec/thinking_sphinx/field_spec.rb +0 -127
- data/spec/thinking_sphinx/index/builder_spec.rb +0 -532
- data/spec/thinking_sphinx/index/faux_column_spec.rb +0 -36
- data/spec/thinking_sphinx/search_methods_spec.rb +0 -156
- data/spec/thinking_sphinx/source_spec.rb +0 -267
- data/spec/thinking_sphinx/test_spec.rb +0 -20
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
module ThinkingSphinx
|
|
2
|
-
class AutoVersion
|
|
3
|
-
def self.detect
|
|
4
|
-
version = ThinkingSphinx::Configuration.instance.version
|
|
5
|
-
case version
|
|
6
|
-
when '0.9.8', '0.9.9'
|
|
7
|
-
require "riddle/#{version}"
|
|
8
|
-
when /1.10/
|
|
9
|
-
require 'riddle/1.10'
|
|
10
|
-
when /2.0.[12]/
|
|
11
|
-
require 'riddle/2.0.1'
|
|
12
|
-
when /2.0.[^12]/, /2.1.\d/
|
|
13
|
-
require 'riddle/2.1.0'
|
|
14
|
-
else
|
|
15
|
-
documentation_link = %Q{
|
|
16
|
-
For more information, read the documentation:
|
|
17
|
-
http://pat.github.io/thinking-sphinx/advanced_config.html
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if version.nil? || version.empty?
|
|
21
|
-
STDERR.puts %Q{
|
|
22
|
-
Sphinx cannot be found on your system. You may need to configure the following
|
|
23
|
-
settings in your config/sphinx.yml file:
|
|
24
|
-
* bin_path
|
|
25
|
-
* searchd_binary_name
|
|
26
|
-
* indexer_binary_name
|
|
27
|
-
|
|
28
|
-
#{documentation_link}
|
|
29
|
-
}
|
|
30
|
-
else
|
|
31
|
-
STDERR.puts %Q{
|
|
32
|
-
Unsupported version: #{version}
|
|
33
|
-
|
|
34
|
-
#{documentation_link}
|
|
35
|
-
}
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
module ThinkingSphinx
|
|
2
|
-
class BundledSearch
|
|
3
|
-
def initialize
|
|
4
|
-
@searches = []
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
def search(*args)
|
|
8
|
-
@searches << ThinkingSphinx.search(*args)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def search_for_ids(*args)
|
|
12
|
-
@searches << ThinkingSphinx.search_for_ids(*args)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def searches
|
|
16
|
-
populate
|
|
17
|
-
@searches
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
private
|
|
21
|
-
|
|
22
|
-
def populated?
|
|
23
|
-
@populated
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def populate
|
|
27
|
-
return if populated?
|
|
28
|
-
|
|
29
|
-
@populated = true
|
|
30
|
-
|
|
31
|
-
ThinkingSphinx::Connection.take do |client|
|
|
32
|
-
@searches.each { |search| search.append_to client }
|
|
33
|
-
|
|
34
|
-
client.run.each_with_index do |results, index|
|
|
35
|
-
searches[index].populate_from_queue results
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
module ThinkingSphinx
|
|
2
|
-
class ClassFacet < ThinkingSphinx::Facet
|
|
3
|
-
def name
|
|
4
|
-
:class
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
def attribute_name
|
|
8
|
-
Riddle.loaded_version.to_i < 2 ? 'class_crc' : 'sphinx_internal_class'
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def value(object, attribute_hash)
|
|
12
|
-
if Riddle.loaded_version.to_i < 2
|
|
13
|
-
crc = attribute_hash['class_crc']
|
|
14
|
-
ThinkingSphinx::Configuration.instance.models_by_crc[crc]
|
|
15
|
-
else
|
|
16
|
-
attribute_hash['sphinx_internal_class']
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
class ThinkingSphinx::Connection
|
|
2
|
-
def self.pool
|
|
3
|
-
@pool ||= Innertube::Pool.new(
|
|
4
|
-
Proc.new { ThinkingSphinx::Connection.new },
|
|
5
|
-
Proc.new { |connection| connection.close }
|
|
6
|
-
)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def self.take
|
|
10
|
-
retries = 0
|
|
11
|
-
original = nil
|
|
12
|
-
begin
|
|
13
|
-
pool.take do |connection|
|
|
14
|
-
connection.reset
|
|
15
|
-
begin
|
|
16
|
-
yield connection
|
|
17
|
-
rescue Riddle::ConnectionError, Riddle::ResponseError, SystemCallError => error
|
|
18
|
-
original = error
|
|
19
|
-
raise Innertube::Pool::BadResource
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
rescue Innertube::Pool::BadResource
|
|
23
|
-
retries += 1
|
|
24
|
-
retry if retries < 3
|
|
25
|
-
raise original
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def initialize
|
|
30
|
-
client.open
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def client
|
|
34
|
-
@client ||= begin
|
|
35
|
-
client = Riddle::Client.new shuffled_addresses, configuration.port,
|
|
36
|
-
client_key
|
|
37
|
-
client.max_matches = _max_matches
|
|
38
|
-
client.timeout = configuration.timeout || 0
|
|
39
|
-
client
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
private
|
|
44
|
-
|
|
45
|
-
def client_key
|
|
46
|
-
configuration.configuration.searchd.client_key
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def configuration
|
|
50
|
-
ThinkingSphinx::Configuration.instance
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def _max_matches
|
|
54
|
-
configuration.configuration.searchd.max_matches || 1000
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def method_missing(method, *arguments, &block)
|
|
58
|
-
client.send method, *arguments, &block
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def shuffled_addresses
|
|
62
|
-
return configuration.address unless configuration.shuffle
|
|
63
|
-
|
|
64
|
-
addresses = Array(configuration.address)
|
|
65
|
-
if addresses.respond_to?(:shuffle)
|
|
66
|
-
addresses.shuffle
|
|
67
|
-
else
|
|
68
|
-
address.sort_by { rand }
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
class ThinkingSphinx::Context
|
|
2
|
-
attr_reader :indexed_models
|
|
3
|
-
|
|
4
|
-
def initialize(*models)
|
|
5
|
-
@indexed_models = []
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def prepare
|
|
9
|
-
ThinkingSphinx::Configuration.instance.indexed_models.each do |model|
|
|
10
|
-
add_indexed_model model
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
return unless indexed_models.empty?
|
|
14
|
-
|
|
15
|
-
load_models
|
|
16
|
-
add_indexed_models
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def define_indexes
|
|
20
|
-
indexed_models.each { |model|
|
|
21
|
-
model.constantize.define_indexes
|
|
22
|
-
}
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def add_indexed_model(model)
|
|
26
|
-
model = model.name if model.is_a?(Class)
|
|
27
|
-
|
|
28
|
-
indexed_models << model
|
|
29
|
-
indexed_models.uniq!
|
|
30
|
-
indexed_models.sort!
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def superclass_indexed_models
|
|
34
|
-
klasses = indexed_models.collect { |name| name.constantize }
|
|
35
|
-
klasses.reject { |klass|
|
|
36
|
-
klass.superclass.ancestors.any? { |ancestor| klasses.include?(ancestor) }
|
|
37
|
-
}.collect { |klass| klass.name }
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
private
|
|
41
|
-
|
|
42
|
-
def add_indexed_models
|
|
43
|
-
ActiveRecord::Base.descendants.each do |klass|
|
|
44
|
-
add_indexed_model klass if klass.has_sphinx_indexes?
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Make sure all models are loaded - without reloading any that
|
|
49
|
-
# ActiveRecord::Base is already aware of (otherwise we start to hit some
|
|
50
|
-
# messy dependencies issues).
|
|
51
|
-
#
|
|
52
|
-
def load_models
|
|
53
|
-
ThinkingSphinx::Configuration.instance.model_directories.each do |base|
|
|
54
|
-
Dir["#{base}**/*.rb"].each do |file|
|
|
55
|
-
model_name = file.gsub(/^#{base}([\w_\/\\]+)\.rb/, '\1')
|
|
56
|
-
|
|
57
|
-
next if model_name.nil?
|
|
58
|
-
camelized_model = model_name.camelize
|
|
59
|
-
next if ::ActiveRecord::Base.descendants.detect { |model|
|
|
60
|
-
model.name == camelized_model
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
begin
|
|
64
|
-
camelized_model.constantize
|
|
65
|
-
rescue LoadError, NameError
|
|
66
|
-
# Make sure that STI subclasses in subfolders are loaded.
|
|
67
|
-
if camelized_model.gsub!(/.+::/, '').nil?
|
|
68
|
-
STDERR.puts "ThinkingSphinx: error loading #{file}"
|
|
69
|
-
next
|
|
70
|
-
else
|
|
71
|
-
retry
|
|
72
|
-
end
|
|
73
|
-
rescue Exception => err
|
|
74
|
-
STDERR.puts "Warning: Error loading #{file}:"
|
|
75
|
-
STDERR.puts err.message
|
|
76
|
-
STDERR.puts err.backtrace.join("\n"), ''
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
class ThinkingSphinx::Deltas::DeleteJob
|
|
2
|
-
def initialize(indices, document_id)
|
|
3
|
-
@indices, @document_id = indices, document_id
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
def perform
|
|
7
|
-
ThinkingSphinx::Connection.take do |client|
|
|
8
|
-
@indices.each do |index|
|
|
9
|
-
client.update(index, ['sphinx_deleted'], {@document_id => [1]})
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
rescue Riddle::ConnectionError, Riddle::ResponseError,
|
|
13
|
-
ThinkingSphinx::SphinxError, Errno::ETIMEDOUT, Timeout::Error
|
|
14
|
-
# Not the end of the world if Sphinx isn't running.
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
class ThinkingSphinx::Deltas::IndexJob
|
|
2
|
-
def initialize(indices)
|
|
3
|
-
@indices = indices
|
|
4
|
-
@indices << {:verbose => !ThinkingSphinx.suppress_delta_output?}
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
def perform
|
|
8
|
-
ThinkingSphinx::Configuration.instance.controller.index *@indices
|
|
9
|
-
ThinkingSphinx::Connection.pool.clear
|
|
10
|
-
|
|
11
|
-
true
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def configuration
|
|
15
|
-
ThinkingSphinx::Configuration.instance
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
Capistrano::Configuration.instance(:must_exist).load do
|
|
2
|
-
namespace :thinking_sphinx do
|
|
3
|
-
namespace :install do
|
|
4
|
-
desc <<-DESC
|
|
5
|
-
Install Sphinx by source
|
|
6
|
-
|
|
7
|
-
If Postgres is available, Sphinx will use it.
|
|
8
|
-
|
|
9
|
-
If the variable :thinking_sphinx_configure_args is set, it will
|
|
10
|
-
be passed to the Sphinx configure script. You can use this to
|
|
11
|
-
install Sphinx in a non-standard location:
|
|
12
|
-
|
|
13
|
-
set :thinking_sphinx_configure_args, "--prefix=$HOME/software"
|
|
14
|
-
DESC
|
|
15
|
-
|
|
16
|
-
task :sphinx do
|
|
17
|
-
with_postgres = false
|
|
18
|
-
begin
|
|
19
|
-
run "which pg_config" do |channel, stream, data|
|
|
20
|
-
with_postgres = !(data.nil? || data == "")
|
|
21
|
-
end
|
|
22
|
-
rescue Capistrano::CommandError => e
|
|
23
|
-
puts "Continuing despite error: #{e.message}"
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
args = []
|
|
27
|
-
if with_postgres
|
|
28
|
-
run "pg_config --pkgincludedir" do |channel, stream, data|
|
|
29
|
-
args << "--with-pgsql=#{data}"
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
args << fetch(:thinking_sphinx_configure_args, '')
|
|
33
|
-
|
|
34
|
-
commands = <<-CMD
|
|
35
|
-
wget -q http://sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz >> sphinx.log
|
|
36
|
-
tar xzvf sphinx-0.9.9.tar.gz
|
|
37
|
-
cd sphinx-0.9.9
|
|
38
|
-
./configure #{args.join(" ")}
|
|
39
|
-
make
|
|
40
|
-
#{try_sudo} make install
|
|
41
|
-
rm -rf sphinx-0.9.9 sphinx-0.9.9.tar.gz
|
|
42
|
-
CMD
|
|
43
|
-
run commands.split(/\n\s+/).join(" && ")
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
desc "Install Thinking Sphinx as a gem"
|
|
47
|
-
task :ts do
|
|
48
|
-
run "#{try_sudo} gem install thinking-sphinx"
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
desc "Generate the Sphinx configuration file"
|
|
53
|
-
task :configure do
|
|
54
|
-
rake "thinking_sphinx:configure"
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
desc "Index data"
|
|
58
|
-
task :index do
|
|
59
|
-
rake "thinking_sphinx:index"
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
desc "Start the Sphinx daemon"
|
|
63
|
-
task :start do
|
|
64
|
-
rake "thinking_sphinx:configure thinking_sphinx:start"
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
desc "Stop the Sphinx daemon"
|
|
68
|
-
task :stop do
|
|
69
|
-
rake "thinking_sphinx:configure thinking_sphinx:stop"
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
desc "Stop and then start the Sphinx daemon"
|
|
73
|
-
task :restart do
|
|
74
|
-
rake "thinking_sphinx:configure thinking_sphinx:stop \
|
|
75
|
-
thinking_sphinx:start"
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
desc "Stop, re-index and then start the Sphinx daemon"
|
|
79
|
-
task :rebuild do
|
|
80
|
-
rake "thinking_sphinx:configure thinking_sphinx:stop \
|
|
81
|
-
thinking_sphinx:reindex \
|
|
82
|
-
thinking_sphinx:start"
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
desc "Add the shared folder for sphinx files"
|
|
86
|
-
task :shared_sphinx_folder, :roles => :web do
|
|
87
|
-
rails_env = fetch(:rails_env, "production")
|
|
88
|
-
run "mkdir -p #{shared_path}/sphinx/#{rails_env}"
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def rake(*tasks)
|
|
92
|
-
rails_env = fetch(:rails_env, "production")
|
|
93
|
-
rake = fetch(:rake, "rake")
|
|
94
|
-
tasks.each do |t|
|
|
95
|
-
run "if [ -d #{release_path} ]; then cd #{release_path}; else cd #{current_path}; fi; if [ -f Rakefile ]; then #{rake} RAILS_ENV=#{rails_env} #{t}; fi;"
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
end
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
module ThinkingSphinx
|
|
2
|
-
# Fields - holding the string data which Sphinx indexes for your searches.
|
|
3
|
-
# This class isn't really useful to you unless you're hacking around with the
|
|
4
|
-
# internals of Thinking Sphinx - but hey, don't let that stop you.
|
|
5
|
-
#
|
|
6
|
-
# One key thing to remember - if you're using the field manually to
|
|
7
|
-
# generate SQL statements, you'll need to set the base model, and all the
|
|
8
|
-
# associations. Which can get messy. Use Index.link!, it really helps.
|
|
9
|
-
#
|
|
10
|
-
class Field < ThinkingSphinx::Property
|
|
11
|
-
attr_accessor :sortable, :infixes, :prefixes
|
|
12
|
-
|
|
13
|
-
# To create a new field, you'll need to pass in either a single Column
|
|
14
|
-
# or an array of them, and some (optional) options. The columns are
|
|
15
|
-
# references to the data that will make up the field.
|
|
16
|
-
#
|
|
17
|
-
# Valid options are:
|
|
18
|
-
# - :as => :alias_name
|
|
19
|
-
# - :sortable => true
|
|
20
|
-
# - :infixes => true
|
|
21
|
-
# - :prefixes => true
|
|
22
|
-
# - :file => true
|
|
23
|
-
# - :with => :attribute # or :wordcount
|
|
24
|
-
#
|
|
25
|
-
# Alias is only required in three circumstances: when there's
|
|
26
|
-
# another attribute or field with the same name, when the column name is
|
|
27
|
-
# 'id', or when there's more than one column.
|
|
28
|
-
#
|
|
29
|
-
# Sortable defaults to false - but is quite useful when set to true, as
|
|
30
|
-
# it creates an attribute with the same string value (which Sphinx converts
|
|
31
|
-
# to an integer value), which can be sorted by. Thinking Sphinx is smart
|
|
32
|
-
# enough to realise that when you specify fields in sort statements, you
|
|
33
|
-
# mean their respective attributes.
|
|
34
|
-
#
|
|
35
|
-
# If you have partial matching enabled (ie: enable_star), then you can
|
|
36
|
-
# specify certain fields to have their prefixes and infixes indexed. Keep
|
|
37
|
-
# in mind, though, that Sphinx's default is _all_ fields - so once you
|
|
38
|
-
# highlight a particular field, no other fields in the index will have
|
|
39
|
-
# these partial indexes.
|
|
40
|
-
#
|
|
41
|
-
# Here's some examples:
|
|
42
|
-
#
|
|
43
|
-
# Field.new(
|
|
44
|
-
# Column.new(:name)
|
|
45
|
-
# )
|
|
46
|
-
#
|
|
47
|
-
# Field.new(
|
|
48
|
-
# [Column.new(:first_name), Column.new(:last_name)],
|
|
49
|
-
# :as => :name, :sortable => true
|
|
50
|
-
# )
|
|
51
|
-
#
|
|
52
|
-
# Field.new(
|
|
53
|
-
# [Column.new(:posts, :subject), Column.new(:posts, :content)],
|
|
54
|
-
# :as => :posts, :prefixes => true
|
|
55
|
-
# )
|
|
56
|
-
#
|
|
57
|
-
def initialize(source, columns, options = {})
|
|
58
|
-
super
|
|
59
|
-
|
|
60
|
-
@sortable = options[:sortable] || false
|
|
61
|
-
@infixes = options[:infixes] || false
|
|
62
|
-
@prefixes = options[:prefixes] || false
|
|
63
|
-
@file = options[:file] || false
|
|
64
|
-
@with = options[:with]
|
|
65
|
-
|
|
66
|
-
source.fields << self
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Get the part of the SELECT clause related to this field. Don't forget
|
|
70
|
-
# to set your model and associations first though.
|
|
71
|
-
#
|
|
72
|
-
# This will concatenate strings if there's more than one data source or
|
|
73
|
-
# multiple data values (has_many or has_and_belongs_to_many associations).
|
|
74
|
-
#
|
|
75
|
-
def to_select_sql
|
|
76
|
-
return nil unless available?
|
|
77
|
-
|
|
78
|
-
clause = columns_with_prefixes.join(', ')
|
|
79
|
-
|
|
80
|
-
clause = adapter.concatenate(clause) if concat_ws?
|
|
81
|
-
clause = adapter.group_concatenate(clause) if is_many?
|
|
82
|
-
|
|
83
|
-
"#{clause} AS #{quote_column(unique_name)}"
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def file?
|
|
87
|
-
@file
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def with_attribute?
|
|
91
|
-
@with == :attribute
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def with_wordcount?
|
|
95
|
-
@with == :wordcount
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|