sequel 4.9.0 → 4.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +79 -1
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/Rakefile +2 -12
- data/bin/sequel +1 -0
- data/doc/advanced_associations.rdoc +82 -25
- data/doc/association_basics.rdoc +21 -22
- data/doc/core_extensions.rdoc +1 -1
- data/doc/opening_databases.rdoc +7 -0
- data/doc/release_notes/4.10.0.txt +226 -0
- data/doc/security.rdoc +1 -0
- data/doc/testing.rdoc +7 -7
- data/doc/transactions.rdoc +8 -0
- data/lib/sequel/adapters/jdbc.rb +160 -168
- data/lib/sequel/adapters/jdbc/db2.rb +17 -18
- data/lib/sequel/adapters/jdbc/derby.rb +5 -28
- data/lib/sequel/adapters/jdbc/h2.rb +11 -22
- data/lib/sequel/adapters/jdbc/hsqldb.rb +31 -18
- data/lib/sequel/adapters/jdbc/jtds.rb +0 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +36 -35
- data/lib/sequel/adapters/jdbc/postgresql.rb +72 -90
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +18 -16
- data/lib/sequel/adapters/jdbc/sqlite.rb +7 -0
- data/lib/sequel/adapters/jdbc/sqlserver.rb +10 -30
- data/lib/sequel/adapters/jdbc/transactions.rb +5 -6
- data/lib/sequel/adapters/openbase.rb +1 -7
- data/lib/sequel/adapters/postgres.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +3 -6
- data/lib/sequel/adapters/shared/cubrid.rb +24 -9
- data/lib/sequel/adapters/shared/db2.rb +13 -5
- data/lib/sequel/adapters/shared/firebird.rb +16 -16
- data/lib/sequel/adapters/shared/informix.rb +2 -5
- data/lib/sequel/adapters/shared/mssql.rb +72 -63
- data/lib/sequel/adapters/shared/mysql.rb +72 -40
- data/lib/sequel/adapters/shared/oracle.rb +27 -15
- data/lib/sequel/adapters/shared/postgres.rb +24 -44
- data/lib/sequel/adapters/shared/progress.rb +1 -5
- data/lib/sequel/adapters/shared/sqlanywhere.rb +26 -18
- data/lib/sequel/adapters/shared/sqlite.rb +21 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -1
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +8 -2
- data/lib/sequel/adapters/utils/split_alter_table.rb +8 -0
- data/lib/sequel/core.rb +14 -9
- data/lib/sequel/database/dataset_defaults.rb +1 -0
- data/lib/sequel/database/misc.rb +12 -0
- data/lib/sequel/database/query.rb +4 -1
- data/lib/sequel/database/schema_methods.rb +3 -2
- data/lib/sequel/database/transactions.rb +47 -17
- data/lib/sequel/dataset/features.rb +12 -2
- data/lib/sequel/dataset/mutation.rb +2 -0
- data/lib/sequel/dataset/placeholder_literalizer.rb +12 -4
- data/lib/sequel/dataset/prepared_statements.rb +6 -0
- data/lib/sequel/dataset/query.rb +1 -1
- data/lib/sequel/dataset/sql.rb +132 -70
- data/lib/sequel/extensions/columns_introspection.rb +1 -1
- data/lib/sequel/extensions/null_dataset.rb +8 -4
- data/lib/sequel/extensions/pg_array.rb +4 -4
- data/lib/sequel/extensions/pg_row.rb +1 -0
- data/lib/sequel/model/associations.rb +468 -188
- data/lib/sequel/model/base.rb +88 -13
- data/lib/sequel/plugins/association_pks.rb +23 -64
- data/lib/sequel/plugins/auto_validations.rb +3 -2
- data/lib/sequel/plugins/dataset_associations.rb +1 -3
- data/lib/sequel/plugins/many_through_many.rb +18 -65
- data/lib/sequel/plugins/pg_array_associations.rb +97 -86
- data/lib/sequel/plugins/prepared_statements.rb +2 -1
- data/lib/sequel/plugins/prepared_statements_associations.rb +36 -27
- data/lib/sequel/plugins/rcte_tree.rb +12 -16
- data/lib/sequel/plugins/sharding.rb +21 -3
- data/lib/sequel/plugins/single_table_inheritance.rb +2 -1
- data/lib/sequel/plugins/subclasses.rb +1 -9
- data/lib/sequel/plugins/tactical_eager_loading.rb +9 -0
- data/lib/sequel/plugins/tree.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +57 -15
- data/spec/adapters/mysql_spec.rb +11 -0
- data/spec/bin_spec.rb +2 -2
- data/spec/core/database_spec.rb +38 -4
- data/spec/core/dataset_spec.rb +45 -7
- data/spec/core/placeholder_literalizer_spec.rb +17 -0
- data/spec/core/schema_spec.rb +6 -1
- data/spec/extensions/active_model_spec.rb +18 -9
- data/spec/extensions/association_pks_spec.rb +20 -18
- data/spec/extensions/association_proxies_spec.rb +9 -9
- data/spec/extensions/auto_validations_spec.rb +6 -0
- data/spec/extensions/columns_introspection_spec.rb +1 -0
- data/spec/extensions/constraint_validations_spec.rb +3 -1
- data/spec/extensions/many_through_many_spec.rb +191 -111
- data/spec/extensions/pg_array_associations_spec.rb +133 -103
- data/spec/extensions/prepared_statements_associations_spec.rb +23 -4
- data/spec/extensions/rcte_tree_spec.rb +35 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -1
- data/spec/extensions/sharding_spec.rb +2 -2
- data/spec/extensions/tactical_eager_loading_spec.rb +4 -0
- data/spec/extensions/to_dot_spec.rb +1 -0
- data/spec/extensions/touch_spec.rb +2 -2
- data/spec/integration/associations_test.rb +130 -37
- data/spec/integration/dataset_test.rb +17 -0
- data/spec/integration/model_test.rb +17 -0
- data/spec/integration/schema_test.rb +14 -0
- data/spec/integration/transaction_test.rb +25 -1
- data/spec/model/association_reflection_spec.rb +63 -24
- data/spec/model/associations_spec.rb +104 -57
- data/spec/model/base_spec.rb +14 -1
- data/spec/model/class_dataset_methods_spec.rb +1 -0
- data/spec/model/eager_loading_spec.rb +221 -74
- data/spec/model/model_spec.rb +119 -1
- metadata +4 -2
@@ -2,14 +2,15 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
3
3
|
describe Sequel::Model, "pg_array_associations" do
|
4
4
|
before do
|
5
|
-
|
5
|
+
@db = Sequel.mock(:numrows=>1)
|
6
|
+
class ::Artist < Sequel::Model(@db)
|
6
7
|
attr_accessor :yyy
|
7
8
|
columns :id, :tag_ids
|
8
9
|
plugin :pg_array_associations
|
9
10
|
pg_array_to_many :tags
|
10
11
|
pg_array_to_many :a_tags, :clone=>:tags, :conditions=>{:name=>'A'}, :key=>:tag_ids
|
11
12
|
end
|
12
|
-
class ::Tag < Sequel::Model
|
13
|
+
class ::Tag < Sequel::Model(@db)
|
13
14
|
columns :id
|
14
15
|
plugin :pg_array_associations
|
15
16
|
many_to_pg_array :artists
|
@@ -26,7 +27,7 @@ describe Sequel::Model, "pg_array_associations" do
|
|
26
27
|
@o2 = @c2.first
|
27
28
|
@n1 = @c1.new
|
28
29
|
@n2 = @c2.new
|
29
|
-
|
30
|
+
@db.sqls
|
30
31
|
end
|
31
32
|
after do
|
32
33
|
Object.send(:remove_const, :Artist)
|
@@ -47,24 +48,24 @@ describe Sequel::Model, "pg_array_associations" do
|
|
47
48
|
@n1.tags.should == []
|
48
49
|
@c1.load(:tag_ids=>[]).tags.should == []
|
49
50
|
@n2.artists.should == []
|
50
|
-
|
51
|
+
@db.sqls.should == []
|
51
52
|
end
|
52
53
|
|
53
54
|
it "should use correct SQL when loading associations lazily" do
|
54
55
|
@o1.tags.should == [@o2]
|
55
56
|
@o2.artists.should == [@o1]
|
56
|
-
|
57
|
+
@db.sqls.should == ["SELECT * FROM tags WHERE (tags.id IN (1, 2, 3))", "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[])"]
|
57
58
|
end
|
58
59
|
|
59
60
|
it "should accept :primary_key option for primary keys to use in current and associated table" do
|
60
61
|
@c1.pg_array_to_many :tags, :clone=>:tags, :primary_key=>Sequel./(:id, 3)
|
61
62
|
@c2.many_to_pg_array :artists, :clone=>:artists, :primary_key=>:id3
|
62
63
|
@o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE ((tags.id / 3) IN (1, 2, 3))"
|
63
|
-
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[6])"
|
64
|
+
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[6]::integer[])"
|
64
65
|
end
|
65
66
|
|
66
67
|
it "should allowing filtering by associations" do
|
67
|
-
@c1.filter(:tags=>@o2).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2])"
|
68
|
+
@c1.filter(:tags=>@o2).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[])"
|
68
69
|
@c2.filter(:artists=>@o1).sql.should == "SELECT * FROM tags WHERE (tags.id IN (1, 2, 3))"
|
69
70
|
end
|
70
71
|
|
@@ -74,7 +75,7 @@ describe Sequel::Model, "pg_array_associations" do
|
|
74
75
|
end
|
75
76
|
|
76
77
|
it "should allowing excluding by associations" do
|
77
|
-
@c1.exclude(:tags=>@o2).sql.should == "SELECT * FROM artists WHERE (NOT (artists.tag_ids @> ARRAY[2]) OR (artists.tag_ids IS NULL))"
|
78
|
+
@c1.exclude(:tags=>@o2).sql.should == "SELECT * FROM artists WHERE (NOT (artists.tag_ids @> ARRAY[2]::integer[]) OR (artists.tag_ids IS NULL))"
|
78
79
|
@c2.exclude(:artists=>@o1).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (1, 2, 3)) OR (tags.id IS NULL))"
|
79
80
|
end
|
80
81
|
|
@@ -84,7 +85,7 @@ describe Sequel::Model, "pg_array_associations" do
|
|
84
85
|
end
|
85
86
|
|
86
87
|
it "should allowing filtering by multiple associations" do
|
87
|
-
@c1.filter(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[1,2])"
|
88
|
+
@c1.filter(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[1,2]::integer[])"
|
88
89
|
@c2.filter(:artists=>[@c1.load(:tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:tag_ids=>Sequel.pg_array([4, 5]))]).sql.should == "SELECT * FROM tags WHERE (tags.id IN (3, 4, 5))"
|
89
90
|
end
|
90
91
|
|
@@ -94,7 +95,7 @@ describe Sequel::Model, "pg_array_associations" do
|
|
94
95
|
end
|
95
96
|
|
96
97
|
it "should allowing excluding by multiple associations" do
|
97
|
-
@c1.exclude(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (NOT (artists.tag_ids && ARRAY[1,2]) OR (artists.tag_ids IS NULL))"
|
98
|
+
@c1.exclude(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (NOT (artists.tag_ids && ARRAY[1,2]::integer[]) OR (artists.tag_ids IS NULL))"
|
98
99
|
@c2.exclude(:artists=>[@c1.load(:tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:tag_ids=>Sequel.pg_array([4, 5]))]).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (3, 4, 5)) OR (tags.id IS NULL))"
|
99
100
|
end
|
100
101
|
|
@@ -112,7 +113,7 @@ describe Sequel::Model, "pg_array_associations" do
|
|
112
113
|
@c2.filter(:artists=>@c1.load(:tag_ids=>[])).sql.should == 'SELECT * FROM tags WHERE \'f\''
|
113
114
|
@c2.exclude(:artists=>@c1.load(:tag_ids=>[])).sql.should == 'SELECT * FROM tags WHERE \'t\''
|
114
115
|
|
115
|
-
@c1.filter(:tags=>[@c2.new, @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2])"
|
116
|
+
@c1.filter(:tags=>[@c2.new, @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"
|
116
117
|
@c2.filter(:artists=>[@c1.load(:tag_ids=>Sequel.pg_array([3, 4])), @c1.new]).sql.should == "SELECT * FROM tags WHERE (tags.id IN (3, 4))"
|
117
118
|
end
|
118
119
|
|
@@ -141,7 +142,7 @@ describe Sequel::Model, "pg_array_associations" do
|
|
141
142
|
@c1.pg_array_to_many :tags, :clone=>:tags, :primary_key=>Sequel.*(:id, 3), :primary_key_method=>:id3, :key=>:tag3_ids, :key_column=>Sequel.pg_array(:tag_ids)[1..2]
|
142
143
|
@c2.many_to_pg_array :artists, :clone=>:artists, :primary_key=>Sequel.*(:id, 3), :primary_key_method=>:id3, :key=>:tag3_ids, :key_column=>Sequel.pg_array(:tag_ids)[1..2]
|
143
144
|
|
144
|
-
@c1.filter(:tags=>@o2).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids[1:2] @> ARRAY[6])"
|
145
|
+
@c1.filter(:tags=>@o2).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids[1:2] @> ARRAY[6]::integer[])"
|
145
146
|
@c2.filter(:artists=>@o1).sql.should == "SELECT * FROM tags WHERE ((tags.id * 3) IN (3, 6, 9))"
|
146
147
|
@c1.filter(:tags=>@c2.where(:id=>1)).sql.should == "SELECT * FROM artists WHERE coalesce((artists.tag_ids[1:2] && (SELECT array_agg((tags.id * 3)) FROM tags WHERE (id = 1))), 'f')"
|
147
148
|
@c2.filter(:artists=>@c1.where(:id=>1)).sql.should == "SELECT * FROM tags WHERE ((tags.id * 3) IN (SELECT unnest(artists.tag_ids[1:2]) FROM artists WHERE (id = 1)))"
|
@@ -152,12 +153,12 @@ describe Sequel::Model, "pg_array_associations" do
|
|
152
153
|
@c2.many_to_pg_array :artists, :clone=>:artists, :key=>:tag2_ids
|
153
154
|
@c1.class_eval{def tag2_ids; tag_ids.map{|x| x * 2} end}
|
154
155
|
@o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE (tags.id IN (2, 4, 6))"
|
155
|
-
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag2_ids @> ARRAY[2])"
|
156
|
+
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag2_ids @> ARRAY[2]::integer[])"
|
156
157
|
end
|
157
158
|
|
158
159
|
it "should support a :key_column option" do
|
159
160
|
@c2.many_to_pg_array :artists, :clone=>:artists, :key_column=>Sequel.pg_array(:tag_ids)[1..2], :key=>:tag2_ids
|
160
|
-
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids[1:2] @> ARRAY[2])"
|
161
|
+
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids[1:2] @> ARRAY[2]::integer[])"
|
161
162
|
end
|
162
163
|
|
163
164
|
it "should support a :primary_key option" do
|
@@ -165,35 +166,35 @@ describe Sequel::Model, "pg_array_associations" do
|
|
165
166
|
@c2.many_to_pg_array :artists, :clone=>:artists, :primary_key=>:id2
|
166
167
|
@o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE (tags.id2 IN (1, 2, 3))"
|
167
168
|
@c2.class_eval{def id2; id*2 end}
|
168
|
-
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[4])"
|
169
|
+
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[4]::integer[])"
|
169
170
|
end
|
170
171
|
|
171
172
|
it "should support a :conditions option" do
|
172
173
|
@c1.pg_array_to_many :tags, :clone=>:tags, :conditions=>{:a=>1}
|
173
174
|
@c2.many_to_pg_array :artists, :clone=>:artists, :conditions=>{:a=>1}
|
174
175
|
@o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE ((a = 1) AND (tags.id IN (1, 2, 3)))"
|
175
|
-
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE ((a = 1) AND (artists.tag_ids @> ARRAY[2]))"
|
176
|
+
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE ((a = 1) AND (artists.tag_ids @> ARRAY[2]::integer[]))"
|
176
177
|
end
|
177
178
|
|
178
179
|
it "should support an :order option" do
|
179
180
|
@c1.pg_array_to_many :tags, :clone=>:tags, :order=>[:a, :b]
|
180
181
|
@c2.many_to_pg_array :artists, :clone=>:artists, :order=>[:a, :b]
|
181
182
|
@o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE (tags.id IN (1, 2, 3)) ORDER BY a, b"
|
182
|
-
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]) ORDER BY a, b"
|
183
|
+
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[]) ORDER BY a, b"
|
183
184
|
end
|
184
185
|
|
185
186
|
it "should support a select option" do
|
186
187
|
@c1.pg_array_to_many :tags, :clone=>:tags, :select=>[:a, :b]
|
187
188
|
@c2.many_to_pg_array :artists, :clone=>:artists, :select=>[:a, :b]
|
188
189
|
@c1.load(:tag_ids=>Sequel.pg_array([1,2,3])).tags_dataset.sql.should == "SELECT a, b FROM tags WHERE (tags.id IN (1, 2, 3))"
|
189
|
-
@c2.load(:id=>1).artists_dataset.sql.should == "SELECT a, b FROM artists WHERE (artists.tag_ids @> ARRAY[1])"
|
190
|
+
@c2.load(:id=>1).artists_dataset.sql.should == "SELECT a, b FROM artists WHERE (artists.tag_ids @> ARRAY[1]::integer[])"
|
190
191
|
end
|
191
192
|
|
192
193
|
it "should accept a block" do
|
193
194
|
@c1.pg_array_to_many :tags, :clone=>:tags do |ds| ds.filter(:yyy=>@yyy) end
|
194
195
|
@c2.many_to_pg_array :artists, :clone=>:artists do |ds| ds.filter(:a=>1) end
|
195
196
|
@c1.new(:yyy=>6, :tag_ids=>Sequel.pg_array([1,2,3])).tags_dataset.sql.should == "SELECT * FROM tags WHERE ((tags.id IN (1, 2, 3)) AND (yyy = 6))"
|
196
|
-
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE ((artists.tag_ids @> ARRAY[2]) AND (a = 1))"
|
197
|
+
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE ((artists.tag_ids @> ARRAY[2]::integer[]) AND (a = 1))"
|
197
198
|
end
|
198
199
|
|
199
200
|
it "should support a :dataset option that is used instead of the default" do
|
@@ -207,7 +208,7 @@ describe Sequel::Model, "pg_array_associations" do
|
|
207
208
|
@c1.pg_array_to_many :tags, :clone=>:tags, :limit=>[2, 3]
|
208
209
|
@c2.many_to_pg_array :artists, :clone=>:artists, :limit=>[3, 2]
|
209
210
|
@o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE (tags.id IN (1, 2, 3)) LIMIT 2 OFFSET 3"
|
210
|
-
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]) LIMIT 3 OFFSET 2"
|
211
|
+
@o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[]) LIMIT 3 OFFSET 2"
|
211
212
|
end
|
212
213
|
|
213
214
|
it "should support a :uniq option that removes duplicates from the association" do
|
@@ -237,17 +238,17 @@ describe Sequel::Model, "pg_array_associations" do
|
|
237
238
|
it "should eagerly load correctly" do
|
238
239
|
a = @c1.eager(:tags).all
|
239
240
|
a.should == [@o1]
|
240
|
-
sqls =
|
241
|
+
sqls = @db.sqls
|
241
242
|
sqls.pop.should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
|
242
243
|
sqls.should == ["SELECT * FROM artists"]
|
243
244
|
a.first.tags.should == [@o2]
|
244
|
-
|
245
|
+
@db.sqls.should == []
|
245
246
|
|
246
247
|
a = @c2.eager(:artists).all
|
247
248
|
a.should == [@o2]
|
248
|
-
|
249
|
+
@db.sqls.should == ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
|
249
250
|
a.first.artists.should == [@o1]
|
250
|
-
|
251
|
+
@db.sqls.should == []
|
251
252
|
end
|
252
253
|
|
253
254
|
it "should support using custom key options when eager loading associations" do
|
@@ -257,28 +258,28 @@ describe Sequel::Model, "pg_array_associations" do
|
|
257
258
|
|
258
259
|
a = @c1.eager(:tags).all
|
259
260
|
a.should == [@o1]
|
260
|
-
sqls =
|
261
|
+
sqls = @db.sqls
|
261
262
|
sqls.pop.should =~ /SELECT \* FROM tags WHERE \(\(tags\.id \* 3\) IN \([369], [369], [369]\)\)/
|
262
263
|
sqls.should == ["SELECT * FROM artists"]
|
263
264
|
a.first.tags.should == [@o2]
|
264
|
-
|
265
|
+
@db.sqls.should == []
|
265
266
|
|
266
267
|
a = @c2.eager(:artists).all
|
267
268
|
a.should == [@o2]
|
268
|
-
|
269
|
+
@db.sqls.should == ["SELECT * FROM tags", "SELECT * FROM artists WHERE (artists.tag_ids[1:2] && ARRAY[6]::integer[])"]
|
269
270
|
a.first.artists.should == [@o1]
|
270
|
-
|
271
|
+
@db.sqls.should == []
|
271
272
|
end
|
272
273
|
|
273
274
|
it "should allow cascading of eager loading for associations of associated models" do
|
274
275
|
a = @c1.eager(:tags=>:artists).all
|
275
276
|
a.should == [@o1]
|
276
|
-
sqls =
|
277
|
+
sqls = @db.sqls
|
277
278
|
sqls.slice!(1).should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
|
278
|
-
sqls.should == ['SELECT * FROM artists', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2])"]
|
279
|
+
sqls.should == ['SELECT * FROM artists', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
|
279
280
|
a.first.tags.should == [@o2]
|
280
281
|
a.first.tags.first.artists.should == [@o1]
|
281
|
-
|
282
|
+
@db.sqls.should == []
|
282
283
|
end
|
283
284
|
|
284
285
|
it "should respect :eager when lazily loading an association" do
|
@@ -286,16 +287,16 @@ describe Sequel::Model, "pg_array_associations" do
|
|
286
287
|
@c2.many_to_pg_array :artists2, :clone=>:artists, :eager=>:tags
|
287
288
|
|
288
289
|
@o1.tags2.should == [@o2]
|
289
|
-
|
290
|
+
@db.sqls.should == ["SELECT * FROM tags WHERE (tags.id IN (1, 2, 3))", "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
|
290
291
|
@o1.tags2.first.artists.should == [@o1]
|
291
|
-
|
292
|
+
@db.sqls.should == []
|
292
293
|
|
293
294
|
@o2.artists2.should == [@o1]
|
294
|
-
sqls =
|
295
|
+
sqls = @db.sqls
|
295
296
|
sqls.pop.should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
|
296
|
-
sqls.should == ["SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2])"]
|
297
|
+
sqls.should == ["SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[])"]
|
297
298
|
@o2.artists2.first.tags.should == [@o2]
|
298
|
-
|
299
|
+
@db.sqls.should == []
|
299
300
|
end
|
300
301
|
|
301
302
|
it "should cascade eagerly loading when the :eager_graph association option is used" do
|
@@ -306,36 +307,36 @@ describe Sequel::Model, "pg_array_associations" do
|
|
306
307
|
@c1.dataset._fetch = {:id=>1, :tags_id=>2, :tag_ids=>Sequel.pg_array([1,2,3])}
|
307
308
|
|
308
309
|
@o1.tags2.should == [@o2]
|
309
|
-
|
310
|
+
@db.sqls.first.should =~ /SELECT tags\.id, artists\.id AS artists_id, artists\.tag_ids FROM tags LEFT OUTER JOIN artists ON \(artists.tag_ids @> ARRAY\[tags.id\]\) WHERE \(tags\.id IN \([123], [123], [123]\)\)/
|
310
311
|
@o1.tags2.first.artists.should == [@o1]
|
311
|
-
|
312
|
+
@db.sqls.should == []
|
312
313
|
|
313
314
|
@o2.artists2.should == [@o1]
|
314
|
-
|
315
|
+
@db.sqls.should == ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id]) WHERE (artists.tag_ids @> ARRAY[2]::integer[])"]
|
315
316
|
@o2.artists2.first.tags.should == [@o2]
|
316
|
-
|
317
|
+
@db.sqls.should == []
|
317
318
|
|
318
319
|
@c2.dataset._fetch = {:id=>2, :artists_id=>1, :tag_ids=>Sequel.pg_array([1,2,3])}
|
319
320
|
@c1.dataset._fetch = {:id=>1, :tag_ids=>Sequel.pg_array([1,2,3])}
|
320
321
|
|
321
322
|
a = @c1.eager(:tags2).all
|
322
|
-
sqls =
|
323
|
+
sqls = @db.sqls
|
323
324
|
sqls.pop.should =~ /SELECT tags\.id, artists\.id AS artists_id, artists\.tag_ids FROM tags LEFT OUTER JOIN artists ON \(artists.tag_ids @> ARRAY\[tags.id\]\) WHERE \(tags\.id IN \([123], [123], [123]\)\)/
|
324
325
|
sqls.should == ["SELECT * FROM artists"]
|
325
326
|
a.should == [@o1]
|
326
327
|
a.first.tags2.should == [@o2]
|
327
328
|
a.first.tags2.first.artists.should == [@o1]
|
328
|
-
|
329
|
+
@db.sqls.should == []
|
329
330
|
|
330
331
|
@c2.dataset._fetch = {:id=>2}
|
331
332
|
@c1.dataset._fetch = {:id=>1, :tags_id=>2, :tag_ids=>Sequel.pg_array([1,2,3])}
|
332
333
|
|
333
334
|
a = @c2.eager(:artists2).all
|
334
|
-
|
335
|
+
@db.sqls.should == ["SELECT * FROM tags", "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id]) WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
|
335
336
|
a.should == [@o2]
|
336
337
|
a.first.artists2.should == [@o1]
|
337
338
|
a.first.artists2.first.tags.should == [@o2]
|
338
|
-
|
339
|
+
@db.sqls.should == []
|
339
340
|
end
|
340
341
|
|
341
342
|
it "should respect the :limit option when eager loading" do
|
@@ -344,29 +345,29 @@ describe Sequel::Model, "pg_array_associations" do
|
|
344
345
|
@c1.pg_array_to_many :tags, :clone=>:tags, :limit=>2
|
345
346
|
a = @c1.eager(:tags).all
|
346
347
|
a.should == [@o1]
|
347
|
-
sqls =
|
348
|
+
sqls = @db.sqls
|
348
349
|
sqls.pop.should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
|
349
350
|
sqls.should == ["SELECT * FROM artists"]
|
350
351
|
a.first.tags.should == [@c2.load(:id=>1), @c2.load(:id=>2)]
|
351
|
-
|
352
|
+
@db.sqls.should == []
|
352
353
|
|
353
354
|
@c1.pg_array_to_many :tags, :clone=>:tags, :limit=>[1, 1]
|
354
355
|
a = @c1.eager(:tags).all
|
355
356
|
a.should == [@o1]
|
356
|
-
sqls =
|
357
|
+
sqls = @db.sqls
|
357
358
|
sqls.pop.should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
|
358
359
|
sqls.should == ["SELECT * FROM artists"]
|
359
360
|
a.first.tags.should == [@c2.load(:id=>2)]
|
360
|
-
|
361
|
+
@db.sqls.should == []
|
361
362
|
|
362
363
|
@c1.pg_array_to_many :tags, :clone=>:tags, :limit=>[nil, 1]
|
363
364
|
a = @c1.eager(:tags).all
|
364
365
|
a.should == [@o1]
|
365
|
-
sqls =
|
366
|
+
sqls = @db.sqls
|
366
367
|
sqls.pop.should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
|
367
368
|
sqls.should == ["SELECT * FROM artists"]
|
368
369
|
a.first.tags.should == [@c2.load(:id=>2), @c2.load(:id=>3)]
|
369
|
-
|
370
|
+
@db.sqls.length.should == 0
|
370
371
|
|
371
372
|
@c2.dataset._fetch = [{:id=>2}]
|
372
373
|
@c1.dataset._fetch = [{:id=>5, :tag_ids=>Sequel.pg_array([1,2,3])},{:id=>6, :tag_ids=>Sequel.pg_array([2,3])}, {:id=>7, :tag_ids=>Sequel.pg_array([1,2])}]
|
@@ -374,23 +375,23 @@ describe Sequel::Model, "pg_array_associations" do
|
|
374
375
|
@c2.many_to_pg_array :artists, :clone=>:artists, :limit=>2
|
375
376
|
a = @c2.eager(:artists).all
|
376
377
|
a.should == [@o2]
|
377
|
-
|
378
|
+
@db.sqls.should == ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
|
378
379
|
a.first.artists.should == [@c1.load(:id=>5, :tag_ids=>Sequel.pg_array([1,2,3])), @c1.load(:id=>6, :tag_ids=>Sequel.pg_array([2,3]))]
|
379
|
-
|
380
|
+
@db.sqls.should == []
|
380
381
|
|
381
382
|
@c2.many_to_pg_array :artists, :clone=>:artists, :limit=>[1, 1]
|
382
383
|
a = @c2.eager(:artists).all
|
383
384
|
a.should == [@o2]
|
384
|
-
|
385
|
+
@db.sqls.should == ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
|
385
386
|
a.first.artists.should == [@c1.load(:id=>6, :tag_ids=>Sequel.pg_array([2,3]))]
|
386
|
-
|
387
|
+
@db.sqls.should == []
|
387
388
|
|
388
389
|
@c2.many_to_pg_array :artists, :clone=>:artists, :limit=>[nil, 1]
|
389
390
|
a = @c2.eager(:artists).all
|
390
391
|
a.should == [@o2]
|
391
|
-
|
392
|
+
@db.sqls.should == ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
|
392
393
|
a.first.artists.should == [@c1.load(:id=>6, :tag_ids=>Sequel.pg_array([2,3])), @c1.load(:id=>7, :tag_ids=>Sequel.pg_array([1,2]))]
|
393
|
-
|
394
|
+
@db.sqls.should == []
|
394
395
|
end
|
395
396
|
|
396
397
|
it "should support association_join" do
|
@@ -403,16 +404,16 @@ describe Sequel::Model, "pg_array_associations" do
|
|
403
404
|
@c1.dataset._fetch = {:id=>1, :tags_id=>2, :tag_ids=>Sequel.pg_array([1,2,3])}
|
404
405
|
|
405
406
|
a = @c1.eager_graph(:tags).all
|
406
|
-
|
407
|
+
@db.sqls.should == ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"]
|
407
408
|
a.should == [@o1]
|
408
409
|
a.first.tags.should == [@o2]
|
409
|
-
|
410
|
+
@db.sqls.should == []
|
410
411
|
|
411
412
|
a = @c2.eager_graph(:artists).all
|
412
|
-
|
413
|
+
@db.sqls.should == ["SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"]
|
413
414
|
a.should == [@o2]
|
414
415
|
a.first.artists.should == [@o1]
|
415
|
-
|
416
|
+
@db.sqls.should == []
|
416
417
|
end
|
417
418
|
|
418
419
|
it "should allow cascading of eager graphing for associations of associated models" do
|
@@ -420,18 +421,18 @@ describe Sequel::Model, "pg_array_associations" do
|
|
420
421
|
@c1.dataset._fetch = {:id=>1, :tags_id=>2, :tag_ids=>Sequel.pg_array([1,2,3]), :artists_0_id=>1, :artists_0_tag_ids=>Sequel.pg_array([1,2,3])}
|
421
422
|
|
422
423
|
a = @c1.eager_graph(:tags=>:artists).all
|
423
|
-
|
424
|
+
@db.sqls.should == ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id, artists_0.id AS artists_0_id, artists_0.tag_ids AS artists_0_tag_ids FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id]) LEFT OUTER JOIN artists AS artists_0 ON (artists_0.tag_ids @> ARRAY[tags.id])"]
|
424
425
|
a.should == [@o1]
|
425
426
|
a.first.tags.should == [@o2]
|
426
427
|
a.first.tags.first.artists.should == [@o1]
|
427
|
-
|
428
|
+
@db.sqls.should == []
|
428
429
|
|
429
430
|
a = @c2.eager_graph(:artists=>:tags).all
|
430
|
-
|
431
|
+
@db.sqls.should == ["SELECT tags.id, artists.id AS artists_id, artists.tag_ids, tags_0.id AS tags_0_id FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id]) LEFT OUTER JOIN tags AS tags_0 ON (artists.tag_ids @> ARRAY[tags_0.id])"]
|
431
432
|
a.should == [@o2]
|
432
433
|
a.first.artists.should == [@o1]
|
433
434
|
a.first.artists.first.tags.should == [@o2]
|
434
|
-
|
435
|
+
@db.sqls.should == []
|
435
436
|
end
|
436
437
|
|
437
438
|
it "eager graphing should respect key options" do
|
@@ -444,15 +445,15 @@ describe Sequel::Model, "pg_array_associations" do
|
|
444
445
|
|
445
446
|
a = @c1.eager_graph(:tags).all
|
446
447
|
a.should == [@o1]
|
447
|
-
|
448
|
+
@db.sqls.should == ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids[1:2] @> ARRAY[(tags.id * 3)])"]
|
448
449
|
a.first.tags.should == [@o2]
|
449
|
-
|
450
|
+
@db.sqls.should == []
|
450
451
|
|
451
452
|
a = @c2.eager_graph(:artists).all
|
452
453
|
a.should == [@o2]
|
453
|
-
|
454
|
+
@db.sqls.should == ["SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids[1:2] @> ARRAY[tags.id3])"]
|
454
455
|
a.first.artists.should == [@o1]
|
455
|
-
|
456
|
+
@db.sqls.should == []
|
456
457
|
end
|
457
458
|
|
458
459
|
it "should respect the association's :graph_select option" do
|
@@ -463,16 +464,16 @@ describe Sequel::Model, "pg_array_associations" do
|
|
463
464
|
@c1.dataset._fetch = {:id=>1, :id2=>2, :tag_ids=>Sequel.pg_array([1,2,3])}
|
464
465
|
|
465
466
|
a = @c1.eager_graph(:tags).all
|
466
|
-
|
467
|
+
@db.sqls.should == ["SELECT artists.id, artists.tag_ids, tags.id2 FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"]
|
467
468
|
a.should == [@o1]
|
468
469
|
a.first.tags.should == [@c2.load(:id2=>2)]
|
469
|
-
|
470
|
+
@db.sqls.should == []
|
470
471
|
|
471
472
|
a = @c2.eager_graph(:artists).all
|
472
|
-
|
473
|
+
@db.sqls.should == ["SELECT tags.id, artists.id AS artists_id FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"]
|
473
474
|
a.should == [@o2]
|
474
475
|
a.first.artists.should == [@c1.load(:id=>1)]
|
475
|
-
|
476
|
+
@db.sqls.should == []
|
476
477
|
end
|
477
478
|
|
478
479
|
it "should respect the association's :graph_join_type option" do
|
@@ -520,34 +521,34 @@ describe Sequel::Model, "pg_array_associations" do
|
|
520
521
|
it "should define an add_ method for adding associated objects" do
|
521
522
|
@o1.add_tag(@c2.load(:id=>4))
|
522
523
|
@o1.tag_ids.should == [1,2,3,4]
|
523
|
-
|
524
|
+
@db.sqls.should == []
|
524
525
|
@o1.save_changes
|
525
|
-
|
526
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1,2,3,4] WHERE (id = 1)"]
|
526
527
|
|
527
528
|
@o2.add_artist(@c1.load(:id=>1, :tag_ids=>Sequel.pg_array([4])))
|
528
|
-
|
529
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[4,2] WHERE (id = 1)"]
|
529
530
|
end
|
530
531
|
|
531
532
|
it "should define a remove_ method for removing associated objects" do
|
532
533
|
@o1.remove_tag(@o2)
|
533
534
|
@o1.tag_ids.should == [1,3]
|
534
|
-
|
535
|
+
@db.sqls.should == []
|
535
536
|
@o1.save_changes
|
536
|
-
|
537
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1,3] WHERE (id = 1)"]
|
537
538
|
|
538
539
|
@o2.remove_artist(@c1.load(:id=>1, :tag_ids=>Sequel.pg_array([1,2,3,4])))
|
539
|
-
|
540
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1,3,4] WHERE (id = 1)"]
|
540
541
|
end
|
541
542
|
|
542
543
|
it "should define a remove_all_ method for removing all associated objects" do
|
543
544
|
@o1.remove_all_tags
|
544
545
|
@o1.tag_ids.should == []
|
545
|
-
|
546
|
+
@db.sqls.should == []
|
546
547
|
@o1.save_changes
|
547
|
-
|
548
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[] WHERE (id = 1)"]
|
548
549
|
|
549
550
|
@o2.remove_all_artists
|
550
|
-
|
551
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = array_remove(tag_ids, 2) WHERE (tag_ids @> ARRAY[2])"]
|
551
552
|
end
|
552
553
|
|
553
554
|
it "should allow calling add_ and remove_ methods on new objects for pg_array_to_many associations" do
|
@@ -567,73 +568,73 @@ describe Sequel::Model, "pg_array_associations" do
|
|
567
568
|
|
568
569
|
@o1.add_tag(@c2.load(:id=>4))
|
569
570
|
@o1.tag_ids.should == [1,2,3,4]
|
570
|
-
|
571
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1,2,3,4] WHERE (id = 1)"]
|
571
572
|
|
572
573
|
@o1.remove_tag(@o2)
|
573
574
|
@o1.tag_ids.should == [1,3,4]
|
574
|
-
|
575
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1,3,4] WHERE (id = 1)"]
|
575
576
|
|
576
577
|
@o1.remove_all_tags
|
577
578
|
@o1.tag_ids.should == []
|
578
|
-
|
579
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[] WHERE (id = 1)"]
|
579
580
|
end
|
580
581
|
|
581
582
|
it "should have association modification methods deal with nil values" do
|
582
583
|
v = @c1.load(:id=>1)
|
583
584
|
v.add_tag(@c2.load(:id=>4))
|
584
585
|
v.tag_ids.should == [4]
|
585
|
-
|
586
|
+
@db.sqls.should == []
|
586
587
|
v.save_changes
|
587
|
-
|
588
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[4]::integer[] WHERE (id = 1)"]
|
588
589
|
|
589
590
|
@o2.add_artist(@c1.load(:id=>1))
|
590
|
-
|
591
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[2]::integer[] WHERE (id = 1)"]
|
591
592
|
|
592
593
|
v = @c1.load(:id=>1)
|
593
594
|
v.remove_tag(@c2.load(:id=>4))
|
594
595
|
v.tag_ids.should == nil
|
595
|
-
|
596
|
+
@db.sqls.should == []
|
596
597
|
v.save_changes
|
597
|
-
|
598
|
+
@db.sqls.should == []
|
598
599
|
|
599
600
|
@o2.remove_artist(@c1.load(:id=>1))
|
600
|
-
|
601
|
+
@db.sqls.should == []
|
601
602
|
|
602
603
|
v = @c1.load(:id=>1)
|
603
604
|
v.remove_all_tags
|
604
605
|
v.tag_ids.should == nil
|
605
|
-
|
606
|
+
@db.sqls.should == []
|
606
607
|
v.save_changes
|
607
|
-
|
608
|
+
@db.sqls.should == []
|
608
609
|
end
|
609
610
|
|
610
611
|
it "should have association modification methods deal with empty arrays values" do
|
611
612
|
v = @c1.load(:id=>1, :tag_ids=>Sequel.pg_array([]))
|
612
613
|
v.add_tag(@c2.load(:id=>4))
|
613
614
|
v.tag_ids.should == [4]
|
614
|
-
|
615
|
+
@db.sqls.should == []
|
615
616
|
v.save_changes
|
616
|
-
|
617
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[4] WHERE (id = 1)"]
|
617
618
|
|
618
619
|
@o2.add_artist(@c1.load(:id=>1, :tag_ids=>Sequel.pg_array([])))
|
619
|
-
|
620
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[2] WHERE (id = 1)"]
|
620
621
|
|
621
622
|
v = @c1.load(:id=>1, :tag_ids=>Sequel.pg_array([]))
|
622
623
|
v.remove_tag(@c2.load(:id=>4))
|
623
624
|
v.tag_ids.should == []
|
624
|
-
|
625
|
+
@db.sqls.should == []
|
625
626
|
v.save_changes
|
626
|
-
|
627
|
+
@db.sqls.should == []
|
627
628
|
|
628
629
|
@o2.remove_artist(@c1.load(:id=>1, :tag_ids=>Sequel.pg_array([])))
|
629
|
-
|
630
|
+
@db.sqls.should == []
|
630
631
|
|
631
632
|
v = @c1.load(:id=>1, :tag_ids=>Sequel.pg_array([]))
|
632
633
|
v.remove_all_tags
|
633
634
|
v.tag_ids.should == []
|
634
|
-
|
635
|
+
@db.sqls.should == []
|
635
636
|
v.save_changes
|
636
|
-
|
637
|
+
@db.sqls.should == []
|
637
638
|
end
|
638
639
|
|
639
640
|
it "should respect the :array_type option when manually creating arrays" do
|
@@ -642,12 +643,41 @@ describe Sequel::Model, "pg_array_associations" do
|
|
642
643
|
v = @c1.load(:id=>1)
|
643
644
|
v.add_tag(@c2.load(:id=>4))
|
644
645
|
v.tag_ids.should == [4]
|
645
|
-
|
646
|
+
@db.sqls.should == []
|
646
647
|
v.save_changes
|
647
|
-
|
648
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[4]::int8[] WHERE (id = 1)"]
|
648
649
|
|
649
650
|
@o2.add_artist(@c1.load(:id=>1))
|
650
|
-
|
651
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[2]::int8[] WHERE (id = 1)"]
|
652
|
+
end
|
653
|
+
|
654
|
+
it "should respect the :array_type option in the associations dataset" do
|
655
|
+
@c2.many_to_pg_array :artists, :clone=>:artists, :array_type=>:int8
|
656
|
+
@c2.load(:id=>1).artists_dataset.sql.should == 'SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[1]::int8[])'
|
657
|
+
end
|
658
|
+
|
659
|
+
it "should respect the :array_type option when eager loading" do
|
660
|
+
@c2.many_to_pg_array :artists, :clone=>:artists, :array_type=>:int8
|
661
|
+
@c2.eager(:artists).all
|
662
|
+
@db.sqls.should == ["SELECT * FROM tags", "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::int8[])"]
|
663
|
+
end
|
664
|
+
|
665
|
+
it "should respect the :array_type option when filtering by associations" do
|
666
|
+
@c1.pg_array_to_many :tags, :clone=>:tags, :array_type=>:int8
|
667
|
+
@c1.where(:tags=>@c2.load(:id=>1)).sql.should == 'SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[1]::int8[])'
|
668
|
+
@c1.where(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == 'SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[1,2]::int8[])'
|
669
|
+
end
|
670
|
+
|
671
|
+
it "should automatically determine the array type by looking at the schema" do
|
672
|
+
@c1.db_schema[:tag_ids][:db_type] = 'int8'
|
673
|
+
@c2.many_to_pg_array :artists, :clone=>:artists
|
674
|
+
@c1.pg_array_to_many :tags, :clone=>:tags, :save_after_modify=>true
|
675
|
+
@c2.load(:id=>1).artists_dataset.sql.should == 'SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[1]::int8[])'
|
676
|
+
@c1.load(:id=>1).add_tag(@c2.load(:id=>1))
|
677
|
+
@db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1]::int8[] WHERE (id = 1)"]
|
678
|
+
end
|
679
|
+
|
680
|
+
it "should automatically determine the array type by looking at the schema" do
|
651
681
|
end
|
652
682
|
|
653
683
|
it "should not validate the current/associated object in add_ and remove_ if the :validate=>false option is used" do
|