thinking-sphinx 3.0.6 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +11 -6
  3. data/Appraisals +5 -5
  4. data/Gemfile +3 -3
  5. data/HISTORY +32 -0
  6. data/README.textile +16 -5
  7. data/gemfiles/rails_3_2.gemfile +2 -1
  8. data/gemfiles/rails_4_0.gemfile +3 -2
  9. data/gemfiles/{rails_3_1.gemfile → rails_4_1.gemfile} +3 -2
  10. data/lib/thinking_sphinx.rb +5 -0
  11. data/lib/thinking_sphinx/active_record.rb +2 -1
  12. data/lib/thinking_sphinx/active_record/association_proxy/attribute_finder.rb +1 -1
  13. data/lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb +6 -7
  14. data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +2 -2
  15. data/lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb +1 -1
  16. data/lib/thinking_sphinx/active_record/column_sql_presenter.rb +34 -0
  17. data/lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb +4 -0
  18. data/lib/thinking_sphinx/active_record/database_adapters/postgresql_adapter.rb +4 -0
  19. data/lib/thinking_sphinx/active_record/index.rb +2 -1
  20. data/lib/thinking_sphinx/active_record/interpreter.rb +7 -0
  21. data/lib/thinking_sphinx/active_record/property.rb +1 -1
  22. data/lib/thinking_sphinx/active_record/property_sql_presenter.rb +10 -16
  23. data/lib/thinking_sphinx/active_record/sql_builder.rb +7 -1
  24. data/lib/thinking_sphinx/active_record/sql_builder/query.rb +0 -7
  25. data/lib/thinking_sphinx/active_record/sql_source.rb +20 -20
  26. data/lib/thinking_sphinx/active_record/sql_source/template.rb +1 -1
  27. data/lib/thinking_sphinx/capistrano.rb +6 -65
  28. data/lib/thinking_sphinx/capistrano/v2.rb +58 -0
  29. data/lib/thinking_sphinx/capistrano/v3.rb +101 -0
  30. data/lib/thinking_sphinx/configuration.rb +8 -3
  31. data/lib/thinking_sphinx/configuration/distributed_indices.rb +29 -0
  32. data/lib/thinking_sphinx/connection.rb +90 -34
  33. data/lib/thinking_sphinx/controller.rb +20 -0
  34. data/lib/thinking_sphinx/core/index.rb +4 -0
  35. data/lib/thinking_sphinx/deletion.rb +15 -11
  36. data/lib/thinking_sphinx/deltas.rb +9 -0
  37. data/lib/thinking_sphinx/deltas/default_delta.rb +2 -0
  38. data/lib/thinking_sphinx/distributed.rb +5 -0
  39. data/lib/thinking_sphinx/distributed/index.rb +24 -0
  40. data/lib/thinking_sphinx/excerpter.rb +7 -3
  41. data/lib/thinking_sphinx/facet_search.rb +1 -1
  42. data/lib/thinking_sphinx/index.rb +2 -6
  43. data/lib/thinking_sphinx/index_set.rb +10 -8
  44. data/lib/thinking_sphinx/middlewares.rb +0 -2
  45. data/lib/thinking_sphinx/middlewares/active_record_translator.rb +1 -0
  46. data/lib/thinking_sphinx/middlewares/geographer.rb +1 -1
  47. data/lib/thinking_sphinx/middlewares/sphinxql.rb +8 -6
  48. data/lib/thinking_sphinx/middlewares/utf8.rb +6 -1
  49. data/lib/thinking_sphinx/query.rb +9 -0
  50. data/lib/thinking_sphinx/railtie.rb +0 -13
  51. data/lib/thinking_sphinx/search/query.rb +3 -21
  52. data/lib/thinking_sphinx/sphinxql.rb +1 -1
  53. data/lib/thinking_sphinx/wildcard.rb +34 -0
  54. data/spec/acceptance/geosearching_spec.rb +13 -0
  55. data/spec/acceptance/indexing_spec.rb +27 -0
  56. data/spec/acceptance/remove_deleted_records_spec.rb +8 -0
  57. data/spec/acceptance/searching_with_sti_spec.rb +7 -0
  58. data/spec/acceptance/searching_within_a_model_spec.rb +8 -0
  59. data/spec/acceptance/sorting_search_results_spec.rb +1 -1
  60. data/spec/acceptance/spec_helper.rb +13 -0
  61. data/spec/acceptance/specifying_sql_spec.rb +2 -2
  62. data/spec/acceptance/support/sphinx_controller.rb +5 -5
  63. data/spec/acceptance/support/sphinx_helpers.rb +3 -0
  64. data/spec/acceptance/suspended_deltas_spec.rb +34 -0
  65. data/spec/internal/config/database.yml +1 -0
  66. data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +13 -6
  67. data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +2 -2
  68. data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +7 -0
  69. data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +6 -0
  70. data/spec/thinking_sphinx/active_record/interpreter_spec.rb +27 -0
  71. data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +18 -7
  72. data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +17 -7
  73. data/spec/thinking_sphinx/active_record/sql_source_spec.rb +84 -82
  74. data/spec/thinking_sphinx/configuration_spec.rb +5 -4
  75. data/spec/thinking_sphinx/connection_spec.rb +1 -1
  76. data/spec/thinking_sphinx/deletion_spec.rb +10 -28
  77. data/spec/thinking_sphinx/excerpter_spec.rb +3 -3
  78. data/spec/thinking_sphinx/facet_search_spec.rb +13 -4
  79. data/spec/thinking_sphinx/index_set_spec.rb +9 -4
  80. data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +8 -0
  81. data/spec/thinking_sphinx/middlewares/geographer_spec.rb +7 -7
  82. data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +17 -1
  83. data/spec/thinking_sphinx/search/query_spec.rb +10 -53
  84. data/spec/thinking_sphinx/wildcard_spec.rb +41 -0
  85. data/thinking-sphinx.gemspec +6 -5
  86. metadata +38 -14
  87. data/lib/thinking_sphinx/active_record/associations.rb +0 -98
  88. data/spec/thinking_sphinx/active_record/associations_spec.rb +0 -230
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thinking-sphinx
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.6
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pat Allan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-20 00:00:00.000000000 Z
11
+ date: 2014-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: 2.1.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: joiner
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.2.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.2.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: middleware
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -72,28 +86,28 @@ dependencies:
72
86
  requirements:
73
87
  - - '>='
74
88
  - !ruby/object:Gem::Version
75
- version: 1.5.9
89
+ version: 1.5.10
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - '>='
81
95
  - !ruby/object:Gem::Version
82
- version: 1.5.9
96
+ version: 1.5.10
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: appraisal
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - ~>
88
102
  - !ruby/object:Gem::Version
89
- version: 0.4.0
103
+ version: 0.5.2
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - ~>
95
109
  - !ruby/object:Gem::Version
96
- version: 0.4.0
110
+ version: 0.5.2
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: combustion
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +128,14 @@ dependencies:
114
128
  requirements:
115
129
  - - ~>
116
130
  - !ruby/object:Gem::Version
117
- version: 0.7.1
131
+ version: 1.2.0
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
136
  - - ~>
123
137
  - !ruby/object:Gem::Version
124
- version: 0.7.1
138
+ version: 1.2.0
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: rspec
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -153,9 +167,9 @@ files:
153
167
  - README.textile
154
168
  - Rakefile
155
169
  - gemfiles/.gitignore
156
- - gemfiles/rails_3_1.gemfile
157
170
  - gemfiles/rails_3_2.gemfile
158
171
  - gemfiles/rails_4_0.gemfile
172
+ - gemfiles/rails_4_1.gemfile
159
173
  - lib/thinking-sphinx.rb
160
174
  - lib/thinking/sphinx.rb
161
175
  - lib/thinking_sphinx.rb
@@ -163,7 +177,6 @@ files:
163
177
  - lib/thinking_sphinx/active_record/association.rb
164
178
  - lib/thinking_sphinx/active_record/association_proxy.rb
165
179
  - lib/thinking_sphinx/active_record/association_proxy/attribute_finder.rb
166
- - lib/thinking_sphinx/active_record/associations.rb
167
180
  - lib/thinking_sphinx/active_record/attribute.rb
168
181
  - lib/thinking_sphinx/active_record/attribute/sphinx_presenter.rb
169
182
  - lib/thinking_sphinx/active_record/attribute/type.rb
@@ -173,6 +186,7 @@ files:
173
186
  - lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb
174
187
  - lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb
175
188
  - lib/thinking_sphinx/active_record/column.rb
189
+ - lib/thinking_sphinx/active_record/column_sql_presenter.rb
176
190
  - lib/thinking_sphinx/active_record/database_adapters.rb
177
191
  - lib/thinking_sphinx/active_record/database_adapters/abstract_adapter.rb
178
192
  - lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb
@@ -195,11 +209,15 @@ files:
195
209
  - lib/thinking_sphinx/batched_search.rb
196
210
  - lib/thinking_sphinx/callbacks.rb
197
211
  - lib/thinking_sphinx/capistrano.rb
212
+ - lib/thinking_sphinx/capistrano/v2.rb
213
+ - lib/thinking_sphinx/capistrano/v3.rb
198
214
  - lib/thinking_sphinx/configuration.rb
199
215
  - lib/thinking_sphinx/configuration/consistent_ids.rb
200
216
  - lib/thinking_sphinx/configuration/defaults.rb
217
+ - lib/thinking_sphinx/configuration/distributed_indices.rb
201
218
  - lib/thinking_sphinx/configuration/minimum_fields.rb
202
219
  - lib/thinking_sphinx/connection.rb
220
+ - lib/thinking_sphinx/controller.rb
203
221
  - lib/thinking_sphinx/core.rb
204
222
  - lib/thinking_sphinx/core/field.rb
205
223
  - lib/thinking_sphinx/core/index.rb
@@ -211,6 +229,8 @@ files:
211
229
  - lib/thinking_sphinx/deltas/default_delta.rb
212
230
  - lib/thinking_sphinx/deltas/delete_job.rb
213
231
  - lib/thinking_sphinx/deltas/index_job.rb
232
+ - lib/thinking_sphinx/distributed.rb
233
+ - lib/thinking_sphinx/distributed/index.rb
214
234
  - lib/thinking_sphinx/errors.rb
215
235
  - lib/thinking_sphinx/excerpter.rb
216
236
  - lib/thinking_sphinx/facet.rb
@@ -242,6 +262,7 @@ files:
242
262
  - lib/thinking_sphinx/panes/distance_pane.rb
243
263
  - lib/thinking_sphinx/panes/excerpts_pane.rb
244
264
  - lib/thinking_sphinx/panes/weight_pane.rb
265
+ - lib/thinking_sphinx/query.rb
245
266
  - lib/thinking_sphinx/railtie.rb
246
267
  - lib/thinking_sphinx/rake_interface.rb
247
268
  - lib/thinking_sphinx/real_time.rb
@@ -268,6 +289,7 @@ files:
268
289
  - lib/thinking_sphinx/tasks.rb
269
290
  - lib/thinking_sphinx/test.rb
270
291
  - lib/thinking_sphinx/utf8.rb
292
+ - lib/thinking_sphinx/wildcard.rb
271
293
  - sketchpad.rb
272
294
  - spec/acceptance/association_scoping_spec.rb
273
295
  - spec/acceptance/attribute_access_spec.rb
@@ -279,6 +301,7 @@ files:
279
301
  - spec/acceptance/geosearching_spec.rb
280
302
  - spec/acceptance/grouping_by_attributes_spec.rb
281
303
  - spec/acceptance/index_options_spec.rb
304
+ - spec/acceptance/indexing_spec.rb
282
305
  - spec/acceptance/paginating_search_results_spec.rb
283
306
  - spec/acceptance/remove_deleted_records_spec.rb
284
307
  - spec/acceptance/search_counts_spec.rb
@@ -333,7 +356,6 @@ files:
333
356
  - spec/spec_helper.rb
334
357
  - spec/support/sphinx_yaml_helpers.rb
335
358
  - spec/thinking_sphinx/active_record/association_spec.rb
336
- - spec/thinking_sphinx/active_record/associations_spec.rb
337
359
  - spec/thinking_sphinx/active_record/attribute/type_spec.rb
338
360
  - spec/thinking_sphinx/active_record/base_spec.rb
339
361
  - spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb
@@ -385,9 +407,10 @@ files:
385
407
  - spec/thinking_sphinx/search/glaze_spec.rb
386
408
  - spec/thinking_sphinx/search/query_spec.rb
387
409
  - spec/thinking_sphinx/search_spec.rb
410
+ - spec/thinking_sphinx/wildcard_spec.rb
388
411
  - spec/thinking_sphinx_spec.rb
389
412
  - thinking-sphinx.gemspec
390
- homepage: http://pat.github.com/ts/en
413
+ homepage: http://pat.github.io/thinking-sphinx/
391
414
  licenses:
392
415
  - MIT
393
416
  metadata: {}
@@ -407,7 +430,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
407
430
  version: '0'
408
431
  requirements: []
409
432
  rubyforge_project: thinking-sphinx
410
- rubygems_version: 2.1.2
433
+ rubygems_version: 2.1.11
411
434
  signing_key:
412
435
  specification_version: 4
413
436
  summary: A smart wrapper over Sphinx for ActiveRecord
@@ -422,6 +445,7 @@ test_files:
422
445
  - spec/acceptance/geosearching_spec.rb
423
446
  - spec/acceptance/grouping_by_attributes_spec.rb
424
447
  - spec/acceptance/index_options_spec.rb
448
+ - spec/acceptance/indexing_spec.rb
425
449
  - spec/acceptance/paginating_search_results_spec.rb
426
450
  - spec/acceptance/remove_deleted_records_spec.rb
427
451
  - spec/acceptance/search_counts_spec.rb
@@ -476,7 +500,6 @@ test_files:
476
500
  - spec/spec_helper.rb
477
501
  - spec/support/sphinx_yaml_helpers.rb
478
502
  - spec/thinking_sphinx/active_record/association_spec.rb
479
- - spec/thinking_sphinx/active_record/associations_spec.rb
480
503
  - spec/thinking_sphinx/active_record/attribute/type_spec.rb
481
504
  - spec/thinking_sphinx/active_record/base_spec.rb
482
505
  - spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb
@@ -528,4 +551,5 @@ test_files:
528
551
  - spec/thinking_sphinx/search/glaze_spec.rb
529
552
  - spec/thinking_sphinx/search/query_spec.rb
530
553
  - spec/thinking_sphinx/search_spec.rb
554
+ - spec/thinking_sphinx/wildcard_spec.rb
531
555
  - spec/thinking_sphinx_spec.rb
@@ -1,98 +0,0 @@
1
- class ThinkingSphinx::ActiveRecord::Associations
2
- JoinDependency = ::ActiveRecord::Associations::JoinDependency
3
-
4
- attr_reader :model
5
-
6
- def initialize(model)
7
- @model = model
8
- @joins = ActiveSupport::OrderedHash.new
9
- end
10
-
11
- def add_join_to(stack)
12
- join_for(stack)
13
- end
14
-
15
- def aggregate_for?(stack)
16
- return false if stack.empty?
17
-
18
- joins_for(stack).compact.any? { |join|
19
- [:has_many, :has_and_belongs_to_many].include?(
20
- join.reflection.macro
21
- )
22
- }
23
- end
24
-
25
- def alias_for(stack)
26
- return model.quoted_table_name if stack.empty?
27
-
28
- join_for(stack).aliased_table_name
29
- end
30
-
31
- def join_values
32
- @joins.values.compact
33
- end
34
-
35
- def model_for(stack)
36
- return model if stack.empty?
37
-
38
- join = join_for(stack)
39
- join.nil? ? nil : join.reflection.klass
40
- end
41
-
42
- private
43
-
44
- def base
45
- @base ||= JoinDependency.new model, [], []
46
- end
47
-
48
- def join_for(stack)
49
- @joins[stack] ||= begin
50
- reflection = reflection_for stack
51
- reflection.nil? ? nil : JoinDependency::JoinAssociation.new(
52
- reflection, base, parent_join_for(stack)
53
- ).tap { |join|
54
- join.join_type = Arel::OuterJoin
55
-
56
- rewrite_conditions_for join
57
- }
58
- end
59
- end
60
-
61
- def joins_for(stack)
62
- if stack.length == 1
63
- [join_for(stack)]
64
- else
65
- [joins_for(stack[0..-2]), join_for(stack)].flatten
66
- end
67
- end
68
-
69
- def parent_for(stack)
70
- stack.length == 1 ? base : join_for(stack[0..-2])
71
- end
72
-
73
- def parent_join_for(stack)
74
- stack.length == 1 ? base.join_base : parent_for(stack)
75
- end
76
-
77
- def reflection_for(stack)
78
- parent = parent_for(stack)
79
- klass = parent.respond_to?(:base_klass) ? parent.base_klass :
80
- parent.active_record
81
- klass.reflections[stack.last]
82
- end
83
-
84
- def rewrite_conditions_for(join)
85
- if join.respond_to?(:scope_chain)
86
- conditions = Array(join.scope_chain).flatten
87
- else
88
- conditions = Array(join.conditions).flatten
89
- end
90
-
91
- conditions.each do |condition|
92
- next unless condition.is_a?(String)
93
-
94
- condition.gsub! /::ts_join_alias::/,
95
- model.connection.quote_table_name(join.parent.aliased_table_name)
96
- end
97
- end
98
- end
@@ -1,230 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ThinkingSphinx::ActiveRecord::Associations do
4
- JoinDependency = ::ActiveRecord::Associations::JoinDependency
5
-
6
- let(:associations) { ThinkingSphinx::ActiveRecord::Associations.new model }
7
- let(:model) { model_double 'articles' }
8
- let(:base) {
9
- double('base', :active_record => model, :join_base => join_base)
10
- }
11
- let(:join_base) { double('join base') }
12
- let(:join) { join_double 'users' }
13
- let(:sub_join) { join_double 'posts' }
14
-
15
- def join_double(table_alias)
16
- double 'join',
17
- :join_type= => nil,
18
- :aliased_table_name => table_alias,
19
- :reflection => double('reflection'),
20
- :conditions => []
21
- end
22
-
23
- def model_double(table_name = nil)
24
- double 'model', :quoted_table_name => table_name, :reflections => {}
25
- end
26
-
27
- before :each do
28
- JoinDependency.stub :new => base
29
- JoinDependency::JoinAssociation.stub(:new).and_return(join, sub_join)
30
- model.reflections[:user] = join.reflection
31
-
32
- join.stub :active_record => model_double
33
- join.active_record.reflections[:posts] = sub_join.reflection
34
- end
35
-
36
- describe '#add_join_to' do
37
- before :each do
38
- JoinDependency::JoinAssociation.unstub :new
39
- end
40
-
41
- it "adds just one join for a stack with a single association" do
42
- JoinDependency::JoinAssociation.should_receive(:new).
43
- with(join.reflection, base, join_base).once.and_return(join)
44
-
45
- associations.add_join_to([:user])
46
- end
47
-
48
- it "does not duplicate joins when given the same stack twice" do
49
- JoinDependency::JoinAssociation.should_receive(:new).once.and_return(join)
50
-
51
- associations.add_join_to([:user])
52
- associations.add_join_to([:user])
53
- end
54
-
55
- context 'multiple joins' do
56
- it "adds two joins for a stack with two associations" do
57
- JoinDependency::JoinAssociation.should_receive(:new).
58
- with(join.reflection, base, join_base).once.and_return(join)
59
- JoinDependency::JoinAssociation.should_receive(:new).
60
- with(sub_join.reflection, base, join).once.and_return(sub_join)
61
-
62
- associations.add_join_to([:user, :posts])
63
- end
64
-
65
- it "extends upon existing joins when given stacks where parts are already mapped" do
66
- JoinDependency::JoinAssociation.should_receive(:new).twice.
67
- and_return(join, sub_join)
68
-
69
- associations.add_join_to([:user])
70
- associations.add_join_to([:user, :posts])
71
- end
72
- end
73
-
74
- context 'join with conditions' do
75
- let(:connection) { double }
76
- let(:parent) { double :aliased_table_name => 'qux' }
77
-
78
- before :each do
79
- JoinDependency::JoinAssociation.stub :new => join
80
-
81
- join.stub :parent => parent
82
- model.stub :connection => connection
83
- connection.stub(:quote_table_name) { |table| "\"#{table}\"" }
84
- end
85
-
86
- it "leaves standard conditions untouched" do
87
- join.stub :conditions => 'foo = bar'
88
-
89
- associations.add_join_to [:user]
90
-
91
- join.conditions.should == 'foo = bar'
92
- end
93
-
94
- it "modifies filtered polymorphic conditions" do
95
- join.stub :conditions => '::ts_join_alias::.foo = bar'
96
-
97
- associations.add_join_to [:user]
98
-
99
- join.conditions.should == '"qux".foo = bar'
100
- end
101
-
102
- it "modifies filtered polymorphic conditions within arrays" do
103
- join.stub :conditions => ['::ts_join_alias::.foo = bar']
104
-
105
- associations.add_join_to [:user]
106
-
107
- join.conditions.should == ['"qux".foo = bar']
108
- end
109
-
110
- it "does not modify conditions as hashes" do
111
- join.stub :conditions => [{:foo => 'bar'}]
112
-
113
- associations.add_join_to [:user]
114
-
115
- join.conditions.should == [{:foo => 'bar'}]
116
- end
117
- end
118
- end
119
-
120
- describe '#aggregate_for?' do
121
- it "is false when the stack is empty" do
122
- associations.aggregate_for?([]).should be_false
123
- end
124
-
125
- it "is true when a reflection is a has_many" do
126
- join.reflection.stub!(:macro => :has_many)
127
-
128
- associations.aggregate_for?([:user]).should be_true
129
- end
130
-
131
- it "is true when a reflection is a has_and_belongs_to_many" do
132
- join.reflection.stub!(:macro => :has_and_belongs_to_many)
133
-
134
- associations.aggregate_for?([:user]).should be_true
135
- end
136
-
137
- it "is false when a reflection is a belongs_to" do
138
- join.reflection.stub!(:macro => :belongs_to)
139
-
140
- associations.aggregate_for?([:user]).should be_false
141
- end
142
-
143
- it "is false when a reflection is a has_one" do
144
- join.reflection.stub!(:macro => :has_one)
145
-
146
- associations.aggregate_for?([:user]).should be_false
147
- end
148
-
149
- it "is true when one level is aggregate" do
150
- join.reflection.stub!(:macro => :belongs_to)
151
- sub_join.reflection.stub!(:macro => :has_many)
152
-
153
- associations.aggregate_for?([:user, :posts]).should be_true
154
- end
155
-
156
- it "is true when both levels are aggregates" do
157
- join.reflection.stub!(:macro => :has_many)
158
- sub_join.reflection.stub!(:macro => :has_many)
159
-
160
- associations.aggregate_for?([:user, :posts]).should be_true
161
- end
162
-
163
- it "is false when both levels are not aggregates" do
164
- join.reflection.stub!(:macro => :belongs_to)
165
- sub_join.reflection.stub!(:macro => :belongs_to)
166
-
167
- associations.aggregate_for?([:user, :posts]).should be_false
168
- end
169
- end
170
-
171
- describe '#alias_for' do
172
- it "returns the model's table name when no stack is given" do
173
- associations.alias_for([]).should == 'articles'
174
- end
175
-
176
- it "adds just one join for a stack with a single association" do
177
- JoinDependency::JoinAssociation.unstub :new
178
- JoinDependency::JoinAssociation.should_receive(:new).
179
- with(join.reflection, base, join_base).once.and_return(join)
180
-
181
- associations.alias_for([:user])
182
- end
183
-
184
- it "returns the aliased table name for the join" do
185
- associations.alias_for([:user]).should == 'users'
186
- end
187
-
188
- it "does not duplicate joins when given the same stack twice" do
189
- JoinDependency::JoinAssociation.unstub :new
190
- JoinDependency::JoinAssociation.should_receive(:new).once.and_return(join)
191
-
192
- associations.alias_for([:user])
193
- associations.alias_for([:user])
194
- end
195
-
196
- context 'multiple joins' do
197
- it "adds two joins for a stack with two associations" do
198
- JoinDependency::JoinAssociation.unstub :new
199
- JoinDependency::JoinAssociation.should_receive(:new).
200
- with(join.reflection, base, join_base).once.and_return(join)
201
- JoinDependency::JoinAssociation.should_receive(:new).
202
- with(sub_join.reflection, base, join).once.and_return(sub_join)
203
-
204
- associations.alias_for([:user, :posts])
205
- end
206
-
207
- it "returns the sub join's aliased table name" do
208
- associations.alias_for([:user, :posts]).should == 'posts'
209
- end
210
-
211
- it "extends upon existing joins when given stacks where parts are already mapped" do
212
- JoinDependency::JoinAssociation.unstub :new
213
- JoinDependency::JoinAssociation.should_receive(:new).twice.
214
- and_return(join, sub_join)
215
-
216
- associations.alias_for([:user])
217
- associations.alias_for([:user, :posts])
218
- end
219
- end
220
- end
221
-
222
- describe '#join_values' do
223
- it "returns all joins that have been created" do
224
- associations.alias_for([:user])
225
- associations.alias_for([:user, :posts])
226
-
227
- associations.join_values.should == [join, sub_join]
228
- end
229
- end
230
- end