sequel 4.9.0 → 4.10.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.
- checksums.yaml +4 -4
- data/CHANGELOG +79 -1
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/Rakefile +2 -12
- data/bin/sequel +1 -0
- data/doc/advanced_associations.rdoc +82 -25
- data/doc/association_basics.rdoc +21 -22
- data/doc/core_extensions.rdoc +1 -1
- data/doc/opening_databases.rdoc +7 -0
- data/doc/release_notes/4.10.0.txt +226 -0
- data/doc/security.rdoc +1 -0
- data/doc/testing.rdoc +7 -7
- data/doc/transactions.rdoc +8 -0
- data/lib/sequel/adapters/jdbc.rb +160 -168
- data/lib/sequel/adapters/jdbc/db2.rb +17 -18
- data/lib/sequel/adapters/jdbc/derby.rb +5 -28
- data/lib/sequel/adapters/jdbc/h2.rb +11 -22
- data/lib/sequel/adapters/jdbc/hsqldb.rb +31 -18
- data/lib/sequel/adapters/jdbc/jtds.rb +0 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +36 -35
- data/lib/sequel/adapters/jdbc/postgresql.rb +72 -90
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +18 -16
- data/lib/sequel/adapters/jdbc/sqlite.rb +7 -0
- data/lib/sequel/adapters/jdbc/sqlserver.rb +10 -30
- data/lib/sequel/adapters/jdbc/transactions.rb +5 -6
- data/lib/sequel/adapters/openbase.rb +1 -7
- data/lib/sequel/adapters/postgres.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +3 -6
- data/lib/sequel/adapters/shared/cubrid.rb +24 -9
- data/lib/sequel/adapters/shared/db2.rb +13 -5
- data/lib/sequel/adapters/shared/firebird.rb +16 -16
- data/lib/sequel/adapters/shared/informix.rb +2 -5
- data/lib/sequel/adapters/shared/mssql.rb +72 -63
- data/lib/sequel/adapters/shared/mysql.rb +72 -40
- data/lib/sequel/adapters/shared/oracle.rb +27 -15
- data/lib/sequel/adapters/shared/postgres.rb +24 -44
- data/lib/sequel/adapters/shared/progress.rb +1 -5
- data/lib/sequel/adapters/shared/sqlanywhere.rb +26 -18
- data/lib/sequel/adapters/shared/sqlite.rb +21 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -1
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +8 -2
- data/lib/sequel/adapters/utils/split_alter_table.rb +8 -0
- data/lib/sequel/core.rb +14 -9
- data/lib/sequel/database/dataset_defaults.rb +1 -0
- data/lib/sequel/database/misc.rb +12 -0
- data/lib/sequel/database/query.rb +4 -1
- data/lib/sequel/database/schema_methods.rb +3 -2
- data/lib/sequel/database/transactions.rb +47 -17
- data/lib/sequel/dataset/features.rb +12 -2
- data/lib/sequel/dataset/mutation.rb +2 -0
- data/lib/sequel/dataset/placeholder_literalizer.rb +12 -4
- data/lib/sequel/dataset/prepared_statements.rb +6 -0
- data/lib/sequel/dataset/query.rb +1 -1
- data/lib/sequel/dataset/sql.rb +132 -70
- data/lib/sequel/extensions/columns_introspection.rb +1 -1
- data/lib/sequel/extensions/null_dataset.rb +8 -4
- data/lib/sequel/extensions/pg_array.rb +4 -4
- data/lib/sequel/extensions/pg_row.rb +1 -0
- data/lib/sequel/model/associations.rb +468 -188
- data/lib/sequel/model/base.rb +88 -13
- data/lib/sequel/plugins/association_pks.rb +23 -64
- data/lib/sequel/plugins/auto_validations.rb +3 -2
- data/lib/sequel/plugins/dataset_associations.rb +1 -3
- data/lib/sequel/plugins/many_through_many.rb +18 -65
- data/lib/sequel/plugins/pg_array_associations.rb +97 -86
- data/lib/sequel/plugins/prepared_statements.rb +2 -1
- data/lib/sequel/plugins/prepared_statements_associations.rb +36 -27
- data/lib/sequel/plugins/rcte_tree.rb +12 -16
- data/lib/sequel/plugins/sharding.rb +21 -3
- data/lib/sequel/plugins/single_table_inheritance.rb +2 -1
- data/lib/sequel/plugins/subclasses.rb +1 -9
- data/lib/sequel/plugins/tactical_eager_loading.rb +9 -0
- data/lib/sequel/plugins/tree.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +57 -15
- data/spec/adapters/mysql_spec.rb +11 -0
- data/spec/bin_spec.rb +2 -2
- data/spec/core/database_spec.rb +38 -4
- data/spec/core/dataset_spec.rb +45 -7
- data/spec/core/placeholder_literalizer_spec.rb +17 -0
- data/spec/core/schema_spec.rb +6 -1
- data/spec/extensions/active_model_spec.rb +18 -9
- data/spec/extensions/association_pks_spec.rb +20 -18
- data/spec/extensions/association_proxies_spec.rb +9 -9
- data/spec/extensions/auto_validations_spec.rb +6 -0
- data/spec/extensions/columns_introspection_spec.rb +1 -0
- data/spec/extensions/constraint_validations_spec.rb +3 -1
- data/spec/extensions/many_through_many_spec.rb +191 -111
- data/spec/extensions/pg_array_associations_spec.rb +133 -103
- data/spec/extensions/prepared_statements_associations_spec.rb +23 -4
- data/spec/extensions/rcte_tree_spec.rb +35 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -1
- data/spec/extensions/sharding_spec.rb +2 -2
- data/spec/extensions/tactical_eager_loading_spec.rb +4 -0
- data/spec/extensions/to_dot_spec.rb +1 -0
- data/spec/extensions/touch_spec.rb +2 -2
- data/spec/integration/associations_test.rb +130 -37
- data/spec/integration/dataset_test.rb +17 -0
- data/spec/integration/model_test.rb +17 -0
- data/spec/integration/schema_test.rb +14 -0
- data/spec/integration/transaction_test.rb +25 -1
- data/spec/model/association_reflection_spec.rb +63 -24
- data/spec/model/associations_spec.rb +104 -57
- data/spec/model/base_spec.rb +14 -1
- data/spec/model/class_dataset_methods_spec.rb +1 -0
- data/spec/model/eager_loading_spec.rb +221 -74
- data/spec/model/model_spec.rb +119 -1
- metadata +4 -2
@@ -157,6 +157,14 @@ describe "Simple Dataset operations" do
|
|
157
157
|
rows = []
|
158
158
|
@ds.order(Sequel.*(:number, 2)).paged_each(:rows_per_fetch=>5, :strategy=>:filter, :filter_values=>proc{|row, _| [row[:number] * 2]}){|row| rows << row}
|
159
159
|
rows.should == (1..100).map{|i| {:id=>i, :number=>i*10}}
|
160
|
+
|
161
|
+
if DB.adapter_scheme == :jdbc
|
162
|
+
# check retrival with varying fetch sizes
|
163
|
+
array = (1..100).to_a
|
164
|
+
[1, 2, 5, 10, 33, 50, 100, 1000].each do |i|
|
165
|
+
@ds.with_fetch_size(i).select_order_map(:id).should == array
|
166
|
+
end
|
167
|
+
end
|
160
168
|
end
|
161
169
|
|
162
170
|
specify "should fetch all results correctly" do
|
@@ -187,6 +195,15 @@ describe "Simple Dataset operations" do
|
|
187
195
|
@ds.order(:id).limit(2, 1).all.should == [{:id=>2, :number=>20}]
|
188
196
|
end
|
189
197
|
|
198
|
+
specify "should fetch correctly with just offset" do
|
199
|
+
@ds.order(:id).offset(0).all.should == [{:id=>1, :number=>10}]
|
200
|
+
@ds.order(:id).offset(1).all.should == []
|
201
|
+
@ds.insert(:number=>20)
|
202
|
+
@ds.order(:id).offset(0).all.should == [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
|
203
|
+
@ds.order(:id).offset(1).all.should == [{:id=>2, :number=>20}]
|
204
|
+
@ds.order(:id).offset(2).all.should == []
|
205
|
+
end
|
206
|
+
|
190
207
|
specify "should fetch correctly with a limit and offset using seperate methods" do
|
191
208
|
@ds.order(:id).limit(2).offset(0).all.should == [{:id=>1, :number=>10}]
|
192
209
|
@ds.order(:id).limit(2).offset(1).all.should == []
|
@@ -22,6 +22,23 @@ describe "Sequel::Model basic support" do
|
|
22
22
|
Item.find(:name=>'J').should == Item.load(:id=>1, :name=>'J')
|
23
23
|
end
|
24
24
|
|
25
|
+
specify ".finder should create method that returns first matching item" do
|
26
|
+
def Item.by_name(name) where(:name=>name) end
|
27
|
+
Item.finder :by_name
|
28
|
+
Item.first_by_name('J').should == nil
|
29
|
+
Item.create(:name=>'J')
|
30
|
+
Item.first_by_name('J').should == Item.load(:id=>1, :name=>'J')
|
31
|
+
Item.first_by_name(['J', 'K']).should == Item.load(:id=>1, :name=>'J')
|
32
|
+
end
|
33
|
+
|
34
|
+
specify ".prepared_finder should create method that returns first matching item" do
|
35
|
+
def Item.by_name(name) where(:name=>name) end
|
36
|
+
Item.prepared_finder :by_name
|
37
|
+
Item.first_by_name('J').should == nil
|
38
|
+
Item.create(:name=>'J')
|
39
|
+
Item.first_by_name('J').should == Item.load(:id=>1, :name=>'J')
|
40
|
+
end
|
41
|
+
|
25
42
|
specify ".find_or_create should return first matching item, or create it if it doesn't exist" do
|
26
43
|
Item.all.should == []
|
27
44
|
Item.find_or_create(:name=>'J').should == Item.load(:id=>1, :name=>'J')
|
@@ -266,6 +266,10 @@ describe "Database schema modifiers" do
|
|
266
266
|
@db[:items2].all.should == [{:number=>10}]
|
267
267
|
end
|
268
268
|
|
269
|
+
specify "should not raise an error if table doesn't exist when using drop_table :if_exists" do
|
270
|
+
proc{@db.drop_table(:items, :if_exists=>true)}.should_not raise_error
|
271
|
+
end if DB.supports_drop_table_if_exists?
|
272
|
+
|
269
273
|
describe "views" do
|
270
274
|
before do
|
271
275
|
@db.drop_view(:items_view) rescue nil
|
@@ -287,6 +291,16 @@ describe "Database schema modifiers" do
|
|
287
291
|
@db[:items_view].map(:n).should == [1]
|
288
292
|
end
|
289
293
|
|
294
|
+
specify "should drop views correctly" do
|
295
|
+
@db.create_view(:items_view, @ds.where(:number=>1))
|
296
|
+
@db.drop_view(:items_view)
|
297
|
+
proc{@db[:items_view].map(:number)}.should raise_error(Sequel::DatabaseError)
|
298
|
+
end
|
299
|
+
|
300
|
+
specify "should not raise an error if view doesn't exist when using drop_view :if_exists" do
|
301
|
+
proc{@db.drop_view(:items_view, :if_exists=>true)}.should_not raise_error
|
302
|
+
end if DB.supports_drop_table_if_exists?
|
303
|
+
|
290
304
|
specify "should create or replace views correctly" do
|
291
305
|
@db.create_or_replace_view(:items_view, @ds.where(:number=>1))
|
292
306
|
@db[:items_view].map(:number).should == [1]
|
@@ -84,7 +84,7 @@ describe "Database transactions" do
|
|
84
84
|
end
|
85
85
|
|
86
86
|
if DB.supports_savepoints?
|
87
|
-
|
87
|
+
specify "should support nested transactions through savepoints using the savepoint option" do
|
88
88
|
@db.transaction do
|
89
89
|
@d << {:name => '1'}
|
90
90
|
@db.transaction(:savepoint=>true) do
|
@@ -107,6 +107,30 @@ describe "Database transactions" do
|
|
107
107
|
|
108
108
|
@d.order(:name).map(:name).should == %w{1 4 5 6}
|
109
109
|
end
|
110
|
+
|
111
|
+
specify "should support nested transactions through savepoints using the auto_savepoint option" do
|
112
|
+
@db.transaction(:auto_savepoint=>true) do
|
113
|
+
@d << {:name => '1'}
|
114
|
+
@db.transaction do
|
115
|
+
@d << {:name => '2'}
|
116
|
+
@db.transaction do
|
117
|
+
@d << {:name => '3'}
|
118
|
+
raise Sequel::Rollback
|
119
|
+
end
|
120
|
+
end
|
121
|
+
@d << {:name => '4'}
|
122
|
+
@db.transaction(:auto_savepoint=>true) do
|
123
|
+
@d << {:name => '6'}
|
124
|
+
@db.transaction do
|
125
|
+
@d << {:name => '7'}
|
126
|
+
raise Sequel::Rollback
|
127
|
+
end
|
128
|
+
end
|
129
|
+
@d << {:name => '5'}
|
130
|
+
end
|
131
|
+
|
132
|
+
@d.order(:name).map(:name).should == %w{1 4 5 6}
|
133
|
+
end
|
110
134
|
end
|
111
135
|
|
112
136
|
specify "should handle returning inside of the block by committing" do
|
@@ -282,9 +282,10 @@ describe Sequel::Model::Associations::AssociationReflection, "#remove_before_des
|
|
282
282
|
end
|
283
283
|
end
|
284
284
|
|
285
|
-
describe Sequel::Model::Associations::AssociationReflection, "#
|
285
|
+
describe Sequel::Model::Associations::AssociationReflection, "#filter_by_associations_limit_strategy" do
|
286
286
|
before do
|
287
|
-
@
|
287
|
+
@db = Sequel.mock
|
288
|
+
@c = Class.new(Sequel::Model(@db[:a]))
|
288
289
|
end
|
289
290
|
after do
|
290
291
|
Sequel::Model.default_eager_limit_strategy = true
|
@@ -292,53 +293,83 @@ describe Sequel::Model::Associations::AssociationReflection, "#eager_limit_strat
|
|
292
293
|
|
293
294
|
it "should be nil by default for *_one associations" do
|
294
295
|
@c.many_to_one :c, :class=>@c
|
295
|
-
@c.association_reflection(:c).
|
296
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should be_nil
|
296
297
|
@c.one_to_one :c, :class=>@c
|
297
|
-
@c.association_reflection(:c).
|
298
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should be_nil
|
299
|
+
@c.one_through_one :c, :class=>@c
|
300
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should be_nil
|
298
301
|
end
|
299
302
|
|
300
|
-
it "should be :
|
303
|
+
it "should be :correlated_subquery by default for one_to_many and one_to_one with :order associations" do
|
304
|
+
@c.one_to_one :c, :class=>@c, :order=>:a
|
305
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should == :correlated_subquery
|
301
306
|
@c.one_to_many :cs, :class=>@c, :limit=>1
|
302
|
-
@c.association_reflection(:cs).
|
307
|
+
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :correlated_subquery
|
308
|
+
end
|
309
|
+
|
310
|
+
it "should be :ruby by default for many_to_many and one_through_one with :order associations" do
|
311
|
+
@c.one_through_one :c, :class=>@c, :order=>:a
|
312
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should == :ruby
|
303
313
|
@c.many_to_many :cs, :class=>@c, :limit=>1
|
304
|
-
@c.association_reflection(:cs).
|
314
|
+
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :ruby
|
305
315
|
end
|
306
316
|
|
307
|
-
it "should be nil for many_to_one associations" do
|
317
|
+
it "should be nil for many_to_one associations even if :eager_limit_strategy or :filter_limit_strategy is used" do
|
308
318
|
@c.many_to_one :c, :class=>@c, :eager_limit_strategy=>true
|
309
|
-
@c.association_reflection(:c).
|
319
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should be_nil
|
310
320
|
@c.many_to_one :c, :class=>@c, :eager_limit_strategy=>:distinct_on
|
311
|
-
@c.association_reflection(:c).
|
321
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should be_nil
|
322
|
+
@c.many_to_one :c, :class=>@c, :filter_limit_strategy=>true
|
323
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should be_nil
|
312
324
|
end
|
313
325
|
|
314
326
|
it "should be a symbol for other associations if given a symbol" do
|
315
327
|
@c.one_to_one :c, :class=>@c, :eager_limit_strategy=>:distinct_on
|
316
|
-
@c.association_reflection(:c).
|
328
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should == :distinct_on
|
317
329
|
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>:window_function, :limit=>1
|
318
|
-
@c.association_reflection(:cs).
|
330
|
+
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :window_function
|
319
331
|
end
|
320
332
|
|
321
333
|
it "should use :distinct_on for one_to_one associations if picking and the association dataset supports ordered distinct on" do
|
322
334
|
def (@c.dataset).supports_ordered_distinct_on?() true end
|
323
335
|
@c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
|
324
|
-
@c.association_reflection(:c).
|
336
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should == :distinct_on
|
325
337
|
end
|
326
338
|
|
327
339
|
it "should use :window_function for associations if picking and the association dataset supports window functions" do
|
328
340
|
def (@c.dataset).supports_window_functions?() true end
|
329
341
|
@c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
|
330
|
-
@c.association_reflection(:c).
|
342
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should == :window_function
|
331
343
|
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
|
332
|
-
@c.association_reflection(:cs).
|
344
|
+
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :window_function
|
333
345
|
@c.many_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
|
334
|
-
@c.association_reflection(:cs).
|
346
|
+
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :window_function
|
335
347
|
end
|
336
348
|
|
337
|
-
it "should use :ruby for
|
349
|
+
it "should use :ruby for one_to_many associations if the database doesn't support limits in subqueries" do
|
350
|
+
def (@c.dataset).supports_limits_in_correlated_subqueries?; false; end
|
338
351
|
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
|
339
|
-
@c.association_reflection(:cs).
|
352
|
+
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :ruby
|
353
|
+
end
|
354
|
+
|
355
|
+
it "should use :ruby for one_to_many associations if offset doesn't work in correlated subqueries and an offset is used" do
|
356
|
+
def (@c.dataset).supports_offsets_in_correlated_subqueries?; false; end
|
357
|
+
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
|
358
|
+
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :correlated_subquery
|
359
|
+
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>[1, 1]
|
360
|
+
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :ruby
|
361
|
+
end
|
362
|
+
|
363
|
+
it "should use :ruby for one_to_many associations if composite primary key is used and database does not multiple columns in IN" do
|
364
|
+
def (@c.dataset).supports_multiple_column_in?; false; end
|
365
|
+
@c.set_primary_key [:id, :id2]
|
366
|
+
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1, :key=>[:id, :id2]
|
367
|
+
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :ruby
|
368
|
+
end
|
369
|
+
|
370
|
+
it "should use :ruby for many_to_many associations if picking and the association dataset doesn't window functions" do
|
340
371
|
@c.many_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
|
341
|
-
@c.association_reflection(:cs).
|
372
|
+
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :ruby
|
342
373
|
end
|
343
374
|
|
344
375
|
it "should respect Model.default_eager_limit_strategy to *_many associations" do
|
@@ -348,24 +379,32 @@ describe Sequel::Model::Associations::AssociationReflection, "#eager_limit_strat
|
|
348
379
|
c.dataset = :a
|
349
380
|
c.default_eager_limit_strategy.should == :window_function
|
350
381
|
c.one_to_many :cs, :class=>c, :limit=>1
|
351
|
-
c.association_reflection(:cs).
|
382
|
+
c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :window_function
|
352
383
|
c.many_to_many :cs, :class=>c, :limit=>1
|
353
|
-
c.association_reflection(:cs).
|
384
|
+
c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :window_function
|
354
385
|
|
355
386
|
Sequel::Model.default_eager_limit_strategy = true
|
356
387
|
c = Class.new(Sequel::Model)
|
357
388
|
c.dataset = :a
|
358
389
|
c.one_to_many :cs, :class=>c, :limit=>1
|
359
|
-
c.association_reflection(:cs).
|
390
|
+
c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :correlated_subquery
|
360
391
|
def (c.dataset).supports_window_functions?() true end
|
361
392
|
c.many_to_many :cs, :class=>c, :limit=>1
|
362
|
-
c.association_reflection(:cs).
|
393
|
+
c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).should == :window_function
|
363
394
|
end
|
364
395
|
|
365
396
|
it "should ignore Model.default_eager_limit_strategy for one_to_one associations" do
|
366
397
|
@c.default_eager_limit_strategy = :window_function
|
367
398
|
@c.one_to_one :c, :class=>@c
|
368
|
-
@c.association_reflection(:c).
|
399
|
+
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).should be_nil
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
describe Sequel::Model::Associations::AssociationReflection, "#apply_eager_dataset_changes" do
|
404
|
+
it "should apply the eager block as well as the association options to the dataset" do
|
405
|
+
@c = Class.new(Sequel::Model(:foo))
|
406
|
+
@c.one_to_many :cs, :class=>@c, :select=>:a, :order=>:b do |ds| ds.where(:c) end
|
407
|
+
@c.association_reflection(:cs).apply_eager_dataset_changes(@c.dataset).sql.should == 'SELECT a FROM foo WHERE c ORDER BY b'
|
369
408
|
end
|
370
409
|
end
|
371
410
|
|
@@ -1860,19 +1860,19 @@ describe Sequel::Model, "many_to_many" do
|
|
1860
1860
|
|
1861
1861
|
it "should use implicit key values and join table if omitted" do
|
1862
1862
|
@c2.many_to_many :attributes, :class => @c1
|
1863
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
1863
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234)'
|
1864
1864
|
end
|
1865
1865
|
|
1866
1866
|
it "should use implicit key values and join table if omitted" do
|
1867
1867
|
@c2.one_through_one :attribute, :class => @c1
|
1868
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
1868
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 1'
|
1869
1869
|
end
|
1870
1870
|
|
1871
1871
|
it "should use implicit class if omitted" do
|
1872
1872
|
begin
|
1873
1873
|
class ::Tag < Sequel::Model; end
|
1874
1874
|
@c2.many_to_many :tags
|
1875
|
-
@c2.new(:id => 1234).tags_dataset.sql.should == 'SELECT tags.* FROM tags INNER JOIN nodes_tags ON (
|
1875
|
+
@c2.new(:id => 1234).tags_dataset.sql.should == 'SELECT tags.* FROM tags INNER JOIN nodes_tags ON (nodes_tags.tag_id = tags.id) WHERE (nodes_tags.node_id = 1234)'
|
1876
1876
|
ensure
|
1877
1877
|
Object.send(:remove_const, :Tag)
|
1878
1878
|
end
|
@@ -1884,7 +1884,7 @@ describe Sequel::Model, "many_to_many" do
|
|
1884
1884
|
class Tag < Sequel::Model; end
|
1885
1885
|
end
|
1886
1886
|
@c2.many_to_many :tags, :class=>'::Historical::Tag'
|
1887
|
-
@c2.new(:id => 1234).tags_dataset.sql.should == 'SELECT tags.* FROM tags INNER JOIN nodes_tags ON (
|
1887
|
+
@c2.new(:id => 1234).tags_dataset.sql.should == 'SELECT tags.* FROM tags INNER JOIN nodes_tags ON (nodes_tags.tag_id = tags.id) WHERE (nodes_tags.node_id = 1234)'
|
1888
1888
|
ensure
|
1889
1889
|
Object.send(:remove_const, :Historical)
|
1890
1890
|
end
|
@@ -1892,41 +1892,41 @@ describe Sequel::Model, "many_to_many" do
|
|
1892
1892
|
|
1893
1893
|
it "should respect :eager_loader_predicate_key when lazily loading" do
|
1894
1894
|
@c2.many_to_many :attributes, :class => @c1, :eager_loading_predicate_key=>Sequel.subscript(:attributes_nodes__node_id, 0)
|
1895
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
1895
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id[0] = 1234)'
|
1896
1896
|
end
|
1897
1897
|
|
1898
1898
|
it "should use explicit key values and join table if given" do
|
1899
1899
|
@c2.many_to_many :attributes, :class => @c1, :left_key => :nodeid, :right_key => :attributeid, :join_table => :attribute2node
|
1900
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attribute2node ON (
|
1900
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attribute2node ON (attribute2node.attributeid = attributes.id) WHERE (attribute2node.nodeid = 1234)'
|
1901
1901
|
end
|
1902
1902
|
|
1903
1903
|
it "should support a conditions option" do
|
1904
1904
|
@c2.many_to_many :attributes, :class => @c1, :conditions => {:a=>32}
|
1905
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
1905
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((a = 32) AND (attributes_nodes.node_id = 1234))'
|
1906
1906
|
|
1907
1907
|
@c2.many_to_many :attributes, :class => @c1, :conditions => ['a = ?', 32]
|
1908
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
1908
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((a = 32) AND (attributes_nodes.node_id = 1234))'
|
1909
1909
|
@c2.new(:id => 1234).attributes.should == [@c1.load({})]
|
1910
1910
|
end
|
1911
1911
|
|
1912
1912
|
it "should support an order option" do
|
1913
1913
|
@c2.many_to_many :attributes, :class => @c1, :order => :blah
|
1914
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
1914
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) ORDER BY blah'
|
1915
1915
|
end
|
1916
1916
|
|
1917
1917
|
it "should support an array for the order option" do
|
1918
1918
|
@c2.many_to_many :attributes, :class => @c1, :order => [:blah1, :blah2]
|
1919
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
1919
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) ORDER BY blah1, blah2'
|
1920
1920
|
end
|
1921
1921
|
|
1922
1922
|
it "should support :left_primary_key and :right_primary_key options" do
|
1923
1923
|
@c2.many_to_many :attributes, :class => @c1, :left_primary_key=>:xxx, :right_primary_key=>:yyy
|
1924
|
-
@c2.new(:id => 1234, :xxx=>5).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
1924
|
+
@c2.new(:id => 1234, :xxx=>5).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.yyy) WHERE (attributes_nodes.node_id = 5)'
|
1925
1925
|
end
|
1926
1926
|
|
1927
1927
|
it "should support composite keys" do
|
1928
1928
|
@c2.many_to_many :attributes, :class => @c1, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :left_primary_key=>[:id, :x], :right_primary_key=>[:id, :y]
|
1929
|
-
@c2.load(:id => 1234, :x=>5).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.r1 = attributes.id) AND (attributes_nodes.r2 = attributes.y)
|
1929
|
+
@c2.load(:id => 1234, :x=>5).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.r1 = attributes.id) AND (attributes_nodes.r2 = attributes.y)) WHERE ((attributes_nodes.l1 = 1234) AND (attributes_nodes.l2 = 5))'
|
1930
1930
|
end
|
1931
1931
|
|
1932
1932
|
it "should not issue query if not all keys have values" do
|
@@ -1951,13 +1951,13 @@ describe Sequel::Model, "many_to_many" do
|
|
1951
1951
|
it "should support a select option" do
|
1952
1952
|
@c2.many_to_many :attributes, :class => @c1, :select => :blah
|
1953
1953
|
|
1954
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT blah FROM attributes INNER JOIN attributes_nodes ON (
|
1954
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT blah FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234)'
|
1955
1955
|
end
|
1956
1956
|
|
1957
1957
|
it "should support an array for the select option" do
|
1958
1958
|
@c2.many_to_many :attributes, :class => @c1, :select => [Sequel::SQL::ColumnAll.new(:attributes), :attribute_nodes__blah2]
|
1959
1959
|
|
1960
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.*, attribute_nodes.blah2 FROM attributes INNER JOIN attributes_nodes ON (
|
1960
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.*, attribute_nodes.blah2 FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234)'
|
1961
1961
|
end
|
1962
1962
|
|
1963
1963
|
it "should accept a block" do
|
@@ -1967,7 +1967,7 @@ describe Sequel::Model, "many_to_many" do
|
|
1967
1967
|
|
1968
1968
|
n = @c2.new(:id => 1234)
|
1969
1969
|
n.xxx = 555
|
1970
|
-
n.attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
1970
|
+
n.attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (xxx = 555))'
|
1971
1971
|
end
|
1972
1972
|
|
1973
1973
|
it "should allow the :order option while accepting a block" do
|
@@ -1977,7 +1977,7 @@ describe Sequel::Model, "many_to_many" do
|
|
1977
1977
|
|
1978
1978
|
n = @c2.new(:id => 1234)
|
1979
1979
|
n.xxx = 555
|
1980
|
-
n.attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
1980
|
+
n.attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (xxx = 555)) ORDER BY blah1, blah2'
|
1981
1981
|
end
|
1982
1982
|
|
1983
1983
|
it "should support a :dataset option that is used instead of the default" do
|
@@ -1994,7 +1994,7 @@ describe Sequel::Model, "many_to_many" do
|
|
1994
1994
|
end
|
1995
1995
|
|
1996
1996
|
it "should support a :dataset option that accepts the reflection as an argument" do
|
1997
|
-
@c2.many_to_many :attributes, :class => @c1, :dataset=>lambda{|opts| opts.
|
1997
|
+
@c2.many_to_many :attributes, :class => @c1, :dataset=>lambda{|opts| opts.associated_class.natural_join(:an).filter(:an__nodeid=>pk)}, :order=> :a, :limit=>10, :select=>nil do |ds|
|
1998
1998
|
ds.filter(:xxx => @xxx)
|
1999
1999
|
end
|
2000
2000
|
|
@@ -2007,9 +2007,9 @@ describe Sequel::Model, "many_to_many" do
|
|
2007
2007
|
|
2008
2008
|
it "should support a :limit option" do
|
2009
2009
|
@c2.many_to_many :attributes, :class => @c1 , :limit=>10
|
2010
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2010
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 10'
|
2011
2011
|
@c2.many_to_many :attributes, :class => @c1 , :limit=>[10, 10]
|
2012
|
-
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2012
|
+
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 10 OFFSET 10'
|
2013
2013
|
end
|
2014
2014
|
|
2015
2015
|
it "should have the :eager option affect the _dataset method" do
|
@@ -2021,7 +2021,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2021
2021
|
@c2.many_to_many :attributes, :class => @c1, :join_table => :attribute2node___attributes_nodes
|
2022
2022
|
n = @c2.load(:id => 1234)
|
2023
2023
|
a = @c1.load(:id => 2345)
|
2024
|
-
n.attributes_dataset.sql.should == "SELECT attributes.* FROM attributes INNER JOIN attribute2node AS attributes_nodes ON (
|
2024
|
+
n.attributes_dataset.sql.should == "SELECT attributes.* FROM attributes INNER JOIN attribute2node AS attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234)"
|
2025
2025
|
a.should == n.add_attribute(a)
|
2026
2026
|
a.should == n.remove_attribute(a)
|
2027
2027
|
n.remove_all_attributes
|
@@ -2062,7 +2062,6 @@ describe Sequel::Model, "many_to_many" do
|
|
2062
2062
|
@c2.many_to_many :attributes, :class => @c1
|
2063
2063
|
|
2064
2064
|
n = @c2.load(:id => 1234)
|
2065
|
-
a = @c1.load(:id => 2345)
|
2066
2065
|
@c1.dataset._fetch = []
|
2067
2066
|
proc{n.add_attribute(2345)}.should raise_error(Sequel::NoMatchingRow)
|
2068
2067
|
DB.sqls.should == ["SELECT * FROM attributes WHERE id = 2345"]
|
@@ -2100,7 +2099,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2100
2099
|
n = @c2.new(:id => 1234)
|
2101
2100
|
@c1.dataset._fetch = {:id=>234}
|
2102
2101
|
n.remove_attribute(234).should == @c1.load(:id => 234)
|
2103
|
-
DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2102
|
+
DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (attributes.id = 234)) LIMIT 1",
|
2104
2103
|
"DELETE FROM attributes_nodes WHERE ((node_id = 1234) AND (attribute_id = 234))"]
|
2105
2104
|
end
|
2106
2105
|
|
@@ -2192,8 +2191,8 @@ describe Sequel::Model, "many_to_many" do
|
|
2192
2191
|
@c1.dataset._fetch = {:id=>234, :y=>8}
|
2193
2192
|
@c1.load(:id => 234, :y=>8).should == n.remove_attribute([234, 8])
|
2194
2193
|
sqls = DB.sqls
|
2195
|
-
["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2196
|
-
"SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2194
|
+
["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (attributes.id = 234) AND (attributes.y = 8)) LIMIT 1",
|
2195
|
+
"SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (attributes.y = 8) AND (attributes.id = 234)) LIMIT 1"].should include(sqls.shift)
|
2197
2196
|
sqls.should == ["DELETE FROM attributes_nodes WHERE ((node_id = 1234) AND (attribute_id = 234))"]
|
2198
2197
|
end
|
2199
2198
|
|
@@ -2255,7 +2254,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2255
2254
|
@c2.many_to_many :attributes, :class => @c1
|
2256
2255
|
|
2257
2256
|
@c2.new(:id => 1234).attributes.should == [@c1.load({})]
|
2258
|
-
DB.sqls.should == ['SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2257
|
+
DB.sqls.should == ['SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234)']
|
2259
2258
|
end
|
2260
2259
|
|
2261
2260
|
it "should populate cache when accessed" do
|
@@ -2282,7 +2281,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2282
2281
|
n = @c2.new(:id => 1234)
|
2283
2282
|
n.associations[:attributes] = 42
|
2284
2283
|
n.attributes(true).should_not == 42
|
2285
|
-
DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2284
|
+
DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234)"]
|
2286
2285
|
end
|
2287
2286
|
|
2288
2287
|
it "should add item to cache if it exists when calling add_" do
|
@@ -2608,7 +2607,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2608
2607
|
|
2609
2608
|
it "should support a :distinct option that uses the DISTINCT clause" do
|
2610
2609
|
@c2.many_to_many :attributes, :class => @c1, :distinct=>true
|
2611
|
-
@c2.load(:id=>10).attributes_dataset.sql.should == "SELECT DISTINCT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2610
|
+
@c2.load(:id=>10).attributes_dataset.sql.should == "SELECT DISTINCT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 10)"
|
2612
2611
|
end
|
2613
2612
|
|
2614
2613
|
it "should not apply association options when removing all associated records" do
|
@@ -2625,7 +2624,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2625
2624
|
end
|
2626
2625
|
@c1.dataset._fetch = {:id=>2}
|
2627
2626
|
@c2.load(:id=>1).remove_attribute(2)
|
2628
|
-
DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2627
|
+
DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1) AND (join_table_att = 3) AND (attributes.id = 2)) LIMIT 1",
|
2629
2628
|
"DELETE FROM attributes_nodes WHERE ((node_id = 1) AND (attribute_id = 2))"]
|
2630
2629
|
end
|
2631
2630
|
end
|
@@ -2657,46 +2656,46 @@ describe Sequel::Model, "one_through_one" do
|
|
2657
2656
|
|
2658
2657
|
it "should use implicit key values and join table if omitted" do
|
2659
2658
|
@c2.one_through_one :attribute, :class => @c1
|
2660
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2659
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 1'
|
2661
2660
|
end
|
2662
2661
|
|
2663
2662
|
it "should respect :eager_loader_predicate_key when lazily loading" do
|
2664
2663
|
@c2.one_through_one :attribute, :class => @c1, :eager_loading_predicate_key=>Sequel.subscript(:attributes_nodes__node_id, 0)
|
2665
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2664
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id[0] = 1234) LIMIT 1'
|
2666
2665
|
end
|
2667
2666
|
|
2668
2667
|
it "should use explicit key values and join table if given" do
|
2669
2668
|
@c2.one_through_one :attribute, :class => @c1, :left_key => :nodeid, :right_key => :attributeid, :join_table => :attribute2node
|
2670
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attribute2node ON (
|
2669
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attribute2node ON (attribute2node.attributeid = attributes.id) WHERE (attribute2node.nodeid = 1234) LIMIT 1'
|
2671
2670
|
end
|
2672
2671
|
|
2673
2672
|
it "should support a conditions option" do
|
2674
2673
|
@c2.one_through_one :attribute, :class => @c1, :conditions => {:a=>32}
|
2675
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2674
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((a = 32) AND (attributes_nodes.node_id = 1234)) LIMIT 1'
|
2676
2675
|
|
2677
2676
|
@c2.one_through_one :attribute, :class => @c1, :conditions => ['a = ?', 32]
|
2678
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2677
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((a = 32) AND (attributes_nodes.node_id = 1234)) LIMIT 1'
|
2679
2678
|
@c2.new(:id => 1234).attribute.should == @c1.load({})
|
2680
2679
|
end
|
2681
2680
|
|
2682
2681
|
it "should support an order option" do
|
2683
2682
|
@c2.one_through_one :attribute, :class => @c1, :order => :blah
|
2684
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2683
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) ORDER BY blah LIMIT 1'
|
2685
2684
|
end
|
2686
2685
|
|
2687
2686
|
it "should support an array for the order option" do
|
2688
2687
|
@c2.one_through_one :attribute, :class => @c1, :order => [:blah1, :blah2]
|
2689
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2688
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) ORDER BY blah1, blah2 LIMIT 1'
|
2690
2689
|
end
|
2691
2690
|
|
2692
2691
|
it "should support :left_primary_key and :right_primary_key options" do
|
2693
2692
|
@c2.one_through_one :attribute, :class => @c1, :left_primary_key=>:xxx, :right_primary_key=>:yyy
|
2694
|
-
@c2.new(:id => 1234, :xxx=>5).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2693
|
+
@c2.new(:id => 1234, :xxx=>5).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.yyy) WHERE (attributes_nodes.node_id = 5) LIMIT 1'
|
2695
2694
|
end
|
2696
2695
|
|
2697
2696
|
it "should support composite keys" do
|
2698
2697
|
@c2.one_through_one :attribute, :class => @c1, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :left_primary_key=>[:id, :x], :right_primary_key=>[:id, :y]
|
2699
|
-
@c2.load(:id => 1234, :x=>5).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.r1 = attributes.id) AND (attributes_nodes.r2 = attributes.y)
|
2698
|
+
@c2.load(:id => 1234, :x=>5).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.r1 = attributes.id) AND (attributes_nodes.r2 = attributes.y)) WHERE ((attributes_nodes.l1 = 1234) AND (attributes_nodes.l2 = 5)) LIMIT 1'
|
2700
2699
|
end
|
2701
2700
|
|
2702
2701
|
it "should not issue query if not all keys have values" do
|
@@ -2721,13 +2720,13 @@ describe Sequel::Model, "one_through_one" do
|
|
2721
2720
|
it "should support a select option" do
|
2722
2721
|
@c2.one_through_one :attribute, :class => @c1, :select => :blah
|
2723
2722
|
|
2724
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT blah FROM attributes INNER JOIN attributes_nodes ON (
|
2723
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT blah FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 1'
|
2725
2724
|
end
|
2726
2725
|
|
2727
2726
|
it "should support an array for the select option" do
|
2728
2727
|
@c2.one_through_one :attribute, :class => @c1, :select => [Sequel::SQL::ColumnAll.new(:attributes), :attribute_nodes__blah2]
|
2729
2728
|
|
2730
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.*, attribute_nodes.blah2 FROM attributes INNER JOIN attributes_nodes ON (
|
2729
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.*, attribute_nodes.blah2 FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 1'
|
2731
2730
|
end
|
2732
2731
|
|
2733
2732
|
it "should accept a block" do
|
@@ -2737,7 +2736,7 @@ describe Sequel::Model, "one_through_one" do
|
|
2737
2736
|
|
2738
2737
|
n = @c2.new(:id => 1234)
|
2739
2738
|
n.xxx = 555
|
2740
|
-
n.attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2739
|
+
n.attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (xxx = 555)) LIMIT 1'
|
2741
2740
|
end
|
2742
2741
|
|
2743
2742
|
it "should allow the :order option while accepting a block" do
|
@@ -2747,7 +2746,7 @@ describe Sequel::Model, "one_through_one" do
|
|
2747
2746
|
|
2748
2747
|
n = @c2.new(:id => 1234)
|
2749
2748
|
n.xxx = 555
|
2750
|
-
n.attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2749
|
+
n.attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (xxx = 555)) ORDER BY blah1, blah2 LIMIT 1'
|
2751
2750
|
end
|
2752
2751
|
|
2753
2752
|
it "should support a :dataset option that is used instead of the default" do
|
@@ -2764,7 +2763,7 @@ describe Sequel::Model, "one_through_one" do
|
|
2764
2763
|
end
|
2765
2764
|
|
2766
2765
|
it "should support a :dataset option that accepts the reflection as an argument" do
|
2767
|
-
@c2.one_through_one :attribute, :class => @c1, :dataset=>lambda{|opts| opts.
|
2766
|
+
@c2.one_through_one :attribute, :class => @c1, :dataset=>lambda{|opts| opts.associated_class.natural_join(:an).filter(:an__nodeid=>pk)}, :order=> :a, :select=>nil do |ds|
|
2768
2767
|
ds.filter(:xxx => @xxx)
|
2769
2768
|
end
|
2770
2769
|
|
@@ -2777,7 +2776,7 @@ describe Sequel::Model, "one_through_one" do
|
|
2777
2776
|
|
2778
2777
|
it "should support a :limit option to specify an offset" do
|
2779
2778
|
@c2.one_through_one :attribute, :class => @c1 , :limit=>[nil, 10]
|
2780
|
-
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2779
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 1 OFFSET 10'
|
2781
2780
|
end
|
2782
2781
|
|
2783
2782
|
it "should have the :eager option affect the _dataset method" do
|
@@ -2788,14 +2787,12 @@ describe Sequel::Model, "one_through_one" do
|
|
2788
2787
|
it "should handle an aliased join table" do
|
2789
2788
|
@c2.one_through_one :attribute, :class => @c1, :join_table => :attribute2node___attributes_nodes
|
2790
2789
|
n = @c2.load(:id => 1234)
|
2791
|
-
|
2792
|
-
n.attribute_dataset.sql.should == "SELECT attributes.* FROM attributes INNER JOIN attribute2node AS attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) LIMIT 1"
|
2790
|
+
n.attribute_dataset.sql.should == "SELECT attributes.* FROM attributes INNER JOIN attribute2node AS attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 1"
|
2793
2791
|
end
|
2794
2792
|
|
2795
2793
|
it "should raise an error if the model object doesn't have a valid primary key" do
|
2796
2794
|
@c2.one_through_one :attribute, :class => @c1
|
2797
2795
|
a = @c2.new
|
2798
|
-
n = @c1.load(:id=>123)
|
2799
2796
|
proc{a.attribute_dataset}.should raise_error(Sequel::Error)
|
2800
2797
|
end
|
2801
2798
|
|
@@ -2803,7 +2800,7 @@ describe Sequel::Model, "one_through_one" do
|
|
2803
2800
|
@c2.one_through_one :attribute, :class => @c1
|
2804
2801
|
|
2805
2802
|
@c2.new(:id => 1234).attribute.should == @c1.load({})
|
2806
|
-
DB.sqls.should == ['SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2803
|
+
DB.sqls.should == ['SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 1']
|
2807
2804
|
end
|
2808
2805
|
|
2809
2806
|
it "should populate cache when accessed" do
|
@@ -2830,7 +2827,7 @@ describe Sequel::Model, "one_through_one" do
|
|
2830
2827
|
n = @c2.new(:id => 1234)
|
2831
2828
|
n.associations[:attribute] = 42
|
2832
2829
|
n.attribute(true).should_not == 42
|
2833
|
-
DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2830
|
+
DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 1"]
|
2834
2831
|
end
|
2835
2832
|
|
2836
2833
|
it "should not add associations methods directly to class" do
|
@@ -2861,7 +2858,7 @@ describe Sequel::Model, "one_through_one" do
|
|
2861
2858
|
|
2862
2859
|
it "should support a :distinct option that uses the DISTINCT clause" do
|
2863
2860
|
@c2.one_through_one :attribute, :class => @c1, :distinct=>true
|
2864
|
-
@c2.load(:id=>10).attribute_dataset.sql.should == "SELECT DISTINCT attributes.* FROM attributes INNER JOIN attributes_nodes ON (
|
2861
|
+
@c2.load(:id=>10).attribute_dataset.sql.should == "SELECT DISTINCT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 10) LIMIT 1"
|
2865
2862
|
end
|
2866
2863
|
end
|
2867
2864
|
|
@@ -2888,6 +2885,7 @@ describe "Filtering by associations" do
|
|
2888
2885
|
|
2889
2886
|
many_to_one :artist, :class=>artist, :key=>:artist_id
|
2890
2887
|
one_to_many :tracks, :class=>track, :key=>:album_id
|
2888
|
+
one_to_one :track, :class=>track, :key=>:album_id
|
2891
2889
|
one_to_one :album_info, :class=>album_info, :key=>:album_id
|
2892
2890
|
many_to_many :tags, :class=>tag, :left_key=>:album_id, :join_table=>:albums_tags, :right_key=>:tag_id
|
2893
2891
|
|
@@ -2937,6 +2935,9 @@ describe "Filtering by associations" do
|
|
2937
2935
|
one_through_one :al_ctag, :clone=>:l_ctag, :conditions=>c
|
2938
2936
|
end
|
2939
2937
|
end
|
2938
|
+
after do
|
2939
|
+
@Album.default_eager_limit_strategy = true
|
2940
|
+
end
|
2940
2941
|
|
2941
2942
|
it "should be able to filter on many_to_one associations" do
|
2942
2943
|
@Album.filter(:artist=>@Artist.load(:id=>3)).sql.should == 'SELECT * FROM albums WHERE (albums.artist_id = 3)'
|
@@ -2994,6 +2995,47 @@ describe "Filtering by associations" do
|
|
2994
2995
|
@Album.filter(:l_track=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT DISTINCT ON (tracks.album_id) tracks.id FROM tracks ORDER BY tracks.album_id, name)) AND (tracks.id = 5))))"
|
2995
2996
|
end
|
2996
2997
|
|
2998
|
+
it "should be able to filter on one_to_one associations with :filter_limit_strategy" do
|
2999
|
+
@Album.one_to_one :l_track2, :clone=>:track, :filter_limit_strategy=>:window_function
|
3000
|
+
@Album.filter(:l_track2=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT id FROM (SELECT tracks.id, row_number() OVER (PARTITION BY tracks.album_id) AS x_sequel_row_number_x FROM tracks) AS t1 WHERE (x_sequel_row_number_x = 1))) AND (tracks.id = 5))))"
|
3001
|
+
end
|
3002
|
+
|
3003
|
+
it "should be able to filter on one_to_one associations with :eager_limit_strategy" do
|
3004
|
+
@Album.one_to_one :l_track2, :clone=>:track, :eager_limit_strategy=>:window_function
|
3005
|
+
@Album.filter(:l_track2=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT id FROM (SELECT tracks.id, row_number() OVER (PARTITION BY tracks.album_id) AS x_sequel_row_number_x FROM tracks) AS t1 WHERE (x_sequel_row_number_x = 1))) AND (tracks.id = 5))))"
|
3006
|
+
end
|
3007
|
+
|
3008
|
+
it "should be able to filter on one_to_one associations with :order and :filter_limit_strategy" do
|
3009
|
+
@Album.one_to_one :l_track2, :clone=>:l_track, :filter_limit_strategy=>:window_function
|
3010
|
+
@Album.filter(:l_track2=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT id FROM (SELECT tracks.id, row_number() OVER (PARTITION BY tracks.album_id ORDER BY name) AS x_sequel_row_number_x FROM tracks) AS t1 WHERE (x_sequel_row_number_x = 1))) AND (tracks.id = 5))))"
|
3011
|
+
end
|
3012
|
+
|
3013
|
+
it "should be able to filter on one_to_one associations with :order and :eager_limit_strategy" do
|
3014
|
+
@Album.one_to_one :l_track2, :clone=>:l_track, :eager_limit_strategy=>:window_function
|
3015
|
+
@Album.filter(:l_track2=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT id FROM (SELECT tracks.id, row_number() OVER (PARTITION BY tracks.album_id ORDER BY name) AS x_sequel_row_number_x FROM tracks) AS t1 WHERE (x_sequel_row_number_x = 1))) AND (tracks.id = 5))))"
|
3016
|
+
end
|
3017
|
+
|
3018
|
+
it "should be able to filter on one_to_one associations with :order and Model.default_eager_limit_strategy" do
|
3019
|
+
@Album.default_eager_limit_strategy = :window_function
|
3020
|
+
@Album.one_to_one :l_track2, :clone=>:l_track
|
3021
|
+
@Album.filter(:l_track2=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT id FROM (SELECT tracks.id, row_number() OVER (PARTITION BY tracks.album_id ORDER BY name) AS x_sequel_row_number_x FROM tracks) AS t1 WHERE (x_sequel_row_number_x = 1))) AND (tracks.id = 5))))"
|
3022
|
+
end
|
3023
|
+
|
3024
|
+
it "should be able to filter on one_to_one associations with :order and :eager_limit_strategy=>:union" do
|
3025
|
+
@Album.one_to_one :l_track2, :clone=>:l_track, :eager_limit_strategy=>:union
|
3026
|
+
@Album.filter(:l_track2=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT DISTINCT ON (tracks.album_id) tracks.id FROM tracks ORDER BY tracks.album_id, name)) AND (tracks.id = 5))))"
|
3027
|
+
end
|
3028
|
+
|
3029
|
+
it "should be able to filter on one_to_one associations with :order and :eager_limit_strategy=>:ruby" do
|
3030
|
+
@Album.one_to_one :l_track2, :clone=>:l_track, :eager_limit_strategy=>:ruby
|
3031
|
+
@Album.filter(:l_track2=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT DISTINCT ON (tracks.album_id) tracks.id FROM tracks ORDER BY tracks.album_id, name)) AND (tracks.id = 5))))"
|
3032
|
+
end
|
3033
|
+
|
3034
|
+
it "should be able to filter on one_to_one associations with :filter_limit_strategy :correlated_subquery" do
|
3035
|
+
@Album.one_to_one :l_track2, :clone=>:track, :filter_limit_strategy=>:correlated_subquery
|
3036
|
+
@Album.filter(:l_track2=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT t1.id FROM tracks AS t1 WHERE (t1.album_id = tracks.album_id) LIMIT 1)) AND (tracks.id = 5))))"
|
3037
|
+
end
|
3038
|
+
|
2997
3039
|
it "should be able to filter on many_to_many associations with :limit" do
|
2998
3040
|
@Album.filter(:l_tags=>@Tag.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT albums_tags.album_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((albums_tags.album_id IS NOT NULL) AND ((albums_tags.album_id, tags.id) IN (SELECT b, c FROM (SELECT albums_tags.album_id AS b, tags.id AS c, row_number() OVER (PARTITION BY albums_tags.album_id) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id)) AS t1 WHERE (x_sequel_row_number_x <= 10))) AND (tags.id = 3))))"
|
2999
3041
|
end
|
@@ -3070,6 +3112,11 @@ describe "Filtering by associations" do
|
|
3070
3112
|
@Album.filter(:l_ctracks=>@Track.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (SELECT id FROM (SELECT tracks.id, row_number() OVER (PARTITION BY tracks.album_id1, tracks.album_id2) AS x_sequel_row_number_x FROM tracks) AS t1 WHERE (x_sequel_row_number_x <= 10))) AND (tracks.id = 5))))"
|
3071
3113
|
end
|
3072
3114
|
|
3115
|
+
it "should be able to filter on one_to_many associations with composite keys and :filter_limit_strategy :correlated_subquery" do
|
3116
|
+
@Album.one_to_one :l_ctracks2, :clone=>:l_ctracks, :filter_limit_strategy=>:correlated_subquery
|
3117
|
+
@Album.filter(:l_ctracks2=>@Track.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (SELECT t1.id FROM tracks AS t1 WHERE ((t1.album_id1 = tracks.album_id1) AND (t1.album_id2 = tracks.album_id2)) LIMIT 1)) AND (tracks.id = 5))))"
|
3118
|
+
end
|
3119
|
+
|
3073
3120
|
it "should be able to filter on one_to_one associations with :order and composite keys" do
|
3074
3121
|
@Album.filter(:l_ctrack=>@Track.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (SELECT DISTINCT ON (tracks.album_id1, tracks.album_id2) tracks.id FROM tracks ORDER BY tracks.album_id1, tracks.album_id2, name)) AND (tracks.id = 5))))"
|
3075
3122
|
end
|
@@ -3814,9 +3861,9 @@ describe "Sequel::Model Associations with clashing column names" do
|
|
3814
3861
|
@Foo.first.bar.should == @bar
|
3815
3862
|
@db.sqls.should == ["SELECT * FROM foos LIMIT 1", "SELECT * FROM bars WHERE (bars.object_id = 2) LIMIT 1"]
|
3816
3863
|
@Foo.first.mtmbars.should == [@bar]
|
3817
|
-
@db.sqls.should == ["SELECT * FROM foos LIMIT 1", "SELECT bars.* FROM bars INNER JOIN bars_foos ON (
|
3864
|
+
@db.sqls.should == ["SELECT * FROM foos LIMIT 1", "SELECT bars.* FROM bars INNER JOIN bars_foos ON (bars_foos.object_id = bars.object_id) WHERE (bars_foos.foo_id = 2)"]
|
3818
3865
|
@Bar.first.mtmfoos.should == [@foo]
|
3819
|
-
@db.sqls.should == ["SELECT * FROM bars LIMIT 1", "SELECT foos.* FROM foos INNER JOIN bars_foos ON (
|
3866
|
+
@db.sqls.should == ["SELECT * FROM bars LIMIT 1", "SELECT foos.* FROM foos INNER JOIN bars_foos ON (bars_foos.foo_id = foos.object_id) WHERE (bars_foos.object_id = 2)"]
|
3820
3867
|
end
|
3821
3868
|
|
3822
3869
|
it "should have working eager loading methods" do
|
@@ -3828,10 +3875,10 @@ describe "Sequel::Model Associations with clashing column names" do
|
|
3828
3875
|
@db.sqls.should == ["SELECT * FROM foos", "SELECT * FROM bars WHERE (bars.object_id IN (2))"]
|
3829
3876
|
@db.fetch = [[{:id=>1, :object_id=>2}], [{:id=>1, :object_id=>2, :x_foreign_key_x=>2}]]
|
3830
3877
|
@Foo.eager(:mtmbars).all.map{|o| [o, o.mtmbars]}.should == [[@foo, [@bar]]]
|
3831
|
-
@db.sqls.should == ["SELECT * FROM foos", "SELECT bars.*, bars_foos.foo_id AS x_foreign_key_x FROM bars INNER JOIN bars_foos ON (
|
3878
|
+
@db.sqls.should == ["SELECT * FROM foos", "SELECT bars.*, bars_foos.foo_id AS x_foreign_key_x FROM bars INNER JOIN bars_foos ON (bars_foos.object_id = bars.object_id) WHERE (bars_foos.foo_id IN (2))"]
|
3832
3879
|
@db.fetch = [[{:id=>1, :object_id=>2}], [{:id=>1, :object_id=>2, :x_foreign_key_x=>2}]]
|
3833
3880
|
@Bar.eager(:mtmfoos).all.map{|o| [o, o.mtmfoos]}.should == [[@bar, [@foo]]]
|
3834
|
-
@db.sqls.should == ["SELECT * FROM bars", "SELECT foos.*, bars_foos.object_id AS x_foreign_key_x FROM foos INNER JOIN bars_foos ON (
|
3881
|
+
@db.sqls.should == ["SELECT * FROM bars", "SELECT foos.*, bars_foos.object_id AS x_foreign_key_x FROM foos INNER JOIN bars_foos ON (bars_foos.foo_id = foos.object_id) WHERE (bars_foos.object_id IN (2))"]
|
3835
3882
|
end
|
3836
3883
|
|
3837
3884
|
it "should have working eager graphing methods" do
|
@@ -3963,9 +4010,9 @@ describe "Sequel::Model Associations with non-column expression keys" do
|
|
3963
4010
|
@Foo.first.bar.should == @bar
|
3964
4011
|
@db.sqls.should == ["SELECT * FROM foos LIMIT 1", "SELECT * FROM bars WHERE (bars.object_ids[0] = 2) LIMIT 1"]
|
3965
4012
|
@Foo.first.mtmbars.should == [@bar]
|
3966
|
-
@db.sqls.should == ["SELECT * FROM foos LIMIT 1", "SELECT bars.* FROM bars INNER JOIN bars_foos ON (
|
4013
|
+
@db.sqls.should == ["SELECT * FROM foos LIMIT 1", "SELECT bars.* FROM bars INNER JOIN bars_foos ON (bars_foos.bar_ids[0] = bars.object_ids[0]) WHERE (bars_foos.foo_ids[0] = 2)"]
|
3967
4014
|
@Bar.first.mtmfoos.should == [@foo]
|
3968
|
-
@db.sqls.should == ["SELECT * FROM bars LIMIT 1", "SELECT foos.* FROM foos INNER JOIN bars_foos ON (
|
4015
|
+
@db.sqls.should == ["SELECT * FROM bars LIMIT 1", "SELECT foos.* FROM foos INNER JOIN bars_foos ON (bars_foos.foo_ids[0] = foos.object_ids[0]) WHERE (bars_foos.bar_ids[0] = 2)"]
|
3969
4016
|
end
|
3970
4017
|
|
3971
4018
|
it "should have working eager loading methods" do
|
@@ -3977,10 +4024,10 @@ describe "Sequel::Model Associations with non-column expression keys" do
|
|
3977
4024
|
@db.sqls.should == ["SELECT * FROM foos", "SELECT * FROM bars WHERE (bars.object_ids[0] IN (2))"]
|
3978
4025
|
@db.fetch = [[{:id=>1, :object_ids=>[2]}], [{:id=>1, :object_ids=>[2], :x_foreign_key_x=>2}]]
|
3979
4026
|
@Foo.eager(:mtmbars).all.map{|o| [o, o.mtmbars]}.should == [[@foo, [@bar]]]
|
3980
|
-
@db.sqls.should == ["SELECT * FROM foos", "SELECT bars.*, bars_foos.foo_ids[0] AS x_foreign_key_x FROM bars INNER JOIN bars_foos ON (
|
4027
|
+
@db.sqls.should == ["SELECT * FROM foos", "SELECT bars.*, bars_foos.foo_ids[0] AS x_foreign_key_x FROM bars INNER JOIN bars_foos ON (bars_foos.bar_ids[0] = bars.object_ids[0]) WHERE (bars_foos.foo_ids[0] IN (2))"]
|
3981
4028
|
@db.fetch = [[{:id=>1, :object_ids=>[2]}], [{:id=>1, :object_ids=>[2], :x_foreign_key_x=>2}]]
|
3982
4029
|
@Bar.eager(:mtmfoos).all.map{|o| [o, o.mtmfoos]}.should == [[@bar, [@foo]]]
|
3983
|
-
@db.sqls.should == ["SELECT * FROM bars", "SELECT foos.*, bars_foos.bar_ids[0] AS x_foreign_key_x FROM foos INNER JOIN bars_foos ON (
|
4030
|
+
@db.sqls.should == ["SELECT * FROM bars", "SELECT foos.*, bars_foos.bar_ids[0] AS x_foreign_key_x FROM foos INNER JOIN bars_foos ON (bars_foos.foo_ids[0] = foos.object_ids[0]) WHERE (bars_foos.bar_ids[0] IN (2))"]
|
3984
4031
|
end
|
3985
4032
|
|
3986
4033
|
it "should have working eager graphing methods" do
|