sequel 3.29.0 → 3.30.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +35 -3
- data/Rakefile +2 -1
- data/doc/association_basics.rdoc +11 -0
- data/doc/opening_databases.rdoc +2 -0
- data/doc/release_notes/3.30.0.txt +135 -0
- data/doc/testing.rdoc +17 -3
- data/lib/sequel/adapters/amalgalite.rb +2 -2
- data/lib/sequel/adapters/do/mysql.rb +5 -2
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc.rb +126 -43
- data/lib/sequel/adapters/jdbc/as400.rb +11 -3
- data/lib/sequel/adapters/jdbc/db2.rb +2 -1
- data/lib/sequel/adapters/jdbc/derby.rb +44 -19
- data/lib/sequel/adapters/jdbc/h2.rb +32 -19
- data/lib/sequel/adapters/jdbc/hsqldb.rb +21 -17
- data/lib/sequel/adapters/jdbc/jtds.rb +9 -4
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -1
- data/lib/sequel/adapters/jdbc/mysql.rb +2 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +21 -7
- data/lib/sequel/adapters/jdbc/postgresql.rb +3 -2
- data/lib/sequel/adapters/jdbc/sqlite.rb +2 -1
- data/lib/sequel/adapters/jdbc/sqlserver.rb +48 -18
- data/lib/sequel/adapters/mock.rb +2 -1
- data/lib/sequel/adapters/mysql.rb +4 -2
- data/lib/sequel/adapters/mysql2.rb +2 -2
- data/lib/sequel/adapters/odbc/mssql.rb +1 -1
- data/lib/sequel/adapters/openbase.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +6 -6
- data/lib/sequel/adapters/postgres.rb +25 -12
- data/lib/sequel/adapters/shared/access.rb +14 -6
- data/lib/sequel/adapters/shared/db2.rb +36 -13
- data/lib/sequel/adapters/shared/firebird.rb +12 -5
- data/lib/sequel/adapters/shared/informix.rb +11 -3
- data/lib/sequel/adapters/shared/mssql.rb +94 -47
- data/lib/sequel/adapters/shared/mysql.rb +107 -49
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +2 -2
- data/lib/sequel/adapters/shared/oracle.rb +54 -27
- data/lib/sequel/adapters/shared/postgres.rb +65 -26
- data/lib/sequel/adapters/shared/progress.rb +4 -1
- data/lib/sequel/adapters/shared/sqlite.rb +36 -20
- data/lib/sequel/adapters/sqlite.rb +2 -3
- data/lib/sequel/adapters/swift/mysql.rb +3 -2
- data/lib/sequel/adapters/swift/sqlite.rb +2 -2
- data/lib/sequel/adapters/tinytds.rb +14 -8
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -4
- data/lib/sequel/database/misc.rb +6 -2
- data/lib/sequel/dataset/graph.rb +33 -7
- data/lib/sequel/dataset/prepared_statements.rb +19 -5
- data/lib/sequel/dataset/sql.rb +611 -201
- data/lib/sequel/model/associations.rb +12 -5
- data/lib/sequel/model/base.rb +20 -5
- data/lib/sequel/plugins/sharding.rb +9 -29
- data/lib/sequel/sql.rb +2 -1
- data/lib/sequel/timezones.rb +14 -4
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mysql_spec.rb +10 -0
- data/spec/adapters/oracle_spec.rb +1 -1
- data/spec/core/core_sql_spec.rb +3 -1
- data/spec/core/database_spec.rb +42 -0
- data/spec/core/dataset_spec.rb +10 -3
- data/spec/core/mock_adapter_spec.rb +4 -0
- data/spec/core/object_graph_spec.rb +38 -0
- data/spec/extensions/association_autoreloading_spec.rb +1 -10
- data/spec/extensions/association_dependencies_spec.rb +2 -12
- data/spec/extensions/association_pks_spec.rb +35 -39
- data/spec/extensions/caching_spec.rb +23 -50
- data/spec/extensions/class_table_inheritance_spec.rb +30 -82
- data/spec/extensions/composition_spec.rb +18 -13
- data/spec/extensions/hook_class_methods_spec.rb +65 -91
- data/spec/extensions/identity_map_spec.rb +33 -103
- data/spec/extensions/instance_filters_spec.rb +10 -21
- data/spec/extensions/instance_hooks_spec.rb +6 -24
- data/spec/extensions/json_serializer_spec.rb +4 -5
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +17 -39
- data/spec/extensions/many_through_many_spec.rb +135 -277
- data/spec/extensions/migration_spec.rb +18 -15
- data/spec/extensions/named_timezones_spec.rb +1 -1
- data/spec/extensions/nested_attributes_spec.rb +97 -92
- data/spec/extensions/optimistic_locking_spec.rb +9 -20
- data/spec/extensions/prepared_statements_associations_spec.rb +22 -37
- data/spec/extensions/prepared_statements_safe_spec.rb +9 -27
- data/spec/extensions/prepared_statements_spec.rb +11 -30
- data/spec/extensions/prepared_statements_with_pk_spec.rb +6 -13
- data/spec/extensions/pretty_table_spec.rb +1 -6
- data/spec/extensions/rcte_tree_spec.rb +41 -43
- data/spec/extensions/schema_dumper_spec.rb +3 -6
- data/spec/extensions/serialization_spec.rb +20 -32
- data/spec/extensions/sharding_spec.rb +66 -140
- data/spec/extensions/single_table_inheritance_spec.rb +14 -36
- data/spec/extensions/spec_helper.rb +10 -64
- data/spec/extensions/sql_expr_spec.rb +20 -60
- data/spec/extensions/tactical_eager_loading_spec.rb +9 -19
- data/spec/extensions/timestamps_spec.rb +6 -6
- data/spec/extensions/to_dot_spec.rb +1 -2
- data/spec/extensions/touch_spec.rb +13 -14
- data/spec/extensions/tree_spec.rb +11 -26
- data/spec/extensions/update_primary_key_spec.rb +30 -24
- data/spec/extensions/validation_class_methods_spec.rb +30 -51
- data/spec/extensions/validation_helpers_spec.rb +16 -35
- data/spec/integration/dataset_test.rb +16 -4
- data/spec/integration/prepared_statement_test.rb +4 -2
- data/spec/model/eager_loading_spec.rb +16 -0
- data/spec/model/model_spec.rb +15 -1
- data/spec/model/record_spec.rb +60 -0
- metadata +23 -40
@@ -48,9 +48,10 @@ describe "Composition plugin" do
|
|
48
48
|
@c.composition :date, :composer=>proc{Date.new(year+1, month+2, day+3)}, :decomposer=>proc{[:year, :month, :day].each{|s| self.send("#{s}=", date.send(s) * 2)}}
|
49
49
|
@o.date.should == Date.new(2, 4, 6)
|
50
50
|
@o.save
|
51
|
-
MODEL_DB.sqls.last
|
52
|
-
|
53
|
-
|
51
|
+
sql = MODEL_DB.sqls.last
|
52
|
+
sql.should include("year = 4")
|
53
|
+
sql.should include("month = 8")
|
54
|
+
sql.should include("day = 12")
|
54
55
|
end
|
55
56
|
|
56
57
|
it "should allow call super in composition getter and setter method definition in class" do
|
@@ -139,8 +140,9 @@ describe "Composition plugin" do
|
|
139
140
|
@o.date.month.should == 6
|
140
141
|
@o.date = c.new(3, 4)
|
141
142
|
@o.save
|
142
|
-
MODEL_DB.sqls.last
|
143
|
-
|
143
|
+
sql = MODEL_DB.sqls.last
|
144
|
+
sql.should include("year = 6")
|
145
|
+
sql.should include("month = 12")
|
144
146
|
end
|
145
147
|
|
146
148
|
it ":mapping option should work with an array of two pairs of symbols" do
|
@@ -160,8 +162,9 @@ describe "Composition plugin" do
|
|
160
162
|
@o.date.m.should == 6
|
161
163
|
@o.date = c.new(3, 4)
|
162
164
|
@o.save
|
163
|
-
MODEL_DB.sqls.last
|
164
|
-
|
165
|
+
sql = MODEL_DB.sqls.last
|
166
|
+
sql.should include("year = 6")
|
167
|
+
sql.should include("month = 12")
|
165
168
|
end
|
166
169
|
|
167
170
|
it ":mapping option :composer should return nil if all values are nil" do
|
@@ -173,9 +176,10 @@ describe "Composition plugin" do
|
|
173
176
|
@c.composition :date, :mapping=>[:year, :month, :day]
|
174
177
|
@o.date = nil
|
175
178
|
@o.save
|
176
|
-
MODEL_DB.sqls.last
|
177
|
-
|
178
|
-
|
179
|
+
sql = MODEL_DB.sqls.last
|
180
|
+
sql.should include("year = NULL")
|
181
|
+
sql.should include("month = NULL")
|
182
|
+
sql.should include("day = NULL")
|
179
183
|
end
|
180
184
|
|
181
185
|
it "should work correctly with subclasses" do
|
@@ -184,8 +188,9 @@ describe "Composition plugin" do
|
|
184
188
|
o = c.load(:id=>1, :year=>1, :month=>2, :day=>3)
|
185
189
|
o.date.should == Date.new(1, 2, 3)
|
186
190
|
o.save
|
187
|
-
MODEL_DB.sqls.last
|
188
|
-
|
189
|
-
|
191
|
+
sql = MODEL_DB.sqls.last
|
192
|
+
sql.should include("year = 1")
|
193
|
+
sql.should include("month = 2")
|
194
|
+
sql.should include("day = 3")
|
190
195
|
end
|
191
196
|
end
|
@@ -6,187 +6,185 @@ describe "Model hooks" do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
specify "should be definable using a block" do
|
9
|
-
|
9
|
+
adds = []
|
10
10
|
c = Class.new(Sequel::Model)
|
11
11
|
c.class_eval do
|
12
|
-
before_save
|
12
|
+
before_save{adds << 'hi'}
|
13
13
|
end
|
14
14
|
|
15
15
|
c.new.before_save
|
16
|
-
|
16
|
+
adds.should == ['hi']
|
17
17
|
end
|
18
18
|
|
19
19
|
specify "should be definable using a method name" do
|
20
|
-
|
20
|
+
adds = []
|
21
21
|
c = Class.new(Sequel::Model)
|
22
22
|
c.class_eval do
|
23
|
-
|
23
|
+
define_method(:bye){adds << 'bye'}
|
24
24
|
before_save :bye
|
25
25
|
end
|
26
26
|
|
27
27
|
c.new.before_save
|
28
|
-
|
28
|
+
adds.should == ['bye']
|
29
29
|
end
|
30
30
|
|
31
31
|
specify "should be additive" do
|
32
|
-
|
32
|
+
adds = []
|
33
33
|
c = Class.new(Sequel::Model)
|
34
34
|
c.class_eval do
|
35
|
-
after_save
|
36
|
-
after_save
|
35
|
+
after_save{adds << 'hyiyie'}
|
36
|
+
after_save{adds << 'byiyie'}
|
37
37
|
end
|
38
38
|
|
39
39
|
c.new.after_save
|
40
|
-
|
40
|
+
adds.should == ['hyiyie', 'byiyie']
|
41
41
|
end
|
42
42
|
|
43
43
|
specify "before hooks should run in reverse order" do
|
44
|
-
|
44
|
+
adds = []
|
45
45
|
c = Class.new(Sequel::Model)
|
46
46
|
c.class_eval do
|
47
|
-
before_save
|
48
|
-
before_save
|
47
|
+
before_save{adds << 'hyiyie'}
|
48
|
+
before_save{adds << 'byiyie'}
|
49
49
|
end
|
50
50
|
|
51
51
|
c.new.before_save
|
52
|
-
|
52
|
+
adds.should == ['byiyie', 'hyiyie']
|
53
53
|
end
|
54
54
|
|
55
55
|
specify "should not be additive if the method or tag already exists" do
|
56
|
-
|
56
|
+
adds = []
|
57
57
|
c = Class.new(Sequel::Model)
|
58
58
|
c.class_eval do
|
59
|
-
|
59
|
+
define_method(:bye){adds << 'bye'}
|
60
60
|
before_save :bye
|
61
61
|
before_save :bye
|
62
62
|
end
|
63
63
|
|
64
64
|
c.new.before_save
|
65
|
-
|
65
|
+
adds.should == ['bye']
|
66
66
|
|
67
|
-
|
67
|
+
adds = []
|
68
68
|
d = Class.new(Sequel::Model)
|
69
69
|
d.class_eval do
|
70
|
-
before_save(:bye){
|
71
|
-
before_save(:bye){
|
70
|
+
before_save(:bye){adds << 'hyiyie'}
|
71
|
+
before_save(:bye){adds << 'byiyie'}
|
72
72
|
end
|
73
73
|
|
74
74
|
d.new.before_save
|
75
|
-
|
75
|
+
adds.should == ['byiyie']
|
76
76
|
|
77
|
-
|
77
|
+
adds = []
|
78
78
|
e = Class.new(Sequel::Model)
|
79
79
|
e.class_eval do
|
80
|
-
|
80
|
+
define_method(:bye){adds << 'bye'}
|
81
81
|
before_save :bye
|
82
|
-
before_save(:bye){
|
82
|
+
before_save(:bye){adds << 'byiyie'}
|
83
83
|
end
|
84
84
|
|
85
85
|
e.new.before_save
|
86
|
-
|
86
|
+
adds.should == ['byiyie']
|
87
87
|
|
88
|
-
|
88
|
+
adds = []
|
89
89
|
e = Class.new(Sequel::Model)
|
90
90
|
e.class_eval do
|
91
|
-
|
92
|
-
before_save(:bye){
|
91
|
+
define_method(:bye){adds << 'bye'}
|
92
|
+
before_save(:bye){adds << 'byiyie'}
|
93
93
|
before_save :bye
|
94
94
|
end
|
95
95
|
|
96
96
|
e.new.before_save
|
97
|
-
|
97
|
+
adds.should == ['bye']
|
98
98
|
end
|
99
99
|
|
100
100
|
specify "should be inheritable" do
|
101
|
-
|
102
|
-
|
103
|
-
$adds = []
|
101
|
+
adds = []
|
104
102
|
a = Class.new(Sequel::Model)
|
105
103
|
a.class_eval do
|
106
|
-
after_save
|
104
|
+
after_save{adds << '123'}
|
107
105
|
end
|
108
106
|
|
109
107
|
b = Class.new(a)
|
110
108
|
b.class_eval do
|
111
|
-
after_save
|
112
|
-
after_save
|
109
|
+
after_save{adds << '456'}
|
110
|
+
after_save{adds << '789'}
|
113
111
|
end
|
114
112
|
|
115
113
|
b.new.after_save
|
116
|
-
|
114
|
+
adds.should == ['123', '456', '789']
|
117
115
|
end
|
118
116
|
|
119
117
|
specify "should be overridable in descendant classes" do
|
120
|
-
|
118
|
+
adds = []
|
121
119
|
a = Class.new(Sequel::Model)
|
122
120
|
a.class_eval do
|
123
|
-
before_save
|
121
|
+
before_save{adds << '123'}
|
124
122
|
end
|
125
123
|
|
126
124
|
b = Class.new(a)
|
127
125
|
b.class_eval do
|
128
|
-
|
126
|
+
define_method(:before_save){adds << '456'}
|
129
127
|
end
|
130
128
|
|
131
129
|
a.new.before_save
|
132
|
-
|
133
|
-
|
130
|
+
adds.should == ['123']
|
131
|
+
adds = []
|
134
132
|
b.new.before_save
|
135
|
-
|
133
|
+
adds.should == ['456']
|
136
134
|
end
|
137
135
|
|
138
136
|
specify "should stop processing if a before hook returns false" do
|
139
|
-
|
140
|
-
|
137
|
+
flag = true
|
138
|
+
adds = []
|
141
139
|
|
142
140
|
a = Class.new(Sequel::Model)
|
143
141
|
a.class_eval do
|
144
|
-
before_save
|
145
|
-
before_save
|
142
|
+
before_save{adds << 'cruel'; flag}
|
143
|
+
before_save{adds << 'blah'; flag}
|
146
144
|
end
|
147
145
|
|
148
146
|
a.new.before_save
|
149
|
-
|
147
|
+
adds.should == ['blah', 'cruel']
|
150
148
|
|
151
149
|
# chain should not break on nil
|
152
|
-
|
153
|
-
|
150
|
+
adds = []
|
151
|
+
flag = nil
|
154
152
|
a.new.before_save
|
155
|
-
|
153
|
+
adds.should == ['blah', 'cruel']
|
156
154
|
|
157
|
-
|
158
|
-
|
155
|
+
adds = []
|
156
|
+
flag = false
|
159
157
|
a.new.before_save
|
160
|
-
|
158
|
+
adds.should == ['blah']
|
161
159
|
|
162
160
|
b = Class.new(a)
|
163
161
|
b.class_eval do
|
164
|
-
before_save
|
162
|
+
before_save{adds << 'mau'}
|
165
163
|
end
|
166
164
|
|
167
|
-
|
165
|
+
adds = []
|
168
166
|
b.new.before_save
|
169
|
-
|
167
|
+
adds.should == ['mau', 'blah']
|
170
168
|
end
|
171
169
|
end
|
172
170
|
|
173
171
|
describe "Model#after_initialize" do
|
174
172
|
specify "should be called after initialization" do
|
175
|
-
|
176
|
-
|
173
|
+
values1 = nil
|
174
|
+
reached_after_initialized = false
|
177
175
|
|
178
176
|
a = Class.new(Sequel::Model)
|
179
177
|
a.class_eval do
|
180
178
|
columns :x, :y
|
181
179
|
after_initialize do
|
182
|
-
|
183
|
-
|
180
|
+
values1 = @values.clone
|
181
|
+
reached_after_initialized = true
|
184
182
|
end
|
185
183
|
end
|
186
184
|
|
187
185
|
a.new(:x => 1, :y => 2)
|
188
|
-
|
189
|
-
|
186
|
+
values1.should == {:x => 1, :y => 2}
|
187
|
+
reached_after_initialized.should == true
|
190
188
|
end
|
191
189
|
end
|
192
190
|
|
@@ -206,11 +204,7 @@ describe "Model#before_create && Model#after_create" do
|
|
206
204
|
specify "should be called around new record creation" do
|
207
205
|
@c.before_create {MODEL_DB << "BLAH before"}
|
208
206
|
@c.create(:x => 2)
|
209
|
-
MODEL_DB.sqls.should == [
|
210
|
-
'BLAH before',
|
211
|
-
'INSERT INTO items (x) VALUES (2)',
|
212
|
-
'BLAH after'
|
213
|
-
]
|
207
|
+
MODEL_DB.sqls.should == ['BLAH before', 'INSERT INTO items (x) VALUES (2)', 'BLAH after']
|
214
208
|
end
|
215
209
|
|
216
210
|
specify ".create should cancel the save and raise an error if before_create returns false and raise_on_save_failure is true" do
|
@@ -242,11 +236,7 @@ describe "Model#before_update && Model#after_update" do
|
|
242
236
|
@c.before_update {MODEL_DB << "BLAH before"}
|
243
237
|
m = @c.load(:id => 2233, :x=>123)
|
244
238
|
m.save
|
245
|
-
MODEL_DB.sqls.should == [
|
246
|
-
'BLAH before',
|
247
|
-
'UPDATE items SET x = 123 WHERE (id = 2233)',
|
248
|
-
'BLAH after'
|
249
|
-
]
|
239
|
+
MODEL_DB.sqls.should == ['BLAH before', 'UPDATE items SET x = 123 WHERE (id = 2233)', 'BLAH after']
|
250
240
|
end
|
251
241
|
|
252
242
|
specify "#save should cancel the save and raise an error if before_update returns false and raise_on_save_failure is true" do
|
@@ -279,22 +269,14 @@ describe "Model#before_save && Model#after_save" do
|
|
279
269
|
@c.before_save {MODEL_DB << "BLAH before"}
|
280
270
|
m = @c.load(:id => 2233, :x=>123)
|
281
271
|
m.save
|
282
|
-
MODEL_DB.sqls.should == [
|
283
|
-
'BLAH before',
|
284
|
-
'UPDATE items SET x = 123 WHERE (id = 2233)',
|
285
|
-
'BLAH after'
|
286
|
-
]
|
272
|
+
MODEL_DB.sqls.should == ['BLAH before', 'UPDATE items SET x = 123 WHERE (id = 2233)', 'BLAH after']
|
287
273
|
end
|
288
274
|
|
289
275
|
specify "should be called around record creation" do
|
290
276
|
@c.before_save {MODEL_DB << "BLAH before"}
|
291
277
|
@c.no_primary_key
|
292
278
|
@c.create(:x => 2)
|
293
|
-
MODEL_DB.sqls.should == [
|
294
|
-
'BLAH before',
|
295
|
-
'INSERT INTO items (x) VALUES (2)',
|
296
|
-
'BLAH after'
|
297
|
-
]
|
279
|
+
MODEL_DB.sqls.should == ['BLAH before', 'INSERT INTO items (x) VALUES (2)', 'BLAH after']
|
298
280
|
end
|
299
281
|
|
300
282
|
specify "#save should cancel the save and raise an error if before_save returns false and raise_on_save_failure is true" do
|
@@ -319,10 +301,6 @@ describe "Model#before_destroy && Model#after_destroy" do
|
|
319
301
|
@c = Class.new(Sequel::Model(:items))
|
320
302
|
@c.class_eval do
|
321
303
|
after_destroy {MODEL_DB << "BLAH after"}
|
322
|
-
|
323
|
-
def delete
|
324
|
-
MODEL_DB << "DELETE BLAH"
|
325
|
-
end
|
326
304
|
end
|
327
305
|
end
|
328
306
|
|
@@ -330,11 +308,7 @@ describe "Model#before_destroy && Model#after_destroy" do
|
|
330
308
|
@c.before_destroy {MODEL_DB << "BLAH before"}
|
331
309
|
m = @c.load(:id => 2233)
|
332
310
|
m.destroy
|
333
|
-
MODEL_DB.sqls.should == [
|
334
|
-
'BLAH before',
|
335
|
-
'DELETE BLAH',
|
336
|
-
'BLAH after'
|
337
|
-
]
|
311
|
+
MODEL_DB.sqls.should == ['BLAH before', "DELETE FROM items WHERE (id = 2233)", 'BLAH after']
|
338
312
|
end
|
339
313
|
|
340
314
|
specify "#destroy should cancel the destroy and raise an error if before_destroy returns false and raise_on_save_failure is true" do
|
@@ -5,13 +5,9 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
5
5
|
class ::IdentityMapModel < Sequel::Model
|
6
6
|
plugin :identity_map
|
7
7
|
attr_accessor :foo
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
c = c.column if c.is_a?(Sequel::SQL::QualifiedIdentifier)
|
12
|
-
h = {c=>@opts[:where].args.last}
|
13
|
-
execute(sql)
|
14
|
-
yield h
|
8
|
+
dataset._fetch = proc do |sql|
|
9
|
+
sql =~ /WHERE \(?(\w+\.)?(\w+) = (\d)\)?/
|
10
|
+
{$2.to_sym=>$3.to_i}
|
15
11
|
end
|
16
12
|
def self.waw_identity_map(&block) # with and without
|
17
13
|
with_identity_map(&block)
|
@@ -110,9 +106,9 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
110
106
|
MODEL_DB.sqls.length.should == 1
|
111
107
|
o.foo = 1
|
112
108
|
@c[1].foo.should == o.foo
|
113
|
-
MODEL_DB.sqls.length.should ==
|
109
|
+
MODEL_DB.sqls.length.should == 0
|
114
110
|
@c[2].foo.should_not == o.foo
|
115
|
-
MODEL_DB.sqls.length.should ==
|
111
|
+
MODEL_DB.sqls.length.should == 1
|
116
112
|
end
|
117
113
|
end
|
118
114
|
|
@@ -123,22 +119,22 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
123
119
|
MODEL_DB.sqls.length.should == 1
|
124
120
|
o.foo = 1
|
125
121
|
@c[1].should == o
|
126
|
-
MODEL_DB.sqls.length.should ==
|
122
|
+
MODEL_DB.sqls.length.should == 0
|
127
123
|
o.destroy
|
128
|
-
MODEL_DB.sqls.length.should ==
|
124
|
+
MODEL_DB.sqls.length.should == 1
|
129
125
|
@c[1].foo.should_not == o.foo
|
130
|
-
MODEL_DB.sqls.length.should ==
|
126
|
+
MODEL_DB.sqls.length.should == 1
|
131
127
|
|
132
128
|
MODEL_DB.reset
|
133
129
|
o = @c[2]
|
134
130
|
MODEL_DB.sqls.length.should == 1
|
135
131
|
o.foo = 1
|
136
132
|
@c[2].should == o
|
137
|
-
MODEL_DB.sqls.length.should ==
|
133
|
+
MODEL_DB.sqls.length.should == 0
|
138
134
|
o.delete
|
139
|
-
MODEL_DB.sqls.length.should ==
|
135
|
+
MODEL_DB.sqls.length.should == 1
|
140
136
|
@c[2].foo.should_not == o.foo
|
141
|
-
MODEL_DB.sqls.length.should ==
|
137
|
+
MODEL_DB.sqls.length.should == 1
|
142
138
|
end
|
143
139
|
end
|
144
140
|
|
@@ -153,10 +149,10 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
153
149
|
MODEL_DB.sqls.length.should == 1
|
154
150
|
o = @c1.load(:id=>1, :another_id=>2, :artist_id=>2)
|
155
151
|
o.artist.should == a
|
156
|
-
MODEL_DB.sqls.length.should ==
|
152
|
+
MODEL_DB.sqls.length.should == 0
|
157
153
|
o = @c1.load(:id=>3, :another_id=>3, :artist_id=>3)
|
158
154
|
o.artist.should_not == a
|
159
|
-
MODEL_DB.sqls.length.should ==
|
155
|
+
MODEL_DB.sqls.length.should == 1
|
160
156
|
end
|
161
157
|
end
|
162
158
|
|
@@ -170,10 +166,10 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
170
166
|
MODEL_DB.sqls.length.should == 1
|
171
167
|
o = @c1.load(:id=>2, :artist_id=>2)
|
172
168
|
o.artist.should == a
|
173
|
-
MODEL_DB.sqls.length.should ==
|
169
|
+
MODEL_DB.sqls.length.should == 0
|
174
170
|
o = @c1.load(:id=>3, :artist_id=>3)
|
175
171
|
o.artist.should_not == a
|
176
|
-
MODEL_DB.sqls.length.should ==
|
172
|
+
MODEL_DB.sqls.length.should == 1
|
177
173
|
end
|
178
174
|
end
|
179
175
|
|
@@ -187,9 +183,9 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
187
183
|
a.should be_a_kind_of(@c1)
|
188
184
|
MODEL_DB.sqls.length.should == 1
|
189
185
|
o.reload
|
190
|
-
MODEL_DB.sqls.length.should ==
|
186
|
+
MODEL_DB.sqls.length.should == 1
|
191
187
|
o.artist.should == a
|
192
|
-
MODEL_DB.sqls.length.should ==
|
188
|
+
MODEL_DB.sqls.length.should == 1
|
193
189
|
end
|
194
190
|
end
|
195
191
|
|
@@ -204,7 +200,7 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
204
200
|
MODEL_DB.sqls.length.should == 1
|
205
201
|
o = @c1.load(:id=>2, :artist_id=>2)
|
206
202
|
o.artist.should == a
|
207
|
-
MODEL_DB.sqls.length.should ==
|
203
|
+
MODEL_DB.sqls.length.should == 1
|
208
204
|
end
|
209
205
|
end
|
210
206
|
|
@@ -218,7 +214,7 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
218
214
|
MODEL_DB.sqls.length.should == 1
|
219
215
|
o = @c1.load(:id=>2, :artist_id=>2)
|
220
216
|
o.artist.should == a
|
221
|
-
MODEL_DB.sqls.length.should ==
|
217
|
+
MODEL_DB.sqls.length.should == 1
|
222
218
|
end
|
223
219
|
end
|
224
220
|
|
@@ -229,13 +225,7 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
229
225
|
@c1.many_to_many :artists, :class=>@c2, :left_key=>:album_id, :right_key=>:artist_id, :join_table=>:aa, :eager_loader=>(proc do |eo|
|
230
226
|
eo[:rows].each{|object| object.associations[:artists] = [c.load(:id=>object.id)]}
|
231
227
|
end)
|
232
|
-
|
233
|
-
def ds.fetch_rows(sql)
|
234
|
-
execute(sql)
|
235
|
-
yield({:id=>1})
|
236
|
-
yield({:id=>2})
|
237
|
-
yield({:id=>3})
|
238
|
-
end
|
228
|
+
@c1.dataset._fetch = [{:id=>1}, {:id=>2}, {:id=>3}]
|
239
229
|
|
240
230
|
@c.waw_identity_map do
|
241
231
|
MODEL_DB.sqls.length.should == 0
|
@@ -243,7 +233,7 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
243
233
|
MODEL_DB.sqls.length.should == 1
|
244
234
|
a.should == [@c1.load(:id=>1), @c1.load(:id=>2), @c1.load(:id=>3)]
|
245
235
|
a.map{|x| x.artists}.should == [[@c2.load(:id=>1)], [@c2.load(:id=>2)], [@c2.load(:id=>3)]]
|
246
|
-
MODEL_DB.sqls.length.should ==
|
236
|
+
MODEL_DB.sqls.length.should == 0
|
247
237
|
end
|
248
238
|
end
|
249
239
|
|
@@ -251,23 +241,8 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
251
241
|
@c1.columns :id
|
252
242
|
@c2.columns :id
|
253
243
|
@c1.many_to_many :artists, :class=>@c2, :left_key=>:album_id, :right_key=>:artist_id, :join_table=>:aa
|
254
|
-
|
255
|
-
|
256
|
-
execute(sql)
|
257
|
-
yield({:id=>1})
|
258
|
-
yield({:id=>2})
|
259
|
-
yield({:id=>3})
|
260
|
-
end
|
261
|
-
ds = @c2.dataset
|
262
|
-
def ds.fetch_rows(sql)
|
263
|
-
execute(sql)
|
264
|
-
yield({:id=>1, :x_foreign_key_x=>1})
|
265
|
-
yield({:id=>1, :x_foreign_key_x=>2})
|
266
|
-
yield({:id=>2, :x_foreign_key_x=>1})
|
267
|
-
yield({:id=>2, :x_foreign_key_x=>2})
|
268
|
-
yield({:id=>3, :x_foreign_key_x=>1})
|
269
|
-
yield({:id=>3, :x_foreign_key_x=>1})
|
270
|
-
end
|
244
|
+
@c1.dataset._fetch = [{:id=>1}, {:id=>2}, {:id=>3}]
|
245
|
+
@c2.dataset._fetch = [{:id=>1, :x_foreign_key_x=>1}, {:id=>1, :x_foreign_key_x=>2}, {:id=>2, :x_foreign_key_x=>1}, {:id=>2, :x_foreign_key_x=>2}, {:id=>3, :x_foreign_key_x=>1}, {:id=>3, :x_foreign_key_x=>1}]
|
271
246
|
|
272
247
|
@c.waw_identity_map do
|
273
248
|
MODEL_DB.sqls.length.should == 0
|
@@ -275,7 +250,7 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
275
250
|
MODEL_DB.sqls.length.should == 2
|
276
251
|
a.should == [@c1.load(:id=>1), @c1.load(:id=>2), @c1.load(:id=>3)]
|
277
252
|
a.map{|x| x.artists}.should == [[@c2.load(:id=>1), @c2.load(:id=>2), @c2.load(:id=>3), @c2.load(:id=>3)], [@c2.load(:id=>1), @c2.load(:id=>2)], []]
|
278
|
-
MODEL_DB.sqls.length.should ==
|
253
|
+
MODEL_DB.sqls.length.should == 0
|
279
254
|
end
|
280
255
|
end
|
281
256
|
|
@@ -284,23 +259,8 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
284
259
|
@c2.columns :id
|
285
260
|
@c1.set_primary_key :id, :id2
|
286
261
|
@c1.many_to_many :artists, :class=>@c2, :left_key=>[:album_id1, :album_id2], :right_key=>:artist_id, :join_table=>:aa
|
287
|
-
|
288
|
-
|
289
|
-
execute(sql)
|
290
|
-
yield({:id=>1, :id2=>4})
|
291
|
-
yield({:id=>2, :id2=>5})
|
292
|
-
yield({:id=>3, :id2=>6})
|
293
|
-
end
|
294
|
-
ds = @c2.dataset
|
295
|
-
def ds.fetch_rows(sql)
|
296
|
-
execute(sql)
|
297
|
-
yield({:id=>1, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
|
298
|
-
yield({:id=>1, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5})
|
299
|
-
yield({:id=>2, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
|
300
|
-
yield({:id=>2, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5})
|
301
|
-
yield({:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
|
302
|
-
yield({:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
|
303
|
-
end
|
262
|
+
@c1.dataset._fetch = [{:id=>1, :id2=>4}, {:id=>2, :id2=>5}, {:id=>3, :id2=>6}]
|
263
|
+
@c2.dataset._fetch = [ {:id=>1, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4}, {:id=>1, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5}, {:id=>2, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4}, {:id=>2, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5}, {:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4}, {:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4}]
|
304
264
|
|
305
265
|
@c.waw_identity_map do
|
306
266
|
MODEL_DB.sqls.length.should == 0
|
@@ -308,7 +268,7 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
308
268
|
MODEL_DB.sqls.length.should == 2
|
309
269
|
a.should == [@c1.load(:id=>1, :id2=>4), @c1.load(:id=>2, :id2=>5), @c1.load(:id=>3, :id2=>6)]
|
310
270
|
a.map{|x| x.artists}.should == [[@c2.load(:id=>1), @c2.load(:id=>2), @c2.load(:id=>3), @c2.load(:id=>3)], [@c2.load(:id=>1), @c2.load(:id=>2)], []]
|
311
|
-
MODEL_DB.sqls.length.should ==
|
271
|
+
MODEL_DB.sqls.length.should == 0
|
312
272
|
end
|
313
273
|
end
|
314
274
|
|
@@ -317,23 +277,8 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
317
277
|
@c2.columns :id
|
318
278
|
@c1.plugin :many_through_many
|
319
279
|
@c1.many_through_many :artists, [[:aa, :album_id, :artist_id]], :class=>@c2
|
320
|
-
|
321
|
-
|
322
|
-
execute(sql)
|
323
|
-
yield({:id=>1})
|
324
|
-
yield({:id=>2})
|
325
|
-
yield({:id=>3})
|
326
|
-
end
|
327
|
-
ds = @c2.dataset
|
328
|
-
def ds.fetch_rows(sql)
|
329
|
-
execute(sql)
|
330
|
-
yield({:id=>1, :x_foreign_key_x=>1})
|
331
|
-
yield({:id=>1, :x_foreign_key_x=>2})
|
332
|
-
yield({:id=>2, :x_foreign_key_x=>1})
|
333
|
-
yield({:id=>2, :x_foreign_key_x=>2})
|
334
|
-
yield({:id=>3, :x_foreign_key_x=>1})
|
335
|
-
yield({:id=>3, :x_foreign_key_x=>1})
|
336
|
-
end
|
280
|
+
@c1.dataset._fetch = [{:id=>1}, {:id=>2}, {:id=>3}]
|
281
|
+
@c2.dataset._fetch = [{:id=>1, :x_foreign_key_x=>1}, {:id=>1, :x_foreign_key_x=>2}, {:id=>2, :x_foreign_key_x=>1}, {:id=>2, :x_foreign_key_x=>2}, {:id=>3, :x_foreign_key_x=>1}, {:id=>3, :x_foreign_key_x=>1}]
|
337
282
|
|
338
283
|
@c.waw_identity_map do
|
339
284
|
MODEL_DB.sqls.length.should == 0
|
@@ -341,7 +286,7 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
341
286
|
MODEL_DB.sqls.length.should == 2
|
342
287
|
a.should == [@c1.load(:id=>1), @c1.load(:id=>2), @c1.load(:id=>3)]
|
343
288
|
a.map{|x| x.artists}.should == [[@c2.load(:id=>1), @c2.load(:id=>2), @c2.load(:id=>3), @c2.load(:id=>3)], [@c2.load(:id=>1), @c2.load(:id=>2)], []]
|
344
|
-
MODEL_DB.sqls.length.should ==
|
289
|
+
MODEL_DB.sqls.length.should == 0
|
345
290
|
end
|
346
291
|
end
|
347
292
|
|
@@ -351,23 +296,8 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
351
296
|
@c1.set_primary_key :id, :id2
|
352
297
|
@c1.plugin :many_through_many
|
353
298
|
@c1.many_through_many :artists, [[:aa, [:album_id1, :album_id2], :artist_id]], :class=>@c2
|
354
|
-
|
355
|
-
|
356
|
-
execute(sql)
|
357
|
-
yield({:id=>1, :id2=>4})
|
358
|
-
yield({:id=>2, :id2=>5})
|
359
|
-
yield({:id=>3, :id2=>6})
|
360
|
-
end
|
361
|
-
ds = @c2.dataset
|
362
|
-
def ds.fetch_rows(sql)
|
363
|
-
execute(sql)
|
364
|
-
yield({:id=>1, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
|
365
|
-
yield({:id=>1, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5})
|
366
|
-
yield({:id=>2, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
|
367
|
-
yield({:id=>2, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5})
|
368
|
-
yield({:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
|
369
|
-
yield({:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
|
370
|
-
end
|
299
|
+
@c1.dataset._fetch = [{:id=>1, :id2=>4}, {:id=>2, :id2=>5}, {:id=>3, :id2=>6}]
|
300
|
+
@c2.dataset._fetch = [ {:id=>1, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4}, {:id=>1, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5}, {:id=>2, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4}, {:id=>2, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5}, {:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4}, {:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4}]
|
371
301
|
|
372
302
|
@c.waw_identity_map do
|
373
303
|
MODEL_DB.sqls.length.should == 0
|
@@ -375,7 +305,7 @@ describe "Sequel::Plugins::IdentityMap" do
|
|
375
305
|
MODEL_DB.sqls.length.should == 2
|
376
306
|
a.should == [@c1.load(:id=>1, :id2=>4), @c1.load(:id=>2, :id2=>5), @c1.load(:id=>3, :id2=>6)]
|
377
307
|
a.map{|x| x.artists}.should == [[@c2.load(:id=>1), @c2.load(:id=>2), @c2.load(:id=>3), @c2.load(:id=>3)], [@c2.load(:id=>1), @c2.load(:id=>2)], []]
|
378
|
-
MODEL_DB.sqls.length.should ==
|
308
|
+
MODEL_DB.sqls.length.should == 0
|
379
309
|
end
|
380
310
|
end
|
381
311
|
end
|