sequel 4.7.0 → 4.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|