sequel 4.9.0 → 4.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +79 -1
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/Rakefile +2 -12
- data/bin/sequel +1 -0
- data/doc/advanced_associations.rdoc +82 -25
- data/doc/association_basics.rdoc +21 -22
- data/doc/core_extensions.rdoc +1 -1
- data/doc/opening_databases.rdoc +7 -0
- data/doc/release_notes/4.10.0.txt +226 -0
- data/doc/security.rdoc +1 -0
- data/doc/testing.rdoc +7 -7
- data/doc/transactions.rdoc +8 -0
- data/lib/sequel/adapters/jdbc.rb +160 -168
- data/lib/sequel/adapters/jdbc/db2.rb +17 -18
- data/lib/sequel/adapters/jdbc/derby.rb +5 -28
- data/lib/sequel/adapters/jdbc/h2.rb +11 -22
- data/lib/sequel/adapters/jdbc/hsqldb.rb +31 -18
- data/lib/sequel/adapters/jdbc/jtds.rb +0 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +36 -35
- data/lib/sequel/adapters/jdbc/postgresql.rb +72 -90
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +18 -16
- data/lib/sequel/adapters/jdbc/sqlite.rb +7 -0
- data/lib/sequel/adapters/jdbc/sqlserver.rb +10 -30
- data/lib/sequel/adapters/jdbc/transactions.rb +5 -6
- data/lib/sequel/adapters/openbase.rb +1 -7
- data/lib/sequel/adapters/postgres.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +3 -6
- data/lib/sequel/adapters/shared/cubrid.rb +24 -9
- data/lib/sequel/adapters/shared/db2.rb +13 -5
- data/lib/sequel/adapters/shared/firebird.rb +16 -16
- data/lib/sequel/adapters/shared/informix.rb +2 -5
- data/lib/sequel/adapters/shared/mssql.rb +72 -63
- data/lib/sequel/adapters/shared/mysql.rb +72 -40
- data/lib/sequel/adapters/shared/oracle.rb +27 -15
- data/lib/sequel/adapters/shared/postgres.rb +24 -44
- data/lib/sequel/adapters/shared/progress.rb +1 -5
- data/lib/sequel/adapters/shared/sqlanywhere.rb +26 -18
- data/lib/sequel/adapters/shared/sqlite.rb +21 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -1
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +8 -2
- data/lib/sequel/adapters/utils/split_alter_table.rb +8 -0
- data/lib/sequel/core.rb +14 -9
- data/lib/sequel/database/dataset_defaults.rb +1 -0
- data/lib/sequel/database/misc.rb +12 -0
- data/lib/sequel/database/query.rb +4 -1
- data/lib/sequel/database/schema_methods.rb +3 -2
- data/lib/sequel/database/transactions.rb +47 -17
- data/lib/sequel/dataset/features.rb +12 -2
- data/lib/sequel/dataset/mutation.rb +2 -0
- data/lib/sequel/dataset/placeholder_literalizer.rb +12 -4
- data/lib/sequel/dataset/prepared_statements.rb +6 -0
- data/lib/sequel/dataset/query.rb +1 -1
- data/lib/sequel/dataset/sql.rb +132 -70
- data/lib/sequel/extensions/columns_introspection.rb +1 -1
- data/lib/sequel/extensions/null_dataset.rb +8 -4
- data/lib/sequel/extensions/pg_array.rb +4 -4
- data/lib/sequel/extensions/pg_row.rb +1 -0
- data/lib/sequel/model/associations.rb +468 -188
- data/lib/sequel/model/base.rb +88 -13
- data/lib/sequel/plugins/association_pks.rb +23 -64
- data/lib/sequel/plugins/auto_validations.rb +3 -2
- data/lib/sequel/plugins/dataset_associations.rb +1 -3
- data/lib/sequel/plugins/many_through_many.rb +18 -65
- data/lib/sequel/plugins/pg_array_associations.rb +97 -86
- data/lib/sequel/plugins/prepared_statements.rb +2 -1
- data/lib/sequel/plugins/prepared_statements_associations.rb +36 -27
- data/lib/sequel/plugins/rcte_tree.rb +12 -16
- data/lib/sequel/plugins/sharding.rb +21 -3
- data/lib/sequel/plugins/single_table_inheritance.rb +2 -1
- data/lib/sequel/plugins/subclasses.rb +1 -9
- data/lib/sequel/plugins/tactical_eager_loading.rb +9 -0
- data/lib/sequel/plugins/tree.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +57 -15
- data/spec/adapters/mysql_spec.rb +11 -0
- data/spec/bin_spec.rb +2 -2
- data/spec/core/database_spec.rb +38 -4
- data/spec/core/dataset_spec.rb +45 -7
- data/spec/core/placeholder_literalizer_spec.rb +17 -0
- data/spec/core/schema_spec.rb +6 -1
- data/spec/extensions/active_model_spec.rb +18 -9
- data/spec/extensions/association_pks_spec.rb +20 -18
- data/spec/extensions/association_proxies_spec.rb +9 -9
- data/spec/extensions/auto_validations_spec.rb +6 -0
- data/spec/extensions/columns_introspection_spec.rb +1 -0
- data/spec/extensions/constraint_validations_spec.rb +3 -1
- data/spec/extensions/many_through_many_spec.rb +191 -111
- data/spec/extensions/pg_array_associations_spec.rb +133 -103
- data/spec/extensions/prepared_statements_associations_spec.rb +23 -4
- data/spec/extensions/rcte_tree_spec.rb +35 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -1
- data/spec/extensions/sharding_spec.rb +2 -2
- data/spec/extensions/tactical_eager_loading_spec.rb +4 -0
- data/spec/extensions/to_dot_spec.rb +1 -0
- data/spec/extensions/touch_spec.rb +2 -2
- data/spec/integration/associations_test.rb +130 -37
- data/spec/integration/dataset_test.rb +17 -0
- data/spec/integration/model_test.rb +17 -0
- data/spec/integration/schema_test.rb +14 -0
- data/spec/integration/transaction_test.rb +25 -1
- data/spec/model/association_reflection_spec.rb +63 -24
- data/spec/model/associations_spec.rb +104 -57
- data/spec/model/base_spec.rb +14 -1
- data/spec/model/class_dataset_methods_spec.rb +1 -0
- data/spec/model/eager_loading_spec.rb +221 -74
- data/spec/model/model_spec.rb +119 -1
- metadata +4 -2
@@ -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
|