sequel 4.7.0 → 4.8.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 +46 -0
- data/README.rdoc +25 -1
- data/doc/active_record.rdoc +1 -1
- data/doc/advanced_associations.rdoc +143 -17
- data/doc/association_basics.rdoc +80 -59
- data/doc/release_notes/4.8.0.txt +175 -0
- data/lib/sequel/adapters/odbc.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -2
- data/lib/sequel/adapters/shared/postgres.rb +19 -3
- data/lib/sequel/adapters/shared/sqlite.rb +3 -3
- data/lib/sequel/ast_transformer.rb +1 -1
- data/lib/sequel/dataset/actions.rb +1 -1
- data/lib/sequel/dataset/graph.rb +23 -9
- data/lib/sequel/dataset/misc.rb +2 -2
- data/lib/sequel/dataset/sql.rb +3 -3
- data/lib/sequel/extensions/columns_introspection.rb +1 -1
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +1 -1
- data/lib/sequel/extensions/pg_array_ops.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +7 -0
- data/lib/sequel/extensions/pg_json_ops.rb +5 -0
- data/lib/sequel/extensions/query.rb +8 -2
- data/lib/sequel/extensions/to_dot.rb +1 -1
- data/lib/sequel/model/associations.rb +476 -152
- data/lib/sequel/plugins/class_table_inheritance.rb +11 -3
- data/lib/sequel/plugins/dataset_associations.rb +21 -18
- data/lib/sequel/plugins/many_through_many.rb +87 -20
- data/lib/sequel/plugins/nested_attributes.rb +12 -0
- data/lib/sequel/plugins/pg_array_associations.rb +31 -12
- data/lib/sequel/plugins/single_table_inheritance.rb +9 -1
- data/lib/sequel/sql.rb +1 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +2 -2
- data/spec/adapters/postgres_spec.rb +7 -0
- data/spec/core/object_graph_spec.rb +250 -196
- data/spec/extensions/core_refinements_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +100 -6
- data/spec/extensions/many_through_many_spec.rb +1002 -19
- data/spec/extensions/nested_attributes_spec.rb +24 -0
- data/spec/extensions/pg_array_associations_spec.rb +17 -12
- data/spec/extensions/pg_array_spec.rb +4 -2
- data/spec/extensions/spec_helper.rb +1 -1
- data/spec/integration/associations_test.rb +1003 -48
- data/spec/integration/dataset_test.rb +12 -5
- data/spec/integration/prepared_statement_test.rb +1 -1
- data/spec/integration/type_test.rb +1 -1
- data/spec/model/associations_spec.rb +467 -130
- data/spec/model/eager_loading_spec.rb +332 -5
- metadata +5 -3
@@ -75,7 +75,14 @@ describe "Simple Dataset operations" do
|
|
75
75
|
end
|
76
76
|
|
77
77
|
specify "should graph correctly" do
|
78
|
-
|
78
|
+
a = [{:items=>{:id=>1, :number=>10}, :b=>{:id=>1, :number=>10}}]
|
79
|
+
pr = proc{|t| @ds.graph(t, {:id=>:id}, :table_alias=>:b).extension(:graph_each).all.should == a}
|
80
|
+
pr[:items]
|
81
|
+
pr[:items___foo]
|
82
|
+
pr[Sequel.identifier(:items)]
|
83
|
+
pr[Sequel.identifier('items')]
|
84
|
+
pr[Sequel.as(:items, :foo)]
|
85
|
+
pr[Sequel.as(Sequel.identifier('items'), 'foo')]
|
79
86
|
end
|
80
87
|
|
81
88
|
specify "should graph correctly with a subselect" do
|
@@ -266,7 +273,7 @@ describe "Simple dataset operations with nasty table names" do
|
|
266
273
|
@db.quote_identifiers = @qi
|
267
274
|
end
|
268
275
|
|
269
|
-
cspecify "should work correctly", :
|
276
|
+
cspecify "should work correctly", :oracle, :sqlanywhere, [:jdbc, :mssql] do
|
270
277
|
@db.create_table!(@table) do
|
271
278
|
primary_key :id
|
272
279
|
Integer :number
|
@@ -752,14 +759,14 @@ if DB.dataset.supports_window_functions?
|
|
752
759
|
[{:rank=>1, :id=>1}, {:rank=>2, :id=>2}, {:rank=>3, :id=>3}, {:rank=>4, :id=>4}, {:rank=>5, :id=>5}, {:rank=>6, :id=>6}]
|
753
760
|
end
|
754
761
|
|
755
|
-
|
762
|
+
specify "should give correct results for aggregate window functions with orders" do
|
756
763
|
@ds.select(:id){sum(:amount).over(:partition=>:group_id, :order=>:id).as(:sum)}.all.should ==
|
757
764
|
[{:sum=>1, :id=>1}, {:sum=>11, :id=>2}, {:sum=>111, :id=>3}, {:sum=>1000, :id=>4}, {:sum=>11000, :id=>5}, {:sum=>111000, :id=>6}]
|
758
765
|
@ds.select(:id){sum(:amount).over(:order=>:id).as(:sum)}.all.should ==
|
759
766
|
[{:sum=>1, :id=>1}, {:sum=>11, :id=>2}, {:sum=>111, :id=>3}, {:sum=>1111, :id=>4}, {:sum=>11111, :id=>5}, {:sum=>111111, :id=>6}]
|
760
767
|
end
|
761
768
|
|
762
|
-
|
769
|
+
specify "should give correct results for aggregate window functions with frames" do
|
763
770
|
@ds.select(:id){sum(:amount).over(:partition=>:group_id, :order=>:id, :frame=>:all).as(:sum)}.all.should ==
|
764
771
|
[{:sum=>111, :id=>1}, {:sum=>111, :id=>2}, {:sum=>111, :id=>3}, {:sum=>111000, :id=>4}, {:sum=>111000, :id=>5}, {:sum=>111000, :id=>6}]
|
765
772
|
@ds.select(:id){sum(:amount).over(:order=>:id, :frame=>:all).as(:sum)}.all.should ==
|
@@ -793,7 +800,7 @@ describe Sequel::SQL::Constants do
|
|
793
800
|
@db.drop_table?(:constants)
|
794
801
|
end
|
795
802
|
|
796
|
-
cspecify "should have working CURRENT_DATE", [:
|
803
|
+
cspecify "should have working CURRENT_DATE", [:jdbc, :sqlite], :oracle do
|
797
804
|
@db.create_table!(:constants){Date :d}
|
798
805
|
@ds.insert(:d=>Sequel::CURRENT_DATE)
|
799
806
|
d = @c2[@ds.get(:d)]
|
@@ -283,7 +283,7 @@ describe "Bound Argument Types" do
|
|
283
283
|
@db.drop_table?(:items)
|
284
284
|
end
|
285
285
|
|
286
|
-
cspecify "should handle date type", [:do, :sqlite], :mssql, [:jdbc, :sqlite], :oracle do
|
286
|
+
cspecify "should handle date type", [:do, :sqlite], [:tinytds], [:jdbc, :mssql], [:jdbc, :sqlite], :oracle do
|
287
287
|
@ds.filter(:d=>:$x).prepare(:first, :ps_date).call(:x=>@vs[:d])[:d].should == @vs[:d]
|
288
288
|
end
|
289
289
|
|
@@ -73,7 +73,7 @@ describe "Supported types" do
|
|
73
73
|
ds.all.should == [{:name=>'Test User'*100}]
|
74
74
|
end
|
75
75
|
|
76
|
-
cspecify "should support generic date type", [:do, :sqlite], [:jdbc, :sqlite], :mssql, :oracle do
|
76
|
+
cspecify "should support generic date type", [:do, :sqlite], [:jdbc, :sqlite], [:tinytds], [:jdbc, :mssql], :oracle do
|
77
77
|
ds = create_items_table_with_column(:dat, Date)
|
78
78
|
d = Date.today
|
79
79
|
ds.insert(:dat => d)
|
@@ -143,6 +143,13 @@ describe Sequel::Model, "associate" do
|
|
143
143
|
proc{c.one_to_one :c2, :clone=>:cs}.should_not raise_error
|
144
144
|
end
|
145
145
|
|
146
|
+
it "should allow cloning of many_to_many to one_through_one associations and vice-versa" do
|
147
|
+
c = Class.new(Sequel::Model(:c))
|
148
|
+
c.many_to_many :c
|
149
|
+
proc{c.one_through_one :cs, :clone=>:c}.should_not raise_error
|
150
|
+
proc{c.many_to_many :c2, :clone=>:cs}.should_not raise_error
|
151
|
+
end
|
152
|
+
|
146
153
|
it "should clear associations cache when refreshing object manually" do
|
147
154
|
c = Class.new(Sequel::Model(:c))
|
148
155
|
c.many_to_one :c
|
@@ -1856,6 +1863,11 @@ describe Sequel::Model, "many_to_many" do
|
|
1856
1863
|
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234))'
|
1857
1864
|
end
|
1858
1865
|
|
1866
|
+
it "should use implicit key values and join table if omitted" do
|
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 ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) LIMIT 1'
|
1869
|
+
end
|
1870
|
+
|
1859
1871
|
it "should use implicit class if omitted" do
|
1860
1872
|
begin
|
1861
1873
|
class ::Tag < Sequel::Model; end
|
@@ -2618,13 +2630,253 @@ describe Sequel::Model, "many_to_many" do
|
|
2618
2630
|
end
|
2619
2631
|
end
|
2620
2632
|
|
2633
|
+
describe Sequel::Model, "one_through_one" do
|
2634
|
+
before do
|
2635
|
+
@c1 = Class.new(Sequel::Model(:attributes)) do
|
2636
|
+
unrestrict_primary_key
|
2637
|
+
attr_accessor :yyy
|
2638
|
+
def self.name; 'Attribute'; end
|
2639
|
+
def self.to_s; 'Attribute'; end
|
2640
|
+
columns :id, :y, :z
|
2641
|
+
end
|
2642
|
+
|
2643
|
+
@c2 = Class.new(Sequel::Model(:nodes)) do
|
2644
|
+
unrestrict_primary_key
|
2645
|
+
attr_accessor :xxx
|
2646
|
+
|
2647
|
+
def self.name; 'Node'; end
|
2648
|
+
def self.to_s; 'Node'; end
|
2649
|
+
columns :id, :x
|
2650
|
+
end
|
2651
|
+
@dataset = @c2.dataset
|
2652
|
+
@c1.dataset.autoid = 1
|
2653
|
+
|
2654
|
+
[@c1, @c2].each{|c| c.dataset._fetch = {}}
|
2655
|
+
DB.reset
|
2656
|
+
end
|
2657
|
+
|
2658
|
+
it "should use implicit key values and join table if omitted" do
|
2659
|
+
@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 ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) LIMIT 1'
|
2661
|
+
end
|
2662
|
+
|
2663
|
+
it "should respect :eager_loader_predicate_key when lazily loading" do
|
2664
|
+
@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 ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id[0] = 1234)) LIMIT 1'
|
2666
|
+
end
|
2667
|
+
|
2668
|
+
it "should use explicit key values and join table if given" do
|
2669
|
+
@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 ((attribute2node.attributeid = attributes.id) AND (attribute2node.nodeid = 1234)) LIMIT 1'
|
2671
|
+
end
|
2672
|
+
|
2673
|
+
it "should support a conditions option" do
|
2674
|
+
@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 ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) WHERE (a = 32) LIMIT 1'
|
2676
|
+
|
2677
|
+
@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 ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) WHERE (a = 32) LIMIT 1'
|
2679
|
+
@c2.new(:id => 1234).attribute.should == @c1.load({})
|
2680
|
+
end
|
2681
|
+
|
2682
|
+
it "should support an order option" do
|
2683
|
+
@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 ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) ORDER BY blah LIMIT 1'
|
2685
|
+
end
|
2686
|
+
|
2687
|
+
it "should support an array for the order option" do
|
2688
|
+
@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 ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) ORDER BY blah1, blah2 LIMIT 1'
|
2690
|
+
end
|
2691
|
+
|
2692
|
+
it "should support :left_primary_key and :right_primary_key options" do
|
2693
|
+
@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 ((attributes_nodes.attribute_id = attributes.yyy) AND (attributes_nodes.node_id = 5)) LIMIT 1'
|
2695
|
+
end
|
2696
|
+
|
2697
|
+
it "should support composite keys" do
|
2698
|
+
@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) AND (attributes_nodes.l1 = 1234) AND (attributes_nodes.l2 = 5)) LIMIT 1'
|
2700
|
+
end
|
2701
|
+
|
2702
|
+
it "should not issue query if not all keys have values" do
|
2703
|
+
@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]
|
2704
|
+
@c2.load(:id => 1234, :x=>nil).attribute.should == nil
|
2705
|
+
DB.sqls.should == []
|
2706
|
+
end
|
2707
|
+
|
2708
|
+
it "should raise an Error unless same number of composite keys used" do
|
2709
|
+
proc{@c2.one_through_one :attribute, :class => @c1, :left_key=>[:node_id, :id]}.should raise_error(Sequel::Error)
|
2710
|
+
proc{@c2.one_through_one :attribute, :class => @c1, :left_primary_key=>[:node_id, :id]}.should raise_error(Sequel::Error)
|
2711
|
+
proc{@c2.one_through_one :attribute, :class => @c1, :left_key=>[:node_id, :id], :left_primary_key=>:id}.should raise_error(Sequel::Error)
|
2712
|
+
proc{@c2.one_through_one :attribute, :class => @c1, :left_key=>:id, :left_primary_key=>[:node_id, :id]}.should raise_error(Sequel::Error)
|
2713
|
+
proc{@c2.one_through_one :attribute, :class => @c1, :left_key=>[:node_id, :id, :x], :left_primary_key=>[:parent_id, :id]}.should raise_error(Sequel::Error)
|
2714
|
+
|
2715
|
+
proc{@c2.one_through_one :attribute, :class => @c1, :right_primary_key=>[:node_id, :id]}.should raise_error(Sequel::Error)
|
2716
|
+
proc{@c2.one_through_one :attribute, :class => @c1, :right_key=>[:node_id, :id], :right_primary_key=>:id}.should raise_error(Sequel::Error)
|
2717
|
+
proc{@c2.one_through_one :attribute, :class => @c1, :right_key=>:id, :left_primary_key=>[:node_id, :id]}.should raise_error(Sequel::Error)
|
2718
|
+
proc{@c2.one_through_one :attribute, :class => @c1, :right_key=>[:node_id, :id, :x], :right_primary_key=>[:parent_id, :id]}.should raise_error(Sequel::Error)
|
2719
|
+
end
|
2720
|
+
|
2721
|
+
it "should support a select option" do
|
2722
|
+
@c2.one_through_one :attribute, :class => @c1, :select => :blah
|
2723
|
+
|
2724
|
+
@c2.new(:id => 1234).attribute_dataset.sql.should == 'SELECT blah FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) LIMIT 1'
|
2725
|
+
end
|
2726
|
+
|
2727
|
+
it "should support an array for the select option" do
|
2728
|
+
@c2.one_through_one :attribute, :class => @c1, :select => [Sequel::SQL::ColumnAll.new(:attributes), :attribute_nodes__blah2]
|
2729
|
+
|
2730
|
+
@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) AND (attributes_nodes.node_id = 1234)) LIMIT 1'
|
2731
|
+
end
|
2732
|
+
|
2733
|
+
it "should accept a block" do
|
2734
|
+
@c2.one_through_one :attribute, :class => @c1 do |ds|
|
2735
|
+
ds.filter(:xxx => @xxx)
|
2736
|
+
end
|
2737
|
+
|
2738
|
+
n = @c2.new(:id => 1234)
|
2739
|
+
n.xxx = 555
|
2740
|
+
n.attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) WHERE (xxx = 555) LIMIT 1'
|
2741
|
+
end
|
2742
|
+
|
2743
|
+
it "should allow the :order option while accepting a block" do
|
2744
|
+
@c2.one_through_one :attribute, :class => @c1, :order=>[:blah1, :blah2] do |ds|
|
2745
|
+
ds.filter(:xxx => @xxx)
|
2746
|
+
end
|
2747
|
+
|
2748
|
+
n = @c2.new(:id => 1234)
|
2749
|
+
n.xxx = 555
|
2750
|
+
n.attribute_dataset.sql.should == 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) WHERE (xxx = 555) ORDER BY blah1, blah2 LIMIT 1'
|
2751
|
+
end
|
2752
|
+
|
2753
|
+
it "should support a :dataset option that is used instead of the default" do
|
2754
|
+
c1 = @c1
|
2755
|
+
@c2.one_through_one :attribute, :class => @c1, :dataset=>proc{c1.join_table(:natural, :an).filter(:an__nodeid=>pk)}, :order=> :a, :select=>nil do |ds|
|
2756
|
+
ds.filter(:xxx => @xxx)
|
2757
|
+
end
|
2758
|
+
|
2759
|
+
n = @c2.new(:id => 1234)
|
2760
|
+
n.xxx = 555
|
2761
|
+
n.attribute_dataset.sql.should == 'SELECT * FROM attributes NATURAL JOIN an WHERE ((an.nodeid = 1234) AND (xxx = 555)) ORDER BY a LIMIT 1'
|
2762
|
+
n.attribute.should == @c1.load({})
|
2763
|
+
DB.sqls.should == ['SELECT * FROM attributes NATURAL JOIN an WHERE ((an.nodeid = 1234) AND (xxx = 555)) ORDER BY a LIMIT 1']
|
2764
|
+
end
|
2765
|
+
|
2766
|
+
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.associated_dataset.join_table(:natural, :an).filter(:an__nodeid=>pk)}, :order=> :a, :select=>nil do |ds|
|
2768
|
+
ds.filter(:xxx => @xxx)
|
2769
|
+
end
|
2770
|
+
|
2771
|
+
n = @c2.new(:id => 1234)
|
2772
|
+
n.xxx = 555
|
2773
|
+
n.attribute_dataset.sql.should == 'SELECT * FROM attributes NATURAL JOIN an WHERE ((an.nodeid = 1234) AND (xxx = 555)) ORDER BY a LIMIT 1'
|
2774
|
+
n.attribute.should == @c1.load({})
|
2775
|
+
DB.sqls.should == ['SELECT * FROM attributes NATURAL JOIN an WHERE ((an.nodeid = 1234) AND (xxx = 555)) ORDER BY a LIMIT 1']
|
2776
|
+
end
|
2777
|
+
|
2778
|
+
it "should support a :limit option to specify an offset" do
|
2779
|
+
@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 ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) LIMIT 1 OFFSET 10'
|
2781
|
+
end
|
2782
|
+
|
2783
|
+
it "should have the :eager option affect the _dataset method" do
|
2784
|
+
@c2.one_through_one :attribute, :class => @c2 , :eager=>:attribute
|
2785
|
+
@c2.new(:id => 1234).attribute_dataset.opts[:eager].should == {:attribute=>nil}
|
2786
|
+
end
|
2787
|
+
|
2788
|
+
it "should handle an aliased join table" do
|
2789
|
+
@c2.one_through_one :attribute, :class => @c1, :join_table => :attribute2node___attributes_nodes
|
2790
|
+
n = @c2.load(:id => 1234)
|
2791
|
+
a = @c1.load(:id => 2345)
|
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"
|
2793
|
+
end
|
2794
|
+
|
2795
|
+
it "should raise an error if the model object doesn't have a valid primary key" do
|
2796
|
+
@c2.one_through_one :attribute, :class => @c1
|
2797
|
+
a = @c2.new
|
2798
|
+
n = @c1.load(:id=>123)
|
2799
|
+
proc{a.attribute_dataset}.should raise_error(Sequel::Error)
|
2800
|
+
end
|
2801
|
+
|
2802
|
+
it "should provide an array with all members of the association" do
|
2803
|
+
@c2.one_through_one :attribute, :class => @c1
|
2804
|
+
|
2805
|
+
@c2.new(:id => 1234).attribute.should == @c1.load({})
|
2806
|
+
DB.sqls.should == ['SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) LIMIT 1']
|
2807
|
+
end
|
2808
|
+
|
2809
|
+
it "should populate cache when accessed" do
|
2810
|
+
@c2.one_through_one :attribute, :class => @c1
|
2811
|
+
|
2812
|
+
n = @c2.new(:id => 1234)
|
2813
|
+
n.associations.include?(:attribute).should == false
|
2814
|
+
atts = n.attribute
|
2815
|
+
atts.should == n.associations[:attribute]
|
2816
|
+
end
|
2817
|
+
|
2818
|
+
it "should use cache if available" do
|
2819
|
+
@c2.one_through_one :attribute, :class => @c1
|
2820
|
+
|
2821
|
+
n = @c2.new(:id => 1234)
|
2822
|
+
n.associations[:attribute] = 42
|
2823
|
+
n.attribute.should == 42
|
2824
|
+
DB.sqls.should == []
|
2825
|
+
end
|
2826
|
+
|
2827
|
+
it "should not use cache if asked to reload" do
|
2828
|
+
@c2.one_through_one :attribute, :class => @c1
|
2829
|
+
|
2830
|
+
n = @c2.new(:id => 1234)
|
2831
|
+
n.associations[:attribute] = 42
|
2832
|
+
n.attribute(true).should_not == 42
|
2833
|
+
DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) LIMIT 1"]
|
2834
|
+
end
|
2835
|
+
|
2836
|
+
it "should not add associations methods directly to class" do
|
2837
|
+
@c2.one_through_one :attribute, :class => @c1
|
2838
|
+
im = @c2.instance_methods.collect{|x| x.to_s}
|
2839
|
+
im.should(include('attribute'))
|
2840
|
+
im.should(include('attribute_dataset'))
|
2841
|
+
im2 = @c2.instance_methods(false).collect{|x| x.to_s}
|
2842
|
+
im2.should_not(include('attribute'))
|
2843
|
+
im2.should_not(include('attribute_dataset'))
|
2844
|
+
end
|
2845
|
+
|
2846
|
+
it "should support after_load association callback" do
|
2847
|
+
h = []
|
2848
|
+
@c2.one_through_one :attribute, :class => @c1, :after_load=>[proc{|x,y| h << [x.pk, y.pk]}, :al]
|
2849
|
+
@c2.class_eval do
|
2850
|
+
self::Foo = h
|
2851
|
+
def al(v)
|
2852
|
+
model::Foo << v.pk
|
2853
|
+
end
|
2854
|
+
end
|
2855
|
+
@c1.dataset._fetch = [{:id=>20}]
|
2856
|
+
p = @c2.load(:id=>10, :parent_id=>20)
|
2857
|
+
attribute = p.attribute
|
2858
|
+
h.should == [[10, 20], 20]
|
2859
|
+
attribute.pk.should == 20
|
2860
|
+
end
|
2861
|
+
|
2862
|
+
it "should support a :distinct option that uses the DISTINCT clause" do
|
2863
|
+
@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 ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 10)) LIMIT 1"
|
2865
|
+
end
|
2866
|
+
end
|
2867
|
+
|
2621
2868
|
describe "Filtering by associations" do
|
2622
2869
|
before(:all) do
|
2623
|
-
|
2624
|
-
|
2625
|
-
|
2626
|
-
|
2627
|
-
|
2870
|
+
db = Sequel.mock
|
2871
|
+
db.extend_datasets do
|
2872
|
+
def supports_window_functions?; true; end
|
2873
|
+
def supports_distinct_on?; true; end
|
2874
|
+
end
|
2875
|
+
@Album = Class.new(Sequel::Model(db[:albums]))
|
2876
|
+
artist = @Artist = Class.new(Sequel::Model(db[:artists]))
|
2877
|
+
tag = @Tag = Class.new(Sequel::Model(db[:tags]))
|
2878
|
+
track = @Track = Class.new(Sequel::Model(db[:tracks]))
|
2879
|
+
album_info = @AlbumInfo = Class.new(Sequel::Model(db[:album_infos]))
|
2628
2880
|
@Artist.columns :id, :id1, :id2
|
2629
2881
|
@Tag.columns :id, :tid1, :tid2
|
2630
2882
|
@Track.columns :id, :album_id, :album_id1, :album_id2
|
@@ -2632,36 +2884,57 @@ describe "Filtering by associations" do
|
|
2632
2884
|
@Album.class_eval do
|
2633
2885
|
columns :id, :id1, :id2, :artist_id, :artist_id1, :artist_id2
|
2634
2886
|
b = lambda{|ds| ds.where(:name=>'B')}
|
2887
|
+
c = {:name=>'A'}
|
2635
2888
|
|
2636
2889
|
many_to_one :artist, :class=>artist, :key=>:artist_id
|
2637
2890
|
one_to_many :tracks, :class=>track, :key=>:album_id
|
2638
2891
|
one_to_one :album_info, :class=>album_info, :key=>:album_id
|
2639
2892
|
many_to_many :tags, :class=>tag, :left_key=>:album_id, :join_table=>:albums_tags, :right_key=>:tag_id
|
2640
2893
|
|
2641
|
-
many_to_one :a_artist, :clone=>:artist, :conditions=>
|
2642
|
-
one_to_many :a_tracks, :clone=>:tracks, :conditions=>
|
2643
|
-
one_to_one :a_album_info, :clone=>:album_info, :conditions=>
|
2644
|
-
many_to_many :a_tags, :clone=>:tags, :conditions=>
|
2894
|
+
many_to_one :a_artist, :clone=>:artist, :conditions=>c
|
2895
|
+
one_to_many :a_tracks, :clone=>:tracks, :conditions=>c
|
2896
|
+
one_to_one :a_album_info, :clone=>:album_info, :conditions=>c
|
2897
|
+
many_to_many :a_tags, :clone=>:tags, :conditions=>c
|
2645
2898
|
|
2646
2899
|
many_to_one :b_artist, :clone=>:artist, &b
|
2647
2900
|
one_to_many :b_tracks, :clone=>:tracks, &b
|
2648
2901
|
one_to_one :b_album_info, :clone=>:album_info, &b
|
2649
2902
|
many_to_many :b_tags, :clone=>:tags, &b
|
2650
2903
|
|
2904
|
+
one_to_many :l_tracks, :clone=>:tracks, :limit=>10
|
2905
|
+
one_to_one :l_track, :clone=>:tracks, :order=>:name
|
2906
|
+
many_to_many :l_tags, :clone=>:tags, :limit=>10
|
2907
|
+
one_through_one :l_tag, :clone=>:tags, :order=>:name
|
2908
|
+
|
2909
|
+
one_to_many :al_tracks, :clone=>:l_tracks, :conditions=>c
|
2910
|
+
one_to_one :al_track, :clone=>:l_track, :conditions=>c
|
2911
|
+
many_to_many :al_tags, :clone=>:l_tags, :conditions=>c
|
2912
|
+
one_through_one :al_tag, :clone=>:l_tag, :conditions=>c
|
2913
|
+
|
2651
2914
|
many_to_one :cartist, :class=>artist, :key=>[:artist_id1, :artist_id2], :primary_key=>[:id1, :id2]
|
2652
2915
|
one_to_many :ctracks, :class=>track, :key=>[:album_id1, :album_id2], :primary_key=>[:id1, :id2]
|
2653
2916
|
one_to_one :calbum_info, :class=>album_info, :key=>[:album_id1, :album_id2], :primary_key=>[:id1, :id2]
|
2654
2917
|
many_to_many :ctags, :class=>tag, :left_key=>[:album_id1, :album_id2], :left_primary_key=>[:id1, :id2], :right_key=>[:tag_id1, :tag_id2], :right_primary_key=>[:tid1, :tid2], :join_table=>:albums_tags
|
2655
2918
|
|
2656
|
-
many_to_one :a_cartist, :clone=>:cartist, :conditions=>
|
2657
|
-
one_to_many :a_ctracks, :clone=>:ctracks, :conditions=>
|
2658
|
-
one_to_one :a_calbum_info, :clone=>:calbum_info, :conditions=>
|
2659
|
-
many_to_many :a_ctags, :clone=>:ctags, :conditions=>
|
2919
|
+
many_to_one :a_cartist, :clone=>:cartist, :conditions=>c
|
2920
|
+
one_to_many :a_ctracks, :clone=>:ctracks, :conditions=>c
|
2921
|
+
one_to_one :a_calbum_info, :clone=>:calbum_info, :conditions=>c
|
2922
|
+
many_to_many :a_ctags, :clone=>:ctags, :conditions=>c
|
2660
2923
|
|
2661
2924
|
many_to_one :b_cartist, :clone=>:cartist, &b
|
2662
2925
|
one_to_many :b_ctracks, :clone=>:ctracks, &b
|
2663
2926
|
one_to_one :b_calbum_info, :clone=>:calbum_info, &b
|
2664
2927
|
many_to_many :b_ctags, :clone=>:ctags, &b
|
2928
|
+
|
2929
|
+
one_to_many :l_ctracks, :clone=>:ctracks, :limit=>10
|
2930
|
+
one_to_one :l_ctrack, :clone=>:ctracks, :order=>:name
|
2931
|
+
many_to_many :l_ctags, :clone=>:ctags, :limit=>10
|
2932
|
+
one_through_one :l_ctag, :clone=>:ctags, :order=>:name
|
2933
|
+
|
2934
|
+
one_to_many :al_ctracks, :clone=>:l_ctracks, :conditions=>c
|
2935
|
+
one_to_one :al_ctrack, :clone=>:l_ctrack, :conditions=>c
|
2936
|
+
many_to_many :al_ctags, :clone=>:l_ctags, :conditions=>c
|
2937
|
+
one_through_one :al_ctag, :clone=>:l_ctag, :conditions=>c
|
2665
2938
|
end
|
2666
2939
|
end
|
2667
2940
|
|
@@ -2682,35 +2955,67 @@ describe "Filtering by associations" do
|
|
2682
2955
|
end
|
2683
2956
|
|
2684
2957
|
it "should be able to filter on many_to_one associations with :conditions" do
|
2685
|
-
@Album.filter(:a_artist=>@Artist.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE (
|
2958
|
+
@Album.filter(:a_artist=>@Artist.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists WHERE ((name = 'A') AND (artists.id IS NOT NULL) AND (artists.id = 3))))"
|
2686
2959
|
end
|
2687
2960
|
|
2688
2961
|
it "should be able to filter on one_to_many associations with :conditions" do
|
2689
|
-
@Album.filter(:a_tracks=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (
|
2962
|
+
@Album.filter(:a_tracks=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'A') AND (tracks.album_id IS NOT NULL) AND (tracks.id = 5))))"
|
2690
2963
|
end
|
2691
2964
|
|
2692
2965
|
it "should be able to filter on one_to_one associations with :conditions" do
|
2693
|
-
@Album.filter(:a_album_info=>@AlbumInfo.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (
|
2966
|
+
@Album.filter(:a_album_info=>@AlbumInfo.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id = 5))))"
|
2694
2967
|
end
|
2695
2968
|
|
2696
2969
|
it "should be able to filter on many_to_many associations with :conditions" do
|
2697
|
-
@Album.filter(:a_tags=>@Tag.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE (
|
2970
|
+
@Album.filter(:a_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 ((name = 'A') AND (albums_tags.album_id IS NOT NULL) AND (tags.id = 3))))"
|
2698
2971
|
end
|
2699
2972
|
|
2700
2973
|
it "should be able to filter on many_to_one associations with block" do
|
2701
|
-
@Album.filter(:b_artist=>@Artist.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE (
|
2974
|
+
@Album.filter(:b_artist=>@Artist.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists WHERE ((name = 'B') AND (artists.id IS NOT NULL) AND (artists.id = 3))))"
|
2702
2975
|
end
|
2703
2976
|
|
2704
2977
|
it "should be able to filter on one_to_many associations with block" do
|
2705
|
-
@Album.filter(:b_tracks=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (
|
2978
|
+
@Album.filter(:b_tracks=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'B') AND (tracks.album_id IS NOT NULL) AND (tracks.id = 5))))"
|
2706
2979
|
end
|
2707
2980
|
|
2708
2981
|
it "should be able to filter on one_to_one associations with block" do
|
2709
|
-
@Album.filter(:b_album_info=>@AlbumInfo.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (
|
2982
|
+
@Album.filter(:b_album_info=>@AlbumInfo.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id = 5))))"
|
2710
2983
|
end
|
2711
2984
|
|
2712
2985
|
it "should be able to filter on many_to_many associations with block" do
|
2713
|
-
@Album.filter(:b_tags=>@Tag.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE (
|
2986
|
+
@Album.filter(:b_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 ((name = 'B') AND (albums_tags.album_id IS NOT NULL) AND (tags.id = 3))))"
|
2987
|
+
end
|
2988
|
+
|
2989
|
+
it "should be able to filter on one_to_many associations with :limit" do
|
2990
|
+
@Album.filter(:l_tracks=>@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 <= 10))) AND (tracks.id = 5))))"
|
2991
|
+
end
|
2992
|
+
|
2993
|
+
it "should be able to filter on one_to_one associations with :order" do
|
2994
|
+
@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
|
+
end
|
2996
|
+
|
2997
|
+
it "should be able to filter on many_to_many associations with :limit" do
|
2998
|
+
@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
|
+
end
|
3000
|
+
|
3001
|
+
it "should be able to filter on one_through_one associations with :order" do
|
3002
|
+
@Album.filter(:l_tag=>@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 DISTINCT ON (albums_tags.album_id) albums_tags.album_id, tags.id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) ORDER BY albums_tags.album_id, name)) AND (tags.id = 3))))"
|
3003
|
+
end
|
3004
|
+
|
3005
|
+
it "should be able to filter on one_to_many associations with :limit and :conditions" do
|
3006
|
+
@Album.filter(:al_tracks=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'A') AND (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 WHERE (name = 'A')) AS t1 WHERE (x_sequel_row_number_x <= 10))) AND (tracks.id = 5))))"
|
3007
|
+
end
|
3008
|
+
|
3009
|
+
it "should be able to filter on one_to_one associations with :order and :conditions" do
|
3010
|
+
@Album.filter(:al_track=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'A') AND (tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT DISTINCT ON (tracks.album_id) tracks.id FROM tracks WHERE (name = 'A') ORDER BY tracks.album_id, name)) AND (tracks.id = 5))))"
|
3011
|
+
end
|
3012
|
+
|
3013
|
+
it "should be able to filter on many_to_many associations with :limit and :conditions" do
|
3014
|
+
@Album.filter(:al_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 ((name = 'A') AND (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) WHERE (name = 'A')) AS t1 WHERE (x_sequel_row_number_x <= 10))) AND (tags.id = 3))))"
|
3015
|
+
end
|
3016
|
+
|
3017
|
+
it "should be able to filter on one_through_one associations with :order and :conditions" do
|
3018
|
+
@Album.filter(:al_tag=>@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 ((name = 'A') AND (albums_tags.album_id IS NOT NULL) AND ((albums_tags.album_id, tags.id) IN (SELECT DISTINCT ON (albums_tags.album_id) albums_tags.album_id, tags.id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE (name = 'A') ORDER BY albums_tags.album_id, name)) AND (tags.id = 3))))"
|
2714
3019
|
end
|
2715
3020
|
|
2716
3021
|
it "should be able to filter on many_to_one associations with composite keys" do
|
@@ -2730,35 +3035,67 @@ describe "Filtering by associations" do
|
|
2730
3035
|
end
|
2731
3036
|
|
2732
3037
|
it "should be able to filter on many_to_one associations with :conditions and composite keys" do
|
2733
|
-
@Album.filter(:a_cartist=>@Artist.load(:id=>5, :id1=>3, :id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id1
|
3038
|
+
@Album.filter(:a_cartist=>@Artist.load(:id=>5, :id1=>3, :id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'A') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id = 5))))"
|
2734
3039
|
end
|
2735
3040
|
|
2736
3041
|
it "should be able to filter on one_to_many associations with :conditions and composite keys" do
|
2737
|
-
@Album.filter(:a_ctracks=>@Track.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1
|
3042
|
+
@Album.filter(:a_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 ((name = 'A') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id = 5))))"
|
2738
3043
|
end
|
2739
3044
|
|
2740
3045
|
it "should be able to filter on one_to_one associations with :conditions and composite keys" do
|
2741
|
-
@Album.filter(:a_calbum_info=>@AlbumInfo.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1
|
3046
|
+
@Album.filter(:a_calbum_info=>@AlbumInfo.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id = 5))))"
|
2742
3047
|
end
|
2743
3048
|
|
2744
3049
|
it "should be able to filter on many_to_many associations with block and composite keys" do
|
2745
|
-
@Album.filter(:a_ctags=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE ((
|
3050
|
+
@Album.filter(:a_ctags=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'A') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id = 5))))"
|
2746
3051
|
end
|
2747
3052
|
|
2748
3053
|
it "should be able to filter on many_to_one associations with block and composite keys" do
|
2749
|
-
@Album.filter(:b_cartist=>@Artist.load(:id=>5, :id1=>3, :id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id1
|
3054
|
+
@Album.filter(:b_cartist=>@Artist.load(:id=>5, :id1=>3, :id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'B') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id = 5))))"
|
2750
3055
|
end
|
2751
3056
|
|
2752
3057
|
it "should be able to filter on one_to_many associations with block and composite keys" do
|
2753
|
-
@Album.filter(:b_ctracks=>@Track.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1
|
3058
|
+
@Album.filter(:b_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 ((name = 'B') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id = 5))))"
|
2754
3059
|
end
|
2755
3060
|
|
2756
3061
|
it "should be able to filter on one_to_one associations with block and composite keys" do
|
2757
|
-
@Album.filter(:b_calbum_info=>@AlbumInfo.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1
|
3062
|
+
@Album.filter(:b_calbum_info=>@AlbumInfo.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id = 5))))"
|
2758
3063
|
end
|
2759
3064
|
|
2760
3065
|
it "should be able to filter on many_to_many associations with block and composite keys" do
|
2761
|
-
@Album.filter(:b_ctags=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE ((
|
3066
|
+
@Album.filter(:b_ctags=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'B') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id = 5))))"
|
3067
|
+
end
|
3068
|
+
|
3069
|
+
it "should be able to filter on one_to_many associations with :limit and composite keys" do
|
3070
|
+
@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
|
+
end
|
3072
|
+
|
3073
|
+
it "should be able to filter on one_to_one associations with :order and composite keys" do
|
3074
|
+
@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
|
+
end
|
3076
|
+
|
3077
|
+
it "should be able to filter on many_to_many associations with :limit and composite keys" do
|
3078
|
+
@Album.filter(:l_ctags=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND ((albums_tags.album_id1, albums_tags.album_id2, tags.id) IN (SELECT b, c, d FROM (SELECT albums_tags.album_id1 AS b, albums_tags.album_id2 AS c, tags.id AS d, row_number() OVER (PARTITION BY albums_tags.album_id1, albums_tags.album_id2) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2))) AS t1 WHERE (x_sequel_row_number_x <= 10))) AND (tags.id = 5))))"
|
3079
|
+
end
|
3080
|
+
|
3081
|
+
it "should be able to filter on one_through_one associations with :order and composite keys" do
|
3082
|
+
@Album.filter(:l_ctag=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND ((albums_tags.album_id1, albums_tags.album_id2, tags.id) IN (SELECT DISTINCT ON (albums_tags.album_id1, albums_tags.album_id2) albums_tags.album_id1, albums_tags.album_id2, tags.id FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) ORDER BY albums_tags.album_id1, albums_tags.album_id2, name)) AND (tags.id = 5))))"
|
3083
|
+
end
|
3084
|
+
|
3085
|
+
it "should be able to filter on one_to_many associations with :limit and :conditions and composite keys" do
|
3086
|
+
@Album.filter(:al_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 ((name = 'A') AND (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 WHERE (name = 'A')) AS t1 WHERE (x_sequel_row_number_x <= 10))) AND (tracks.id = 5))))"
|
3087
|
+
end
|
3088
|
+
|
3089
|
+
it "should be able to filter on one_to_one associations with :order and :conditions and composite keys" do
|
3090
|
+
@Album.filter(:al_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 ((name = 'A') AND (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 WHERE (name = 'A') ORDER BY tracks.album_id1, tracks.album_id2, name)) AND (tracks.id = 5))))"
|
3091
|
+
end
|
3092
|
+
|
3093
|
+
it "should be able to filter on many_to_many associations with :limit and :conditions and composite keys" do
|
3094
|
+
@Album.filter(:al_ctags=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'A') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND ((albums_tags.album_id1, albums_tags.album_id2, tags.id) IN (SELECT b, c, d FROM (SELECT albums_tags.album_id1 AS b, albums_tags.album_id2 AS c, tags.id AS d, row_number() OVER (PARTITION BY albums_tags.album_id1, albums_tags.album_id2) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE (name = 'A')) AS t1 WHERE (x_sequel_row_number_x <= 10))) AND (tags.id = 5))))"
|
3095
|
+
end
|
3096
|
+
|
3097
|
+
it "should be able to filter on one_through_one associations with :order and :conditions and composite keys" do
|
3098
|
+
@Album.filter(:al_ctag=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'A') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND ((albums_tags.album_id1, albums_tags.album_id2, tags.id) IN (SELECT DISTINCT ON (albums_tags.album_id1, albums_tags.album_id2) albums_tags.album_id1, albums_tags.album_id2, tags.id FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE (name = 'A') ORDER BY albums_tags.album_id1, albums_tags.album_id2, name)) AND (tags.id = 5))))"
|
2762
3099
|
end
|
2763
3100
|
|
2764
3101
|
it "should work inside a complex filter" do
|
@@ -2818,35 +3155,35 @@ describe "Filtering by associations" do
|
|
2818
3155
|
end
|
2819
3156
|
|
2820
3157
|
it "should be able to exclude on many_to_one associations with :conditions" do
|
2821
|
-
@Album.exclude(:a_artist=>@Artist.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id
|
3158
|
+
@Album.exclude(:a_artist=>@Artist.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id NOT IN (SELECT artists.id FROM artists WHERE ((name = 'A') AND (artists.id IS NOT NULL) AND (artists.id = 3)))) OR (albums.artist_id IS NULL))"
|
2822
3159
|
end
|
2823
3160
|
|
2824
3161
|
it "should be able to exclude on one_to_many associations with :conditions" do
|
2825
|
-
@Album.exclude(:a_tracks=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id
|
3162
|
+
@Album.exclude(:a_tracks=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'A') AND (tracks.album_id IS NOT NULL) AND (tracks.id = 5)))) OR (albums.id IS NULL))"
|
2826
3163
|
end
|
2827
3164
|
|
2828
3165
|
it "should be able to exclude on one_to_one associations with :conditions" do
|
2829
|
-
@Album.exclude(:a_album_info=>@AlbumInfo.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id
|
3166
|
+
@Album.exclude(:a_album_info=>@AlbumInfo.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id = 5)))) OR (albums.id IS NULL))"
|
2830
3167
|
end
|
2831
3168
|
|
2832
3169
|
it "should be able to exclude on many_to_many associations with :conditions" do
|
2833
|
-
@Album.exclude(:a_tags=>@Tag.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM
|
3170
|
+
@Album.exclude(:a_tags=>@Tag.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((name = 'A') AND (albums_tags.album_id IS NOT NULL) AND (tags.id = 3)))) OR (albums.id IS NULL))"
|
2834
3171
|
end
|
2835
3172
|
|
2836
3173
|
it "should be able to exclude on many_to_one associations with block" do
|
2837
|
-
@Album.exclude(:b_artist=>@Artist.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id
|
3174
|
+
@Album.exclude(:b_artist=>@Artist.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id NOT IN (SELECT artists.id FROM artists WHERE ((name = 'B') AND (artists.id IS NOT NULL) AND (artists.id = 3)))) OR (albums.artist_id IS NULL))"
|
2838
3175
|
end
|
2839
3176
|
|
2840
3177
|
it "should be able to exclude on one_to_many associations with block" do
|
2841
|
-
@Album.exclude(:b_tracks=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id
|
3178
|
+
@Album.exclude(:b_tracks=>@Track.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'B') AND (tracks.album_id IS NOT NULL) AND (tracks.id = 5)))) OR (albums.id IS NULL))"
|
2842
3179
|
end
|
2843
3180
|
|
2844
3181
|
it "should be able to exclude on one_to_one associations with block" do
|
2845
|
-
@Album.exclude(:b_album_info=>@AlbumInfo.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id
|
3182
|
+
@Album.exclude(:b_album_info=>@AlbumInfo.load(:id=>5, :album_id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id = 5)))) OR (albums.id IS NULL))"
|
2846
3183
|
end
|
2847
3184
|
|
2848
3185
|
it "should be able to exclude on many_to_many associations with block" do
|
2849
|
-
@Album.exclude(:b_tags=>@Tag.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM
|
3186
|
+
@Album.exclude(:b_tags=>@Tag.load(:id=>3)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((name = 'B') AND (albums_tags.album_id IS NOT NULL) AND (tags.id = 3)))) OR (albums.id IS NULL))"
|
2850
3187
|
end
|
2851
3188
|
|
2852
3189
|
it "should be able to exclude on many_to_one associations with composite keys" do
|
@@ -2866,35 +3203,35 @@ describe "Filtering by associations" do
|
|
2866
3203
|
end
|
2867
3204
|
|
2868
3205
|
it "should be able to exclude on many_to_one associations with :conditions and composite keys" do
|
2869
|
-
@Album.exclude(:a_cartist=>@Artist.load(:id=>5, :id1=>3, :id2=>4)).sql.should == "SELECT * FROM albums WHERE ((
|
3206
|
+
@Album.exclude(:a_cartist=>@Artist.load(:id=>5, :id1=>3, :id2=>4)).sql.should == "SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) NOT IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'A') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id = 5)))) OR (albums.artist_id1 IS NULL) OR (albums.artist_id2 IS NULL))"
|
2870
3207
|
end
|
2871
3208
|
|
2872
3209
|
it "should be able to exclude on one_to_many associations with :conditions and composite keys" do
|
2873
|
-
@Album.exclude(:a_ctracks=>@Track.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((
|
3210
|
+
@Album.exclude(:a_ctracks=>@Track.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((name = 'A') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id = 5)))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
2874
3211
|
end
|
2875
3212
|
|
2876
3213
|
it "should be able to exclude on one_to_one associations with :conditions and composite keys" do
|
2877
|
-
@Album.exclude(:a_calbum_info=>@AlbumInfo.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((
|
3214
|
+
@Album.exclude(:a_calbum_info=>@AlbumInfo.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id = 5)))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
2878
3215
|
end
|
2879
3216
|
|
2880
3217
|
it "should be able to exclude on many_to_many associations with block and composite keys" do
|
2881
|
-
@Album.exclude(:a_ctags=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM albums_tags
|
3218
|
+
@Album.exclude(:a_ctags=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'A') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id = 5)))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
2882
3219
|
end
|
2883
3220
|
|
2884
3221
|
it "should be able to exclude on many_to_one associations with block and composite keys" do
|
2885
|
-
@Album.exclude(:b_cartist=>@Artist.load(:id=>5, :id1=>3, :id2=>4)).sql.should == "SELECT * FROM albums WHERE ((
|
3222
|
+
@Album.exclude(:b_cartist=>@Artist.load(:id=>5, :id1=>3, :id2=>4)).sql.should == "SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) NOT IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'B') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id = 5)))) OR (albums.artist_id1 IS NULL) OR (albums.artist_id2 IS NULL))"
|
2886
3223
|
end
|
2887
3224
|
|
2888
3225
|
it "should be able to exclude on one_to_many associations with block and composite keys" do
|
2889
|
-
@Album.exclude(:b_ctracks=>@Track.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((
|
3226
|
+
@Album.exclude(:b_ctracks=>@Track.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((name = 'B') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id = 5)))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
2890
3227
|
end
|
2891
3228
|
|
2892
3229
|
it "should be able to exclude on one_to_one associations with block and composite keys" do
|
2893
|
-
@Album.exclude(:b_calbum_info=>@AlbumInfo.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE ((
|
3230
|
+
@Album.exclude(:b_calbum_info=>@AlbumInfo.load(:id=>5, :album_id1=>3, :album_id2=>4)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id = 5)))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
2894
3231
|
end
|
2895
3232
|
|
2896
3233
|
it "should be able to exclude on many_to_many associations with block and composite keys" do
|
2897
|
-
@Album.exclude(:b_ctags=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM albums_tags
|
3234
|
+
@Album.exclude(:b_ctags=>@Tag.load(:id=>5, :tid1=>3, :tid2=>4)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'B') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id = 5)))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
2898
3235
|
end
|
2899
3236
|
|
2900
3237
|
it "should be able to filter on multiple many_to_one associations" do
|
@@ -2914,35 +3251,35 @@ describe "Filtering by associations" do
|
|
2914
3251
|
end
|
2915
3252
|
|
2916
3253
|
it "should be able to filter on multiple many_to_one associations with :conditions" do
|
2917
|
-
@Album.filter(:a_artist=>[@Artist.load(:id=>3), @Artist.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE (
|
3254
|
+
@Album.filter(:a_artist=>[@Artist.load(:id=>3), @Artist.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists WHERE ((name = 'A') AND (artists.id IS NOT NULL) AND (artists.id IN (3, 4)))))"
|
2918
3255
|
end
|
2919
3256
|
|
2920
3257
|
it "should be able to filter on multiple one_to_many associations with :conditions" do
|
2921
|
-
@Album.filter(:a_tracks=>[@Track.load(:id=>5, :album_id=>3), @Track.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE (
|
3258
|
+
@Album.filter(:a_tracks=>[@Track.load(:id=>5, :album_id=>3), @Track.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'A') AND (tracks.album_id IS NOT NULL) AND (tracks.id IN (5, 6)))))"
|
2922
3259
|
end
|
2923
3260
|
|
2924
3261
|
it "should be able to filter on multiple one_to_one associations with :conditions" do
|
2925
|
-
@Album.filter(:a_album_info=>[@AlbumInfo.load(:id=>5, :album_id=>3), @AlbumInfo.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE (
|
3262
|
+
@Album.filter(:a_album_info=>[@AlbumInfo.load(:id=>5, :album_id=>3), @AlbumInfo.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id IN (5, 6)))))"
|
2926
3263
|
end
|
2927
3264
|
|
2928
3265
|
it "should be able to filter on multiple many_to_many associations with :conditions" do
|
2929
|
-
@Album.filter(:a_tags=>[@Tag.load(:id=>3), @Tag.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE (
|
3266
|
+
@Album.filter(:a_tags=>[@Tag.load(:id=>3), @Tag.load(:id=>4)]).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 ((name = 'A') AND (albums_tags.album_id IS NOT NULL) AND (tags.id IN (3, 4)))))"
|
2930
3267
|
end
|
2931
3268
|
|
2932
3269
|
it "should be able to filter on multiple many_to_one associations with block" do
|
2933
|
-
@Album.filter(:b_artist=>[@Artist.load(:id=>3), @Artist.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE (
|
3270
|
+
@Album.filter(:b_artist=>[@Artist.load(:id=>3), @Artist.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists WHERE ((name = 'B') AND (artists.id IS NOT NULL) AND (artists.id IN (3, 4)))))"
|
2934
3271
|
end
|
2935
3272
|
|
2936
3273
|
it "should be able to filter on multiple one_to_many associations with block" do
|
2937
|
-
@Album.filter(:b_tracks=>[@Track.load(:id=>5, :album_id=>3), @Track.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE (
|
3274
|
+
@Album.filter(:b_tracks=>[@Track.load(:id=>5, :album_id=>3), @Track.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'B') AND (tracks.album_id IS NOT NULL) AND (tracks.id IN (5, 6)))))"
|
2938
3275
|
end
|
2939
3276
|
|
2940
3277
|
it "should be able to filter on multiple one_to_one associations with block" do
|
2941
|
-
@Album.filter(:b_album_info=>[@AlbumInfo.load(:id=>5, :album_id=>3), @AlbumInfo.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE (
|
3278
|
+
@Album.filter(:b_album_info=>[@AlbumInfo.load(:id=>5, :album_id=>3), @AlbumInfo.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id IN (5, 6)))))"
|
2942
3279
|
end
|
2943
3280
|
|
2944
3281
|
it "should be able to filter on multiple many_to_many associations with block" do
|
2945
|
-
@Album.filter(:b_tags=>[@Tag.load(:id=>3), @Tag.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE (
|
3282
|
+
@Album.filter(:b_tags=>[@Tag.load(:id=>3), @Tag.load(:id=>4)]).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 ((name = 'B') AND (albums_tags.album_id IS NOT NULL) AND (tags.id IN (3, 4)))))"
|
2946
3283
|
end
|
2947
3284
|
|
2948
3285
|
it "should be able to filter on multiple many_to_one associations with composite keys" do
|
@@ -2962,35 +3299,35 @@ describe "Filtering by associations" do
|
|
2962
3299
|
end
|
2963
3300
|
|
2964
3301
|
it "should be able to filter on multiple many_to_one associations with :conditions and composite keys" do
|
2965
|
-
@Album.filter(:a_cartist=>[@Artist.load(:id=>7, :id1=>3, :id2=>4), @Artist.load(:id=>8, :id1=>5, :id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((
|
3302
|
+
@Album.filter(:a_cartist=>[@Artist.load(:id=>7, :id1=>3, :id2=>4), @Artist.load(:id=>8, :id1=>5, :id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'A') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id IN (7, 8)))))"
|
2966
3303
|
end
|
2967
3304
|
|
2968
3305
|
it "should be able to filter on multiple one_to_many associations with :conditions and composite keys" do
|
2969
|
-
@Album.filter(:a_ctracks=>[@Track.load(:id=>7, :album_id1=>3, :album_id2=>4), @Track.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((
|
3306
|
+
@Album.filter(:a_ctracks=>[@Track.load(:id=>7, :album_id1=>3, :album_id2=>4), @Track.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((name = 'A') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (7, 8)))))"
|
2970
3307
|
end
|
2971
3308
|
|
2972
3309
|
it "should be able to filter on multiple one_to_one associations with :conditions and composite keys" do
|
2973
|
-
@Album.filter(:a_calbum_info=>[@AlbumInfo.load(:id=>7, :album_id1=>3, :album_id2=>4), @AlbumInfo.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((
|
3310
|
+
@Album.filter(:a_calbum_info=>[@AlbumInfo.load(:id=>7, :album_id1=>3, :album_id2=>4), @AlbumInfo.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id IN (7, 8)))))"
|
2974
3311
|
end
|
2975
3312
|
|
2976
3313
|
it "should be able to filter on multiple many_to_many associations with block and composite keys" do
|
2977
|
-
@Album.filter(:a_ctags=>[@Tag.load(:id=>7, :tid1=>3, :tid2=>4), @Tag.load(:id=>8, :tid1=>5, :tid2=>6)]).sql.should == "SELECT * FROM albums WHERE ((
|
3314
|
+
@Album.filter(:a_ctags=>[@Tag.load(:id=>7, :tid1=>3, :tid2=>4), @Tag.load(:id=>8, :tid1=>5, :tid2=>6)]).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'A') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id IN (7, 8)))))"
|
2978
3315
|
end
|
2979
3316
|
|
2980
3317
|
it "should be able to filter on multiple many_to_one associations with block and composite keys" do
|
2981
|
-
@Album.filter(:b_cartist=>[@Artist.load(:id=>7, :id1=>3, :id2=>4), @Artist.load(:id=>8, :id1=>5, :id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((
|
3318
|
+
@Album.filter(:b_cartist=>[@Artist.load(:id=>7, :id1=>3, :id2=>4), @Artist.load(:id=>8, :id1=>5, :id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'B') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id IN (7, 8)))))"
|
2982
3319
|
end
|
2983
3320
|
|
2984
3321
|
it "should be able to filter on multiple one_to_many associations with block and composite keys" do
|
2985
|
-
@Album.filter(:b_ctracks=>[@Track.load(:id=>7, :album_id1=>3, :album_id2=>4), @Track.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((
|
3322
|
+
@Album.filter(:b_ctracks=>[@Track.load(:id=>7, :album_id1=>3, :album_id2=>4), @Track.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((name = 'B') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (7, 8)))))"
|
2986
3323
|
end
|
2987
3324
|
|
2988
3325
|
it "should be able to filter on multiple one_to_one associations with block and composite keys" do
|
2989
|
-
@Album.filter(:b_calbum_info=>[@AlbumInfo.load(:id=>7, :album_id1=>3, :album_id2=>4), @AlbumInfo.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((
|
3326
|
+
@Album.filter(:b_calbum_info=>[@AlbumInfo.load(:id=>7, :album_id1=>3, :album_id2=>4), @AlbumInfo.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id IN (7, 8)))))"
|
2990
3327
|
end
|
2991
3328
|
|
2992
3329
|
it "should be able to filter on multiple many_to_many associations with block and composite keys" do
|
2993
|
-
@Album.filter(:b_ctags=>[@Tag.load(:id=>7, :tid1=>3, :tid2=>4), @Tag.load(:id=>8, :tid1=>5, :tid2=>6)]).sql.should == "SELECT * FROM albums WHERE ((
|
3330
|
+
@Album.filter(:b_ctags=>[@Tag.load(:id=>7, :tid1=>3, :tid2=>4), @Tag.load(:id=>8, :tid1=>5, :tid2=>6)]).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'B') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id IN (7, 8)))))"
|
2994
3331
|
end
|
2995
3332
|
|
2996
3333
|
it "should be able to exclude on multiple many_to_one associations" do
|
@@ -3010,35 +3347,35 @@ describe "Filtering by associations" do
|
|
3010
3347
|
end
|
3011
3348
|
|
3012
3349
|
it "should be able to exclude on multiple many_to_one associations with :conditions" do
|
3013
|
-
@Album.exclude(:a_artist=>[@Artist.load(:id=>3), @Artist.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id NOT IN (
|
3350
|
+
@Album.exclude(:a_artist=>[@Artist.load(:id=>3), @Artist.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id NOT IN (SELECT artists.id FROM artists WHERE ((name = 'A') AND (artists.id IS NOT NULL) AND (artists.id IN (3, 4))))) OR (albums.artist_id IS NULL))"
|
3014
3351
|
end
|
3015
3352
|
|
3016
3353
|
it "should be able to exclude on multiple one_to_many associations with :conditions" do
|
3017
|
-
@Album.exclude(:a_tracks=>[@Track.load(:id=>5, :album_id=>3), @Track.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (
|
3354
|
+
@Album.exclude(:a_tracks=>[@Track.load(:id=>5, :album_id=>3), @Track.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'A') AND (tracks.album_id IS NOT NULL) AND (tracks.id IN (5, 6))))) OR (albums.id IS NULL))"
|
3018
3355
|
end
|
3019
3356
|
|
3020
3357
|
it "should be able to exclude on multiple one_to_one associations with :conditions" do
|
3021
|
-
@Album.exclude(:a_album_info=>[@AlbumInfo.load(:id=>5, :album_id=>3), @AlbumInfo.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (
|
3358
|
+
@Album.exclude(:a_album_info=>[@AlbumInfo.load(:id=>5, :album_id=>3), @AlbumInfo.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id IN (5, 6))))) OR (albums.id IS NULL))"
|
3022
3359
|
end
|
3023
3360
|
|
3024
3361
|
it "should be able to exclude on multiple many_to_many associations with :conditions" do
|
3025
|
-
@Album.exclude(:a_tags=>[@Tag.load(:id=>3), @Tag.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM
|
3362
|
+
@Album.exclude(:a_tags=>[@Tag.load(:id=>3), @Tag.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((name = 'A') AND (albums_tags.album_id IS NOT NULL) AND (tags.id IN (3, 4))))) OR (albums.id IS NULL))"
|
3026
3363
|
end
|
3027
3364
|
|
3028
3365
|
it "should be able to exclude on multiple many_to_one associations with block" do
|
3029
|
-
@Album.exclude(:b_artist=>[@Artist.load(:id=>3), @Artist.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id NOT IN (
|
3366
|
+
@Album.exclude(:b_artist=>[@Artist.load(:id=>3), @Artist.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id NOT IN (SELECT artists.id FROM artists WHERE ((name = 'B') AND (artists.id IS NOT NULL) AND (artists.id IN (3, 4))))) OR (albums.artist_id IS NULL))"
|
3030
3367
|
end
|
3031
3368
|
|
3032
3369
|
it "should be able to exclude on multiple one_to_many associations with block" do
|
3033
|
-
@Album.exclude(:b_tracks=>[@Track.load(:id=>5, :album_id=>3), @Track.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (
|
3370
|
+
@Album.exclude(:b_tracks=>[@Track.load(:id=>5, :album_id=>3), @Track.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'B') AND (tracks.album_id IS NOT NULL) AND (tracks.id IN (5, 6))))) OR (albums.id IS NULL))"
|
3034
3371
|
end
|
3035
3372
|
|
3036
3373
|
it "should be able to exclude on multiple one_to_one associations with block" do
|
3037
|
-
@Album.exclude(:b_album_info=>[@AlbumInfo.load(:id=>5, :album_id=>3), @AlbumInfo.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (
|
3374
|
+
@Album.exclude(:b_album_info=>[@AlbumInfo.load(:id=>5, :album_id=>3), @AlbumInfo.load(:id=>6, :album_id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id IN (5, 6))))) OR (albums.id IS NULL))"
|
3038
3375
|
end
|
3039
3376
|
|
3040
3377
|
it "should be able to exclude on multiple many_to_many associations with block" do
|
3041
|
-
@Album.exclude(:b_tags=>[@Tag.load(:id=>3), @Tag.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM
|
3378
|
+
@Album.exclude(:b_tags=>[@Tag.load(:id=>3), @Tag.load(:id=>4)]).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((name = 'B') AND (albums_tags.album_id IS NOT NULL) AND (tags.id IN (3, 4))))) OR (albums.id IS NULL))"
|
3042
3379
|
end
|
3043
3380
|
|
3044
3381
|
it "should be able to exclude on multiple many_to_one associations with composite keys" do
|
@@ -3058,35 +3395,35 @@ describe "Filtering by associations" do
|
|
3058
3395
|
end
|
3059
3396
|
|
3060
3397
|
it "should be able to exclude on multiple many_to_one associations with :conditions and composite keys" do
|
3061
|
-
@Album.exclude(:a_cartist=>[@Artist.load(:id=>7, :id1=>3, :id2=>4), @Artist.load(:id=>8, :id1=>5, :id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) NOT IN (
|
3398
|
+
@Album.exclude(:a_cartist=>[@Artist.load(:id=>7, :id1=>3, :id2=>4), @Artist.load(:id=>8, :id1=>5, :id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) NOT IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'A') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id IN (7, 8))))) OR (albums.artist_id1 IS NULL) OR (albums.artist_id2 IS NULL))"
|
3062
3399
|
end
|
3063
3400
|
|
3064
3401
|
it "should be able to exclude on multiple one_to_many associations with :conditions and composite keys" do
|
3065
|
-
@Album.exclude(:a_ctracks=>[@Track.load(:id=>7, :album_id1=>3, :album_id2=>4), @Track.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (
|
3402
|
+
@Album.exclude(:a_ctracks=>[@Track.load(:id=>7, :album_id1=>3, :album_id2=>4), @Track.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((name = 'A') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (7, 8))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3066
3403
|
end
|
3067
3404
|
|
3068
3405
|
it "should be able to exclude on multiple one_to_one associations with :conditions and composite keys" do
|
3069
|
-
@Album.exclude(:a_calbum_info=>[@AlbumInfo.load(:id=>7, :album_id1=>3, :album_id2=>4), @AlbumInfo.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (
|
3406
|
+
@Album.exclude(:a_calbum_info=>[@AlbumInfo.load(:id=>7, :album_id1=>3, :album_id2=>4), @AlbumInfo.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id IN (7, 8))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3070
3407
|
end
|
3071
3408
|
|
3072
|
-
it "should be able to exclude on multiple many_to_many associations with
|
3073
|
-
@Album.exclude(:a_ctags=>[@Tag.load(:id=>7, :tid1=>3, :tid2=>4), @Tag.load(:id=>8, :tid1=>5, :tid2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM
|
3409
|
+
it "should be able to exclude on multiple many_to_many associations with :conditions and composite keys" do
|
3410
|
+
@Album.exclude(:a_ctags=>[@Tag.load(:id=>7, :tid1=>3, :tid2=>4), @Tag.load(:id=>8, :tid1=>5, :tid2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'A') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id IN (7, 8))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3074
3411
|
end
|
3075
3412
|
|
3076
3413
|
it "should be able to exclude on multiple many_to_one associations with block and composite keys" do
|
3077
|
-
@Album.exclude(:b_cartist=>[@Artist.load(:id=>7, :id1=>3, :id2=>4), @Artist.load(:id=>8, :id1=>5, :id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) NOT IN (
|
3414
|
+
@Album.exclude(:b_cartist=>[@Artist.load(:id=>7, :id1=>3, :id2=>4), @Artist.load(:id=>8, :id1=>5, :id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) NOT IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'B') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id IN (7, 8))))) OR (albums.artist_id1 IS NULL) OR (albums.artist_id2 IS NULL))"
|
3078
3415
|
end
|
3079
3416
|
|
3080
3417
|
it "should be able to exclude on multiple one_to_many associations with block and composite keys" do
|
3081
|
-
@Album.exclude(:b_ctracks=>[@Track.load(:id=>7, :album_id1=>3, :album_id2=>4), @Track.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (
|
3418
|
+
@Album.exclude(:b_ctracks=>[@Track.load(:id=>7, :album_id1=>3, :album_id2=>4), @Track.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((name = 'B') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (7, 8))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3082
3419
|
end
|
3083
3420
|
|
3084
3421
|
it "should be able to exclude on multiple one_to_one associations with block and composite keys" do
|
3085
|
-
@Album.exclude(:b_calbum_info=>[@AlbumInfo.load(:id=>7, :album_id1=>3, :album_id2=>4), @AlbumInfo.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (
|
3422
|
+
@Album.exclude(:b_calbum_info=>[@AlbumInfo.load(:id=>7, :album_id1=>3, :album_id2=>4), @AlbumInfo.load(:id=>8, :album_id1=>5, :album_id2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id IN (7, 8))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3086
3423
|
end
|
3087
3424
|
|
3088
3425
|
it "should be able to exclude on multiple many_to_many associations with block and composite keys" do
|
3089
|
-
@Album.exclude(:b_ctags=>[@Tag.load(:id=>7, :tid1=>3, :tid2=>4), @Tag.load(:id=>8, :tid1=>5, :tid2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM
|
3426
|
+
@Album.exclude(:b_ctags=>[@Tag.load(:id=>7, :tid1=>3, :tid2=>4), @Tag.load(:id=>8, :tid1=>5, :tid2=>6)]).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'B') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id IN (7, 8))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3090
3427
|
end
|
3091
3428
|
|
3092
3429
|
it "should be able to handle NULL values when filtering many_to_one associations" do
|
@@ -3266,35 +3603,35 @@ describe "Filtering by associations" do
|
|
3266
3603
|
end
|
3267
3604
|
|
3268
3605
|
it "should be able to filter on many_to_one association datasets with :conditions" do
|
3269
|
-
@Album.filter(:a_artist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (
|
3606
|
+
@Album.filter(:a_artist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists WHERE ((name = 'A') AND (artists.id IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (x = 1))))))"
|
3270
3607
|
end
|
3271
3608
|
|
3272
3609
|
it "should be able to filter on one_to_many association datasets with :conditions" do
|
3273
|
-
@Album.filter(:a_tracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (
|
3610
|
+
@Album.filter(:a_tracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'A') AND (tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT tracks.id FROM tracks WHERE (x = 1))))))"
|
3274
3611
|
end
|
3275
3612
|
|
3276
3613
|
it "should be able to filter on one_to_one association datasets with :conditions" do
|
3277
|
-
@Album.filter(:a_album_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (
|
3614
|
+
@Album.filter(:a_album_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id IN (SELECT album_infos.id FROM album_infos WHERE (x = 1))))))"
|
3278
3615
|
end
|
3279
3616
|
|
3280
3617
|
it "should be able to filter on many_to_many association datasets with :conditions" do
|
3281
|
-
@Album.filter(:a_tags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (
|
3618
|
+
@Album.filter(:a_tags=>@Tag.filter(:x=>1)).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 ((name = 'A') AND (albums_tags.album_id IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (x = 1))))))"
|
3282
3619
|
end
|
3283
3620
|
|
3284
3621
|
it "should be able to filter on many_to_one association datasets with block" do
|
3285
|
-
@Album.filter(:b_artist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (
|
3622
|
+
@Album.filter(:b_artist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists WHERE ((name = 'B') AND (artists.id IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (x = 1))))))"
|
3286
3623
|
end
|
3287
3624
|
|
3288
3625
|
it "should be able to filter on one_to_many association datasets with block" do
|
3289
|
-
@Album.filter(:b_tracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (
|
3626
|
+
@Album.filter(:b_tracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'B') AND (tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT tracks.id FROM tracks WHERE (x = 1))))))"
|
3290
3627
|
end
|
3291
3628
|
|
3292
3629
|
it "should be able to filter on one_to_one association datasets with block" do
|
3293
|
-
@Album.filter(:b_album_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (
|
3630
|
+
@Album.filter(:b_album_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (albums.id IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id IN (SELECT album_infos.id FROM album_infos WHERE (x = 1))))))"
|
3294
3631
|
end
|
3295
3632
|
|
3296
3633
|
it "should be able to filter on many_to_many association datasets with block" do
|
3297
|
-
@Album.filter(:b_tags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (
|
3634
|
+
@Album.filter(:b_tags=>@Tag.filter(:x=>1)).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 ((name = 'B') AND (albums_tags.album_id IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (x = 1))))))"
|
3298
3635
|
end
|
3299
3636
|
|
3300
3637
|
it "should be able to filter on many_to_one association datasets with composite keys" do
|
@@ -3314,35 +3651,35 @@ describe "Filtering by associations" do
|
|
3314
3651
|
end
|
3315
3652
|
|
3316
3653
|
it "should be able to filter on many_to_one association datasets with :conditions and composite keys" do
|
3317
|
-
@Album.filter(:a_cartist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((
|
3654
|
+
@Album.filter(:a_cartist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'A') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (x = 1))))))"
|
3318
3655
|
end
|
3319
3656
|
|
3320
3657
|
it "should be able to filter on one_to_many association datasets with :conditions and composite keys" do
|
3321
|
-
@Album.filter(:a_ctracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((
|
3658
|
+
@Album.filter(:a_ctracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((name = 'A') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (SELECT tracks.id FROM tracks WHERE (x = 1))))))"
|
3322
3659
|
end
|
3323
3660
|
|
3324
3661
|
it "should be able to filter on one_to_one association datasets with :conditions and composite keys" do
|
3325
|
-
@Album.filter(:a_calbum_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((
|
3662
|
+
@Album.filter(:a_calbum_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id IN (SELECT album_infos.id FROM album_infos WHERE (x = 1))))))"
|
3326
3663
|
end
|
3327
3664
|
|
3328
3665
|
it "should be able to filter on many_to_many association datasets with :conditions and composite keys" do
|
3329
|
-
@Album.filter(:a_ctags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((
|
3666
|
+
@Album.filter(:a_ctags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'A') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (x = 1))))))"
|
3330
3667
|
end
|
3331
3668
|
|
3332
3669
|
it "should be able to filter on many_to_one association datasets with block and composite keys" do
|
3333
|
-
@Album.filter(:b_cartist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((
|
3670
|
+
@Album.filter(:b_cartist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'B') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (x = 1))))))"
|
3334
3671
|
end
|
3335
3672
|
|
3336
3673
|
it "should be able to filter on one_to_many association datasets with block and composite keys" do
|
3337
|
-
@Album.filter(:b_ctracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((
|
3674
|
+
@Album.filter(:b_ctracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((name = 'B') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (SELECT tracks.id FROM tracks WHERE (x = 1))))))"
|
3338
3675
|
end
|
3339
3676
|
|
3340
3677
|
it "should be able to filter on one_to_one association datasets with block and composite keys" do
|
3341
|
-
@Album.filter(:b_calbum_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((
|
3678
|
+
@Album.filter(:b_calbum_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id IN (SELECT album_infos.id FROM album_infos WHERE (x = 1))))))"
|
3342
3679
|
end
|
3343
3680
|
|
3344
3681
|
it "should be able to filter on many_to_many association datasets with block and composite keys" do
|
3345
|
-
@Album.filter(:b_ctags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((
|
3682
|
+
@Album.filter(:b_ctags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id1, albums.id2) IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'B') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (x = 1))))))"
|
3346
3683
|
end
|
3347
3684
|
|
3348
3685
|
it "should be able to exclude on many_to_one association datasets" do
|
@@ -3362,35 +3699,35 @@ describe "Filtering by associations" do
|
|
3362
3699
|
end
|
3363
3700
|
|
3364
3701
|
it "should be able to exclude on many_to_one association datasets with :conditions" do
|
3365
|
-
@Album.exclude(:a_artist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id NOT IN (SELECT artists.id FROM artists WHERE ((
|
3702
|
+
@Album.exclude(:a_artist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id NOT IN (SELECT artists.id FROM artists WHERE ((name = 'A') AND (artists.id IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (x = 1)))))) OR (albums.artist_id IS NULL))"
|
3366
3703
|
end
|
3367
3704
|
|
3368
3705
|
it "should be able to exclude on one_to_many association datasets with :conditions" do
|
3369
|
-
@Album.exclude(:a_tracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT tracks.album_id FROM tracks WHERE ((
|
3706
|
+
@Album.exclude(:a_tracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'A') AND (tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT tracks.id FROM tracks WHERE (x = 1)))))) OR (albums.id IS NULL))"
|
3370
3707
|
end
|
3371
3708
|
|
3372
3709
|
it "should be able to exclude on one_to_one association datasets with :conditions" do
|
3373
|
-
@Album.exclude(:a_album_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT album_infos.album_id FROM album_infos WHERE ((
|
3710
|
+
@Album.exclude(:a_album_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id IN (SELECT album_infos.id FROM album_infos WHERE (x = 1)))))) OR (albums.id IS NULL))"
|
3374
3711
|
end
|
3375
3712
|
|
3376
3713
|
it "should be able to exclude on many_to_many association datasets with :conditions" do
|
3377
|
-
@Album.exclude(:a_tags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM albums_tags
|
3714
|
+
@Album.exclude(:a_tags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((name = 'A') AND (albums_tags.album_id IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (x = 1)))))) OR (albums.id IS NULL))"
|
3378
3715
|
end
|
3379
3716
|
|
3380
3717
|
it "should be able to exclude on many_to_one association datasets with block" do
|
3381
|
-
@Album.exclude(:b_artist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id NOT IN (SELECT artists.id FROM artists WHERE ((
|
3718
|
+
@Album.exclude(:b_artist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.artist_id NOT IN (SELECT artists.id FROM artists WHERE ((name = 'B') AND (artists.id IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (x = 1)))))) OR (albums.artist_id IS NULL))"
|
3382
3719
|
end
|
3383
3720
|
|
3384
3721
|
it "should be able to exclude on one_to_many association datasets with block" do
|
3385
|
-
@Album.exclude(:b_tracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT tracks.album_id FROM tracks WHERE ((
|
3722
|
+
@Album.exclude(:b_tracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT tracks.album_id FROM tracks WHERE ((name = 'B') AND (tracks.album_id IS NOT NULL) AND (tracks.id IN (SELECT tracks.id FROM tracks WHERE (x = 1)))))) OR (albums.id IS NULL))"
|
3386
3723
|
end
|
3387
3724
|
|
3388
3725
|
it "should be able to exclude on one_to_one association datasets with block" do
|
3389
|
-
@Album.exclude(:b_album_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT album_infos.album_id FROM album_infos WHERE ((
|
3726
|
+
@Album.exclude(:b_album_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT album_infos.album_id FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id IS NOT NULL) AND (album_infos.id IN (SELECT album_infos.id FROM album_infos WHERE (x = 1)))))) OR (albums.id IS NULL))"
|
3390
3727
|
end
|
3391
3728
|
|
3392
3729
|
it "should be able to exclude on many_to_many association datasets with block" do
|
3393
|
-
@Album.exclude(:b_tags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM albums_tags
|
3730
|
+
@Album.exclude(:b_tags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE ((albums.id NOT IN (SELECT albums_tags.album_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((name = 'B') AND (albums_tags.album_id IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (x = 1)))))) OR (albums.id IS NULL))"
|
3394
3731
|
end
|
3395
3732
|
|
3396
3733
|
it "should be able to exclude on many_to_one association datasets with composite keys" do
|
@@ -3410,35 +3747,35 @@ describe "Filtering by associations" do
|
|
3410
3747
|
end
|
3411
3748
|
|
3412
3749
|
it "should be able to exclude on many_to_one association datasets with :conditions and composite keys" do
|
3413
|
-
@Album.exclude(:a_cartist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) NOT IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((
|
3750
|
+
@Album.exclude(:a_cartist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) NOT IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'A') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (x = 1)))))) OR (albums.artist_id1 IS NULL) OR (albums.artist_id2 IS NULL))"
|
3414
3751
|
end
|
3415
3752
|
|
3416
3753
|
it "should be able to exclude on one_to_many association datasets with :conditions and composite keys" do
|
3417
|
-
@Album.exclude(:a_ctracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((
|
3754
|
+
@Album.exclude(:a_ctracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((name = 'A') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (SELECT tracks.id FROM tracks WHERE (x = 1)))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3418
3755
|
end
|
3419
3756
|
|
3420
3757
|
it "should be able to exclude on one_to_one association datasets with :conditions and composite keys" do
|
3421
|
-
@Album.exclude(:a_calbum_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((
|
3758
|
+
@Album.exclude(:a_calbum_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'A') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id IN (SELECT album_infos.id FROM album_infos WHERE (x = 1)))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3422
3759
|
end
|
3423
3760
|
|
3424
3761
|
it "should be able to exclude on many_to_many association datasets with :conditions and composite keys" do
|
3425
|
-
@Album.exclude(:a_ctags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM albums_tags
|
3762
|
+
@Album.exclude(:a_ctags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'A') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (x = 1)))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3426
3763
|
end
|
3427
3764
|
|
3428
3765
|
it "should be able to exclude on many_to_one association datasets with block and composite keys" do
|
3429
|
-
@Album.exclude(:b_cartist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) NOT IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((
|
3766
|
+
@Album.exclude(:b_cartist=>@Artist.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) NOT IN (SELECT artists.id1, artists.id2 FROM artists WHERE ((name = 'B') AND (artists.id1 IS NOT NULL) AND (artists.id2 IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (x = 1)))))) OR (albums.artist_id1 IS NULL) OR (albums.artist_id2 IS NULL))"
|
3430
3767
|
end
|
3431
3768
|
|
3432
3769
|
it "should be able to exclude on one_to_many association datasets with block and composite keys" do
|
3433
|
-
@Album.exclude(:b_ctracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((
|
3770
|
+
@Album.exclude(:b_ctracks=>@Track.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT tracks.album_id1, tracks.album_id2 FROM tracks WHERE ((name = 'B') AND (tracks.album_id1 IS NOT NULL) AND (tracks.album_id2 IS NOT NULL) AND (tracks.id IN (SELECT tracks.id FROM tracks WHERE (x = 1)))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3434
3771
|
end
|
3435
3772
|
|
3436
3773
|
it "should be able to exclude on one_to_one association datasets with block and composite keys" do
|
3437
|
-
@Album.exclude(:b_calbum_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((
|
3774
|
+
@Album.exclude(:b_calbum_info=>@AlbumInfo.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT album_infos.album_id1, album_infos.album_id2 FROM album_infos WHERE ((name = 'B') AND (album_infos.album_id1 IS NOT NULL) AND (album_infos.album_id2 IS NOT NULL) AND (album_infos.id IN (SELECT album_infos.id FROM album_infos WHERE (x = 1)))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3438
3775
|
end
|
3439
3776
|
|
3440
3777
|
it "should be able to exclude on many_to_many association datasets with block and composite keys" do
|
3441
|
-
@Album.exclude(:b_ctags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM albums_tags
|
3778
|
+
@Album.exclude(:b_ctags=>@Tag.filter(:x=>1)).sql.should == "SELECT * FROM albums WHERE (((albums.id1, albums.id2) NOT IN (SELECT albums_tags.album_id1, albums_tags.album_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.tid1) AND (albums_tags.tag_id2 = tags.tid2)) WHERE ((name = 'B') AND (albums_tags.album_id1 IS NOT NULL) AND (albums_tags.album_id2 IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (x = 1)))))) OR (albums.id1 IS NULL) OR (albums.id2 IS NULL))"
|
3442
3779
|
end
|
3443
3780
|
|
3444
3781
|
it "should do a regular IN query if the dataset for a different model is used" do
|
@@ -3535,11 +3872,11 @@ describe "Sequel::Model Associations with clashing column names" do
|
|
3535
3872
|
@Foo.many_to_many :mtmbars, :clone=>:mtmbars, :conditions=>{:name=>'A'}
|
3536
3873
|
@Bar.many_to_many :mtmfoos, :clone=>:mtmfoos, :conditions=>{:name=>'A'}
|
3537
3874
|
|
3538
|
-
@Bar.where(:foo=>@foo).sql.should == "SELECT * FROM bars WHERE (
|
3539
|
-
@Foo.where(:bars=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3540
|
-
@Foo.where(:bar=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3541
|
-
@Foo.where(:mtmbars=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3542
|
-
@Bar.where(:mtmfoos=>@foo).sql.should == "SELECT * FROM bars WHERE (
|
3875
|
+
@Bar.where(:foo=>@foo).sql.should == "SELECT * FROM bars WHERE (bars.object_id IN (SELECT foos.object_id FROM foos WHERE ((name = 'A') AND (foos.object_id IS NOT NULL) AND (foos.id = 1))))"
|
3876
|
+
@Foo.where(:bars=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_id IN (SELECT bars.object_id FROM bars WHERE ((name = 'A') AND (bars.object_id IS NOT NULL) AND (bars.id = 1))))"
|
3877
|
+
@Foo.where(:bar=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_id IN (SELECT bars.object_id FROM bars WHERE ((name = 'A') AND (bars.object_id IS NOT NULL) AND (bars.id = 1))))"
|
3878
|
+
@Foo.where(:mtmbars=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_id IN (SELECT bars_foos.foo_id FROM bars INNER JOIN bars_foos ON (bars_foos.object_id = bars.object_id) WHERE ((name = 'A') AND (bars_foos.foo_id IS NOT NULL) AND (bars.id = 1))))"
|
3879
|
+
@Bar.where(:mtmfoos=>@foo).sql.should == "SELECT * FROM bars WHERE (bars.object_id IN (SELECT bars_foos.object_id FROM foos INNER JOIN bars_foos ON (bars_foos.foo_id = foos.object_id) WHERE ((name = 'A') AND (bars_foos.object_id IS NOT NULL) AND (foos.id = 1))))"
|
3543
3880
|
end
|
3544
3881
|
|
3545
3882
|
it "should have working filter by associations for associations with block with model instances" do
|
@@ -3550,11 +3887,11 @@ describe "Sequel::Model Associations with clashing column names" do
|
|
3550
3887
|
@Foo.many_to_many :mtmbars, :clone=>:mtmbars, &b
|
3551
3888
|
@Bar.many_to_many :mtmfoos, :clone=>:mtmfoos, &b
|
3552
3889
|
|
3553
|
-
@Bar.where(:foo=>@foo).sql.should == "SELECT * FROM bars WHERE (
|
3554
|
-
@Foo.where(:bars=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3555
|
-
@Foo.where(:bar=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3556
|
-
@Foo.where(:mtmbars=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3557
|
-
@Bar.where(:mtmfoos=>@foo).sql.should == "SELECT * FROM bars WHERE (
|
3890
|
+
@Bar.where(:foo=>@foo).sql.should == "SELECT * FROM bars WHERE (bars.object_id IN (SELECT foos.object_id FROM foos WHERE ((name = 'A') AND (foos.object_id IS NOT NULL) AND (foos.id = 1))))"
|
3891
|
+
@Foo.where(:bars=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_id IN (SELECT bars.object_id FROM bars WHERE ((name = 'A') AND (bars.object_id IS NOT NULL) AND (bars.id = 1))))"
|
3892
|
+
@Foo.where(:bar=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_id IN (SELECT bars.object_id FROM bars WHERE ((name = 'A') AND (bars.object_id IS NOT NULL) AND (bars.id = 1))))"
|
3893
|
+
@Foo.where(:mtmbars=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_id IN (SELECT bars_foos.foo_id FROM bars INNER JOIN bars_foos ON (bars_foos.object_id = bars.object_id) WHERE ((name = 'A') AND (bars_foos.foo_id IS NOT NULL) AND (bars.id = 1))))"
|
3894
|
+
@Bar.where(:mtmfoos=>@foo).sql.should == "SELECT * FROM bars WHERE (bars.object_id IN (SELECT bars_foos.object_id FROM foos INNER JOIN bars_foos ON (bars_foos.foo_id = foos.object_id) WHERE ((name = 'A') AND (bars_foos.object_id IS NOT NULL) AND (foos.id = 1))))"
|
3558
3895
|
end
|
3559
3896
|
|
3560
3897
|
it "should have working modification methods" do
|
@@ -3684,11 +4021,11 @@ describe "Sequel::Model Associations with non-column expression keys" do
|
|
3684
4021
|
@Foo.many_to_many :mtmbars, :clone=>:mtmbars, :conditions=>{:name=>'A'}
|
3685
4022
|
@Bar.many_to_many :mtmfoos, :clone=>:mtmfoos, :conditions=>{:name=>'A'}
|
3686
4023
|
|
3687
|
-
@Bar.where(:foo=>@foo).sql.should == "SELECT * FROM bars WHERE (
|
3688
|
-
@Foo.where(:bars=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3689
|
-
@Foo.where(:bar=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3690
|
-
@Foo.where(:mtmbars=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3691
|
-
@Bar.where(:mtmfoos=>@foo).sql.should == "SELECT * FROM bars WHERE (
|
4024
|
+
@Bar.where(:foo=>@foo).sql.should == "SELECT * FROM bars WHERE (bars.object_ids[0] IN (SELECT foos.object_ids[0] FROM foos WHERE ((name = 'A') AND (foos.object_ids[0] IS NOT NULL) AND (foos.id = 1))))"
|
4025
|
+
@Foo.where(:bars=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_ids[0] IN (SELECT bars.object_ids[0] FROM bars WHERE ((name = 'A') AND (bars.object_ids[0] IS NOT NULL) AND (bars.id = 1))))"
|
4026
|
+
@Foo.where(:bar=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_ids[0] IN (SELECT bars.object_ids[0] FROM bars WHERE ((name = 'A') AND (bars.object_ids[0] IS NOT NULL) AND (bars.id = 1))))"
|
4027
|
+
@Foo.where(:mtmbars=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_ids[0] IN (SELECT bars_foos.foo_ids[0] FROM bars INNER JOIN bars_foos ON (bars_foos.bar_ids[0] = bars.object_ids[0]) WHERE ((name = 'A') AND (bars_foos.foo_ids[0] IS NOT NULL) AND (bars.id = 1))))"
|
4028
|
+
@Bar.where(:mtmfoos=>@foo).sql.should == "SELECT * FROM bars WHERE (bars.object_ids[0] IN (SELECT bars_foos.bar_ids[0] FROM foos INNER JOIN bars_foos ON (bars_foos.foo_ids[0] = foos.object_ids[0]) WHERE ((name = 'A') AND (bars_foos.bar_ids[0] IS NOT NULL) AND (foos.id = 1))))"
|
3692
4029
|
end
|
3693
4030
|
|
3694
4031
|
it "should have working filter by associations for associations with block with model instances" do
|
@@ -3699,11 +4036,11 @@ describe "Sequel::Model Associations with non-column expression keys" do
|
|
3699
4036
|
@Foo.many_to_many :mtmbars, :clone=>:mtmbars, &b
|
3700
4037
|
@Bar.many_to_many :mtmfoos, :clone=>:mtmfoos, &b
|
3701
4038
|
|
3702
|
-
@Bar.where(:foo=>@foo).sql.should == "SELECT * FROM bars WHERE (
|
3703
|
-
@Foo.where(:bars=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3704
|
-
@Foo.where(:bar=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3705
|
-
@Foo.where(:mtmbars=>@bar).sql.should == "SELECT * FROM foos WHERE (
|
3706
|
-
@Bar.where(:mtmfoos=>@foo).sql.should == "SELECT * FROM bars WHERE (
|
4039
|
+
@Bar.where(:foo=>@foo).sql.should == "SELECT * FROM bars WHERE (bars.object_ids[0] IN (SELECT foos.object_ids[0] FROM foos WHERE ((name = 'A') AND (foos.object_ids[0] IS NOT NULL) AND (foos.id = 1))))"
|
4040
|
+
@Foo.where(:bars=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_ids[0] IN (SELECT bars.object_ids[0] FROM bars WHERE ((name = 'A') AND (bars.object_ids[0] IS NOT NULL) AND (bars.id = 1))))"
|
4041
|
+
@Foo.where(:bar=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_ids[0] IN (SELECT bars.object_ids[0] FROM bars WHERE ((name = 'A') AND (bars.object_ids[0] IS NOT NULL) AND (bars.id = 1))))"
|
4042
|
+
@Foo.where(:mtmbars=>@bar).sql.should == "SELECT * FROM foos WHERE (foos.object_ids[0] IN (SELECT bars_foos.foo_ids[0] FROM bars INNER JOIN bars_foos ON (bars_foos.bar_ids[0] = bars.object_ids[0]) WHERE ((name = 'A') AND (bars_foos.foo_ids[0] IS NOT NULL) AND (bars.id = 1))))"
|
4043
|
+
@Bar.where(:mtmfoos=>@foo).sql.should == "SELECT * FROM bars WHERE (bars.object_ids[0] IN (SELECT bars_foos.bar_ids[0] FROM foos INNER JOIN bars_foos ON (bars_foos.foo_ids[0] = foos.object_ids[0]) WHERE ((name = 'A') AND (bars_foos.bar_ids[0] IS NOT NULL) AND (foos.id = 1))))"
|
3707
4044
|
end
|
3708
4045
|
|
3709
4046
|
it "should have working filter by associations with model datasets" do
|