sequel 3.48.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +114 -0
- data/Rakefile +10 -7
- data/doc/association_basics.rdoc +25 -23
- data/doc/code_order.rdoc +7 -0
- data/doc/core_extensions.rdoc +0 -10
- data/doc/object_model.rdoc +4 -1
- data/doc/querying.rdoc +3 -3
- data/doc/release_notes/4.0.0.txt +262 -0
- data/doc/security.rdoc +0 -28
- data/doc/testing.rdoc +8 -14
- data/lib/sequel/adapters/ado.rb +7 -11
- data/lib/sequel/adapters/ado/access.rb +8 -8
- data/lib/sequel/adapters/ado/mssql.rb +4 -4
- data/lib/sequel/adapters/amalgalite.rb +6 -6
- data/lib/sequel/adapters/cubrid.rb +7 -7
- data/lib/sequel/adapters/db2.rb +5 -9
- data/lib/sequel/adapters/dbi.rb +2 -6
- data/lib/sequel/adapters/do.rb +4 -4
- data/lib/sequel/adapters/firebird.rb +4 -4
- data/lib/sequel/adapters/ibmdb.rb +8 -8
- data/lib/sequel/adapters/informix.rb +2 -10
- data/lib/sequel/adapters/jdbc.rb +17 -17
- data/lib/sequel/adapters/jdbc/as400.rb +2 -2
- data/lib/sequel/adapters/jdbc/cubrid.rb +1 -1
- data/lib/sequel/adapters/jdbc/db2.rb +1 -1
- data/lib/sequel/adapters/jdbc/derby.rb +1 -1
- data/lib/sequel/adapters/jdbc/h2.rb +2 -2
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
- data/lib/sequel/adapters/jdbc/informix.rb +1 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +5 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +3 -3
- data/lib/sequel/adapters/jdbc/sqlite.rb +3 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +3 -3
- data/lib/sequel/adapters/mock.rb +7 -7
- data/lib/sequel/adapters/mysql.rb +3 -3
- data/lib/sequel/adapters/mysql2.rb +4 -4
- data/lib/sequel/adapters/odbc.rb +2 -6
- data/lib/sequel/adapters/odbc/mssql.rb +1 -1
- data/lib/sequel/adapters/openbase.rb +1 -5
- data/lib/sequel/adapters/oracle.rb +13 -17
- data/lib/sequel/adapters/postgres.rb +20 -25
- data/lib/sequel/adapters/shared/cubrid.rb +3 -3
- data/lib/sequel/adapters/shared/db2.rb +2 -2
- data/lib/sequel/adapters/shared/firebird.rb +7 -7
- data/lib/sequel/adapters/shared/mssql.rb +9 -9
- data/lib/sequel/adapters/shared/mysql.rb +29 -13
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +7 -7
- data/lib/sequel/adapters/shared/oracle.rb +22 -13
- data/lib/sequel/adapters/shared/postgres.rb +61 -46
- data/lib/sequel/adapters/shared/sqlite.rb +9 -9
- data/lib/sequel/adapters/sqlite.rb +17 -11
- data/lib/sequel/adapters/swift.rb +3 -3
- data/lib/sequel/adapters/swift/mysql.rb +1 -1
- data/lib/sequel/adapters/swift/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +8 -8
- data/lib/sequel/ast_transformer.rb +3 -1
- data/lib/sequel/connection_pool.rb +4 -2
- data/lib/sequel/connection_pool/sharded_single.rb +2 -2
- data/lib/sequel/connection_pool/sharded_threaded.rb +5 -5
- data/lib/sequel/connection_pool/threaded.rb +7 -7
- data/lib/sequel/core.rb +4 -67
- data/lib/sequel/database.rb +1 -0
- data/lib/sequel/database/connecting.rb +2 -8
- data/lib/sequel/database/dataset.rb +2 -7
- data/lib/sequel/database/dataset_defaults.rb +0 -18
- data/lib/sequel/database/features.rb +4 -4
- data/lib/sequel/database/misc.rb +6 -8
- data/lib/sequel/database/query.rb +5 -61
- data/lib/sequel/database/schema_generator.rb +22 -20
- data/lib/sequel/database/schema_methods.rb +48 -20
- data/lib/sequel/database/transactions.rb +7 -17
- data/lib/sequel/dataset.rb +2 -0
- data/lib/sequel/dataset/actions.rb +23 -91
- data/lib/sequel/dataset/features.rb +1 -4
- data/lib/sequel/dataset/graph.rb +3 -47
- data/lib/sequel/dataset/misc.rb +4 -33
- data/lib/sequel/dataset/prepared_statements.rb +3 -1
- data/lib/sequel/dataset/query.rb +116 -240
- data/lib/sequel/dataset/sql.rb +19 -97
- data/lib/sequel/deprecated.rb +0 -16
- data/lib/sequel/exceptions.rb +0 -3
- data/lib/sequel/extensions/_pretty_table.rb +1 -1
- data/lib/sequel/extensions/columns_introspection.rb +1 -12
- data/lib/sequel/extensions/constraint_validations.rb +3 -3
- data/lib/sequel/extensions/core_extensions.rb +0 -9
- data/lib/sequel/extensions/date_arithmetic.rb +1 -2
- data/lib/sequel/extensions/graph_each.rb +11 -0
- data/lib/sequel/extensions/migration.rb +5 -5
- data/lib/sequel/extensions/null_dataset.rb +11 -13
- data/lib/sequel/extensions/pagination.rb +3 -6
- data/lib/sequel/extensions/pg_array.rb +6 -4
- data/lib/sequel/extensions/pg_array_ops.rb +35 -1
- data/lib/sequel/extensions/pg_json.rb +12 -2
- data/lib/sequel/extensions/pg_json_ops.rb +266 -0
- data/lib/sequel/extensions/pg_range.rb +2 -2
- data/lib/sequel/extensions/pg_range_ops.rb +0 -8
- data/lib/sequel/extensions/pg_row.rb +2 -2
- data/lib/sequel/extensions/pretty_table.rb +0 -4
- data/lib/sequel/extensions/query.rb +3 -8
- data/lib/sequel/extensions/schema_caching.rb +0 -7
- data/lib/sequel/extensions/schema_dumper.rb +10 -17
- data/lib/sequel/extensions/select_remove.rb +0 -4
- data/lib/sequel/extensions/set_overrides.rb +28 -0
- data/lib/sequel/extensions/to_dot.rb +6 -10
- data/lib/sequel/model.rb +6 -7
- data/lib/sequel/model/associations.rb +127 -182
- data/lib/sequel/model/base.rb +88 -211
- data/lib/sequel/model/errors.rb +0 -13
- data/lib/sequel/model/plugins.rb +2 -2
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/after_initialize.rb +11 -17
- data/lib/sequel/plugins/association_autoreloading.rb +1 -47
- data/lib/sequel/plugins/association_dependencies.rb +2 -2
- data/lib/sequel/plugins/auto_validations.rb +2 -8
- data/lib/sequel/plugins/blacklist_security.rb +32 -2
- data/lib/sequel/plugins/caching.rb +1 -1
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/composition.rb +10 -8
- data/lib/sequel/plugins/constraint_validations.rb +2 -2
- data/lib/sequel/plugins/dataset_associations.rb +4 -0
- data/lib/sequel/plugins/defaults_setter.rb +8 -6
- data/lib/sequel/plugins/dirty.rb +6 -6
- data/lib/sequel/plugins/force_encoding.rb +13 -8
- data/lib/sequel/plugins/hook_class_methods.rb +1 -7
- data/lib/sequel/plugins/json_serializer.rb +13 -74
- data/lib/sequel/plugins/lazy_attributes.rb +2 -4
- data/lib/sequel/plugins/list.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +4 -11
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +1 -49
- data/lib/sequel/plugins/nested_attributes.rb +1 -1
- data/lib/sequel/plugins/optimistic_locking.rb +3 -5
- data/lib/sequel/plugins/pg_array_associations.rb +453 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +23 -7
- data/lib/sequel/plugins/prepared_statements.rb +1 -1
- data/lib/sequel/plugins/prepared_statements_associations.rb +20 -14
- data/lib/sequel/plugins/prepared_statements_safe.rb +2 -2
- data/lib/sequel/plugins/rcte_tree.rb +1 -1
- data/lib/sequel/plugins/serialization.rb +5 -4
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +7 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/touch.rb +2 -2
- data/lib/sequel/plugins/tree.rb +1 -1
- data/lib/sequel/plugins/typecast_on_load.rb +19 -4
- data/lib/sequel/plugins/validation_class_methods.rb +0 -30
- data/lib/sequel/plugins/validation_helpers.rb +13 -31
- data/lib/sequel/plugins/xml_serializer.rb +18 -57
- data/lib/sequel/sql.rb +20 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapters/db2_spec.rb +14 -23
- data/spec/adapters/firebird_spec.rb +25 -29
- data/spec/adapters/informix_spec.rb +11 -14
- data/spec/adapters/mssql_spec.rb +71 -77
- data/spec/adapters/mysql_spec.rb +165 -172
- data/spec/adapters/oracle_spec.rb +36 -39
- data/spec/adapters/postgres_spec.rb +175 -100
- data/spec/adapters/spec_helper.rb +13 -11
- data/spec/adapters/sqlite_spec.rb +36 -44
- data/spec/core/connection_pool_spec.rb +2 -1
- data/spec/core/database_spec.rb +55 -55
- data/spec/core/dataset_spec.rb +45 -249
- data/spec/core/deprecated_spec.rb +0 -8
- data/spec/core/expression_filters_spec.rb +23 -5
- data/spec/core/object_graph_spec.rb +4 -66
- data/spec/core/schema_spec.rb +35 -12
- data/spec/core/spec_helper.rb +3 -2
- data/spec/core_extensions_spec.rb +17 -19
- data/spec/extensions/arbitrary_servers_spec.rb +2 -3
- data/spec/extensions/association_dependencies_spec.rb +14 -14
- data/spec/extensions/auto_validations_spec.rb +7 -0
- data/spec/extensions/blacklist_security_spec.rb +5 -5
- data/spec/extensions/blank_spec.rb +2 -0
- data/spec/extensions/class_table_inheritance_spec.rb +2 -2
- data/spec/extensions/columns_introspection_spec.rb +2 -29
- data/spec/extensions/composition_spec.rb +10 -17
- data/spec/extensions/core_refinements_spec.rb +5 -1
- data/spec/extensions/dataset_associations_spec.rb +18 -0
- data/spec/extensions/date_arithmetic_spec.rb +2 -2
- data/spec/extensions/defaults_setter_spec.rb +9 -9
- data/spec/extensions/dirty_spec.rb +0 -5
- data/spec/extensions/eval_inspect_spec.rb +2 -0
- data/spec/extensions/force_encoding_spec.rb +2 -18
- data/spec/extensions/hash_aliases_spec.rb +8 -0
- data/spec/extensions/hook_class_methods_spec.rb +39 -58
- data/spec/extensions/inflector_spec.rb +2 -0
- data/spec/extensions/instance_filters_spec.rb +8 -8
- data/spec/extensions/json_serializer_spec.rb +1 -41
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +106 -109
- data/spec/extensions/migration_spec.rb +2 -0
- data/spec/extensions/named_timezones_spec.rb +1 -0
- data/spec/extensions/pg_array_associations_spec.rb +603 -0
- data/spec/extensions/pg_array_ops_spec.rb +25 -0
- data/spec/extensions/pg_array_spec.rb +9 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +13 -0
- data/spec/extensions/pg_hstore_spec.rb +1 -0
- data/spec/extensions/pg_json_ops_spec.rb +131 -0
- data/spec/extensions/pg_json_spec.rb +10 -4
- data/spec/extensions/pg_range_ops_spec.rb +2 -5
- data/spec/extensions/pg_range_spec.rb +6 -2
- data/spec/extensions/pg_row_ops_spec.rb +2 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +26 -5
- data/spec/extensions/rcte_tree_spec.rb +15 -15
- data/spec/extensions/schema_dumper_spec.rb +0 -1
- data/spec/extensions/schema_spec.rb +9 -9
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +18 -29
- data/spec/extensions/set_overrides_spec.rb +4 -0
- data/spec/extensions/{many_to_one_pk_lookup_spec.rb → shared_caching_spec.rb} +1 -4
- data/spec/extensions/single_table_inheritance_spec.rb +4 -4
- data/spec/extensions/spec_helper.rb +8 -9
- data/spec/extensions/sql_expr_spec.rb +2 -0
- data/spec/extensions/string_date_time_spec.rb +2 -0
- data/spec/extensions/string_stripper_spec.rb +2 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +12 -12
- data/spec/extensions/thread_local_timezones_spec.rb +2 -0
- data/spec/extensions/timestamps_spec.rb +1 -1
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +24 -24
- data/spec/extensions/tree_spec.rb +7 -7
- data/spec/extensions/typecast_on_load_spec.rb +8 -1
- data/spec/extensions/update_primary_key_spec.rb +10 -10
- data/spec/extensions/validation_class_methods_spec.rb +10 -39
- data/spec/extensions/validation_helpers_spec.rb +29 -47
- data/spec/extensions/xml_serializer_spec.rb +1 -23
- data/spec/integration/associations_test.rb +231 -40
- data/spec/integration/database_test.rb +1 -1
- data/spec/integration/dataset_test.rb +64 -64
- data/spec/integration/eager_loader_test.rb +28 -28
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +2 -2
- data/spec/integration/plugin_test.rb +21 -21
- data/spec/integration/prepared_statement_test.rb +7 -7
- data/spec/integration/schema_test.rb +115 -110
- data/spec/integration/spec_helper.rb +17 -27
- data/spec/integration/timezone_test.rb +1 -1
- data/spec/integration/transaction_test.rb +10 -10
- data/spec/integration/type_test.rb +2 -2
- data/spec/model/association_reflection_spec.rb +2 -28
- data/spec/model/associations_spec.rb +239 -188
- data/spec/model/base_spec.rb +27 -68
- data/spec/model/dataset_methods_spec.rb +4 -4
- data/spec/model/eager_loading_spec.rb +160 -172
- data/spec/model/hooks_spec.rb +62 -79
- data/spec/model/model_spec.rb +36 -51
- data/spec/model/plugins_spec.rb +5 -19
- data/spec/model/record_spec.rb +125 -151
- data/spec/model/spec_helper.rb +8 -6
- data/spec/model/validations_spec.rb +4 -17
- data/spec/spec_config.rb +2 -10
- metadata +50 -56
- data/lib/sequel/deprecated_core_extensions.rb +0 -135
- data/lib/sequel/extensions/pg_auto_parameterize.rb +0 -185
- data/lib/sequel/extensions/pg_statement_cache.rb +0 -318
- data/lib/sequel/plugins/identity_map.rb +0 -260
- data/lib/sequel_core.rb +0 -2
- data/lib/sequel_model.rb +0 -2
- data/spec/extensions/association_autoreloading_spec.rb +0 -102
- data/spec/extensions/identity_map_spec.rb +0 -337
- data/spec/extensions/pg_auto_parameterize_spec.rb +0 -70
- data/spec/extensions/pg_statement_cache_spec.rb +0 -208
- data/spec/rcov.opts +0 -8
- data/spec/spec_config.rb.example +0 -10
@@ -7,40 +7,40 @@ describe "instance_filters plugin" do
|
|
7
7
|
@c.columns :id, :name, :num
|
8
8
|
@c.plugin :instance_filters
|
9
9
|
@p = @c.load(:id=>1, :name=>'John', :num=>1)
|
10
|
-
|
10
|
+
DB.sqls
|
11
11
|
end
|
12
12
|
|
13
13
|
specify "should raise an error when updating a stale record" do
|
14
14
|
@p.update(:name=>'Bob')
|
15
|
-
|
15
|
+
DB.sqls.should == ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
|
16
16
|
@p.instance_filter(:name=>'Jim')
|
17
17
|
@p.this.numrows = 0
|
18
18
|
proc{@p.update(:name=>'Joe')}.should raise_error(Sequel::Plugins::InstanceFilters::Error)
|
19
|
-
|
19
|
+
DB.sqls.should == ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Jim'))"]
|
20
20
|
end
|
21
21
|
|
22
22
|
specify "should raise an error when destroying a stale record" do
|
23
23
|
@p.destroy
|
24
|
-
|
24
|
+
DB.sqls.should == ["DELETE FROM people WHERE id = 1"]
|
25
25
|
@p.instance_filter(:name=>'Jim')
|
26
26
|
@p.this.numrows = 0
|
27
27
|
proc{@p.destroy}.should raise_error(Sequel::Plugins::InstanceFilters::Error)
|
28
|
-
|
28
|
+
DB.sqls.should == ["DELETE FROM people WHERE ((id = 1) AND (name = 'Jim'))"]
|
29
29
|
end
|
30
30
|
|
31
31
|
specify "should apply all instance filters" do
|
32
32
|
@p.instance_filter(:name=>'Jim')
|
33
33
|
@p.instance_filter{num > 2}
|
34
34
|
@p.update(:name=>'Bob')
|
35
|
-
|
35
|
+
DB.sqls.should == ["UPDATE people SET name = 'Bob' WHERE ((id = 1) AND (name = 'Jim') AND (num > 2))"]
|
36
36
|
end
|
37
37
|
|
38
38
|
specify "should drop instance filters after updating" do
|
39
39
|
@p.instance_filter(:name=>'Joe')
|
40
40
|
@p.update(:name=>'Joe')
|
41
|
-
|
41
|
+
DB.sqls.should == ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Joe'))"]
|
42
42
|
@p.update(:name=>'Bob')
|
43
|
-
|
43
|
+
DB.sqls.should == ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
|
44
44
|
end
|
45
45
|
|
46
46
|
specify "shouldn't allow instance filters on frozen objects" do
|
@@ -43,15 +43,6 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
43
43
|
Artist.from_json(Artist.load(:name=>Date.today).to_json).should == Artist.load(:name=>Date.today)
|
44
44
|
end
|
45
45
|
|
46
|
-
qspecify "should have .json_create method for creating an instance from a hash parsed from JSON" do
|
47
|
-
JSON.parse(@artist.to_json(:naked=>false), :create_additions=>true).should == @artist
|
48
|
-
JSON.parse(@artist.to_json(:naked=>false, :include=>{:albums=>{:include=>{:artist=>{:include=>:albums}}}}), :create_additions=>true).albums.map{|a| a.artist.albums}.should == [[@album]]
|
49
|
-
end
|
50
|
-
|
51
|
-
qspecify "should have .json_create method raise error if not given a hash" do
|
52
|
-
proc{Artist.json_create([])}.should raise_error(Sequel::Error)
|
53
|
-
end
|
54
|
-
|
55
46
|
it "should handle the :only option" do
|
56
47
|
Artist.from_json(@artist.to_json(:only=>:name)).should == Artist.load(:name=>@artist.name)
|
57
48
|
Album.from_json(@album.to_json(:only=>[:id, :name])).should == Album.load(:id=>@album.id, :name=>@album.name)
|
@@ -129,10 +120,6 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
129
120
|
Album.from_json(@album.to_json(:include=>{:artist=>{:include=>{:albums=>{:only=>:name}}}}), :associations=>{:artist=>{:associations=>:albums}}).artist.albums.should == [Album.load(:name=>@album.name)]
|
130
121
|
end
|
131
122
|
|
132
|
-
qspecify "should automatically cascade parsing for all associations if :all_associations is used" do
|
133
|
-
Artist.from_json(@artist.to_json(:include=>{:albums=>{:include=>:artist}}), :all_associations=>true).albums.map{|a| a.artist}.should == [@artist]
|
134
|
-
end
|
135
|
-
|
136
123
|
it "should handle the :include option cascading with an empty hash" do
|
137
124
|
Album.from_json(@album.to_json(:include=>{:artist=>{}}), :associations=>:artist).artist.should == @artist
|
138
125
|
Album.from_json(@album.to_json(:include=>{:blah=>{}})).blah.should == @album.blah
|
@@ -228,6 +215,7 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
228
215
|
it "should handle the :root=>:collection option to qualify just the collection" do
|
229
216
|
Album.dataset._fetch = [{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]
|
230
217
|
Album.dataset.to_json(:root=>:collection, :only => :id).to_s.should == '{"albums":[{"id":1},{"id":1}]}'
|
218
|
+
Album.dataset.to_json(:root=>true, :only => :id).to_s.should == '{"albums":[{"id":1},{"id":1}]}'
|
231
219
|
end
|
232
220
|
|
233
221
|
it "should handle the :root=>:instance option to qualify just the instances" do
|
@@ -235,11 +223,6 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
235
223
|
Album.dataset.to_json(:root=>:instance, :only => :id).to_s.should == '[{"album":{"id":1}},{"album":{"id":1}}]'
|
236
224
|
end
|
237
225
|
|
238
|
-
qspecify "should handle the :root=>true option be the same as :root=>:both for backwards compatibility" do
|
239
|
-
Album.dataset._fetch = [{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]
|
240
|
-
Album.dataset.to_json(:root=>true, :only => :id).to_s.should == '{"albums":[{"album":{"id":1}},{"album":{"id":1}}]}'
|
241
|
-
end
|
242
|
-
|
243
226
|
it "should store the default options in json_serializer_opts" do
|
244
227
|
Album.json_serializer_opts.should == {:naked=>true}
|
245
228
|
c = Class.new(Album)
|
@@ -260,29 +243,6 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
260
243
|
Object.send(:remove_const, :Artist3)
|
261
244
|
end
|
262
245
|
|
263
|
-
qspecify "should have :associations option take precedence over :all_assocations" do
|
264
|
-
Artist.from_json(@artist.to_json(:include=>:albums), :associations=>[], :all_associations=>true, :fields=>[]).associations.should == {}
|
265
|
-
end
|
266
|
-
|
267
|
-
qspecify "should allow overriding of :all_columns options in associated objects" do
|
268
|
-
Album.restrict_primary_key
|
269
|
-
Artist.from_json(@artist.to_json(:include=>:albums), :associations=>{:albums=>{:fields=>[:id, :name, :artist_id], :missing=>:raise}}, :all_columns=>true).albums.should == [@album]
|
270
|
-
end
|
271
|
-
|
272
|
-
qspecify "should handle typecasting if setter columns exist when using :all_columns" do
|
273
|
-
Artist.restrict_primary_key
|
274
|
-
Artist.from_json('{"id":"2","name":"YJM","json_class":"Artist"}', :all_columns=>true).should == @artist
|
275
|
-
end
|
276
|
-
|
277
|
-
qspecify "should allow setting columns that are restricted if :all_columns is used" do
|
278
|
-
Artist.restrict_primary_key
|
279
|
-
Artist.from_json(@artist.to_json, :all_columns=>true).should == @artist
|
280
|
-
end
|
281
|
-
|
282
|
-
qspecify "should raise an error if using :all_columns and non-column is in the JSON" do
|
283
|
-
proc{Artist.from_json('{"foo":"bar"}', :all_columns=>true)}.should raise_error(Sequel::Error)
|
284
|
-
end
|
285
|
-
|
286
246
|
it "should raise an error if attempting to set a restricted column and :all_columns is not used" do
|
287
247
|
Artist.restrict_primary_key
|
288
248
|
proc{Artist.from_json(@artist.to_json)}.should raise_error(Sequel::Error)
|
@@ -14,7 +14,7 @@ describe Sequel::Model, "many_through_many" do
|
|
14
14
|
@c2 = Tag
|
15
15
|
@dataset = @c2.dataset
|
16
16
|
@dataset._fetch = {:id=>1}
|
17
|
-
|
17
|
+
DB.reset
|
18
18
|
end
|
19
19
|
after do
|
20
20
|
Object.send(:remove_const, :Artist)
|
@@ -41,9 +41,9 @@ describe Sequel::Model, "many_through_many" do
|
|
41
41
|
@c1.many_through_many :tags, :through=>[[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :left_primary_key=>:id3
|
42
42
|
a = @c1.eager(:tags).all
|
43
43
|
a.should == [@c1.load(:id => 1)]
|
44
|
-
|
44
|
+
DB.sqls.should == ['SELECT * FROM artists', "SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (3)))"]
|
45
45
|
a.first.tags.should == [@c2.load(:id=>4)]
|
46
|
-
|
46
|
+
DB.sqls.should == []
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should handle a :eager_loading_predicate_key option to change the SQL used in the lookup" do
|
@@ -52,7 +52,7 @@ describe Sequel::Model, "many_through_many" do
|
|
52
52
|
@c1.many_through_many :tags, :through=>[[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager_loading_predicate_key=>Sequel./(:albums_artists__artist_id, 3)
|
53
53
|
a = @c1.eager(:tags).all
|
54
54
|
a.should == [@c1.load(:id => 1)]
|
55
|
-
|
55
|
+
DB.sqls.should == ['SELECT * FROM artists', "SELECT tags.*, (albums_artists.artist_id / 3) AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND ((albums_artists.artist_id / 3) IN (1)))"]
|
56
56
|
a.first.tags.should == [@c2.load(:id=>4)]
|
57
57
|
end
|
58
58
|
|
@@ -294,18 +294,18 @@ describe Sequel::Model, "many_through_many" do
|
|
294
294
|
it "should provide an array with all members of the association" do
|
295
295
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]]
|
296
296
|
@c1.load(:id => 1234).tags.should == [@c2.load(:id=>1)]
|
297
|
-
|
297
|
+
DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1234))']
|
298
298
|
end
|
299
299
|
|
300
300
|
it "should populate cache when accessed" do
|
301
301
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]]
|
302
302
|
n = @c1.load(:id => 1234)
|
303
303
|
n.associations[:tags].should == nil
|
304
|
-
|
304
|
+
DB.sqls.should == []
|
305
305
|
n.tags.should == [@c2.load(:id=>1)]
|
306
|
-
|
306
|
+
DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1234))']
|
307
307
|
n.associations[:tags].should == n.tags
|
308
|
-
|
308
|
+
DB.sqls.length.should == 0
|
309
309
|
end
|
310
310
|
|
311
311
|
it "should use cache if available" do
|
@@ -313,18 +313,18 @@ describe Sequel::Model, "many_through_many" do
|
|
313
313
|
n = @c1.load(:id => 1234)
|
314
314
|
n.associations[:tags] = []
|
315
315
|
n.tags.should == []
|
316
|
-
|
316
|
+
DB.sqls.should == []
|
317
317
|
end
|
318
318
|
|
319
319
|
it "should not use cache if asked to reload" do
|
320
320
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]]
|
321
321
|
n = @c1.load(:id => 1234)
|
322
322
|
n.associations[:tags] = []
|
323
|
-
|
323
|
+
DB.sqls.should == []
|
324
324
|
n.tags(true).should == [@c2.load(:id=>1)]
|
325
|
-
|
325
|
+
DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1234))']
|
326
326
|
n.associations[:tags].should == n.tags
|
327
|
-
|
327
|
+
DB.sqls.length.should == 0
|
328
328
|
end
|
329
329
|
|
330
330
|
it "should not add associations methods directly to class" do
|
@@ -368,7 +368,7 @@ describe 'Sequel::Plugins::ManyThroughMany::ManyThroughManyAssociationReflection
|
|
368
368
|
end
|
369
369
|
class ::Tag < Sequel::Model
|
370
370
|
end
|
371
|
-
|
371
|
+
DB.reset
|
372
372
|
@ar = Artist.association_reflection(:tags)
|
373
373
|
end
|
374
374
|
after do
|
@@ -452,7 +452,7 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
452
452
|
end
|
453
453
|
|
454
454
|
@c1 = Artist
|
455
|
-
|
455
|
+
DB.reset
|
456
456
|
end
|
457
457
|
after do
|
458
458
|
[:Artist, :Tag, :Album, :Track].each{|x| Object.send(:remove_const, x)}
|
@@ -461,15 +461,15 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
461
461
|
it "should eagerly load a single many_through_many association" do
|
462
462
|
a = @c1.eager(:tags).all
|
463
463
|
a.should == [@c1.load(:id=>1)]
|
464
|
-
|
464
|
+
DB.sqls.should == ['SELECT * FROM artists', 'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))']
|
465
465
|
a.first.tags.should == [Tag.load(:id=>2)]
|
466
|
-
|
466
|
+
DB.sqls.length.should == 0
|
467
467
|
end
|
468
468
|
|
469
469
|
it "should eagerly load multiple associations in a single call" do
|
470
470
|
a = @c1.eager(:tags, :albums).all
|
471
471
|
a.should == [@c1.load(:id=>1)]
|
472
|
-
sqls =
|
472
|
+
sqls = DB.sqls
|
473
473
|
sqls.length.should == 3
|
474
474
|
sqls[0].should == 'SELECT * FROM artists'
|
475
475
|
sqls[1..-1].should(include('SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))'))
|
@@ -477,13 +477,13 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
477
477
|
a = a.first
|
478
478
|
a.tags.should == [Tag.load(:id=>2)]
|
479
479
|
a.albums.should == [Album.load(:id=>3)]
|
480
|
-
|
480
|
+
DB.sqls.length.should == 0
|
481
481
|
end
|
482
482
|
|
483
483
|
it "should eagerly load multiple associations in separate" do
|
484
484
|
a = @c1.eager(:tags).eager(:albums).all
|
485
485
|
a.should == [@c1.load(:id=>1)]
|
486
|
-
sqls =
|
486
|
+
sqls = DB.sqls
|
487
487
|
sqls.length.should == 3
|
488
488
|
sqls[0].should == 'SELECT * FROM artists'
|
489
489
|
sqls[1..-1].should(include('SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))'))
|
@@ -491,45 +491,45 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
491
491
|
a = a.first
|
492
492
|
a.tags.should == [Tag.load(:id=>2)]
|
493
493
|
a.albums.should == [Album.load(:id=>3)]
|
494
|
-
|
494
|
+
DB.sqls.length.should == 0
|
495
495
|
end
|
496
496
|
|
497
497
|
it "should allow cascading of eager loading for associations of associated models" do
|
498
498
|
a = @c1.eager(:tags=>:tracks).all
|
499
499
|
a.should == [@c1.load(:id=>1)]
|
500
|
-
|
500
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
501
501
|
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))',
|
502
502
|
'SELECT tracks.*, albums_tags.tag_id AS x_foreign_key_x FROM tracks INNER JOIN albums ON (albums.id = tracks.album_id) INNER JOIN albums_tags ON ((albums_tags.album_id = albums.id) AND (albums_tags.tag_id IN (2)))']
|
503
503
|
a = a.first
|
504
504
|
a.tags.should == [Tag.load(:id=>2)]
|
505
505
|
a.tags.first.tracks.should == [Track.load(:id=>4)]
|
506
|
-
|
506
|
+
DB.sqls.length.should == 0
|
507
507
|
end
|
508
508
|
|
509
509
|
it "should cascade eagerly loading when the :eager association option is used" do
|
510
510
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager=>:tracks
|
511
511
|
a = @c1.eager(:tags).all
|
512
512
|
a.should == [@c1.load(:id=>1)]
|
513
|
-
|
513
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
514
514
|
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))',
|
515
515
|
'SELECT tracks.*, albums_tags.tag_id AS x_foreign_key_x FROM tracks INNER JOIN albums ON (albums.id = tracks.album_id) INNER JOIN albums_tags ON ((albums_tags.album_id = albums.id) AND (albums_tags.tag_id IN (2)))']
|
516
516
|
a = a.first
|
517
517
|
a.tags.should == [Tag.load(:id=>2)]
|
518
518
|
a.tags.first.tracks.should == [Track.load(:id=>4)]
|
519
|
-
|
519
|
+
DB.sqls.length.should == 0
|
520
520
|
end
|
521
521
|
|
522
522
|
it "should respect :eager when lazily loading an association" do
|
523
523
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager=>:tracks
|
524
524
|
a = @c1.load(:id=>1)
|
525
525
|
a.tags.should == [Tag.load(:id=>2)]
|
526
|
-
|
526
|
+
DB.sqls.should == ['SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1))',
|
527
527
|
'SELECT tracks.*, albums_tags.tag_id AS x_foreign_key_x FROM tracks INNER JOIN albums ON (albums.id = tracks.album_id) INNER JOIN albums_tags ON ((albums_tags.album_id = albums.id) AND (albums_tags.tag_id IN (2)))']
|
528
528
|
a.tags.first.tracks.should == [Track.load(:id=>4)]
|
529
|
-
|
529
|
+
DB.sqls.length.should == 0
|
530
530
|
end
|
531
531
|
|
532
|
-
it "should
|
532
|
+
it "should raise error if attempting to eagerly load an association using :eager_graph option" do
|
533
533
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager_graph=>:tracks
|
534
534
|
proc{@c1.eager(:tags).all}.should raise_error(Sequel::Error)
|
535
535
|
end
|
@@ -544,50 +544,50 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
544
544
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager_graph=>:tracks
|
545
545
|
a = @c1.load(:id=>1)
|
546
546
|
a.tags
|
547
|
-
|
547
|
+
DB.sqls.should == [ 'SELECT tags.id, tracks.id AS tracks_id FROM (SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1))) AS tags LEFT OUTER JOIN albums_tags AS albums_tags_0 ON (albums_tags_0.tag_id = tags.id) LEFT OUTER JOIN albums ON (albums.id = albums_tags_0.album_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)']
|
548
548
|
a.tags.should == [Tag.load(:id=>2)]
|
549
549
|
a.tags.first.tracks.should == [Track.load(:id=>4)]
|
550
|
-
|
550
|
+
DB.sqls.length.should == 0
|
551
551
|
end
|
552
552
|
|
553
553
|
it "should respect :conditions when eagerly loading" do
|
554
554
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :conditions=>{:a=>32}
|
555
555
|
a = @c1.eager(:tags).all
|
556
556
|
a.should == [@c1.load(:id=>1)]
|
557
|
-
|
557
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
558
558
|
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) WHERE (a = 32)']
|
559
559
|
a.first.tags.should == [Tag.load(:id=>2)]
|
560
|
-
|
560
|
+
DB.sqls.length.should == 0
|
561
561
|
end
|
562
562
|
|
563
563
|
it "should respect :order when eagerly loading" do
|
564
564
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :order=>:blah
|
565
565
|
a = @c1.eager(:tags).all
|
566
566
|
a.should == [@c1.load(:id=>1)]
|
567
|
-
|
567
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
568
568
|
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) ORDER BY blah']
|
569
569
|
a.first.tags.should == [Tag.load(:id=>2)]
|
570
|
-
|
570
|
+
DB.sqls.length.should == 0
|
571
571
|
end
|
572
572
|
|
573
573
|
it "should use the association's block when eager loading by default" do
|
574
574
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]] do |ds| ds.filter(:a) end
|
575
575
|
a = @c1.eager(:tags).all
|
576
576
|
a.should == [@c1.load(:id=>1)]
|
577
|
-
|
577
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
578
578
|
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) WHERE a']
|
579
579
|
a.first.tags.should == [Tag.load(:id=>2)]
|
580
|
-
|
580
|
+
DB.sqls.length.should == 0
|
581
581
|
end
|
582
582
|
|
583
583
|
it "should use the :eager_block option when eager loading if given" do
|
584
584
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager_block=>proc{|ds| ds.filter(:b)} do |ds| ds.filter(:a) end
|
585
585
|
a = @c1.eager(:tags).all
|
586
586
|
a.should == [@c1.load(:id=>1)]
|
587
|
-
|
587
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
588
588
|
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) WHERE b']
|
589
589
|
a.first.tags.should == [Tag.load(:id=>2)]
|
590
|
-
|
590
|
+
DB.sqls.length.should == 0
|
591
591
|
end
|
592
592
|
|
593
593
|
it "should respect the :limit option on a many_through_many association" do
|
@@ -595,80 +595,77 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
595
595
|
Tag.dataset._fetch = [{:x_foreign_key_x=>1, :id=>5},{:x_foreign_key_x=>1, :id=>6}, {:x_foreign_key_x=>1, :id=>7}]
|
596
596
|
a = @c1.eager(:first_two_tags).all
|
597
597
|
a.should == [@c1.load(:id=>1)]
|
598
|
-
|
598
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
599
599
|
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))']
|
600
600
|
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
|
601
|
-
|
601
|
+
DB.sqls.length.should == 0
|
602
602
|
|
603
|
-
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[
|
603
|
+
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[1,1]
|
604
604
|
a = @c1.eager(:first_two_tags).all
|
605
605
|
a.should == [@c1.load(:id=>1)]
|
606
|
-
|
606
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
607
|
+
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))']
|
608
|
+
a.first.first_two_tags.should == [Tag.load(:id=>6)]
|
609
|
+
DB.sqls.length.should == 0
|
610
|
+
|
611
|
+
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[nil,1]
|
612
|
+
a = @c1.eager(:first_two_tags).all
|
613
|
+
a.should == [@c1.load(:id=>1)]
|
614
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
607
615
|
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))']
|
608
616
|
a.first.first_two_tags.should == [Tag.load(:id=>6), Tag.load(:id=>7)]
|
609
|
-
|
617
|
+
DB.sqls.length.should == 0
|
610
618
|
end
|
611
619
|
|
612
620
|
it "should respect the :limit option on a many_through_many association using a :window_function strategy" do
|
613
621
|
Tag.dataset.meta_def(:supports_window_functions?){true}
|
614
|
-
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>2, :
|
622
|
+
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>2, :order=>:name
|
615
623
|
Tag.dataset._fetch = [{:x_foreign_key_x=>1, :id=>5},{:x_foreign_key_x=>1, :id=>6}]
|
616
624
|
a = @c1.eager(:first_two_tags).all
|
617
625
|
a.should == [@c1.load(:id=>1)]
|
618
|
-
|
626
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
619
627
|
'SELECT * FROM (SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x, row_number() OVER (PARTITION BY albums_artists.artist_id ORDER BY name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))) AS t1 WHERE (x_sequel_row_number_x <= 2)']
|
620
628
|
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
|
621
|
-
|
629
|
+
DB.sqls.length.should == 0
|
622
630
|
|
623
|
-
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1], :
|
631
|
+
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1], :order=>:name
|
624
632
|
a = @c1.eager(:first_two_tags).all
|
625
633
|
a.should == [@c1.load(:id=>1)]
|
626
|
-
|
634
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
627
635
|
'SELECT * FROM (SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x, row_number() OVER (PARTITION BY albums_artists.artist_id ORDER BY name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))) AS t1 WHERE ((x_sequel_row_number_x >= 2) AND (x_sequel_row_number_x < 4))']
|
628
636
|
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
|
629
|
-
|
637
|
+
DB.sqls.length.should == 0
|
638
|
+
|
639
|
+
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[nil,1], :order=>:name
|
640
|
+
a = @c1.eager(:first_two_tags).all
|
641
|
+
a.should == [@c1.load(:id=>1)]
|
642
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
643
|
+
'SELECT * FROM (SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x, row_number() OVER (PARTITION BY albums_artists.artist_id ORDER BY name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))) AS t1 WHERE (x_sequel_row_number_x >= 2)']
|
644
|
+
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
|
645
|
+
DB.sqls.length.should == 0
|
630
646
|
end
|
631
647
|
|
632
648
|
it "should respect the :limit option on a many_through_many association with composite primary keys on the main table using a :window_function strategy" do
|
633
649
|
Tag.dataset.meta_def(:supports_window_functions?){true}
|
634
650
|
@c1.set_primary_key([:id1, :id2])
|
635
651
|
@c1.columns :id1, :id2
|
636
|
-
@c1.many_through_many :first_two_tags, [[:albums_artists, [:artist_id1, :artist_id2], :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>2, :
|
652
|
+
@c1.many_through_many :first_two_tags, [[:albums_artists, [:artist_id1, :artist_id2], :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>2, :order=>:name
|
637
653
|
@c1.dataset._fetch = [{:id1=>1, :id2=>2}]
|
638
654
|
Tag.dataset._fetch = [{:x_foreign_key_0_x=>1, :x_foreign_key_1_x=>2, :id=>5}, {:x_foreign_key_0_x=>1, :x_foreign_key_1_x=>2, :id=>6}]
|
639
655
|
a = @c1.eager(:first_two_tags).all
|
640
656
|
a.should == [@c1.load(:id1=>1, :id2=>2)]
|
641
|
-
|
657
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
642
658
|
'SELECT * FROM (SELECT tags.*, albums_artists.artist_id1 AS x_foreign_key_0_x, albums_artists.artist_id2 AS x_foreign_key_1_x, row_number() OVER (PARTITION BY albums_artists.artist_id1, albums_artists.artist_id2 ORDER BY name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND ((albums_artists.artist_id1, albums_artists.artist_id2) IN ((1, 2))))) AS t1 WHERE (x_sequel_row_number_x <= 2)']
|
643
659
|
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
|
644
|
-
|
660
|
+
DB.sqls.length.should == 0
|
645
661
|
|
646
|
-
@c1.many_through_many :first_two_tags, [[:albums_artists, [:artist_id1, :artist_id2], :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1], :
|
662
|
+
@c1.many_through_many :first_two_tags, [[:albums_artists, [:artist_id1, :artist_id2], :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1], :order=>:name
|
647
663
|
a = @c1.eager(:first_two_tags).all
|
648
664
|
a.should == [@c1.load(:id1=>1, :id2=>2)]
|
649
|
-
|
665
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
650
666
|
'SELECT * FROM (SELECT tags.*, albums_artists.artist_id1 AS x_foreign_key_0_x, albums_artists.artist_id2 AS x_foreign_key_1_x, row_number() OVER (PARTITION BY albums_artists.artist_id1, albums_artists.artist_id2 ORDER BY name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND ((albums_artists.artist_id1, albums_artists.artist_id2) IN ((1, 2))))) AS t1 WHERE ((x_sequel_row_number_x >= 2) AND (x_sequel_row_number_x < 4))']
|
651
667
|
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
|
652
|
-
|
653
|
-
end
|
654
|
-
|
655
|
-
qspecify "should respect the :limit option on a many_through_many association using a :correlated_subquery strategy" do
|
656
|
-
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>2, :eager_limit_strategy=>:correlated_subquery, :order=>:name
|
657
|
-
Tag.dataset._fetch = [{:x_foreign_key_x=>1, :id=>5},{:x_foreign_key_x=>1, :id=>6}]
|
658
|
-
a = @c1.eager(:first_two_tags).all
|
659
|
-
a.should == [@c1.load(:id=>1)]
|
660
|
-
MODEL_DB.sqls.should == ['SELECT * FROM artists',
|
661
|
-
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) WHERE (tags.id IN (SELECT t1.id FROM tags AS t1 INNER JOIN albums_tags ON (albums_tags.tag_id = t1.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists AS t2 ON ((t2.album_id = albums.id) AND (t2.artist_id = albums_artists.artist_id)) ORDER BY name LIMIT 2)) ORDER BY name']
|
662
|
-
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
|
663
|
-
MODEL_DB.sqls.length.should == 0
|
664
|
-
|
665
|
-
@c1.many_through_many :first_two_tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :class=>Tag, :limit=>[2,1], :eager_limit_strategy=>:correlated_subquery, :order=>:name
|
666
|
-
a = @c1.eager(:first_two_tags).all
|
667
|
-
a.should == [@c1.load(:id=>1)]
|
668
|
-
MODEL_DB.sqls.should == ['SELECT * FROM artists',
|
669
|
-
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1))) WHERE (tags.id IN (SELECT t1.id FROM tags AS t1 INNER JOIN albums_tags ON (albums_tags.tag_id = t1.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists AS t2 ON ((t2.album_id = albums.id) AND (t2.artist_id = albums_artists.artist_id)) ORDER BY name LIMIT 2 OFFSET 1)) ORDER BY name']
|
670
|
-
a.first.first_two_tags.should == [Tag.load(:id=>5), Tag.load(:id=>6)]
|
671
|
-
MODEL_DB.sqls.length.should == 0
|
668
|
+
DB.sqls.length.should == 0
|
672
669
|
end
|
673
670
|
|
674
671
|
it "should raise an error when attempting to eagerly load an association with the :allow_eager option set to false" do
|
@@ -681,10 +678,10 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
681
678
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :select=>:tags__name
|
682
679
|
a = @c1.eager(:tags).all
|
683
680
|
a.should == [@c1.load(:id=>1)]
|
684
|
-
|
681
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
685
682
|
'SELECT tags.name, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))']
|
686
683
|
a.first.tags.should == [Tag.load(:id=>2)]
|
687
|
-
|
684
|
+
DB.sqls.length.should == 0
|
688
685
|
end
|
689
686
|
|
690
687
|
it "should respect many_through_many association's :left_primary_key and :right_primary_key options" do
|
@@ -694,10 +691,10 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
694
691
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :left_primary_key=>:yyy, :right_primary_key=>:tag_id
|
695
692
|
a = @c1.eager(:tags).all
|
696
693
|
a.should == [@c1.load(:id=>1, :yyy=>8)]
|
697
|
-
|
694
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
698
695
|
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.tag_id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (8)))']
|
699
696
|
a.first.tags.should == [Tag.load(:tag_id=>2)]
|
700
|
-
|
697
|
+
DB.sqls.length.should == 0
|
701
698
|
end
|
702
699
|
|
703
700
|
it "should handle composite keys" do
|
@@ -707,20 +704,20 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
707
704
|
@c1.many_through_many :tags, [[:albums_artists, [:b1, :b2], [:c1, :c2]], [:albums, [:d1, :d2], [:e1, :e2]], [:albums_tags, [:f1, :f2], [:g1, :g2]]], :right_primary_key=>[:h1, :h2], :left_primary_key=>[:id, :yyy]
|
708
705
|
a = @c1.eager(:tags).all
|
709
706
|
a.should == [@c1.load(:id=>1, :yyy=>8)]
|
710
|
-
|
707
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
711
708
|
'SELECT tags.*, albums_artists.b1 AS x_foreign_key_0_x, albums_artists.b2 AS x_foreign_key_1_x FROM tags INNER JOIN albums_tags ON ((albums_tags.g1 = tags.h1) AND (albums_tags.g2 = tags.h2)) INNER JOIN albums ON ((albums.e1 = albums_tags.f1) AND (albums.e2 = albums_tags.f2)) INNER JOIN albums_artists ON ((albums_artists.c1 = albums.d1) AND (albums_artists.c2 = albums.d2) AND ((albums_artists.b1, albums_artists.b2) IN ((1, 8))))']
|
712
709
|
a.first.tags.should == [Tag.load(:id=>2)]
|
713
|
-
|
710
|
+
DB.sqls.length.should == 0
|
714
711
|
end
|
715
712
|
|
716
713
|
it "should respect :after_load callbacks on associations when eager loading" do
|
717
714
|
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :after_load=>lambda{|o, as| o[:id] *= 2; as.each{|a| a[:id] *= 3}}
|
718
715
|
a = @c1.eager(:tags).all
|
719
716
|
a.should == [@c1.load(:id=>2)]
|
720
|
-
|
717
|
+
DB.sqls.should == ['SELECT * FROM artists',
|
721
718
|
'SELECT tags.*, albums_artists.artist_id AS x_foreign_key_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))']
|
722
719
|
a.first.tags.should == [Tag.load(:id=>6)]
|
723
|
-
|
720
|
+
DB.sqls.length.should == 0
|
724
721
|
end
|
725
722
|
|
726
723
|
it "should raise an error if called without a symbol or hash" do
|
@@ -730,39 +727,39 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
730
727
|
it "should eagerly graph a single many_through_many association" do
|
731
728
|
a = @c1.eager_graph(:tags).all
|
732
729
|
a.should == [@c1.load(:id=>1)]
|
733
|
-
|
730
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id)']
|
734
731
|
a.first.tags.should == [Tag.load(:id=>2)]
|
735
|
-
|
732
|
+
DB.sqls.length.should == 0
|
736
733
|
end
|
737
734
|
|
738
735
|
it "should eagerly graph multiple associations in a single call" do
|
739
736
|
a = @c1.eager_graph(:tags, :albums).all
|
740
737
|
a.should == [@c1.load(:id=>1)]
|
741
|
-
|
738
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, albums_0.id AS albums_0_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_artists AS albums_artists_0 ON (albums_artists_0.artist_id = artists.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_artists_0.album_id)']
|
742
739
|
a = a.first
|
743
740
|
a.tags.should == [Tag.load(:id=>2)]
|
744
741
|
a.albums.should == [Album.load(:id=>3)]
|
745
|
-
|
742
|
+
DB.sqls.length.should == 0
|
746
743
|
end
|
747
744
|
|
748
745
|
it "should eagerly graph multiple associations in separate calls" do
|
749
746
|
a = @c1.eager_graph(:tags).eager_graph(:albums).all
|
750
747
|
a.should == [@c1.load(:id=>1)]
|
751
|
-
|
748
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, albums_0.id AS albums_0_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_artists AS albums_artists_0 ON (albums_artists_0.artist_id = artists.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_artists_0.album_id)']
|
752
749
|
a = a.first
|
753
750
|
a.tags.should == [Tag.load(:id=>2)]
|
754
751
|
a.albums.should == [Album.load(:id=>3)]
|
755
|
-
|
752
|
+
DB.sqls.length.should == 0
|
756
753
|
end
|
757
754
|
|
758
755
|
it "should allow cascading of eager graphing for associations of associated models" do
|
759
756
|
a = @c1.eager_graph(:tags=>:tracks).all
|
760
757
|
a.should == [@c1.load(:id=>1)]
|
761
|
-
|
758
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, tracks.id AS tracks_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_tags AS albums_tags_0 ON (albums_tags_0.tag_id = tags.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_tags_0.album_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums_0.id)']
|
762
759
|
a = a.first
|
763
760
|
a.tags.should == [Tag.load(:id=>2)]
|
764
761
|
a.tags.first.tracks.should == [Track.load(:id=>4)]
|
765
|
-
|
762
|
+
DB.sqls.length.should == 0
|
766
763
|
end
|
767
764
|
|
768
765
|
it "eager graphing should eliminate duplicates caused by cartesian products" do
|
@@ -771,29 +768,29 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
771
768
|
ds._fetch = [{:id=>1, :tags_id=>2}, {:id=>1, :tags_id=>3}, {:id=>1, :tags_id=>2}, {:id=>1, :tags_id=>3}]
|
772
769
|
a = ds.all
|
773
770
|
a.should == [@c1.load(:id=>1)]
|
774
|
-
|
771
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id)']
|
775
772
|
a.first.tags.should == [Tag.load(:id=>2), Tag.load(:id=>3)]
|
776
|
-
|
773
|
+
DB.sqls.length.should == 0
|
777
774
|
end
|
778
775
|
|
779
776
|
it "should eager graph multiple associations from the same table" do
|
780
777
|
a = @c1.eager_graph(:tags, :other_tags).all
|
781
778
|
a.should == [@c1.load(:id=>1)]
|
782
|
-
|
779
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, other_tags.id AS other_tags_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_artists AS albums_artists_0 ON (albums_artists_0.artist_id = artists.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_artists_0.album_id) LEFT OUTER JOIN albums_tags AS albums_tags_0 ON (albums_tags_0.album_id = albums_0.id) LEFT OUTER JOIN tags AS other_tags ON (other_tags.id = albums_tags_0.tag_id)']
|
783
780
|
a = a.first
|
784
781
|
a.tags.should == [Tag.load(:id=>2)]
|
785
782
|
a.other_tags.should == [Tag.load(:id=>9)]
|
786
|
-
|
783
|
+
DB.sqls.length.should == 0
|
787
784
|
end
|
788
785
|
|
789
786
|
it "should eager graph a self_referential association" do
|
790
787
|
a = @c1.eager_graph(:tags, :artists).all
|
791
788
|
a.should == [@c1.load(:id=>1)]
|
792
|
-
|
789
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, artists_0.id AS artists_0_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_artists AS albums_artists_0 ON (albums_artists_0.artist_id = artists.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_artists_0.album_id) LEFT OUTER JOIN albums_artists AS albums_artists_1 ON (albums_artists_1.album_id = albums_0.id) LEFT OUTER JOIN artists AS artists_0 ON (artists_0.id = albums_artists_1.artist_id)']
|
793
790
|
a = a.first
|
794
791
|
a.tags.should == [Tag.load(:id=>2)]
|
795
792
|
a.artists.should == [@c1.load(:id=>10)]
|
796
|
-
|
793
|
+
DB.sqls.length.should == 0
|
797
794
|
end
|
798
795
|
|
799
796
|
it "eager graphing should give you a plain hash when called without .all" do
|
@@ -803,12 +800,12 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
803
800
|
it "should be able to use eager and eager_graph together" do
|
804
801
|
a = @c1.eager_graph(:tags).eager(:albums).all
|
805
802
|
a.should == [@c1.load(:id=>1)]
|
806
|
-
|
803
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id)',
|
807
804
|
'SELECT albums.*, albums_artists.artist_id AS x_foreign_key_x FROM albums INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))']
|
808
805
|
a = a.first
|
809
806
|
a.tags.should == [Tag.load(:id=>2)]
|
810
807
|
a.albums.should == [Album.load(:id=>3)]
|
811
|
-
|
808
|
+
DB.sqls.length.should == 0
|
812
809
|
end
|
813
810
|
|
814
811
|
it "should handle no associated records when eagerly graphing a single many_through_many association" do
|
@@ -816,9 +813,9 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
816
813
|
ds._fetch = {:id=>1, :tags_id=>nil}
|
817
814
|
a = ds.all
|
818
815
|
a.should == [@c1.load(:id=>1)]
|
819
|
-
|
816
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id)']
|
820
817
|
a.first.tags.should == []
|
821
|
-
|
818
|
+
DB.sqls.length.should == 0
|
822
819
|
end
|
823
820
|
|
824
821
|
it "should handle no associated records when eagerly graphing multiple many_through_many associations" do
|
@@ -826,12 +823,12 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
826
823
|
ds._fetch = [{:id=>1, :tags_id=>nil, :albums_0_id=>3}, {:id=>1, :tags_id=>2, :albums_0_id=>nil}, {:id=>1, :tags_id=>5, :albums_0_id=>6}, {:id=>7, :tags_id=>nil, :albums_0_id=>nil}]
|
827
824
|
a = ds.all
|
828
825
|
a.should == [@c1.load(:id=>1), @c1.load(:id=>7)]
|
829
|
-
|
826
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, albums_0.id AS albums_0_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_artists AS albums_artists_0 ON (albums_artists_0.artist_id = artists.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_artists_0.album_id)']
|
830
827
|
a.first.tags.should == [Tag.load(:id=>2), Tag.load(:id=>5)]
|
831
828
|
a.first.albums.should == [Album.load(:id=>3), Album.load(:id=>6)]
|
832
829
|
a.last.tags.should == []
|
833
830
|
a.last.albums.should == []
|
834
|
-
|
831
|
+
DB.sqls.length.should == 0
|
835
832
|
end
|
836
833
|
|
837
834
|
it "should handle missing associated records when cascading eager graphing for associations of associated models" do
|
@@ -839,13 +836,13 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
839
836
|
ds._fetch = [{:id=>1, :tags_id=>2, :tracks_id=>4}, {:id=>1, :tags_id=>3, :tracks_id=>nil}, {:id=>2, :tags_id=>nil, :tracks_id=>nil}]
|
840
837
|
a = ds.all
|
841
838
|
a.should == [@c1.load(:id=>1), @c1.load(:id=>2)]
|
842
|
-
|
839
|
+
DB.sqls.should == ['SELECT artists.id, tags.id AS tags_id, tracks.id AS tracks_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) LEFT OUTER JOIN albums_tags AS albums_tags_0 ON (albums_tags_0.tag_id = tags.id) LEFT OUTER JOIN albums AS albums_0 ON (albums_0.id = albums_tags_0.album_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums_0.id)']
|
843
840
|
a.last.tags.should == []
|
844
841
|
a = a.first
|
845
842
|
a.tags.should == [Tag.load(:id=>2), Tag.load(:id=>3)]
|
846
843
|
a.tags.first.tracks.should == [Track.load(:id=>4)]
|
847
844
|
a.tags.last.tracks.should == []
|
848
|
-
|
845
|
+
DB.sqls.length.should == 0
|
849
846
|
end
|
850
847
|
|
851
848
|
it "eager graphing should respect :left_primary_key and :right_primary_key options" do
|
@@ -856,9 +853,9 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
856
853
|
ds._fetch = {:id=>1, :yyy=>8, :tags_id=>2, :tag_id=>4}
|
857
854
|
a = ds.all
|
858
855
|
a.should == [@c1.load(:id=>1, :yyy=>8)]
|
859
|
-
|
856
|
+
DB.sqls.should == ['SELECT artists.id, artists.yyy, tags.id AS tags_id, tags.tag_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.yyy) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.tag_id = albums_tags.tag_id)']
|
860
857
|
a.first.tags.should == [Tag.load(:id=>2, :tag_id=>4)]
|
861
|
-
|
858
|
+
DB.sqls.length.should == 0
|
862
859
|
end
|
863
860
|
|
864
861
|
it "eager graphing should respect composite keys" do
|
@@ -869,9 +866,9 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
869
866
|
ds._fetch = {:id=>1, :yyy=>8, :tags_id=>2, :tag_id=>4}
|
870
867
|
a = ds.all
|
871
868
|
a.should == [@c1.load(:id=>1, :yyy=>8)]
|
872
|
-
|
869
|
+
DB.sqls.should == ['SELECT artists.id, artists.yyy, tags.id AS tags_id, tags.tag_id FROM artists LEFT OUTER JOIN albums_artists ON ((albums_artists.b1 = artists.id) AND (albums_artists.b2 = artists.yyy)) LEFT OUTER JOIN albums ON ((albums.d1 = albums_artists.c1) AND (albums.d2 = albums_artists.c2)) LEFT OUTER JOIN albums_tags ON ((albums_tags.f1 = albums.e1) AND (albums_tags.f2 = albums.e2)) LEFT OUTER JOIN tags ON ((tags.id = albums_tags.g1) AND (tags.tag_id = albums_tags.g2))']
|
873
870
|
a.first.tags.should == [Tag.load(:id=>2, :tag_id=>4)]
|
874
|
-
|
871
|
+
DB.sqls.length.should == 0
|
875
872
|
end
|
876
873
|
|
877
874
|
it "should respect the association's :graph_select option" do
|
@@ -880,9 +877,9 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
880
877
|
ds._fetch = {:id=>1, :b=>2}
|
881
878
|
a = ds.all
|
882
879
|
a.should == [@c1.load(:id=>1)]
|
883
|
-
|
880
|
+
DB.sqls.should == ['SELECT artists.id, tags.b FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id)']
|
884
881
|
a.first.tags.should == [Tag.load(:b=>2)]
|
885
|
-
|
882
|
+
DB.sqls.length.should == 0
|
886
883
|
end
|
887
884
|
|
888
885
|
it "should respect the association's :graph_join_type option" do
|