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
@@ -97,10 +97,6 @@ describe "Sequel::Plugins::XmlSerializer" do
|
|
97
97
|
Album.from_xml(@album.to_xml(:include=>{:artist=>{:include=>{:albums=>{:only=>:name}}}}), :associations=>{:artist=>{:associations=>{:albums=>{:fields=>%w'name'}}}}).artist.albums.should == [Album.load(:name=>@album.name)]
|
98
98
|
end
|
99
99
|
|
100
|
-
qspecify "should automatically cascade parsing for all associations if :all_associations is used" do
|
101
|
-
Artist.from_xml(@artist.to_xml(:include=>{:albums=>{:include=>:artist}}), :all_associations=>true).albums.map{|a| a.artist}.should == [@artist]
|
102
|
-
end
|
103
|
-
|
104
100
|
it "should handle the :include option cascading with an empty hash" do
|
105
101
|
Album.from_xml(@album.to_xml(:include=>{:artist=>{}}), :associations=>:artist).artist.should == @artist
|
106
102
|
Album.from_xml(@album.to_xml(:include=>{:blah=>{}})).blah.should == @album.blah
|
@@ -172,7 +168,7 @@ describe "Sequel::Plugins::XmlSerializer" do
|
|
172
168
|
Album.array_from_xml(Album.to_xml(:array=>[a], :include=>:artist), :associations=>:artist).first.artist.should == artist
|
173
169
|
|
174
170
|
artist.associations[:albums] = [a]
|
175
|
-
x = Artist.array_from_xml(Artist.to_xml(:array=>[artist], :include=>:albums), :associations
|
171
|
+
x = Artist.array_from_xml(Artist.to_xml(:array=>[artist], :include=>:albums), :associations=>[:albums])
|
176
172
|
x.should == [artist]
|
177
173
|
x.first.albums.should == [a]
|
178
174
|
end
|
@@ -181,29 +177,11 @@ describe "Sequel::Plugins::XmlSerializer" do
|
|
181
177
|
proc{Album.dataset.naked.to_xml}.should raise_error(Sequel::Error)
|
182
178
|
end
|
183
179
|
|
184
|
-
qspecify "should have :associations option take precedence over :all_assocations" do
|
185
|
-
Artist.from_xml(@artist.to_xml(:include=>:albums), :associations=>[], :all_associations=>true, :fields=>[]).associations.should == {}
|
186
|
-
end
|
187
|
-
|
188
|
-
qspecify "should allow overriding of :all_columns options in associated objects" do
|
189
|
-
Album.restrict_primary_key
|
190
|
-
Artist.from_xml(@artist.to_xml(:include=>:albums), :associations=>{:albums=>{:fields=>[:id, :name, :artist_id], :missing=>:raise}}, :all_columns=>true).albums
|
191
|
-
end
|
192
|
-
|
193
|
-
qspecify "should allow setting columns that are restricted if :all_columns is used" do
|
194
|
-
Artist.restrict_primary_key
|
195
|
-
Artist.from_xml(@artist.to_xml, :all_columns=>true).should == @artist
|
196
|
-
end
|
197
|
-
|
198
180
|
it "should raise an error if using parsing empty xml" do
|
199
181
|
proc{Artist.from_xml("<?xml version=\"1.0\"?>\n")}.should raise_error(Sequel::Error)
|
200
182
|
proc{Artist.array_from_xml("<?xml version=\"1.0\"?>\n")}.should raise_error(Sequel::Error)
|
201
183
|
end
|
202
184
|
|
203
|
-
qspecify "should raise an error if using :all_columns and non-column is in the XML" do
|
204
|
-
proc{Artist.from_xml("<?xml version=\"1.0\"?>\n<artist>\n <foo>bar</foo>\n <id>2</id>\n</artist>\n", :all_columns=>true)}.should raise_error(Sequel::Error)
|
205
|
-
end
|
206
|
-
|
207
185
|
it "should raise an error if attempting to set a restricted column and :all_columns is not used" do
|
208
186
|
Artist.restrict_primary_key
|
209
187
|
proc{Artist.from_xml(@artist.to_xml)}.should raise_error(Sequel::Error)
|
@@ -1,23 +1,27 @@
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
2
2
|
|
3
|
-
shared_examples_for "eager limit strategies" do
|
3
|
+
shared_examples_for "one_to_one eager limit strategies" do
|
4
4
|
specify "eager loading one_to_one associations should work correctly" do
|
5
5
|
Artist.one_to_one :first_album, {:clone=>:first_album}.merge(@els) if @els
|
6
6
|
Artist.one_to_one :last_album, {:clone=>:last_album}.merge(@els) if @els
|
7
|
+
Artist.one_to_one :second_album, {:clone=>:second_album}.merge(@els) if @els
|
7
8
|
@album.update(:artist => @artist)
|
8
9
|
diff_album = @diff_album.call
|
9
10
|
ar = @pr.call[1]
|
10
11
|
|
11
|
-
a = Artist.eager(:first_album, :last_album).order(:name).all
|
12
|
+
a = Artist.eager(:first_album, :last_album, :second_album).order(:name).all
|
12
13
|
a.should == [@artist, ar]
|
13
14
|
a.first.first_album.should == @album
|
14
15
|
a.first.last_album.should == diff_album
|
16
|
+
a.first.second_album.should == diff_album
|
15
17
|
a.last.first_album.should == nil
|
16
18
|
a.last.last_album.should == nil
|
19
|
+
a.last.second_album.should == nil
|
17
20
|
|
18
21
|
# Check that no extra columns got added by the eager loading
|
19
22
|
a.first.first_album.values.should == @album.values
|
20
23
|
a.first.last_album.values.should == diff_album.values
|
24
|
+
a.first.second_album.values.should == diff_album.values
|
21
25
|
|
22
26
|
same_album = @same_album.call
|
23
27
|
a = Artist.eager(:first_album).order(:name).all
|
@@ -25,42 +29,52 @@ shared_examples_for "eager limit strategies" do
|
|
25
29
|
[@album, same_album].should include(a.first.first_album)
|
26
30
|
a.last.first_album.should == nil
|
27
31
|
end
|
32
|
+
end
|
28
33
|
|
34
|
+
shared_examples_for "one_to_many eager limit strategies" do
|
29
35
|
specify "should correctly handle limits and offsets when eager loading one_to_many associations" do
|
30
36
|
Artist.one_to_many :first_two_albums, {:clone=>:first_two_albums}.merge(@els) if @els
|
31
37
|
Artist.one_to_many :second_two_albums, {:clone=>:second_two_albums}.merge(@els) if @els
|
38
|
+
Artist.one_to_many :not_first_albums, {:clone=>:not_first_albums}.merge(@els) if @els
|
32
39
|
Artist.one_to_many :last_two_albums, {:clone=>:last_two_albums}.merge(@els) if @els
|
33
40
|
@album.update(:artist => @artist)
|
34
41
|
middle_album = @middle_album.call
|
35
42
|
diff_album = @diff_album.call
|
36
43
|
ar = @pr.call[1]
|
37
44
|
|
38
|
-
ars = Artist.eager(:first_two_albums, :second_two_albums, :last_two_albums).order(:name).all
|
45
|
+
ars = Artist.eager(:first_two_albums, :second_two_albums, :not_first_albums, :last_two_albums).order(:name).all
|
39
46
|
ars.should == [@artist, ar]
|
40
47
|
ars.first.first_two_albums.should == [@album, middle_album]
|
41
48
|
ars.first.second_two_albums.should == [middle_album, diff_album]
|
49
|
+
ars.first.not_first_albums.should == [middle_album, diff_album]
|
42
50
|
ars.first.last_two_albums.should == [diff_album, middle_album]
|
43
51
|
ars.last.first_two_albums.should == []
|
44
52
|
ars.last.second_two_albums.should == []
|
53
|
+
ars.last.not_first_albums.should == []
|
45
54
|
ars.last.last_two_albums.should == []
|
46
55
|
|
47
56
|
# Check that no extra columns got added by the eager loading
|
48
57
|
ars.first.first_two_albums.map{|x| x.values}.should == [@album, middle_album].map{|x| x.values}
|
49
58
|
ars.first.second_two_albums.map{|x| x.values}.should == [middle_album, diff_album].map{|x| x.values}
|
59
|
+
ars.first.not_first_albums.map{|x| x.values}.should == [middle_album, diff_album].map{|x| x.values}
|
50
60
|
ars.first.last_two_albums.map{|x| x.values}.should == [diff_album, middle_album].map{|x| x.values}
|
51
61
|
end
|
52
|
-
|
62
|
+
end
|
63
|
+
|
64
|
+
shared_examples_for "many_to_many eager limit strategies" do
|
53
65
|
specify "should correctly handle limits and offsets when eager loading many_to_many associations" do
|
54
|
-
Album.many_to_many :first_two_tags, {:clone=>:first_two_tags}.merge(@els) if @els
|
55
|
-
Album.many_to_many :second_two_tags, {:clone=>:second_two_tags}.merge(@els) if @els
|
56
|
-
Album.many_to_many :
|
66
|
+
Album.send @many_to_many_method||:many_to_many, :first_two_tags, {:clone=>:first_two_tags}.merge(@els) if @els
|
67
|
+
Album.send @many_to_many_method||:many_to_many, :second_two_tags, {:clone=>:second_two_tags}.merge(@els) if @els
|
68
|
+
Album.send @many_to_many_method||:many_to_many, :not_first_tags, {:clone=>:not_first_tags}.merge(@els) if @els
|
69
|
+
Album.send @many_to_many_method||:many_to_many, :last_two_tags, {:clone=>:last_two_tags}.merge(@els) if @els
|
57
70
|
tu, tv = @other_tags.call
|
58
71
|
al = @pr.call.first
|
59
72
|
|
60
|
-
als = Album.eager(:first_two_tags, :second_two_tags, :last_two_tags).order(:name).all
|
73
|
+
als = Album.eager(:first_two_tags, :second_two_tags, :not_first_tags, :last_two_tags).order(:name).all
|
61
74
|
als.should == [@album, al]
|
62
75
|
als.first.first_two_tags.should == [@tag, tu]
|
63
76
|
als.first.second_two_tags.should == [tu, tv]
|
77
|
+
als.first.not_first_tags.should == [tu, tv]
|
64
78
|
als.first.last_two_tags.should == [tv, tu]
|
65
79
|
als.last.first_two_tags.should == []
|
66
80
|
als.last.second_two_tags.should == []
|
@@ -69,21 +83,26 @@ shared_examples_for "eager limit strategies" do
|
|
69
83
|
# Check that no extra columns got added by the eager loading
|
70
84
|
als.first.first_two_tags.map{|x| x.values}.should == [@tag, tu].map{|x| x.values}
|
71
85
|
als.first.second_two_tags.map{|x| x.values}.should == [tu, tv].map{|x| x.values}
|
86
|
+
als.first.not_first_tags.map{|x| x.values}.should == [tu, tv].map{|x| x.values}
|
72
87
|
als.first.last_two_tags.map{|x| x.values}.should == [tv, tu].map{|x| x.values}
|
73
88
|
end
|
74
|
-
|
89
|
+
end
|
90
|
+
|
91
|
+
shared_examples_for "many_through_many eager limit strategies" do
|
75
92
|
specify "should correctly handle limits and offsets when eager loading many_through_many associations" do
|
76
93
|
Artist.many_through_many :first_two_tags, {:clone=>:first_two_tags}.merge(@els) if @els
|
77
94
|
Artist.many_through_many :second_two_tags, {:clone=>:second_two_tags}.merge(@els) if @els
|
95
|
+
Artist.many_through_many :not_first_tags, {:clone=>:not_first_tags}.merge(@els) if @els
|
78
96
|
Artist.many_through_many :last_two_tags, {:clone=>:last_two_tags}.merge(@els) if @els
|
79
97
|
@album.update(:artist => @artist)
|
80
98
|
tu, tv = @other_tags.call
|
81
99
|
ar = @pr.call[1]
|
82
100
|
|
83
|
-
ars = Artist.eager(:first_two_tags, :second_two_tags, :last_two_tags).order(:name).all
|
101
|
+
ars = Artist.eager(:first_two_tags, :second_two_tags, :not_first_tags, :last_two_tags).order(:name).all
|
84
102
|
ars.should == [@artist, ar]
|
85
103
|
ars.first.first_two_tags.should == [@tag, tu]
|
86
104
|
ars.first.second_two_tags.should == [tu, tv]
|
105
|
+
ars.first.not_first_tags.should == [tu, tv]
|
87
106
|
ars.first.last_two_tags.should == [tv, tu]
|
88
107
|
ars.last.first_two_tags.should == []
|
89
108
|
ars.last.second_two_tags.should == []
|
@@ -92,10 +111,18 @@ shared_examples_for "eager limit strategies" do
|
|
92
111
|
# Check that no extra columns got added by the eager loading
|
93
112
|
ars.first.first_two_tags.map{|x| x.values}.should == [@tag, tu].map{|x| x.values}
|
94
113
|
ars.first.second_two_tags.map{|x| x.values}.should == [tu, tv].map{|x| x.values}
|
114
|
+
ars.first.not_first_tags.map{|x| x.values}.should == [tu, tv].map{|x| x.values}
|
95
115
|
ars.first.last_two_tags.map{|x| x.values}.should == [tv, tu].map{|x| x.values}
|
96
116
|
end
|
97
117
|
end
|
98
118
|
|
119
|
+
shared_examples_for "eager limit strategies" do
|
120
|
+
it_should_behave_like "one_to_one eager limit strategies"
|
121
|
+
it_should_behave_like "one_to_many eager limit strategies"
|
122
|
+
it_should_behave_like "many_to_many eager limit strategies"
|
123
|
+
it_should_behave_like "many_through_many eager limit strategies"
|
124
|
+
end
|
125
|
+
|
99
126
|
shared_examples_for "filtering/excluding by associations" do
|
100
127
|
specify "should work correctly when filtering by associations" do
|
101
128
|
@album.update(:artist => @artist)
|
@@ -282,7 +309,7 @@ shared_examples_for "filtering/excluding by associations" do
|
|
282
309
|
end
|
283
310
|
end
|
284
311
|
|
285
|
-
shared_examples_for "regular and composite key associations" do
|
312
|
+
shared_examples_for "basic regular and composite key associations" do
|
286
313
|
specify "should return no objects if none are associated" do
|
287
314
|
@album.artist.should == nil
|
288
315
|
@artist.first_album.should == nil
|
@@ -333,7 +360,7 @@ shared_examples_for "regular and composite key associations" do
|
|
333
360
|
Album.tags.all.should == []
|
334
361
|
Album.alias_tags.all.should == []
|
335
362
|
Artist.albums.all.should == []
|
336
|
-
Artist.tags.all.should == []
|
363
|
+
Artist.tags.all.should == [] unless @no_many_through_many
|
337
364
|
Artist.albums.tags.all.should == []
|
338
365
|
|
339
366
|
@album.update(:artist => @artist)
|
@@ -344,7 +371,7 @@ shared_examples_for "regular and composite key associations" do
|
|
344
371
|
Album.tags.all.should == [@tag]
|
345
372
|
Album.alias_tags.all.should == [@tag]
|
346
373
|
Artist.albums.all.should == [@album]
|
347
|
-
Artist.tags.all.should == [@tag]
|
374
|
+
Artist.tags.all.should == [@tag] unless @no_many_through_many
|
348
375
|
Artist.albums.tags.all.should == [@tag]
|
349
376
|
|
350
377
|
album.add_tag(tag)
|
@@ -355,7 +382,7 @@ shared_examples_for "regular and composite key associations" do
|
|
355
382
|
Album.tags.order(:name).all.should == [@tag, tag]
|
356
383
|
Album.alias_tags.order(:name).all.should == [@tag, tag]
|
357
384
|
Artist.albums.order(:name).all.should == [@album, album]
|
358
|
-
Artist.tags.order(:name).all.should == [@tag, tag]
|
385
|
+
Artist.tags.order(:name).all.should == [@tag, tag] unless @no_many_through_many
|
359
386
|
Artist.albums.tags.order(:name).all.should == [@tag, tag]
|
360
387
|
|
361
388
|
Tag.filter(Tag.qualified_primary_key_hash(tag.pk)).albums.all.should == [album]
|
@@ -363,7 +390,7 @@ shared_examples_for "regular and composite key associations" do
|
|
363
390
|
Album.filter(Album.qualified_primary_key_hash(album.pk)).tags.all.should == [tag]
|
364
391
|
Album.filter(Album.qualified_primary_key_hash(album.pk)).alias_tags.all.should == [tag]
|
365
392
|
Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).albums.all.should == [album]
|
366
|
-
Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).tags.all.should == [tag]
|
393
|
+
Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).tags.all.should == [tag] unless @no_many_through_many
|
367
394
|
Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).albums.tags.all.should == [tag]
|
368
395
|
|
369
396
|
Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).albums.filter(Album.qualified_primary_key_hash(album.pk)).tags.all.should == [tag]
|
@@ -402,8 +429,8 @@ shared_examples_for "regular and composite key associations" do
|
|
402
429
|
@artist.add_album(@album)
|
403
430
|
@album.add_tag(@tag)
|
404
431
|
|
405
|
-
@artist.remove_all_albums
|
406
432
|
@album.remove_all_tags
|
433
|
+
@artist.remove_all_albums
|
407
434
|
|
408
435
|
@album.reload
|
409
436
|
@artist.reload
|
@@ -438,6 +465,23 @@ shared_examples_for "regular and composite key associations" do
|
|
438
465
|
a.first.albums.first.artist.should == @artist
|
439
466
|
end
|
440
467
|
|
468
|
+
specify "should eager load via eager_graph correctly" do
|
469
|
+
@album.update(:artist => @artist)
|
470
|
+
@album.add_tag(@tag)
|
471
|
+
|
472
|
+
a = Artist.eager_graph(:albums=>[:tags, :alias_tags]).eager_graph(:first_album).all
|
473
|
+
a.should == [@artist]
|
474
|
+
a.first.albums.should == [@album]
|
475
|
+
a.first.first_album.should == @album
|
476
|
+
a.first.albums.first.tags.should == [@tag]
|
477
|
+
a.first.albums.first.alias_tags.should == [@tag]
|
478
|
+
|
479
|
+
a = Tag.eager_graph(:albums=>:artist).all
|
480
|
+
a.should == [@tag]
|
481
|
+
a.first.albums.should == [@album]
|
482
|
+
a.first.albums.first.artist.should == @artist
|
483
|
+
end
|
484
|
+
|
441
485
|
describe "when filtering/excluding by associations" do
|
442
486
|
before do
|
443
487
|
@Artist = Artist.dataset
|
@@ -447,6 +491,10 @@ shared_examples_for "regular and composite key associations" do
|
|
447
491
|
|
448
492
|
it_should_behave_like "filtering/excluding by associations"
|
449
493
|
end
|
494
|
+
end
|
495
|
+
|
496
|
+
shared_examples_for "regular and composite key associations" do
|
497
|
+
it_should_behave_like "basic regular and composite key associations"
|
450
498
|
|
451
499
|
describe "when filtering/excluding by associations when joining" do
|
452
500
|
def self_join(c)
|
@@ -462,7 +510,10 @@ shared_examples_for "regular and composite key associations" do
|
|
462
510
|
it_should_behave_like "filtering/excluding by associations"
|
463
511
|
end
|
464
512
|
|
465
|
-
describe "with
|
513
|
+
describe "with :eager_limit_strategy=>:ruby" do
|
514
|
+
before do
|
515
|
+
@els = {:eager_limit_strategy=>:ruby}
|
516
|
+
end
|
466
517
|
it_should_behave_like "eager limit strategies"
|
467
518
|
end
|
468
519
|
|
@@ -470,33 +521,16 @@ shared_examples_for "regular and composite key associations" do
|
|
470
521
|
before do
|
471
522
|
@els = {:eager_limit_strategy=>true}
|
472
523
|
end
|
473
|
-
it_should_behave_like "eager limit strategies"
|
474
|
-
end
|
524
|
+
it_should_behave_like "one_to_one eager limit strategies"
|
525
|
+
end if DB.dataset.supports_ordered_distinct_on?
|
475
526
|
|
476
527
|
describe "with :eager_limit_strategy=>:window_function" do
|
477
528
|
before do
|
478
529
|
@els = {:eager_limit_strategy=>:window_function}
|
479
530
|
end
|
480
531
|
it_should_behave_like "eager limit strategies"
|
481
|
-
end if
|
532
|
+
end if DB.dataset.supports_window_functions?
|
482
533
|
|
483
|
-
specify "should eager load via eager_graph correctly" do
|
484
|
-
@album.update(:artist => @artist)
|
485
|
-
@album.add_tag(@tag)
|
486
|
-
|
487
|
-
a = Artist.eager_graph(:albums=>[:tags, :alias_tags]).eager_graph(:first_album).all
|
488
|
-
a.should == [@artist]
|
489
|
-
a.first.albums.should == [@album]
|
490
|
-
a.first.first_album.should == @album
|
491
|
-
a.first.albums.first.tags.should == [@tag]
|
492
|
-
a.first.albums.first.alias_tags.should == [@tag]
|
493
|
-
|
494
|
-
a = Tag.eager_graph(:albums=>:artist).all
|
495
|
-
a.should == [@tag]
|
496
|
-
a.first.albums.should == [@album]
|
497
|
-
a.first.albums.first.artist.should == @artist
|
498
|
-
end
|
499
|
-
|
500
534
|
specify "should work with a many_through_many association" do
|
501
535
|
@album.update(:artist => @artist)
|
502
536
|
@album.add_tag(@tag)
|
@@ -529,7 +563,7 @@ end
|
|
529
563
|
|
530
564
|
describe "Sequel::Model Simple Associations" do
|
531
565
|
before(:all) do
|
532
|
-
@db =
|
566
|
+
@db = DB
|
533
567
|
@db.drop_table?(:albums_tags, :tags, :albums, :artists)
|
534
568
|
@db.create_table(:artists) do
|
535
569
|
primary_key :id
|
@@ -555,14 +589,17 @@ describe "Sequel::Model Simple Associations" do
|
|
555
589
|
plugin :dataset_associations
|
556
590
|
one_to_many :albums, :order=>:name
|
557
591
|
one_to_one :first_album, :class=>:Album, :order=>:name
|
592
|
+
one_to_one :second_album, :class=>:Album, :order=>:name, :limit=>[nil, 1]
|
558
593
|
one_to_one :last_album, :class=>:Album, :order=>Sequel.desc(:name)
|
559
594
|
one_to_many :first_two_albums, :class=>:Album, :order=>:name, :limit=>2
|
560
595
|
one_to_many :second_two_albums, :class=>:Album, :order=>:name, :limit=>[2, 1]
|
596
|
+
one_to_many :not_first_albums, :class=>:Album, :order=>:name, :limit=>[nil, 1]
|
561
597
|
one_to_many :last_two_albums, :class=>:Album, :order=>Sequel.desc(:name), :limit=>2
|
562
598
|
plugin :many_through_many
|
563
599
|
many_through_many :tags, [[:albums, :artist_id, :id], [:albums_tags, :album_id, :tag_id]]
|
564
600
|
many_through_many :first_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>2
|
565
601
|
many_through_many :second_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>[2, 1]
|
602
|
+
many_through_many :not_first_tags, :clone=>:tags, :order=>:tags__name, :limit=>[nil, 1]
|
566
603
|
many_through_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:tags__name), :limit=>2
|
567
604
|
end
|
568
605
|
class ::Album < Sequel::Model(@db)
|
@@ -572,6 +609,7 @@ describe "Sequel::Model Simple Associations" do
|
|
572
609
|
many_to_many :alias_tags, :clone=>:tags, :join_table=>:albums_tags___at
|
573
610
|
many_to_many :first_two_tags, :clone=>:tags, :order=>:name, :limit=>2
|
574
611
|
many_to_many :second_two_tags, :clone=>:tags, :order=>:name, :limit=>[2, 1]
|
612
|
+
many_to_many :not_first_tags, :clone=>:tags, :order=>:name, :limit=>[nil, 1]
|
575
613
|
many_to_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:name), :limit=>2
|
576
614
|
end
|
577
615
|
class ::Tag < Sequel::Model(@db)
|
@@ -717,7 +755,7 @@ end
|
|
717
755
|
|
718
756
|
describe "Sequel::Model Composite Key Associations" do
|
719
757
|
before(:all) do
|
720
|
-
@db =
|
758
|
+
@db = DB
|
721
759
|
@db.drop_table?(:albums_tags, :tags, :albums, :artists)
|
722
760
|
@db.create_table(:artists) do
|
723
761
|
Integer :id1
|
@@ -758,13 +796,16 @@ describe "Sequel::Model Composite Key Associations" do
|
|
758
796
|
one_to_many :albums, :key=>[:artist_id1, :artist_id2], :order=>:name
|
759
797
|
one_to_one :first_album, :clone=>:albums, :order=>:name
|
760
798
|
one_to_one :last_album, :clone=>:albums, :order=>Sequel.desc(:name)
|
799
|
+
one_to_one :second_album, :clone=>:albums, :limit=>[nil, 1]
|
761
800
|
one_to_many :first_two_albums, :clone=>:albums, :order=>:name, :limit=>2
|
762
801
|
one_to_many :second_two_albums, :clone=>:albums, :order=>:name, :limit=>[2, 1]
|
802
|
+
one_to_many :not_first_albums, :clone=>:albums, :order=>:name, :limit=>[nil, 1]
|
763
803
|
one_to_many :last_two_albums, :clone=>:albums, :order=>Sequel.desc(:name), :limit=>2
|
764
804
|
plugin :many_through_many
|
765
805
|
many_through_many :tags, [[:albums, [:artist_id1, :artist_id2], [:id1, :id2]], [:albums_tags, [:album_id1, :album_id2], [:tag_id1, :tag_id2]]]
|
766
806
|
many_through_many :first_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>2
|
767
807
|
many_through_many :second_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>[2, 1]
|
808
|
+
many_through_many :not_first_tags, :clone=>:tags, :order=>:tags__name, :limit=>[nil, 1]
|
768
809
|
many_through_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:tags__name), :limit=>2
|
769
810
|
end
|
770
811
|
class ::Album < Sequel::Model(@db)
|
@@ -776,6 +817,7 @@ describe "Sequel::Model Composite Key Associations" do
|
|
776
817
|
many_to_many :alias_tags, :clone=>:tags, :join_table=>:albums_tags___at
|
777
818
|
many_to_many :first_two_tags, :clone=>:tags, :order=>:name, :limit=>2
|
778
819
|
many_to_many :second_two_tags, :clone=>:tags, :order=>:name, :limit=>[2, 1]
|
820
|
+
many_to_many :not_first_tags, :clone=>:tags, :order=>:name, :limit=>[nil, 1]
|
779
821
|
many_to_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:name), :limit=>2
|
780
822
|
end
|
781
823
|
class ::Tag < Sequel::Model(@db)
|
@@ -843,9 +885,158 @@ describe "Sequel::Model Composite Key Associations" do
|
|
843
885
|
end
|
844
886
|
end
|
845
887
|
|
888
|
+
describe "Sequel::Model pg_array_to_many" do
|
889
|
+
before(:all) do
|
890
|
+
@db = DB
|
891
|
+
@db.extension :pg_array
|
892
|
+
Sequel.extension :pg_array_ops
|
893
|
+
@db.drop_table?(:tags, :albums, :artists)
|
894
|
+
@db.create_table(:artists) do
|
895
|
+
primary_key :id
|
896
|
+
String :name
|
897
|
+
end
|
898
|
+
@db.create_table(:albums) do
|
899
|
+
primary_key :id
|
900
|
+
String :name
|
901
|
+
foreign_key :artist_id, :artists
|
902
|
+
column :tag_ids, 'int4[]'
|
903
|
+
end
|
904
|
+
@db.create_table(:tags) do
|
905
|
+
primary_key :id
|
906
|
+
String :name
|
907
|
+
end
|
908
|
+
end
|
909
|
+
before do
|
910
|
+
[:tags, :albums, :artists].each{|t| @db[t].delete}
|
911
|
+
class ::Artist < Sequel::Model(@db)
|
912
|
+
plugin :dataset_associations
|
913
|
+
one_to_many :albums, :order=>:name
|
914
|
+
one_to_one :first_album, :class=>:Album, :order=>:name
|
915
|
+
end
|
916
|
+
class ::Album < Sequel::Model(@db)
|
917
|
+
plugin :dataset_associations
|
918
|
+
plugin :pg_array_associations
|
919
|
+
many_to_one :artist, :reciprocal=>nil
|
920
|
+
pg_array_to_many :tags, :key=>:tag_ids, :save_after_modify=>true
|
921
|
+
pg_array_to_many :alias_tags, :clone=>:tags
|
922
|
+
pg_array_to_many :first_two_tags, :clone=>:tags, :order=>:name, :limit=>2
|
923
|
+
pg_array_to_many :second_two_tags, :clone=>:tags, :order=>:name, :limit=>[2, 1]
|
924
|
+
pg_array_to_many :not_first_tags, :clone=>:tags, :order=>:name, :limit=>[nil, 1]
|
925
|
+
pg_array_to_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:name), :limit=>2
|
926
|
+
end
|
927
|
+
class ::Tag < Sequel::Model(@db)
|
928
|
+
plugin :dataset_associations
|
929
|
+
plugin :pg_array_associations
|
930
|
+
many_to_pg_array :albums
|
931
|
+
end
|
932
|
+
@album = Album.create(:name=>'Al')
|
933
|
+
@artist = Artist.create(:name=>'Ar')
|
934
|
+
@tag = Tag.create(:name=>'T')
|
935
|
+
@many_to_many_method = :pg_array_to_many
|
936
|
+
@no_many_through_many = true
|
937
|
+
@same_album = lambda{Album.create(:name=>'Al', :artist_id=>@artist.id)}
|
938
|
+
@diff_album = lambda{Album.create(:name=>'lA', :artist_id=>@artist.id)}
|
939
|
+
@middle_album = lambda{Album.create(:name=>'Bl', :artist_id=>@artist.id)}
|
940
|
+
@other_tags = lambda{t = [Tag.create(:name=>'U'), Tag.create(:name=>'V')]; Tag.all{|x| @album.add_tag(x)}; t}
|
941
|
+
@pr = lambda{[Album.create(:name=>'Al2'),Artist.create(:name=>'Ar2'),Tag.create(:name=>'T2')]}
|
942
|
+
@ins = lambda{}
|
943
|
+
end
|
944
|
+
after do
|
945
|
+
[:Tag, :Album, :Artist].each{|x| Object.send(:remove_const, x)}
|
946
|
+
end
|
947
|
+
after(:all) do
|
948
|
+
@db.drop_table?(:tags, :albums, :artists)
|
949
|
+
end
|
950
|
+
|
951
|
+
it_should_behave_like "basic regular and composite key associations"
|
952
|
+
it_should_behave_like "many_to_many eager limit strategies"
|
953
|
+
|
954
|
+
it "should handle adding and removing entries in array" do
|
955
|
+
a = Album.create
|
956
|
+
a.typecast_on_assignment = false
|
957
|
+
a.add_tag(@tag)
|
958
|
+
a.remove_tag(@tag)
|
959
|
+
a.save
|
960
|
+
end
|
961
|
+
end if DB.database_type == :postgres && DB.adapter_scheme == :postgres && DB.server_version >= 90300
|
962
|
+
|
963
|
+
describe "Sequel::Model many_to_pg_array" do
|
964
|
+
before(:all) do
|
965
|
+
@db = DB
|
966
|
+
@db.extension :pg_array
|
967
|
+
Sequel.extension :pg_array_ops
|
968
|
+
@db.drop_table?(:tags, :albums, :artists)
|
969
|
+
@db.create_table(:artists) do
|
970
|
+
primary_key :id
|
971
|
+
String :name
|
972
|
+
end
|
973
|
+
@db.create_table(:albums) do
|
974
|
+
primary_key :id
|
975
|
+
String :name
|
976
|
+
foreign_key :artist_id, :artists
|
977
|
+
end
|
978
|
+
@db.create_table(:tags) do
|
979
|
+
primary_key :id
|
980
|
+
String :name
|
981
|
+
column :album_ids, 'int4[]'
|
982
|
+
end
|
983
|
+
end
|
984
|
+
before do
|
985
|
+
[:tags, :albums, :artists].each{|t| @db[t].delete}
|
986
|
+
class ::Artist < Sequel::Model(@db)
|
987
|
+
plugin :dataset_associations
|
988
|
+
one_to_many :albums, :order=>:name
|
989
|
+
one_to_one :first_album, :class=>:Album, :order=>:name
|
990
|
+
end
|
991
|
+
class ::Album < Sequel::Model(@db)
|
992
|
+
plugin :dataset_associations
|
993
|
+
plugin :pg_array_associations
|
994
|
+
many_to_one :artist, :reciprocal=>nil
|
995
|
+
many_to_pg_array :tags
|
996
|
+
many_to_pg_array :alias_tags, :clone=>:tags
|
997
|
+
many_to_pg_array :first_two_tags, :clone=>:tags, :order=>:name, :limit=>2
|
998
|
+
many_to_pg_array :second_two_tags, :clone=>:tags, :order=>:name, :limit=>[2, 1]
|
999
|
+
many_to_pg_array :not_first_tags, :clone=>:tags, :order=>:name, :limit=>[nil, 1]
|
1000
|
+
many_to_pg_array :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:name), :limit=>2
|
1001
|
+
end
|
1002
|
+
class ::Tag < Sequel::Model(@db)
|
1003
|
+
plugin :dataset_associations
|
1004
|
+
plugin :pg_array_associations
|
1005
|
+
pg_array_to_many :albums
|
1006
|
+
end
|
1007
|
+
@album = Album.create(:name=>'Al')
|
1008
|
+
@artist = Artist.create(:name=>'Ar')
|
1009
|
+
@tag = Tag.create(:name=>'T')
|
1010
|
+
@many_to_many_method = :pg_array_to_many
|
1011
|
+
@no_many_through_many = true
|
1012
|
+
@same_album = lambda{Album.create(:name=>'Al', :artist_id=>@artist.id)}
|
1013
|
+
@diff_album = lambda{Album.create(:name=>'lA', :artist_id=>@artist.id)}
|
1014
|
+
@middle_album = lambda{Album.create(:name=>'Bl', :artist_id=>@artist.id)}
|
1015
|
+
@other_tags = lambda{t = [Tag.create(:name=>'U'), Tag.create(:name=>'V')]; Tag.all{|x| @album.add_tag(x)}; @tag.refresh; t.each{|x| x.refresh}; t}
|
1016
|
+
@pr = lambda{[Album.create(:name=>'Al2'),Artist.create(:name=>'Ar2'),Tag.create(:name=>'T2')]}
|
1017
|
+
@ins = lambda{}
|
1018
|
+
end
|
1019
|
+
after do
|
1020
|
+
[:Tag, :Album, :Artist].each{|x| Object.send(:remove_const, x)}
|
1021
|
+
end
|
1022
|
+
after(:all) do
|
1023
|
+
@db.drop_table?(:tags, :albums, :artists)
|
1024
|
+
end
|
1025
|
+
|
1026
|
+
it_should_behave_like "basic regular and composite key associations"
|
1027
|
+
it_should_behave_like "many_to_many eager limit strategies"
|
1028
|
+
|
1029
|
+
it "should handle adding and removing entries in array" do
|
1030
|
+
a = Album.create
|
1031
|
+
@tag.typecast_on_assignment = false
|
1032
|
+
a.add_tag(@tag)
|
1033
|
+
a.remove_tag(@tag)
|
1034
|
+
end
|
1035
|
+
end if DB.database_type == :postgres && DB.adapter_scheme == :postgres && DB.server_version >= 90300
|
1036
|
+
|
846
1037
|
describe "Sequel::Model Associations with clashing column names" do
|
847
1038
|
before(:all) do
|
848
|
-
@db =
|
1039
|
+
@db = DB
|
849
1040
|
@db.drop_table?(:bars_foos, :bars, :foos)
|
850
1041
|
@db.create_table(:foos) do
|
851
1042
|
primary_key :id
|