294
294
it "should provide an array with all members of the association" do
295
295
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]]
296
296
@c1.load(:id => 1234).tags.should == [@c2.load(:id=>1)]
297
MODEL_DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1234))']
297
DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1234))']
300
it "should set cached instance variable when accessed" do
300
it "should populate cache when accessed" do
301
301
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]]
302
302
n = @c1.load(:id => 1234)
303
303
n.associations[:tags].should == nil
304
MODEL_DB.sqls.should == []
305
305
n.tags.should == [@c2.load(:id=>1)]
306
MODEL_DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1234))']
306
DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1234))']
307
307
n.associations[:tags].should == n.tags
308
MODEL_DB.sqls.length.should == 0
308
DB.sqls.length.should == 0
311
it "should use cached instance variable if available" do
311
it "should use cache if available" do
312
312
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]]
313
313
n = @c1.load(:id => 1234)
314
314
n.associations[:tags] = []
315
315
n.tags.should == []
316
MODEL_DB.sqls.should == []
319
it "should not use cached instance variable if asked to reload" do
319
it "should not use cache if asked to reload" do
320
320
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]]
321
321
n = @c1.load(:id => 1234)
322
322
n.associations[:tags] = []
323
MODEL_DB.sqls.should == []
324
324
n.tags(true).should == [@c2.load(:id=>1)]
325
MODEL_DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1234))']
325
DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1234))']
326
326
n.associations[:tags].should == n.tags
327
MODEL_DB.sqls.length.should == 0
327
DB.sqls.length.should == 0
330
330
it "should not add associations methods directly to class" do
493
492
a.tags.should == [Tag.load(:id=>2)]
494
493
a.albums.should == [Album.load(:id=>3)]
495
MODEL_DB.sqls.length.should == 0
494
DB.sqls.length.should == 0
498
497
it "should allow cascading of eager loading for associations of associated models" do
499
498
a = @c1.eager(:tags=>:tracks).all
500
499
a.should == [@c1.load(:id=>1)]
501
MODEL_DB.sqls.should == ['SELECT * FROM artists',
500
DB.sqls.should == ['SELECT * FROM artists',
502
501
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))',
503
502
'SELECT tracks.*, albums_tags.tag_id AS x_foreign_key_x FROM tracks INNER JOIN albums ON (albums.id = tracks.album_id) INNER JOIN albums_tags ON ((albums_tags.album_id = albums.id) AND (albums_tags.tag_id IN (2)))']
505
504
a.tags.should == [Tag.load(:id=>2)]
506
505
a.tags.first.tracks.should == [Track.load(:id=>4)]
507
MODEL_DB.sqls.length.should == 0
506
DB.sqls.length.should == 0
510
509
it "should cascade eagerly loading when the :eager association option is used" do
511
510
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager=>:tracks
512
511
a = @c1.eager(:tags).all
513
512
a.should == [@c1.load(:id=>1)]
514
MODEL_DB.sqls.should == ['SELECT * FROM artists',
513
DB.sqls.should == ['SELECT * FROM artists',
515
514
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))',
516
515
'SELECT tracks.*, albums_tags.tag_id AS x_foreign_key_x FROM tracks INNER JOIN albums ON (albums.id = tracks.album_id) INNER JOIN albums_tags ON ((albums_tags.album_id = albums.id) AND (albums_tags.tag_id IN (2)))']
518
517
a.tags.should == [Tag.load(:id=>2)]
519
518
a.tags.first.tracks.should == [Track.load(:id=>4)]
520
MODEL_DB.sqls.length.should == 0
519
DB.sqls.length.should == 0
523
522
it "should respect :eager when lazily loading an association" do
524
523
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager=>:tracks
525
524
a = @c1.load(:id=>1)
526
525
a.tags.should == [Tag.load(:id=>2)]
527
MODEL_DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1))',
526
DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1))',
528
527
'SELECT tracks.*, albums_tags.tag_id AS x_foreign_key_x FROM tracks INNER JOIN albums ON (albums.id = tracks.album_id) INNER JOIN albums_tags ON ((albums_tags.album_id = albums.id) AND (albums_tags.tag_id IN (2)))']
529
528
a.tags.first.tracks.should == [Track.load(:id=>4)]
530
MODEL_DB.sqls.length.should == 0
529
DB.sqls.length.should == 0
533
it "should cascade eagerly loading when the :eager_graph association option is used" do
532
it "should raise error if attempting to eagerly load an association using :eager_graph option" do
534
533
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager_graph=>:tracks
535
534
proc{@c1.eager(:tags).all}.should raise_error(Sequel::Error)
545
544
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager_graph=>:tracks
546
545
a = @c1.load(:id=>1)
548
MODEL_DB.sqls.should == [ 'SELECT tags.id, tracks.id AS tracks_id FROM (SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1))) AS tags LEFT OUTER JOIN albums_tags AS albums_tags_0 ON (albums_tags_0.tag_id = tags.id) LEFT OUTER JOIN albums ON (albums.id = albums_tags_0.album_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)']
547
DB.sqls.should == [ 'SELECT tags.id, tracks.id AS tracks_id FROM (SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1))) AS tags LEFT OUTER JOIN albums_tags AS albums_tags_0 ON (albums_tags_0.tag_id = tags.id) LEFT OUTER JOIN albums ON (albums.id = albums_tags_0.album_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)']
549
548
a.tags.should == [Tag.load(:id=>2)]
550
549
a.tags.first.tracks.should == [Track.load(:id=>4)]
551
MODEL_DB.sqls.length.should == 0
550
DB.sqls.length.should == 0
554
553
it "should respect :conditions when eagerly loading" do
555
554
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :conditions=>{:a=>32}
556
555
a = @c1.eager(:tags).all
557
556
a.should == [@c1.load(:id=>1)]
558
MODEL_DB.sqls.should == ['SELECT * FROM artists',
557
DB.sqls.should == ['SELECT * FROM artists',
559
558
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) WHERE (a = 32)']
560
559
a.first.tags.should == [Tag.load(:id=>2)]
561
MODEL_DB.sqls.length.should == 0
560
DB.sqls.length.should == 0
564
563
it "should respect :order when eagerly loading" do
565
564
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :order=>:blah
566
565
a = @c1.eager(:tags).all
567
566
a.should == [@c1.load(:id=>1)]
568
MODEL_DB.sqls.should == ['SELECT * FROM artists',
567
DB.sqls.should == ['SELECT * FROM artists',
569
568
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) ORDER BY blah']
570
569
a.first.tags.should == [Tag.load(:id=>2)]
571
MODEL_DB.sqls.length.should == 0
570
DB.sqls.length.should == 0
574
573
it "should use the association's block when eager loading by default" do
575
574
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]] do |ds| ds.filter(:a) end
576
575
a = @c1.eager(:tags).all
577
576
a.should == [@c1.load(:id=>1)]
578
MODEL_DB.sqls.should == ['SELECT * FROM artists',
577
DB.sqls.should == ['SELECT * FROM artists',
579
578
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) WHERE a']
580
579
a.first.tags.should == [Tag.load(:id=>2)]
581
MODEL_DB.sqls.length.should == 0
580
DB.sqls.length.should == 0
584
583
it "should use the :eager_block option when eager loading if given" do
585
584
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager_block=>proc{|ds| ds.filter(:b)} do |ds| ds.filter(:a) end
586
585
a = @c1.eager(:tags).all
587
586
a.should == [@c1.load(:id=>1)]
588
MODEL_DB.sqls.should == ['SELECT * FROM artists',
587
DB.sqls.should == ['SELECT * FROM artists',
589
588
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) WHERE b']
590
589
a.first.tags.should == [Tag.load(:id=>2)]
591
MODEL_DB.sqls.length.should == 0
590
DB.sqls.length.should == 0
594
593
it "should respect the :limit option on a many_through_many association" do
596
595
Tag.dataset._fetch = [{:x_foreign_key_x=>1, :id=>5},{:x_foreign_key_x=>1, :id=>6}, {:x_foreign_key_x=>1, :id=>7}]
597
596
a = @c1.eager(:first_two_tags).all
598
597
a.should == [@c1.load(:id=>1)]
599
MODEL_DB.sqls.should == ['SELECT * FROM artists',
598
DB.sqls.should == ['SELECT * FROM artists',
600
599
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))']
601
600
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
602
MODEL_DB.sqls.length.should == 0
604
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1]
605
a = @c1.eager(:first_two_tags).all
606
a.should == [@c1.load(:id=>1)]
607
MODEL_DB.sqls.should == ['SELECT * FROM artists',
601
DB.sqls.length.should == 0
603
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[1,1]
604
a = @c1.eager(:first_two_tags).all
605
a.should == [@c1.load(:id=>1)]
606
DB.sqls.should == ['SELECT * FROM artists',
607
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))']
608
a.first.first_two_tags.should == [Tag.load(:id=>6)]
609
DB.sqls.length.should == 0
611
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[nil,1]
612
a = @c1.eager(:first_two_tags).all
613
a.should == [@c1.load(:id=>1)]
614
DB.sqls.should == ['SELECT * FROM artists',
608
615
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))']
609
616
a.first.first_two_tags.should == [Tag.load(:id=>6), Tag.load(:id=>7)]
610
MODEL_DB.sqls.length.should == 0
617
DB.sqls.length.should == 0
613
620
it "should respect the :limit option on a many_through_many association using a :window_function strategy" do
614
621
Tag.dataset.meta_def(:supports_window_functions?){true}
615
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>2, :eager_limit_strategy=>true, :order=>:name
622
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>2, :order=>:name
616
623
Tag.dataset._fetch = [{:x_foreign_key_x=>1, :id=>5},{:x_foreign_key_x=>1, :id=>6}]
617
624
a = @c1.eager(:first_two_tags).all
618
625
a.should == [@c1.load(:id=>1)]
619
MODEL_DB.sqls.should == ['SELECT * FROM artists',
626
DB.sqls.should == ['SELECT * FROM artists',
620
627
'SELECT * FROM (SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x, row_number() OVER (PARTITION BY albums_artists.artist_id ORDER BY name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))) AS t1 WHERE (x_sequel_row_number_x <= 2)']
621
628
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
622
MODEL_DB.sqls.length.should == 0
629
DB.sqls.length.should == 0
624
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1], :eager_limit_strategy=>true, :order=>:name
631
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1], :order=>:name
625
632
a = @c1.eager(:first_two_tags).all
626
633
a.should == [@c1.load(:id=>1)]
627
MODEL_DB.sqls.should == ['SELECT * FROM artists',
634
DB.sqls.should == ['SELECT * FROM artists',
628
635
'SELECT * FROM (SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x, row_number() OVER (PARTITION BY albums_artists.artist_id ORDER BY name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))) AS t1 WHERE ((x_sequel_row_number_x >= 2) AND (x_sequel_row_number_x < 4))']
629
636
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
630
MODEL_DB.sqls.length.should == 0
637
DB.sqls.length.should == 0
639
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[nil,1], :order=>:name
640
a = @c1.eager(:first_two_tags).all
641
a.should == [@c1.load(:id=>1)]
642
DB.sqls.should == ['SELECT * FROM artists',
643
'SELECT * FROM (SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x, row_number() OVER (PARTITION BY albums_artists.artist_id ORDER BY name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))) AS t1 WHERE (x_sequel_row_number_x >= 2)']
644
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
645
DB.sqls.length.should == 0
633
648
it "should respect the :limit option on a many_through_many association with composite primary keys on the main table using a :window_function strategy" do
634
649
Tag.dataset.meta_def(:supports_window_functions?){true}
635
650
@c1.set_primary_key([:id1, :id2])
636
651
@c1.columns :id1, :id2
637
@c1.many_through_many :first_two_tags, [[:albums_artists, [:artist_id1, :artist_id2], :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>2, :eager_limit_strategy=>true, :order=>:name
652
@c1.many_through_many :first_two_tags, [[:albums_artists, [:artist_id1, :artist_id2], :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>2, :order=>:name
638
653
@c1.dataset._fetch = [{:id1=>1, :id2=>2}]
639
654
Tag.dataset._fetch = [{:x_foreign_key_0_x=>1, :x_foreign_key_1_x=>2, :id=>5}, {:x_foreign_key_0_x=>1, :x_foreign_key_1_x=>2, :id=>6}]
640
655
a = @c1.eager(:first_two_tags).all
641
656
a.should == [@c1.load(:id1=>1, :id2=>2)]
642
MODEL_DB.sqls.should == ['SELECT * FROM artists',
657
DB.sqls.should == ['SELECT * FROM artists',
643
658
'SELECT * FROM (SELECT tags.*, albums_artists.artist_id1 AS x_foreign_key_0_x, albums_artists.artist_id2 AS x_foreign_key_1_x, row_number() OVER (PARTITION BY albums_artists.artist_id1, albums_artists.artist_id2 ORDER BY name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND ((albums_artists.artist_id1, albums_artists.artist_id2) IN ((1, 2))))) AS t1 WHERE (x_sequel_row_number_x <= 2)']
644
659
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
645
MODEL_DB.sqls.length.should == 0
660
DB.sqls.length.should == 0
647
@c1.many_through_many :first_two_tags, [[:albums_artists, [:artist_id1, :artist_id2], :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1], :eager_limit_strategy=>true, :order=>:name
662
@c1.many_through_many :first_two_tags, [[:albums_artists, [:artist_id1, :artist_id2], :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1], :order=>:name
648
663
a = @c1.eager(:first_two_tags).all
649
664
a.should == [@c1.load(:id1=>1, :id2=>2)]
650
MODEL_DB.sqls.should == ['SELECT * FROM artists',
665
DB.sqls.should == ['SELECT * FROM artists',
651
666
'SELECT * FROM (SELECT tags.*, albums_artists.artist_id1 AS x_foreign_key_0_x, albums_artists.artist_id2 AS x_foreign_key_1_x, row_number() OVER (PARTITION BY albums_artists.artist_id1, albums_artists.artist_id2 ORDER BY name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND ((albums_artists.artist_id1, albums_artists.artist_id2) IN ((1, 2))))) AS t1 WHERE ((x_sequel_row_number_x >= 2) AND (x_sequel_row_number_x < 4))']
652
667
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
653
MODEL_DB.sqls.length.should == 0
656
it "should respect the :limit option on a many_through_many association using a :correlated_subquery strategy" do
657
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>2, :eager_limit_strategy=>:correlated_subquery, :order=>:name
658
Tag.dataset._fetch = [{:x_foreign_key_x=>1, :id=>5},{:x_foreign_key_x=>1, :id=>6}]
659
a = @c1.eager(:first_two_tags).all
660
a.should == [@c1.load(:id=>1)]
661
MODEL_DB.sqls.should == ['SELECT * FROM artists',
662
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) WHERE (tags.id IN (SELECT t1.id FROM tags AS t1 INNER JOIN albums_tags ON (albums_tags.tag_id = t1.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists AS t2 ON ((t2.album_id = albums.id) AND (t2.artist_id = albums_artists.artist_id)) ORDER BY name LIMIT 2)) ORDER BY name']
663
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
664
MODEL_DB.sqls.length.should == 0
666
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1], :eager_limit_strategy=>:correlated_subquery, :order=>:name
667
a = @c1.eager(:first_two_tags).all
668
a.should == [@c1.load(:id=>1)]
669
MODEL_DB.sqls.should == ['SELECT * FROM artists',
670
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) WHERE (tags.id IN (SELECT t1.id FROM tags AS t1 INNER JOIN albums_tags ON (albums_tags.tag_id = t1.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists AS t2 ON ((t2.album_id = albums.id) AND (t2.artist_id = albums_artists.artist_id)) ORDER BY name LIMIT 2 OFFSET 1)) ORDER BY name']
671
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
672
MODEL_DB.sqls.length.should == 0
668
DB.sqls.length.should == 0
675
671
it "should raise an error when attempting to eagerly load an association with the :allow_eager option set to false" do
731
727
it "should eagerly graph a single many_through_many association" do
732
728
a = @c1.eager_graph(:tags).all
733
729
a.should == [@c1.load(:id=>1)]
734
MODEL_DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id)']
730
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id)']
735
731
a.first.tags.should == [Tag.load(:id=>2)]
736
MODEL_DB.sqls.length.should == 0
732
DB.sqls.length.should == 0
739
735
it "should eagerly graph multiple associations in a single call" do
740
736
a = @c1.eager_graph(:tags, :albums).all
741
737
a.should == [@c1.load(:id=>1)]
742
MODEL_DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, albums_0.id AS albums_0_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_artists AS albums_artists_0 ON (albums_artists_0.artist_id = artists.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_artists_0.album_id)']
738
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, albums_0.id AS albums_0_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_artists AS albums_artists_0 ON (albums_artists_0.artist_id = artists.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_artists_0.album_id)']
744
740
a.tags.should == [Tag.load(:id=>2)]
745
741
a.albums.should == [Album.load(:id=>3)]
746
MODEL_DB.sqls.length.should == 0
742
DB.sqls.length.should == 0
749
745
it "should eagerly graph multiple associations in separate calls" do
750
746
a = @c1.eager_graph(:tags).eager_graph(:albums).all
751
747
a.should == [@c1.load(:id=>1)]
752
MODEL_DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, albums_0.id AS albums_0_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_artists AS albums_artists_0 ON (albums_artists_0.artist_id = artists.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_artists_0.album_id)']
748
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, albums_0.id AS albums_0_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_artists AS albums_artists_0 ON (albums_artists_0.artist_id = artists.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_artists_0.album_id)']
754
750
a.tags.should == [Tag.load(:id=>2)]
755
751
a.albums.should == [Album.load(:id=>3)]
756
MODEL_DB.sqls.length.should == 0
752
DB.sqls.length.should == 0
759
755
it "should allow cascading of eager graphing for associations of associated models" do
760
756
a = @c1.eager_graph(:tags=>:tracks).all
761
757
a.should == [@c1.load(:id=>1)]
762
MODEL_DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, tracks.id AS tracks_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_tags AS albums_tags_0 ON (albums_tags_0.tag_id = tags.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_tags_0.album_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums_0.id)']
758
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, tracks.id AS tracks_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_tags AS albums_tags_0 ON (albums_tags_0.tag_id = tags.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_tags_0.album_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums_0.id)']
764
760
a.tags.should == [Tag.load(:id=>2)]
765
761
a.tags.first.tracks.should == [Track.load(:id=>4)]
766
MODEL_DB.sqls.length.should == 0
762
DB.sqls.length.should == 0
769
765
it "eager graphing should eliminate duplicates caused by cartesian products" do