thinking-sphinx 1.2.13 → 1.4.0
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/README.textile +37 -4
- data/VERSION +1 -0
- data/features/abstract_inheritance.feature +10 -0
- data/features/alternate_primary_key.feature +1 -1
- data/features/attribute_updates.feature +49 -5
- data/features/deleting_instances.feature +3 -0
- data/features/excerpts.feature +8 -0
- data/features/facets.feature +15 -1
- data/features/facets_across_model.feature +2 -2
- data/features/field_sorting.feature +18 -0
- data/features/handling_edits.feature +1 -1
- data/features/searching_across_models.feature +2 -2
- data/features/searching_by_index.feature +40 -0
- data/features/searching_by_model.feature +1 -8
- data/features/sphinx_scopes.feature +33 -0
- data/features/step_definitions/alpha_steps.rb +14 -1
- data/features/step_definitions/beta_steps.rb +1 -1
- data/features/step_definitions/common_steps.rb +21 -2
- data/features/step_definitions/facet_steps.rb +4 -0
- data/features/step_definitions/scope_steps.rb +8 -0
- data/features/step_definitions/search_steps.rb +5 -0
- data/features/step_definitions/sphinx_steps.rb +8 -4
- data/features/sti_searching.feature +5 -0
- data/features/support/env.rb +7 -6
- data/features/{support → thinking_sphinx}/db/fixtures/betas.rb +1 -0
- data/features/{support → thinking_sphinx}/db/fixtures/comments.rb +1 -1
- data/features/{support → thinking_sphinx}/db/fixtures/developers.rb +2 -0
- data/features/thinking_sphinx/db/fixtures/foxes.rb +3 -0
- data/features/thinking_sphinx/db/fixtures/music.rb +4 -0
- data/features/{support → thinking_sphinx}/db/fixtures/people.rb +1 -1
- data/features/{support → thinking_sphinx}/db/fixtures/tags.rb +1 -1
- data/features/{support → thinking_sphinx}/db/migrations/create_alphas.rb +1 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_developers.rb +0 -2
- data/features/thinking_sphinx/db/migrations/create_genres.rb +3 -0
- data/features/thinking_sphinx/db/migrations/create_music.rb +6 -0
- data/features/thinking_sphinx/models/alpha.rb +23 -0
- data/features/thinking_sphinx/models/andrew.rb +17 -0
- data/features/{support → thinking_sphinx}/models/beta.rb +1 -1
- data/features/{support → thinking_sphinx}/models/developer.rb +2 -2
- data/features/{support → thinking_sphinx}/models/extensible_beta.rb +1 -1
- data/features/thinking_sphinx/models/fox.rb +5 -0
- data/features/thinking_sphinx/models/genre.rb +3 -0
- data/features/thinking_sphinx/models/medium.rb +5 -0
- data/features/thinking_sphinx/models/music.rb +8 -0
- data/features/{support → thinking_sphinx}/models/person.rb +2 -1
- data/features/{support → thinking_sphinx}/models/post.rb +2 -1
- data/lib/cucumber/thinking_sphinx/external_world.rb +12 -0
- data/lib/cucumber/thinking_sphinx/internal_world.rb +13 -11
- data/lib/thinking_sphinx/active_record/attribute_updates.rb +17 -15
- data/lib/thinking_sphinx/active_record/delta.rb +0 -26
- data/lib/thinking_sphinx/active_record/has_many_association.rb +34 -11
- data/lib/thinking_sphinx/active_record/scopes.rb +46 -3
- data/lib/thinking_sphinx/active_record.rb +271 -193
- data/lib/thinking_sphinx/adapters/abstract_adapter.rb +45 -9
- data/lib/thinking_sphinx/adapters/mysql_adapter.rb +5 -1
- data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +9 -1
- data/lib/thinking_sphinx/attribute.rb +67 -23
- data/lib/thinking_sphinx/auto_version.rb +24 -0
- data/lib/thinking_sphinx/bundled_search.rb +44 -0
- data/lib/thinking_sphinx/class_facet.rb +3 -2
- data/lib/thinking_sphinx/configuration.rb +78 -64
- data/lib/thinking_sphinx/context.rb +76 -0
- data/lib/thinking_sphinx/deltas/default_delta.rb +14 -20
- data/lib/thinking_sphinx/deltas.rb +0 -2
- data/lib/thinking_sphinx/deploy/capistrano.rb +1 -1
- data/lib/thinking_sphinx/excerpter.rb +1 -1
- data/lib/thinking_sphinx/facet.rb +6 -5
- data/lib/thinking_sphinx/facet_search.rb +54 -24
- data/lib/thinking_sphinx/field.rb +2 -4
- data/lib/thinking_sphinx/index/builder.rb +36 -20
- data/lib/thinking_sphinx/index/faux_column.rb +8 -0
- data/lib/thinking_sphinx/index.rb +77 -19
- data/lib/thinking_sphinx/join.rb +37 -0
- data/lib/thinking_sphinx/property.rb +9 -2
- data/lib/thinking_sphinx/rails_additions.rb +4 -4
- data/lib/thinking_sphinx/search.rb +212 -66
- data/lib/thinking_sphinx/search_methods.rb +22 -4
- data/lib/thinking_sphinx/source/internal_properties.rb +2 -2
- data/lib/thinking_sphinx/source/sql.rb +5 -3
- data/lib/thinking_sphinx/source.rb +21 -12
- data/lib/thinking_sphinx/tasks.rb +26 -58
- data/lib/thinking_sphinx/test.rb +55 -0
- data/lib/thinking_sphinx.rb +70 -38
- data/rails/init.rb +4 -2
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/active_record/delta_spec.rb +6 -8
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/active_record/has_many_association_spec.rb +26 -3
- data/spec/thinking_sphinx/active_record/scopes_spec.rb +176 -0
- data/spec/thinking_sphinx/active_record_spec.rb +618 -0
- data/spec/thinking_sphinx/adapters/abstract_adapter_spec.rb +134 -0
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/association_spec.rb +1 -1
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/attribute_spec.rb +87 -46
- data/spec/thinking_sphinx/auto_version_spec.rb +47 -0
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/configuration_spec.rb +73 -63
- data/spec/thinking_sphinx/context_spec.rb +127 -0
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/core/array_spec.rb +1 -1
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/core/string_spec.rb +1 -1
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/excerpter_spec.rb +1 -9
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/facet_search_spec.rb +76 -82
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/facet_spec.rb +5 -5
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/field_spec.rb +1 -42
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/index/builder_spec.rb +71 -31
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/index/faux_column_spec.rb +8 -2
- data/spec/thinking_sphinx/index_spec.rb +183 -0
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/rails_additions_spec.rb +5 -5
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/search_methods_spec.rb +5 -1
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/search_spec.rb +183 -31
- data/spec/{lib/thinking_sphinx → thinking_sphinx}/source_spec.rb +18 -2
- data/spec/thinking_sphinx/test_spec.rb +20 -0
- data/spec/thinking_sphinx_spec.rb +204 -0
- data/tasks/distribution.rb +7 -26
- data/tasks/testing.rb +32 -20
- metadata +488 -147
- data/VERSION.yml +0 -5
- data/features/datetime_deltas.feature +0 -66
- data/features/delayed_delta_indexing.feature +0 -37
- data/features/step_definitions/datetime_delta_steps.rb +0 -15
- data/features/step_definitions/delayed_delta_indexing_steps.rb +0 -7
- data/features/support/database.yml +0 -5
- data/features/support/db/active_record.rb +0 -40
- data/features/support/db/database.yml +0 -5
- data/features/support/db/fixtures/delayed_betas.rb +0 -10
- data/features/support/db/fixtures/thetas.rb +0 -10
- data/features/support/db/migrations/create_delayed_betas.rb +0 -17
- data/features/support/db/migrations/create_thetas.rb +0 -5
- data/features/support/db/mysql.rb +0 -3
- data/features/support/db/postgresql.rb +0 -3
- data/features/support/models/alpha.rb +0 -10
- data/features/support/models/delayed_beta.rb +0 -7
- data/features/support/models/theta.rb +0 -7
- data/features/support/post_database.rb +0 -43
- data/lib/thinking_sphinx/deltas/datetime_delta.rb +0 -50
- data/lib/thinking_sphinx/deltas/delayed_delta/delta_job.rb +0 -24
- data/lib/thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job.rb +0 -27
- data/lib/thinking_sphinx/deltas/delayed_delta/job.rb +0 -26
- data/lib/thinking_sphinx/deltas/delayed_delta.rb +0 -30
- data/spec/lib/thinking_sphinx/active_record/scopes_spec.rb +0 -96
- data/spec/lib/thinking_sphinx/active_record_spec.rb +0 -353
- data/spec/lib/thinking_sphinx/deltas/job_spec.rb +0 -32
- data/spec/lib/thinking_sphinx/index_spec.rb +0 -45
- data/spec/lib/thinking_sphinx_spec.rb +0 -162
- data/vendor/after_commit/LICENSE +0 -20
- data/vendor/after_commit/README +0 -16
- data/vendor/after_commit/Rakefile +0 -22
- data/vendor/after_commit/init.rb +0 -8
- data/vendor/after_commit/lib/after_commit/active_record.rb +0 -114
- data/vendor/after_commit/lib/after_commit/connection_adapters.rb +0 -103
- data/vendor/after_commit/lib/after_commit.rb +0 -45
- data/vendor/after_commit/test/after_commit_test.rb +0 -53
- data/vendor/delayed_job/lib/delayed/job.rb +0 -251
- data/vendor/delayed_job/lib/delayed/message_sending.rb +0 -7
- data/vendor/delayed_job/lib/delayed/performable_method.rb +0 -55
- data/vendor/delayed_job/lib/delayed/worker.rb +0 -54
- data/vendor/riddle/lib/riddle/client/filter.rb +0 -53
- data/vendor/riddle/lib/riddle/client/message.rb +0 -66
- data/vendor/riddle/lib/riddle/client/response.rb +0 -84
- data/vendor/riddle/lib/riddle/client.rb +0 -635
- data/vendor/riddle/lib/riddle/configuration/distributed_index.rb +0 -48
- data/vendor/riddle/lib/riddle/configuration/index.rb +0 -142
- data/vendor/riddle/lib/riddle/configuration/indexer.rb +0 -19
- data/vendor/riddle/lib/riddle/configuration/remote_index.rb +0 -17
- data/vendor/riddle/lib/riddle/configuration/searchd.rb +0 -25
- data/vendor/riddle/lib/riddle/configuration/section.rb +0 -43
- data/vendor/riddle/lib/riddle/configuration/source.rb +0 -23
- data/vendor/riddle/lib/riddle/configuration/sql_source.rb +0 -34
- data/vendor/riddle/lib/riddle/configuration/xml_source.rb +0 -28
- data/vendor/riddle/lib/riddle/configuration.rb +0 -33
- data/vendor/riddle/lib/riddle/controller.rb +0 -53
- data/vendor/riddle/lib/riddle.rb +0 -30
- data/features/{support → thinking_sphinx}/database.example.yml +0 -0
- data/features/{support → thinking_sphinx}/db/fixtures/alphas.rb +0 -0
- data/features/{support → thinking_sphinx}/db/fixtures/authors.rb +0 -0
- data/features/{support → thinking_sphinx}/db/fixtures/boxes.rb +0 -0
- data/features/{support → thinking_sphinx}/db/fixtures/categories.rb +0 -0
- data/features/{support → thinking_sphinx}/db/fixtures/cats.rb +0 -0
- data/features/{support → thinking_sphinx}/db/fixtures/dogs.rb +0 -0
- data/features/{support → thinking_sphinx}/db/fixtures/extensible_betas.rb +0 -0
- data/features/{support → thinking_sphinx}/db/fixtures/gammas.rb +0 -0
- data/features/{support → thinking_sphinx}/db/fixtures/posts.rb +0 -0
- data/features/{support → thinking_sphinx}/db/fixtures/robots.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_animals.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_authors.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_authors_posts.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_betas.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_boxes.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_categories.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_comments.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_extensible_betas.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_gammas.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_people.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_posts.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_robots.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_taggings.rb +0 -0
- data/features/{support → thinking_sphinx}/db/migrations/create_tags.rb +0 -0
- data/features/{support → thinking_sphinx}/models/animal.rb +0 -0
- data/features/{support → thinking_sphinx}/models/author.rb +0 -0
- data/features/{support → thinking_sphinx}/models/box.rb +0 -0
- data/features/{support → thinking_sphinx}/models/cat.rb +0 -0
- data/features/{support → thinking_sphinx}/models/category.rb +0 -0
- data/features/{support → thinking_sphinx}/models/comment.rb +3 -3
- /data/features/{support → thinking_sphinx}/models/dog.rb +0 -0
- /data/features/{support → thinking_sphinx}/models/gamma.rb +0 -0
- /data/features/{support → thinking_sphinx}/models/robot.rb +0 -0
- /data/features/{support → thinking_sphinx}/models/tag.rb +0 -0
- /data/features/{support → thinking_sphinx}/models/tagging.rb +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe ThinkingSphinx::Excerpter do
|
|
4
4
|
before :each do
|
|
@@ -40,14 +40,6 @@ describe ThinkingSphinx::Excerpter do
|
|
|
40
40
|
@excerpter.big_name
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
it "should escape the text in the excerpt" do
|
|
44
|
-
@search.should_receive(:excerpt_for) do |string, model|
|
|
45
|
-
string.should == 'test "escaping" <characters>'
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
@excerpter.string_to_escape
|
|
49
|
-
end
|
|
50
|
-
|
|
51
43
|
it "should still raise an exception if no column or method exists" do
|
|
52
44
|
lambda {
|
|
53
45
|
@excerpter.foo
|
|
@@ -1,28 +1,26 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe ThinkingSphinx::FacetSearch do
|
|
4
|
+
let(:search) { stub('search', :append_to => nil, :empty? => true) }
|
|
5
|
+
let(:config) { ThinkingSphinx::Configuration.instance }
|
|
6
|
+
let(:client) { stub('client', :run => []) }
|
|
7
|
+
|
|
8
|
+
before :each do
|
|
9
|
+
config.stub!(:client => client)
|
|
10
|
+
end
|
|
11
|
+
|
|
4
12
|
describe 'populate' do
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
hash_including(:group_by => 'city_facet')
|
|
8
|
-
).and_return([])
|
|
9
|
-
ThinkingSphinx.should_receive(:search).with(
|
|
10
|
-
hash_including(:group_by => 'state_facet')
|
|
11
|
-
).and_return([])
|
|
12
|
-
ThinkingSphinx.should_receive(:search).with(
|
|
13
|
-
hash_including(:group_by => 'birthday')
|
|
14
|
-
).and_return([])
|
|
15
|
-
|
|
16
|
-
ThinkingSphinx::FacetSearch.new(:classes => [Person])
|
|
13
|
+
before :each do
|
|
14
|
+
config.configuration.searchd.max_matches = 10_000
|
|
17
15
|
end
|
|
18
|
-
|
|
16
|
+
|
|
19
17
|
it "should request all shared facets in a multi-model request by default" do
|
|
20
|
-
ThinkingSphinx.stub!(:search =>
|
|
18
|
+
ThinkingSphinx.stub!(:search => search)
|
|
21
19
|
ThinkingSphinx::FacetSearch.new.facet_names.should == ['class_crc']
|
|
22
20
|
end
|
|
23
21
|
|
|
24
22
|
it "should request all facets in a multi-model request if specified" do
|
|
25
|
-
ThinkingSphinx.stub!(:search =>
|
|
23
|
+
ThinkingSphinx.stub!(:search => search)
|
|
26
24
|
ThinkingSphinx::FacetSearch.new(
|
|
27
25
|
:all_facets => true
|
|
28
26
|
).facet_names.should == [
|
|
@@ -30,80 +28,22 @@ describe ThinkingSphinx::FacetSearch do
|
|
|
30
28
|
]
|
|
31
29
|
end
|
|
32
30
|
|
|
33
|
-
describe ':facets option' do
|
|
34
|
-
it "should limit facets to the requested set" do
|
|
35
|
-
ThinkingSphinx.should_receive(:search).once.and_return([])
|
|
36
|
-
|
|
37
|
-
ThinkingSphinx::FacetSearch.new(
|
|
38
|
-
:classes => [Person], :facets => :state
|
|
39
|
-
)
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
describe "empty result set for attributes" do
|
|
44
|
-
before :each do
|
|
45
|
-
ThinkingSphinx.stub!(:search => [])
|
|
46
|
-
@facets = ThinkingSphinx::FacetSearch.new(
|
|
47
|
-
:classes => [Person], :facets => :state
|
|
48
|
-
)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it "should add key as attribute" do
|
|
52
|
-
@facets.should have_key(:state)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
it "should return an empty hash for the facet results" do
|
|
56
|
-
@facets[:state].should be_empty
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
describe "non-empty result set" do
|
|
61
|
-
before :each do
|
|
62
|
-
@person = Person.find(:first)
|
|
63
|
-
@people = [@person]
|
|
64
|
-
@people.stub!(:each_with_groupby_and_count).
|
|
65
|
-
and_yield(@person, @person.city.to_crc32, 1)
|
|
66
|
-
ThinkingSphinx.stub!(:search => @people)
|
|
67
|
-
|
|
68
|
-
@facets = ThinkingSphinx::FacetSearch.new(
|
|
69
|
-
:classes => [Person], :facets => :city
|
|
70
|
-
)
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
it "should return a hash" do
|
|
74
|
-
@facets.should be_a_kind_of(Hash)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it "should add key as attribute" do
|
|
78
|
-
@facets.keys.should include(:city)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it "should return a hash" do
|
|
82
|
-
@facets[:city].should == {@person.city => 1}
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
before :each do
|
|
87
|
-
@config = ThinkingSphinx::Configuration.instance
|
|
88
|
-
@config.configuration.searchd.max_matches = 10_000
|
|
89
|
-
end
|
|
90
|
-
|
|
91
31
|
it "should use the system-set max_matches for limit on facet calls" do
|
|
92
32
|
ThinkingSphinx.should_receive(:search) do |options|
|
|
93
33
|
options[:max_matches].should == 10_000
|
|
94
34
|
options[:limit].should == 10_000
|
|
95
|
-
|
|
35
|
+
search
|
|
96
36
|
end
|
|
97
37
|
|
|
98
38
|
ThinkingSphinx::FacetSearch.new
|
|
99
39
|
end
|
|
100
40
|
|
|
101
41
|
it "should use the default max-matches if there is no explicit setting" do
|
|
102
|
-
|
|
42
|
+
config.configuration.searchd.max_matches = nil
|
|
103
43
|
ThinkingSphinx.should_receive(:search) do |options|
|
|
104
44
|
options[:max_matches].should == 1000
|
|
105
45
|
options[:limit].should == 1000
|
|
106
|
-
|
|
46
|
+
search
|
|
107
47
|
end
|
|
108
48
|
|
|
109
49
|
ThinkingSphinx::FacetSearch.new
|
|
@@ -113,7 +53,7 @@ describe ThinkingSphinx::FacetSearch do
|
|
|
113
53
|
ThinkingSphinx.should_receive(:search) do |options|
|
|
114
54
|
options[:max_matches].should == 10_000
|
|
115
55
|
options[:limit].should == 10_000
|
|
116
|
-
|
|
56
|
+
search
|
|
117
57
|
end
|
|
118
58
|
|
|
119
59
|
ThinkingSphinx::FacetSearch.new(
|
|
@@ -125,7 +65,7 @@ describe ThinkingSphinx::FacetSearch do
|
|
|
125
65
|
it "should not use an explicit :page" do
|
|
126
66
|
ThinkingSphinx.should_receive(:search) do |options|
|
|
127
67
|
options[:page].should == 1
|
|
128
|
-
|
|
68
|
+
search
|
|
129
69
|
end
|
|
130
70
|
|
|
131
71
|
ThinkingSphinx::FacetSearch.new(:page => 3)
|
|
@@ -149,15 +89,69 @@ describe ThinkingSphinx::FacetSearch do
|
|
|
149
89
|
}.should raise_error
|
|
150
90
|
end
|
|
151
91
|
end
|
|
92
|
+
|
|
93
|
+
describe ':facets option' do
|
|
94
|
+
it "should limit facets to the requested set" do
|
|
95
|
+
ThinkingSphinx.should_receive(:search).once.and_return(search)
|
|
96
|
+
|
|
97
|
+
ThinkingSphinx::FacetSearch.new(
|
|
98
|
+
:classes => [Person], :facets => :state
|
|
99
|
+
)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
describe "empty result set for attributes" do
|
|
104
|
+
before :each do
|
|
105
|
+
ThinkingSphinx.stub!(:search => search)
|
|
106
|
+
@facets = ThinkingSphinx::FacetSearch.new(
|
|
107
|
+
:classes => [Person], :facets => :state
|
|
108
|
+
)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "should add key as attribute" do
|
|
112
|
+
@facets.should have_key(:state)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it "should return an empty hash for the facet results" do
|
|
116
|
+
@facets[:state].should be_empty
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
describe "non-empty result set" do
|
|
121
|
+
before :each do
|
|
122
|
+
@person = Person.find(:first)
|
|
123
|
+
@people = [@person]
|
|
124
|
+
search.stub!(:empty? => false)
|
|
125
|
+
search.stub!(:each_with_match).
|
|
126
|
+
and_yield(@person, {:attributes => {'@groupby' => @person.city.to_crc32, '@count' => 1}})
|
|
127
|
+
ThinkingSphinx::Search.stub!(:bundle_searches => [search])
|
|
128
|
+
|
|
129
|
+
@facets = ThinkingSphinx::FacetSearch.new(
|
|
130
|
+
:classes => [Person], :facets => :city
|
|
131
|
+
)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it "should return a hash" do
|
|
135
|
+
@facets.should be_a_kind_of(Hash)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "should add key as attribute" do
|
|
139
|
+
@facets.keys.should include(:city)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it "should return a hash" do
|
|
143
|
+
@facets[:city].should == {@person.city => 1}
|
|
144
|
+
end
|
|
145
|
+
end
|
|
152
146
|
end
|
|
153
147
|
|
|
154
148
|
describe "#for" do
|
|
155
149
|
before do
|
|
156
150
|
@person = Person.find(:first)
|
|
157
151
|
@people = [@person]
|
|
158
|
-
|
|
159
|
-
and_yield(@person, @person.city.to_crc32, 1)
|
|
160
|
-
ThinkingSphinx.stub!(:
|
|
152
|
+
search.stub!(:each_with_match).
|
|
153
|
+
and_yield(@person, {:attributes => {'@groupby' => @person.city.to_crc32, '@count' => 1}})
|
|
154
|
+
ThinkingSphinx::Search.stub!(:bundle_searches => [search])
|
|
161
155
|
|
|
162
156
|
@facets = ThinkingSphinx::FacetSearch.new(
|
|
163
157
|
:classes => [Person], :facets => :city
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe ThinkingSphinx::Facet do
|
|
4
4
|
describe ".name_for" do
|
|
@@ -291,13 +291,13 @@ describe ThinkingSphinx::Facet do
|
|
|
291
291
|
person = Person.find(:first)
|
|
292
292
|
friendship = Friendship.new(:person => person)
|
|
293
293
|
|
|
294
|
-
@facet.value(friendship, 1).should == person.first_name
|
|
294
|
+
@facet.value(friendship, {'first_name_facet' => 1}).should == person.first_name
|
|
295
295
|
end
|
|
296
296
|
|
|
297
297
|
it "should return nil if the association is nil" do
|
|
298
298
|
friendship = Friendship.new(:person => nil)
|
|
299
299
|
|
|
300
|
-
@facet.value(friendship, 1).should be_nil
|
|
300
|
+
@facet.value(friendship, {'first_name_facet' => 1}).should be_nil
|
|
301
301
|
end
|
|
302
302
|
|
|
303
303
|
it "should return multi-level association values" do
|
|
@@ -308,7 +308,7 @@ describe ThinkingSphinx::Facet do
|
|
|
308
308
|
field = ThinkingSphinx::Field.new(
|
|
309
309
|
@source, ThinkingSphinx::Index::FauxColumn.new(:person, :tags, :name)
|
|
310
310
|
)
|
|
311
|
-
ThinkingSphinx::Facet.new(field).value(friendship, 'buried'.to_crc32).
|
|
311
|
+
ThinkingSphinx::Facet.new(field).value(friendship, {'name_facet' => 'buried'.to_crc32}).
|
|
312
312
|
should == 'buried'
|
|
313
313
|
end
|
|
314
314
|
end
|
|
@@ -326,7 +326,7 @@ describe ThinkingSphinx::Facet do
|
|
|
326
326
|
it "should translate using the given model" do
|
|
327
327
|
alpha = Alpha.new(:cost => 10.5)
|
|
328
328
|
|
|
329
|
-
@facet.value(alpha, 1093140480).should == 10.5
|
|
329
|
+
@facet.value(alpha, {'cost' => 1093140480}).should == 10.5
|
|
330
330
|
end
|
|
331
331
|
end
|
|
332
332
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe ThinkingSphinx::Field do
|
|
4
4
|
before :each do
|
|
@@ -77,47 +77,6 @@ describe ThinkingSphinx::Field do
|
|
|
77
77
|
end
|
|
78
78
|
end
|
|
79
79
|
|
|
80
|
-
describe "column_with_prefix method" do
|
|
81
|
-
before :each do
|
|
82
|
-
@field = ThinkingSphinx::Field.new @source, [
|
|
83
|
-
ThinkingSphinx::Index::FauxColumn.new(:col_name)
|
|
84
|
-
]
|
|
85
|
-
@field.columns.each { |col| @field.associations[col] = [] }
|
|
86
|
-
@field.model = Person
|
|
87
|
-
|
|
88
|
-
@first_join = Object.new
|
|
89
|
-
@first_join.stub!(:aliased_table_name => "tabular")
|
|
90
|
-
@second_join = Object.new
|
|
91
|
-
@second_join.stub!(:aliased_table_name => "data")
|
|
92
|
-
|
|
93
|
-
@first_assoc = ThinkingSphinx::Association.new nil, nil
|
|
94
|
-
@first_assoc.stub!(:join => @first_join, :has_column? => true)
|
|
95
|
-
@second_assoc = ThinkingSphinx::Association.new nil, nil
|
|
96
|
-
@second_assoc.stub!(:join => @second_join, :has_column? => true)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
it "should return the column name if the column is a string" do
|
|
100
|
-
@field.columns = [ThinkingSphinx::Index::FauxColumn.new("string")]
|
|
101
|
-
@field.send(:column_with_prefix, @field.columns.first).should == "string"
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it "should return the column with model's table prefix if there's no associations for the column" do
|
|
105
|
-
@field.send(:column_with_prefix, @field.columns.first).should == "`people`.`col_name`"
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
it "should return the column with its join table prefix if an association exists" do
|
|
109
|
-
column = @field.columns.first
|
|
110
|
-
@field.associations[column] = [@first_assoc]
|
|
111
|
-
@field.send(:column_with_prefix, column).should == "`tabular`.`col_name`"
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
it "should return multiple columns concatenated if more than one association exists" do
|
|
115
|
-
column = @field.columns.first
|
|
116
|
-
@field.associations[column] = [@first_assoc, @second_assoc]
|
|
117
|
-
@field.send(:column_with_prefix, column).should == "`tabular`.`col_name`, `data`.`col_name`"
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
80
|
describe "is_many? method" do
|
|
122
81
|
before :each do
|
|
123
82
|
@assoc_a = stub('assoc', :is_many? => true)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe ThinkingSphinx::Index::Builder do
|
|
4
4
|
describe ".generate without source scope" do
|
|
@@ -31,10 +31,10 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
31
31
|
@source.fields[1].unique_name.should == :last_name
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
it "should have two attributes alongside the
|
|
35
|
-
@source.attributes.length.should ==
|
|
36
|
-
@source.attributes[
|
|
37
|
-
@source.attributes[
|
|
34
|
+
it "should have two attributes alongside the three internal ones" do
|
|
35
|
+
@source.attributes.length.should == 5
|
|
36
|
+
@source.attributes[3].unique_name.should == :birthday
|
|
37
|
+
@source.attributes[4].unique_name.should == :internal_id
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
it "should have one condition" do
|
|
@@ -95,8 +95,8 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
95
95
|
@source.fields.length.should == 1
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
-
it "should have one attribute alongside the
|
|
99
|
-
@source.attributes.length.should ==
|
|
98
|
+
it "should have one attribute alongside the three internal ones" do
|
|
99
|
+
@source.attributes.length.should == 4
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
it "should set the attribute name to have the _sort suffix" do
|
|
@@ -109,6 +109,22 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
109
109
|
end
|
|
110
110
|
end
|
|
111
111
|
|
|
112
|
+
describe '#join' do
|
|
113
|
+
before :each do
|
|
114
|
+
@index = ThinkingSphinx::Index::Builder.generate(Person) do
|
|
115
|
+
indexes first_name
|
|
116
|
+
|
|
117
|
+
join contacts
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
@source = @index.sources.first
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "should include the explicit join" do
|
|
124
|
+
@source.joins.length.should == 1
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
112
128
|
describe "faceted field" do
|
|
113
129
|
before :each do
|
|
114
130
|
@index = ThinkingSphinx::Index::Builder.generate(Person) do
|
|
@@ -126,8 +142,8 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
126
142
|
@source.fields.length.should == 1
|
|
127
143
|
end
|
|
128
144
|
|
|
129
|
-
it "should have one attribute alongside the
|
|
130
|
-
@source.attributes.length.should ==
|
|
145
|
+
it "should have one attribute alongside the three internal ones" do
|
|
146
|
+
@source.attributes.length.should == 4
|
|
131
147
|
end
|
|
132
148
|
|
|
133
149
|
it "should set the attribute name to have the _facet suffix" do
|
|
@@ -158,8 +174,8 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
158
174
|
Alpha.sphinx_facets.delete_at(-1)
|
|
159
175
|
end
|
|
160
176
|
|
|
161
|
-
it "should have just one attribute alongside the
|
|
162
|
-
@source.attributes.length.should ==
|
|
177
|
+
it "should have just one attribute alongside the three internal ones" do
|
|
178
|
+
@source.attributes.length.should == 4
|
|
163
179
|
end
|
|
164
180
|
end
|
|
165
181
|
|
|
@@ -177,8 +193,8 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
177
193
|
Person.sphinx_facets.delete_at(-1)
|
|
178
194
|
end
|
|
179
195
|
|
|
180
|
-
it "should have just one attribute alongside the
|
|
181
|
-
@source.attributes.length.should ==
|
|
196
|
+
it "should have just one attribute alongside the three internal ones" do
|
|
197
|
+
@source.attributes.length.should == 4
|
|
182
198
|
end
|
|
183
199
|
end
|
|
184
200
|
|
|
@@ -196,8 +212,8 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
196
212
|
Beta.sphinx_facets.delete_at(-1)
|
|
197
213
|
end
|
|
198
214
|
|
|
199
|
-
it "should have just one attribute alongside the
|
|
200
|
-
@source.attributes.length.should ==
|
|
215
|
+
it "should have just one attribute alongside the three internal ones" do
|
|
216
|
+
@source.attributes.length.should == 4
|
|
201
217
|
end
|
|
202
218
|
end
|
|
203
219
|
|
|
@@ -215,8 +231,8 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
215
231
|
Alpha.sphinx_facets.delete_at(-1)
|
|
216
232
|
end
|
|
217
233
|
|
|
218
|
-
it "should have just one attribute alongside the
|
|
219
|
-
@source.attributes.length.should ==
|
|
234
|
+
it "should have just one attribute alongside the three internal ones" do
|
|
235
|
+
@source.attributes.length.should == 4
|
|
220
236
|
end
|
|
221
237
|
end
|
|
222
238
|
|
|
@@ -234,8 +250,8 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
234
250
|
Person.sphinx_facets.delete_at(-1)
|
|
235
251
|
end
|
|
236
252
|
|
|
237
|
-
it "should have two attributes alongside the
|
|
238
|
-
@source.attributes.length.should ==
|
|
253
|
+
it "should have two attributes alongside the three internal ones" do
|
|
254
|
+
@source.attributes.length.should == 5
|
|
239
255
|
end
|
|
240
256
|
|
|
241
257
|
it "should set the facet attribute name to have the _facet suffix" do
|
|
@@ -266,8 +282,8 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
266
282
|
Person.sphinx_facets.delete_at(-1)
|
|
267
283
|
end
|
|
268
284
|
|
|
269
|
-
it "should have two attributes alongside the
|
|
270
|
-
@source.attributes.length.should ==
|
|
285
|
+
it "should have two attributes alongside the three internal ones" do
|
|
286
|
+
@source.attributes.length.should == 5
|
|
271
287
|
end
|
|
272
288
|
|
|
273
289
|
it "should set the facet attribute name to have the _facet suffix" do
|
|
@@ -305,8 +321,8 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
305
321
|
@source.fields.length.should == 1
|
|
306
322
|
end
|
|
307
323
|
|
|
308
|
-
it "should have one attribute alongside the
|
|
309
|
-
@source.attributes.length.should ==
|
|
324
|
+
it "should have one attribute alongside the three internal ones" do
|
|
325
|
+
@source.attributes.length.should == 4
|
|
310
326
|
end
|
|
311
327
|
|
|
312
328
|
it "should set the attribute name to have the _facet suffix" do
|
|
@@ -365,10 +381,10 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
365
381
|
@source.fields[1].unique_name.should == :last_name
|
|
366
382
|
end
|
|
367
383
|
|
|
368
|
-
it "should have two attributes alongside the
|
|
369
|
-
@source.attributes.length.should ==
|
|
370
|
-
@source.attributes[
|
|
371
|
-
@source.attributes[
|
|
384
|
+
it "should have two attributes alongside the three internal ones" do
|
|
385
|
+
@source.attributes.length.should == 5
|
|
386
|
+
@source.attributes[3].unique_name.should == :birthday
|
|
387
|
+
@source.attributes[4].unique_name.should == :internal_id
|
|
372
388
|
end
|
|
373
389
|
end
|
|
374
390
|
|
|
@@ -401,13 +417,13 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
401
417
|
end
|
|
402
418
|
end
|
|
403
419
|
|
|
404
|
-
it "should have two attributes alongside the
|
|
405
|
-
@index.attributes.length.should ==
|
|
420
|
+
it "should have two attributes alongside the six internal ones" do
|
|
421
|
+
@index.attributes.length.should == 8
|
|
406
422
|
end
|
|
407
423
|
|
|
408
|
-
it "should have one attribute in each source alongside the
|
|
424
|
+
it "should have one attribute in each source alongside the three internal ones" do
|
|
409
425
|
@index.sources.each do |source|
|
|
410
|
-
source.attributes.length.should ==
|
|
426
|
+
source.attributes.length.should == 4
|
|
411
427
|
end
|
|
412
428
|
end
|
|
413
429
|
end
|
|
@@ -452,4 +468,28 @@ describe ThinkingSphinx::Index::Builder do
|
|
|
452
468
|
@index.delta_object.should be_a_kind_of(ThinkingSphinx::Deltas::DefaultDelta)
|
|
453
469
|
end
|
|
454
470
|
end
|
|
471
|
+
|
|
472
|
+
context 'index options' do
|
|
473
|
+
before :each do
|
|
474
|
+
@index = ThinkingSphinx::Index::Builder.generate(Person) do
|
|
475
|
+
indexes first_name
|
|
476
|
+
|
|
477
|
+
set_property :index_exact_words => true
|
|
478
|
+
end
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
it "should track the index_exact_words option to the index" do
|
|
482
|
+
@index.local_options[:index_exact_words].should be_true
|
|
483
|
+
end
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
context 'with an explicit name' do
|
|
487
|
+
it "should set the index's name using the provided value" do
|
|
488
|
+
index = ThinkingSphinx::Index::Builder.generate(Person, 'custom') do
|
|
489
|
+
indexes first_name
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
index.name.should == 'custom'
|
|
493
|
+
end
|
|
494
|
+
end
|
|
455
495
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe ThinkingSphinx::Index::FauxColumn do
|
|
4
4
|
describe "coerce class method" do
|
|
@@ -27,4 +27,10 @@ describe ThinkingSphinx::Index::FauxColumn do
|
|
|
27
27
|
]
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
|
-
|
|
30
|
+
|
|
31
|
+
describe '#to_ary' do
|
|
32
|
+
it "should return an array with the instance inside it" do
|
|
33
|
+
subject.to_ary.should == [subject]
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|