sequel 4.22.0 → 4.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +22 -0
- data/README.rdoc +6 -0
- data/Rakefile +59 -81
- data/doc/migration.rdoc +2 -0
- data/doc/release_notes/4.23.0.txt +65 -0
- data/doc/sharding.rdoc +16 -14
- data/doc/testing.rdoc +61 -77
- data/lib/sequel/adapters/jdbc.rb +1 -0
- data/lib/sequel/adapters/mock.rb +0 -1
- data/lib/sequel/adapters/postgres.rb +1 -0
- data/lib/sequel/adapters/postgresql.rb +1 -0
- data/lib/sequel/adapters/shared/postgres.rb +3 -3
- data/lib/sequel/connection_pool/sharded_threaded.rb +5 -0
- data/lib/sequel/connection_pool/threaded.rb +9 -1
- data/lib/sequel/database/connecting.rb +1 -1
- data/lib/sequel/database/transactions.rb +2 -1
- data/lib/sequel/dataset/prepared_statements.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +12 -12
- data/lib/sequel/extensions/date_arithmetic.rb +0 -4
- data/lib/sequel/extensions/pagination.rb +14 -2
- data/lib/sequel/extensions/pg_enum.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +1 -1
- data/lib/sequel/extensions/pg_json_ops.rb +2 -2
- data/lib/sequel/plugins/csv_serializer.rb +2 -0
- data/lib/sequel/plugins/delay_add_association.rb +50 -0
- data/lib/sequel/plugins/list.rb +2 -2
- data/lib/sequel/plugins/nested_attributes.rb +8 -28
- data/lib/sequel/plugins/update_refresh.rb +50 -0
- data/lib/sequel/plugins/validate_associated.rb +55 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +29 -29
- data/spec/adapters/firebird_spec.rb +97 -103
- data/spec/adapters/informix_spec.rb +25 -25
- data/spec/adapters/mssql_spec.rb +156 -172
- data/spec/adapters/mysql_spec.rb +334 -359
- data/spec/adapters/oracle_spec.rb +67 -69
- data/spec/adapters/postgres_spec.rb +1298 -1249
- data/spec/adapters/spec_helper.rb +2 -35
- data/spec/adapters/sqlanywhere_spec.rb +39 -39
- data/spec/adapters/sqlite_spec.rb +203 -200
- data/spec/bin_spec.rb +57 -59
- data/spec/core/connection_pool_spec.rb +402 -401
- data/spec/core/database_spec.rb +953 -944
- data/spec/core/dataset_spec.rb +2178 -2168
- data/spec/core/deprecated_spec.rb +19 -19
- data/spec/core/expression_filters_spec.rb +415 -415
- data/spec/core/mock_adapter_spec.rb +212 -212
- data/spec/core/object_graph_spec.rb +73 -73
- data/spec/core/placeholder_literalizer_spec.rb +71 -71
- data/spec/core/schema_generator_spec.rb +44 -44
- data/spec/core/schema_spec.rb +470 -472
- data/spec/core/spec_helper.rb +5 -20
- data/spec/core/version_spec.rb +2 -2
- data/spec/core_extensions_spec.rb +320 -320
- data/spec/extensions/accessed_columns_spec.rb +12 -12
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +2 -2
- data/spec/extensions/arbitrary_servers_spec.rb +23 -23
- data/spec/extensions/association_dependencies_spec.rb +34 -34
- data/spec/extensions/association_pks_spec.rb +98 -98
- data/spec/extensions/association_proxies_spec.rb +33 -33
- data/spec/extensions/auto_validations_spec.rb +46 -46
- data/spec/extensions/blacklist_security_spec.rb +19 -18
- data/spec/extensions/blank_spec.rb +36 -36
- data/spec/extensions/boolean_readers_spec.rb +36 -36
- data/spec/extensions/caching_spec.rb +82 -82
- data/spec/extensions/class_table_inheritance_spec.rb +72 -72
- data/spec/extensions/column_conflicts_spec.rb +19 -14
- data/spec/extensions/column_select_spec.rb +19 -19
- data/spec/extensions/columns_introspection_spec.rb +43 -43
- data/spec/extensions/composition_spec.rb +64 -64
- data/spec/extensions/connection_validator_spec.rb +92 -90
- data/spec/extensions/constraint_validations_plugin_spec.rb +92 -92
- data/spec/extensions/constraint_validations_spec.rb +80 -80
- data/spec/extensions/core_refinements_spec.rb +220 -220
- data/spec/extensions/csv_serializer_spec.rb +44 -44
- data/spec/extensions/current_datetime_timestamp_spec.rb +8 -8
- data/spec/extensions/dataset_associations_spec.rb +65 -65
- data/spec/extensions/dataset_source_alias_spec.rb +16 -16
- data/spec/extensions/date_arithmetic_spec.rb +51 -58
- data/spec/extensions/defaults_setter_spec.rb +19 -19
- data/spec/extensions/delay_add_association_spec.rb +52 -0
- data/spec/extensions/dirty_spec.rb +51 -51
- data/spec/extensions/eager_each_spec.rb +8 -8
- data/spec/extensions/empty_array_ignore_nulls_spec.rb +10 -10
- data/spec/extensions/error_splitter_spec.rb +2 -2
- data/spec/extensions/error_sql_spec.rb +4 -4
- data/spec/extensions/eval_inspect_spec.rb +3 -3
- data/spec/extensions/filter_having_spec.rb +8 -8
- data/spec/extensions/force_encoding_spec.rb +30 -30
- data/spec/extensions/from_block_spec.rb +7 -7
- data/spec/extensions/graph_each_spec.rb +19 -19
- data/spec/extensions/hash_aliases_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +100 -100
- data/spec/extensions/inflector_spec.rb +54 -54
- data/spec/extensions/input_transformer_spec.rb +10 -10
- data/spec/extensions/insert_returning_select_spec.rb +8 -8
- data/spec/extensions/instance_filters_spec.rb +26 -26
- data/spec/extensions/instance_hooks_spec.rb +85 -85
- data/spec/extensions/json_serializer_spec.rb +68 -68
- data/spec/extensions/lazy_attributes_spec.rb +49 -49
- data/spec/extensions/list_spec.rb +77 -75
- data/spec/extensions/looser_typecasting_spec.rb +16 -16
- data/spec/extensions/many_through_many_spec.rb +627 -627
- data/spec/extensions/meta_def_spec.rb +7 -7
- data/spec/extensions/migration_spec.rb +217 -217
- data/spec/extensions/modification_detection_spec.rb +20 -20
- data/spec/extensions/mssql_optimistic_locking_spec.rb +21 -21
- data/spec/extensions/named_timezones_spec.rb +18 -18
- data/spec/extensions/nested_attributes_spec.rb +107 -107
- data/spec/extensions/null_dataset_spec.rb +24 -24
- data/spec/extensions/optimistic_locking_spec.rb +21 -21
- data/spec/extensions/pagination_spec.rb +52 -52
- data/spec/extensions/pg_array_associations_spec.rb +273 -273
- data/spec/extensions/pg_array_ops_spec.rb +52 -52
- data/spec/extensions/pg_array_spec.rb +152 -152
- data/spec/extensions/pg_enum_spec.rb +13 -13
- data/spec/extensions/pg_hstore_ops_spec.rb +63 -63
- data/spec/extensions/pg_hstore_spec.rb +84 -84
- data/spec/extensions/pg_inet_spec.rb +15 -15
- data/spec/extensions/pg_interval_spec.rb +29 -29
- data/spec/extensions/pg_json_ops_spec.rb +86 -84
- data/spec/extensions/pg_json_spec.rb +104 -104
- data/spec/extensions/pg_loose_count_spec.rb +6 -6
- data/spec/extensions/pg_range_ops_spec.rb +24 -24
- data/spec/extensions/pg_range_spec.rb +143 -143
- data/spec/extensions/pg_row_ops_spec.rb +14 -14
- data/spec/extensions/pg_row_plugin_spec.rb +12 -12
- data/spec/extensions/pg_row_spec.rb +118 -118
- data/spec/extensions/pg_static_cache_updater_spec.rb +28 -28
- data/spec/extensions/pg_typecast_on_load_spec.rb +21 -21
- data/spec/extensions/prepared_statements_associations_spec.rb +42 -42
- data/spec/extensions/prepared_statements_safe_spec.rb +18 -18
- data/spec/extensions/prepared_statements_spec.rb +28 -28
- data/spec/extensions/prepared_statements_with_pk_spec.rb +11 -11
- data/spec/extensions/pretty_table_spec.rb +16 -16
- data/spec/extensions/query_literals_spec.rb +37 -37
- data/spec/extensions/query_spec.rb +32 -32
- data/spec/extensions/rcte_tree_spec.rb +141 -141
- data/spec/extensions/round_timestamps_spec.rb +21 -21
- data/spec/extensions/schema_caching_spec.rb +8 -8
- data/spec/extensions/schema_dumper_spec.rb +78 -78
- data/spec/extensions/schema_spec.rb +31 -27
- data/spec/extensions/scissors_spec.rb +3 -3
- data/spec/extensions/select_remove_spec.rb +14 -14
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +28 -28
- data/spec/extensions/serialization_modification_detection_spec.rb +33 -33
- data/spec/extensions/serialization_spec.rb +79 -78
- data/spec/extensions/server_block_spec.rb +17 -17
- data/spec/extensions/set_overrides_spec.rb +30 -30
- data/spec/extensions/sharding_spec.rb +65 -65
- data/spec/extensions/shared_caching_spec.rb +29 -29
- data/spec/extensions/single_table_inheritance_spec.rb +79 -79
- data/spec/extensions/skip_create_refresh_spec.rb +3 -3
- data/spec/extensions/spec_helper.rb +4 -29
- data/spec/extensions/split_array_nil_spec.rb +9 -9
- data/spec/extensions/split_values_spec.rb +7 -7
- data/spec/extensions/sql_expr_spec.rb +32 -32
- data/spec/extensions/static_cache_spec.rb +123 -123
- data/spec/extensions/string_date_time_spec.rb +34 -34
- data/spec/extensions/string_stripper_spec.rb +15 -15
- data/spec/extensions/subclasses_spec.rb +31 -31
- data/spec/extensions/table_select_spec.rb +15 -15
- data/spec/extensions/tactical_eager_loading_spec.rb +23 -23
- data/spec/extensions/thread_local_timezones_spec.rb +13 -13
- data/spec/extensions/timestamps_spec.rb +40 -40
- data/spec/extensions/to_dot_spec.rb +34 -34
- data/spec/extensions/touch_spec.rb +52 -52
- data/spec/extensions/tree_spec.rb +72 -72
- data/spec/extensions/typecast_on_load_spec.rb +25 -25
- data/spec/extensions/unlimited_update_spec.rb +2 -2
- data/spec/extensions/update_or_create_spec.rb +36 -36
- data/spec/extensions/update_primary_key_spec.rb +35 -35
- data/spec/extensions/update_refresh_spec.rb +41 -0
- data/spec/extensions/validate_associated_spec.rb +52 -0
- data/spec/extensions/validation_class_methods_spec.rb +314 -317
- data/spec/extensions/validation_helpers_spec.rb +195 -195
- data/spec/extensions/xml_serializer_spec.rb +48 -48
- data/spec/guards_helper.rb +55 -0
- data/spec/integration/associations_test.rb +1089 -1088
- data/spec/integration/database_test.rb +29 -29
- data/spec/integration/dataset_test.rb +661 -661
- data/spec/integration/eager_loader_test.rb +147 -147
- data/spec/integration/migrator_test.rb +122 -122
- data/spec/integration/model_test.rb +70 -70
- data/spec/integration/plugin_test.rb +682 -640
- data/spec/integration/prepared_statement_test.rb +172 -172
- data/spec/integration/schema_test.rb +245 -245
- data/spec/integration/spec_helper.rb +1 -64
- data/spec/integration/timezone_test.rb +17 -17
- data/spec/integration/transaction_test.rb +87 -87
- data/spec/integration/type_test.rb +33 -33
- data/spec/model/association_reflection_spec.rb +130 -121
- data/spec/model/associations_spec.rb +1112 -1113
- data/spec/model/base_spec.rb +197 -196
- data/spec/model/class_dataset_methods_spec.rb +118 -118
- data/spec/model/dataset_methods_spec.rb +49 -49
- data/spec/model/eager_loading_spec.rb +705 -702
- data/spec/model/hooks_spec.rb +169 -168
- data/spec/model/inflector_spec.rb +5 -5
- data/spec/model/model_spec.rb +287 -297
- data/spec/model/plugins_spec.rb +47 -47
- data/spec/model/record_spec.rb +534 -535
- data/spec/model/spec_helper.rb +3 -21
- data/spec/model/validations_spec.rb +72 -70
- data/spec/spec_config.rb +8 -0
- metadata +41 -9
- data/lib/sequel/adapters/fdbsql.rb +0 -286
- data/lib/sequel/adapters/jdbc/fdbsql.rb +0 -66
- data/lib/sequel/adapters/openbase.rb +0 -54
- data/lib/sequel/adapters/shared/fdbsql.rb +0 -550
- data/spec/adapters/fdbsql_spec.rb +0 -429
- data/spec/rspec_helper.rb +0 -22
|
@@ -30,8 +30,8 @@ describe "Sequel::Plugins::CsvSerializer" do
|
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
it "should round trip successfully" do
|
|
33
|
-
@Artist.from_csv(@artist.to_csv).
|
|
34
|
-
@Album.from_csv(@album.to_csv).
|
|
33
|
+
@Artist.from_csv(@artist.to_csv).must_equal @artist
|
|
34
|
+
@Album.from_csv(@album.to_csv).must_equal @album
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
it "should handle ruby objects in values" do
|
|
@@ -40,78 +40,78 @@ describe "Sequel::Plugins::CsvSerializer" do
|
|
|
40
40
|
end
|
|
41
41
|
a = @Artist.load(:name=>Date.today)
|
|
42
42
|
opts = {:columns=>[:name]}
|
|
43
|
-
@Artist.from_csv(a.to_csv(opts), opts).
|
|
43
|
+
@Artist.from_csv(a.to_csv(opts), opts).must_equal a
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
it "should handle the :only option" do
|
|
47
|
-
@Artist.from_csv(@artist.to_csv(:only=>:name), :only=>:name).
|
|
48
|
-
@Album.from_csv(@album.to_csv(:only=>[:id, :name]), :only=>[:id, :name]).
|
|
47
|
+
@Artist.from_csv(@artist.to_csv(:only=>:name), :only=>:name).must_equal @Artist.load(:name=>@artist.name)
|
|
48
|
+
@Album.from_csv(@album.to_csv(:only=>[:id, :name]), :only=>[:id, :name]).must_equal @Album.load(:id=>@album.id, :name=>@album.name)
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
it "should handle the :except option" do
|
|
52
|
-
@Artist.from_csv(@artist.to_csv(:except=>:id), :except=>:id).
|
|
53
|
-
@Album.from_csv(@album.to_csv(:except=>[:id, :artist_id]), :except=>[:id, :artist_id]).
|
|
52
|
+
@Artist.from_csv(@artist.to_csv(:except=>:id), :except=>:id).must_equal @Artist.load(:name=>@artist.name)
|
|
53
|
+
@Album.from_csv(@album.to_csv(:except=>[:id, :artist_id]), :except=>[:id, :artist_id]).must_equal @Album.load(:name=>@album.name)
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
it "should handle the :include option for arbitrary attributes" do
|
|
57
|
-
@Album.from_csv(@album.to_csv(:include=>:blah), :include=>:blah).blah.
|
|
57
|
+
@Album.from_csv(@album.to_csv(:include=>:blah), :include=>:blah).blah.must_equal @album.blah
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
it "should handle multiple inclusions using an array for the :include option" do
|
|
61
61
|
a = @Album.from_csv(@album.to_csv(:include=>[:blah]), :include=>:blah)
|
|
62
|
-
a.blah.
|
|
62
|
+
a.blah.must_equal @album.blah
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
it "#from_csv should set column values" do
|
|
66
66
|
@artist.from_csv('AS', :only=>:name)
|
|
67
|
-
@artist.name.
|
|
68
|
-
@artist.id.
|
|
67
|
+
@artist.name.must_equal 'AS'
|
|
68
|
+
@artist.id.must_equal 2
|
|
69
69
|
|
|
70
70
|
@artist.from_csv('1', :only=>:id)
|
|
71
|
-
@artist.name.
|
|
72
|
-
@artist.id.
|
|
71
|
+
@artist.name.must_equal 'AS'
|
|
72
|
+
@artist.id.must_equal 1
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
it ".array_from_csv should support :headers to specify headers" do
|
|
76
76
|
@albums = @Album.array_from_csv("AS,2\nDF,3", :headers=>['name', 'artist_id'])
|
|
77
|
-
@albums.map(&:name).
|
|
78
|
-
@albums.map(&:artist_id).
|
|
77
|
+
@albums.map(&:name).must_equal %w'AS DF'
|
|
78
|
+
@albums.map(&:artist_id).must_equal [2, 3]
|
|
79
79
|
|
|
80
80
|
@albums = @Album.array_from_csv("2,AS\n3,DF", :headers=>[nil, 'name'])
|
|
81
|
-
@albums.map(&:name).
|
|
82
|
-
@albums.map(&:artist_id).
|
|
81
|
+
@albums.map(&:name).must_equal %w'AS DF'
|
|
82
|
+
@albums.map(&:artist_id).must_equal [nil, nil]
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
it ".from_csv should support :headers to specify headers" do
|
|
86
86
|
@album = @Album.from_csv('AS,2', :headers=>['name', 'artist_id'])
|
|
87
|
-
@album.name.
|
|
88
|
-
@album.artist_id.
|
|
87
|
+
@album.name.must_equal 'AS'
|
|
88
|
+
@album.artist_id.must_equal 2
|
|
89
89
|
|
|
90
90
|
@album = @Album.from_csv('2,AS', :headers=>[nil, 'name'])
|
|
91
|
-
@album.name.
|
|
92
|
-
@album.artist_id.
|
|
91
|
+
@album.name.must_equal 'AS'
|
|
92
|
+
@album.artist_id.must_equal nil
|
|
93
93
|
end
|
|
94
94
|
|
|
95
95
|
it "#from_csv should support :headers to specify headers" do
|
|
96
96
|
@album.from_csv('AS,2', :headers=>['name'])
|
|
97
|
-
@album.name.
|
|
98
|
-
@album.artist_id.
|
|
97
|
+
@album.name.must_equal 'AS'
|
|
98
|
+
@album.artist_id.must_equal 2
|
|
99
99
|
|
|
100
100
|
@album.from_csv('2,AS', :headers=>[nil, 'name'])
|
|
101
|
-
@album.name.
|
|
102
|
-
@album.artist_id.
|
|
101
|
+
@album.name.must_equal 'AS'
|
|
102
|
+
@album.artist_id.must_equal 2
|
|
103
103
|
end
|
|
104
104
|
|
|
105
105
|
it "should support a to_csv class and dataset method" do
|
|
106
106
|
@Album.dataset._fetch = {:id=>1, :name=>'RF', :artist_id=>2}
|
|
107
107
|
@Artist.dataset._fetch = {:id=>2, :name=>'YJM'}
|
|
108
|
-
@Album.array_from_csv(@Album.to_csv).
|
|
109
|
-
@Album.array_from_csv(@Album.dataset.to_csv(:only=>:name), :only=>:name).
|
|
108
|
+
@Album.array_from_csv(@Album.to_csv).must_equal [@album]
|
|
109
|
+
@Album.array_from_csv(@Album.dataset.to_csv(:only=>:name), :only=>:name).must_equal [@Album.load(:name=>@album.name)]
|
|
110
110
|
end
|
|
111
111
|
|
|
112
112
|
it "should have dataset to_csv method respect :array option" do
|
|
113
113
|
a = @Album.new(:id=>1, :name=>'RF', :artist_id=>3)
|
|
114
|
-
@Album.array_from_csv(@Album.to_csv(:array=>[a])).
|
|
114
|
+
@Album.array_from_csv(@Album.to_csv(:array=>[a])).must_equal [a]
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
it "#to_csv should respect class options" do
|
|
@@ -127,34 +127,34 @@ describe "Sequel::Plugins::CsvSerializer" do
|
|
|
127
127
|
@album.artist = @artist
|
|
128
128
|
@album.blah = 'Gak'
|
|
129
129
|
|
|
130
|
-
@album.to_csv.
|
|
131
|
-
@album.to_csv(:write_headers=>false).
|
|
132
|
-
@album.to_csv(:headers=>[:name]).
|
|
133
|
-
@album.to_csv(:headers=>[:name, :id]).
|
|
134
|
-
@album.to_csv(:only=>[:name]).
|
|
135
|
-
@album.to_csv(:except=>nil).
|
|
136
|
-
@album.to_csv(:except=>[:blah]).
|
|
130
|
+
@album.to_csv.must_equal "name,artist_id,blah\nJK,2,Gak\n"
|
|
131
|
+
@album.to_csv(:write_headers=>false).must_equal "JK,2,Gak\n"
|
|
132
|
+
@album.to_csv(:headers=>[:name]).must_equal "name\nJK\n"
|
|
133
|
+
@album.to_csv(:headers=>[:name, :id]).must_equal "name,id\nJK,2\n"
|
|
134
|
+
@album.to_csv(:only=>[:name]).must_equal "name,blah\nJK,Gak\n"
|
|
135
|
+
@album.to_csv(:except=>nil).must_equal "id,name,artist_id,blah\n2,JK,2,Gak\n"
|
|
136
|
+
@album.to_csv(:except=>[:blah]).must_equal "id,name,artist_id\n2,JK,2\n"
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
it "should store the default options in csv_serializer_opts" do
|
|
140
|
-
@Album.csv_serializer_opts.
|
|
140
|
+
@Album.csv_serializer_opts.must_equal({})
|
|
141
141
|
c = Class.new(@Album)
|
|
142
142
|
@Album.csv_serializer_opts[:include] = :blah
|
|
143
143
|
c.plugin :csv_serializer, :naked=>false
|
|
144
|
-
c.csv_serializer_opts.
|
|
145
|
-
@Album.csv_serializer_opts.
|
|
144
|
+
c.csv_serializer_opts.must_equal(:naked=>false)
|
|
145
|
+
@Album.csv_serializer_opts.must_equal(:include=>:blah)
|
|
146
146
|
end
|
|
147
147
|
|
|
148
148
|
it "should work correctly when subclassing" do
|
|
149
149
|
@Artist2 = Class.new(@Artist)
|
|
150
150
|
@Artist2.plugin :csv_serializer, :only=>:name
|
|
151
151
|
@Artist3 = Class.new(@Artist2)
|
|
152
|
-
@Artist3.from_csv(@Artist3.load(:id=>2, :name=>'YYY').to_csv).
|
|
152
|
+
@Artist3.from_csv(@Artist3.load(:id=>2, :name=>'YYY').to_csv).must_equal @Artist3.load(:name=>'YYY')
|
|
153
153
|
end
|
|
154
154
|
|
|
155
155
|
it "should raise an error if attempting to set a restricted column and :all_columns is not used" do
|
|
156
156
|
@Artist.restrict_primary_key
|
|
157
|
-
proc{@Artist.from_csv(@artist.to_csv)}.
|
|
157
|
+
proc{@Artist.from_csv(@artist.to_csv)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
158
158
|
end
|
|
159
159
|
|
|
160
160
|
it "should use a dataset's selected columns" do
|
|
@@ -162,12 +162,12 @@ describe "Sequel::Plugins::CsvSerializer" do
|
|
|
162
162
|
ds = @Artist.select(*columns).limit(1)
|
|
163
163
|
ds.instance_variable_set(:@columns, columns)
|
|
164
164
|
ds._fetch = [:id => 10]
|
|
165
|
-
ds.to_csv(:write_headers => true).
|
|
165
|
+
ds.to_csv(:write_headers => true).must_equal "id\n10\n"
|
|
166
166
|
end
|
|
167
167
|
|
|
168
168
|
it "should pass all the examples from the documentation" do
|
|
169
|
-
@album.to_csv(:write_headers=>true).
|
|
170
|
-
@album.to_csv(:only=>:name).
|
|
171
|
-
@album.to_csv(:except=>[:id, :artist_id]).
|
|
169
|
+
@album.to_csv(:write_headers=>true).must_equal "id,name,artist_id\n1,RF,2\n"
|
|
170
|
+
@album.to_csv(:only=>:name).must_equal "RF\n"
|
|
171
|
+
@album.to_csv(:except=>[:id, :artist_id]).must_equal "RF\n"
|
|
172
172
|
end
|
|
173
173
|
end
|
|
@@ -8,20 +8,20 @@ describe "current_datetime_timestamp extension" do
|
|
|
8
8
|
Sequel.datetime_class = Time
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
it "should have current_timestamp respect Sequel.datetime_class" do
|
|
12
12
|
t = Sequel::Dataset.new(nil).current_datetime
|
|
13
|
-
t.
|
|
14
|
-
(Time.now - t < 0.1).
|
|
13
|
+
t.must_be_kind_of(Time)
|
|
14
|
+
(Time.now - t < 0.1).must_equal true
|
|
15
15
|
|
|
16
16
|
Sequel.datetime_class = DateTime
|
|
17
17
|
t = Sequel::Dataset.new(nil).current_datetime
|
|
18
|
-
t.
|
|
19
|
-
(DateTime.now - t < (0.1/86400)).
|
|
18
|
+
t.must_be_kind_of(DateTime)
|
|
19
|
+
(DateTime.now - t < (0.1/86400)).must_equal true
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
@ds.literal(@ds.current_datetime).
|
|
22
|
+
it "should have current_timestamp value be literalized as CURRENT_TIMESTAMP" do
|
|
23
|
+
@ds.literal(@ds.current_datetime).must_equal 'CURRENT_TIMESTAMP'
|
|
24
24
|
Sequel.datetime_class = DateTime
|
|
25
|
-
@ds.literal(@ds.current_datetime).
|
|
25
|
+
@ds.literal(@ds.current_datetime).must_equal 'CURRENT_TIMESTAMP'
|
|
26
26
|
end
|
|
27
27
|
end
|
|
@@ -43,166 +43,166 @@ describe "Sequel::Plugins::DatasetAssociations" do
|
|
|
43
43
|
|
|
44
44
|
it "should work for many_to_one associations" do
|
|
45
45
|
ds = @Album.artists
|
|
46
|
-
ds.
|
|
47
|
-
ds.model.
|
|
48
|
-
ds.sql.
|
|
46
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
47
|
+
ds.model.must_equal @Artist
|
|
48
|
+
ds.sql.must_equal "SELECT * FROM artists WHERE (artists.id IN (SELECT albums.artist_id FROM albums))"
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
it "should work for one_to_many associations" do
|
|
52
52
|
ds = @Artist.albums
|
|
53
|
-
ds.
|
|
54
|
-
ds.model.
|
|
55
|
-
ds.sql.
|
|
53
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
54
|
+
ds.model.must_equal @Album
|
|
55
|
+
ds.sql.must_equal "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists))"
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
it "should work for one_to_one associations" do
|
|
59
59
|
ds = @Artist.first_albums
|
|
60
|
-
ds.
|
|
61
|
-
ds.model.
|
|
62
|
-
ds.sql.
|
|
60
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
61
|
+
ds.model.must_equal @Album
|
|
62
|
+
ds.sql.must_equal "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists))"
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
it "should work for many_to_many associations" do
|
|
66
66
|
ds = @Album.tags
|
|
67
|
-
ds.
|
|
68
|
-
ds.model.
|
|
69
|
-
ds.sql.
|
|
67
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
68
|
+
ds.model.must_equal @Tag
|
|
69
|
+
ds.sql.must_equal "SELECT tags.* FROM tags WHERE (tags.id IN (SELECT albums_tags.tag_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((albums_tags.album_id) IN (SELECT albums.id FROM albums))))"
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
it "should work for one_through_one associations" do
|
|
73
73
|
ds = @Album.first_tags
|
|
74
|
-
ds.
|
|
75
|
-
ds.model.
|
|
76
|
-
ds.sql.
|
|
74
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
75
|
+
ds.model.must_equal @Tag
|
|
76
|
+
ds.sql.must_equal "SELECT tags.* FROM tags WHERE (tags.id IN (SELECT albums_tags.tag_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((albums_tags.album_id) IN (SELECT albums.id FROM albums))))"
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
it "should work for many_through_many associations" do
|
|
80
80
|
ds = @Artist.tags
|
|
81
|
-
ds.
|
|
82
|
-
ds.model.
|
|
83
|
-
ds.sql.
|
|
81
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
82
|
+
ds.model.must_equal @Tag
|
|
83
|
+
ds.sql.must_equal "SELECT tags.* FROM tags WHERE (tags.id IN (SELECT albums_tags.tag_id FROM artists INNER JOIN albums ON (albums.artist_id = artists.id) INNER JOIN albums_tags ON (albums_tags.album_id = albums.id) INNER JOIN tags ON (tags.id = albums_tags.tag_id) WHERE (albums.artist_id IN (SELECT artists.id FROM artists))))"
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
it "should work for one_through_many associations" do
|
|
87
87
|
ds = @Artist.otags
|
|
88
|
-
ds.
|
|
89
|
-
ds.model.
|
|
90
|
-
ds.sql.
|
|
88
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
89
|
+
ds.model.must_equal @Tag
|
|
90
|
+
ds.sql.must_equal "SELECT tags.* FROM tags WHERE (tags.id IN (SELECT albums_tags.tag_id FROM artists INNER JOIN albums ON (albums.artist_id = artists.id) INNER JOIN albums_tags ON (albums_tags.album_id = albums.id) INNER JOIN tags ON (tags.id = albums_tags.tag_id) WHERE (albums.artist_id IN (SELECT artists.id FROM artists))))"
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
it "should work for pg_array_to_many associations" do
|
|
94
94
|
ds = @Artist.artist_tags
|
|
95
|
-
ds.
|
|
96
|
-
ds.model.
|
|
97
|
-
ds.sql.
|
|
95
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
96
|
+
ds.model.must_equal @Tag
|
|
97
|
+
ds.sql.must_equal "SELECT * FROM tags WHERE (id IN (SELECT unnest(artists.tag_ids) FROM artists))"
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
it "should work for many_to_pg_array associations" do
|
|
101
101
|
ds = @Tag.artists
|
|
102
|
-
ds.
|
|
103
|
-
ds.model.
|
|
104
|
-
ds.sql.
|
|
102
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
103
|
+
ds.model.must_equal @Artist
|
|
104
|
+
ds.sql.must_equal "SELECT * FROM artists WHERE coalesce((tag_ids && (SELECT array_agg(tags.id) FROM tags)), 'f')"
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
it "should have an associated method that takes an association symbol" do
|
|
108
108
|
ds = @Album.associated(:artist)
|
|
109
|
-
ds.
|
|
110
|
-
ds.model.
|
|
111
|
-
ds.sql.
|
|
109
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
110
|
+
ds.model.must_equal @Artist
|
|
111
|
+
ds.sql.must_equal "SELECT * FROM artists WHERE (artists.id IN (SELECT albums.artist_id FROM albums))"
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
it "should raise an Error if an invalid association is given to associated" do
|
|
115
|
-
proc{@Album.associated(:foo)}.
|
|
115
|
+
proc{@Album.associated(:foo)}.must_raise(Sequel::Error)
|
|
116
116
|
end
|
|
117
117
|
|
|
118
118
|
it "should raise an Error if an unrecognized association type is used" do
|
|
119
119
|
@Album.association_reflection(:artist)[:type] = :foo
|
|
120
|
-
proc{@Album.artists}.
|
|
120
|
+
proc{@Album.artists}.must_raise(Sequel::Error)
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
it "should work correctly when chaining" do
|
|
124
124
|
ds = @Artist.albums.tags
|
|
125
|
-
ds.
|
|
126
|
-
ds.model.
|
|
127
|
-
ds.sql.
|
|
125
|
+
ds.must_be_kind_of(Sequel::Dataset)
|
|
126
|
+
ds.model.must_equal @Tag
|
|
127
|
+
ds.sql.must_equal "SELECT tags.* FROM tags WHERE (tags.id IN (SELECT albums_tags.tag_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((albums_tags.album_id) IN (SELECT albums.id FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists))))))"
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
it "should deal correctly with filters before the association method" do
|
|
131
|
-
@Artist.filter(:id=>1).albums.sql.
|
|
131
|
+
@Artist.filter(:id=>1).albums.sql.must_equal "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists WHERE (id = 1)))"
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
it "should deal correctly with filters after the association method" do
|
|
135
|
-
@Artist.albums.filter(:id=>1).sql.
|
|
135
|
+
@Artist.albums.filter(:id=>1).sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (id = 1))"
|
|
136
136
|
end
|
|
137
137
|
|
|
138
138
|
it "should deal correctly with block on the association" do
|
|
139
139
|
@Artist.one_to_many :albums, :clone=>:albums do |ds| ds.filter(:id=>1..100) end
|
|
140
|
-
@Artist.albums.sql.
|
|
140
|
+
@Artist.albums.sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (id >= 1) AND (id <= 100))"
|
|
141
141
|
end
|
|
142
142
|
|
|
143
143
|
it "should deal correctly with :conditions option on the association" do
|
|
144
144
|
@Artist.one_to_many :albums, :clone=>:albums, :conditions=>{:id=>1..100}
|
|
145
|
-
@Artist.albums.sql.
|
|
145
|
+
@Artist.albums.sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (id >= 1) AND (id <= 100))"
|
|
146
146
|
end
|
|
147
147
|
|
|
148
148
|
it "should deal correctly with :distinct option on the association" do
|
|
149
149
|
@Artist.one_to_many :albums, :clone=>:albums, :distinct=>true
|
|
150
|
-
@Artist.albums.sql.
|
|
150
|
+
@Artist.albums.sql.must_equal "SELECT DISTINCT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists))"
|
|
151
151
|
end
|
|
152
152
|
|
|
153
153
|
it "should deal correctly with :eager option on the association" do
|
|
154
154
|
@Artist.one_to_many :albums, :clone=>:albums, :eager=>:tags
|
|
155
|
-
@Artist.albums.opts[:eager].
|
|
155
|
+
@Artist.albums.opts[:eager].must_equal(:tags=>nil)
|
|
156
156
|
end
|
|
157
157
|
|
|
158
158
|
it "should deal correctly with :eager_block option on the association, ignoring the association block" do
|
|
159
159
|
@Artist.one_to_many :albums, :clone=>:albums, :eager_block=>proc{|ds| ds.filter(:id=>1..100)} do |ds| ds.filter(:id=>2..200) end
|
|
160
|
-
@Artist.albums.sql.
|
|
160
|
+
@Artist.albums.sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (id >= 1) AND (id <= 100))"
|
|
161
161
|
end
|
|
162
162
|
|
|
163
163
|
it "should deal correctly with :extend option on the association" do
|
|
164
164
|
@Artist.one_to_many :albums, :clone=>:albums, :extend=>Module.new{def foo(x) filter(:id=>x) end}
|
|
165
|
-
@Artist.albums.foo(1).sql.
|
|
165
|
+
@Artist.albums.foo(1).sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (id = 1))"
|
|
166
166
|
end
|
|
167
167
|
|
|
168
168
|
it "should deal correctly with :order option on the association" do
|
|
169
169
|
@Artist.one_to_many :albums, :clone=>:albums, :order=>:name
|
|
170
|
-
@Artist.albums.sql.
|
|
170
|
+
@Artist.albums.sql.must_equal "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists)) ORDER BY name"
|
|
171
171
|
end
|
|
172
172
|
|
|
173
173
|
it "should deal correctly with :select option on the association" do
|
|
174
174
|
@Artist.one_to_many :albums, :clone=>:albums, :select=>[:id, :name]
|
|
175
|
-
@Artist.albums.sql.
|
|
175
|
+
@Artist.albums.sql.must_equal "SELECT id, name FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists))"
|
|
176
176
|
end
|
|
177
177
|
|
|
178
178
|
it "should deal correctly with :order option for one_to_one associations" do
|
|
179
179
|
@Artist.one_to_one :first_album, :clone=>:first_album, :order=>:name
|
|
180
|
-
@Artist.first_albums.sql.
|
|
180
|
+
@Artist.first_albums.sql.must_equal 'SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (albums.id IN (SELECT DISTINCT ON (albums.artist_id) albums.id FROM albums ORDER BY albums.artist_id, name))) ORDER BY name'
|
|
181
181
|
end
|
|
182
182
|
|
|
183
183
|
it "should deal correctly with :limit option for one_to_many associations" do
|
|
184
184
|
@Artist.one_to_many :albums, :clone=>:albums, :limit=>10, :order=>:name
|
|
185
|
-
@Artist.albums.sql.
|
|
185
|
+
@Artist.albums.sql.must_equal 'SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (albums.id IN (SELECT id FROM (SELECT albums.id, row_number() OVER (PARTITION BY albums.artist_id ORDER BY name) AS x_sequel_row_number_x FROM albums) AS t1 WHERE (x_sequel_row_number_x <= 10)))) ORDER BY name'
|
|
186
186
|
end
|
|
187
187
|
|
|
188
188
|
it "should deal correctly with :order option for one_through_one associations" do
|
|
189
189
|
@Album.one_through_one :first_tag, :clone=>:first_tag, :order=>:tags__name
|
|
190
|
-
@Album.first_tags.sql.
|
|
190
|
+
@Album.first_tags.sql.must_equal 'SELECT tags.* FROM tags WHERE (tags.id IN (SELECT albums_tags.tag_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE (((albums_tags.album_id) IN (SELECT albums.id FROM albums)) AND ((albums_tags.album_id, tags.id) IN (SELECT DISTINCT ON (albums_tags.album_id) albums_tags.album_id, tags.id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) ORDER BY albums_tags.album_id, tags.name))))) ORDER BY tags.name'
|
|
191
191
|
end
|
|
192
192
|
|
|
193
193
|
it "should deal correctly with :limit option for many_to_many associations" do
|
|
194
194
|
@Album.many_to_many :tags, :clone=>:tags, :limit=>10, :order=>:tags__name
|
|
195
|
-
@Album.tags.sql.
|
|
195
|
+
@Album.tags.sql.must_equal 'SELECT tags.* FROM tags WHERE (tags.id IN (SELECT albums_tags.tag_id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE (((albums_tags.album_id) IN (SELECT albums.id FROM albums)) AND ((albums_tags.album_id, tags.id) IN (SELECT b, c FROM (SELECT albums_tags.album_id AS b, tags.id AS c, row_number() OVER (PARTITION BY albums_tags.album_id ORDER BY tags.name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id)) AS t1 WHERE (x_sequel_row_number_x <= 10)))))) ORDER BY tags.name'
|
|
196
196
|
end
|
|
197
197
|
|
|
198
198
|
it "should deal correctly with :order option for one_through_many associations" do
|
|
199
199
|
@Artist.one_through_many :otag, :clone=>:otag, :order=>:tags__name
|
|
200
|
-
@Artist.otags.sql.
|
|
200
|
+
@Artist.otags.sql.must_equal 'SELECT tags.* FROM tags WHERE (tags.id IN (SELECT albums_tags.tag_id FROM artists INNER JOIN albums ON (albums.artist_id = artists.id) INNER JOIN albums_tags ON (albums_tags.album_id = albums.id) INNER JOIN tags ON (tags.id = albums_tags.tag_id) WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND ((albums.artist_id, tags.id) IN (SELECT DISTINCT ON (albums.artist_id) albums.artist_id, tags.id FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) ORDER BY albums.artist_id, tags.name))))) ORDER BY tags.name'
|
|
201
201
|
end
|
|
202
202
|
|
|
203
203
|
it "should deal correctly with :limit option for many_through_many associations" do
|
|
204
204
|
@Artist.many_through_many :tags, :clone=>:tags, :limit=>10, :order=>:tags__name
|
|
205
|
-
@Artist.tags.sql.
|
|
205
|
+
@Artist.tags.sql.must_equal 'SELECT tags.* FROM tags WHERE (tags.id IN (SELECT albums_tags.tag_id FROM artists INNER JOIN albums ON (albums.artist_id = artists.id) INNER JOIN albums_tags ON (albums_tags.album_id = albums.id) INNER JOIN tags ON (tags.id = albums_tags.tag_id) WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND ((albums.artist_id, tags.id) IN (SELECT b, c FROM (SELECT albums.artist_id AS b, tags.id AS c, row_number() OVER (PARTITION BY albums.artist_id ORDER BY tags.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)) AS t1 WHERE (x_sequel_row_number_x <= 10)))))) ORDER BY tags.name'
|
|
206
206
|
end
|
|
207
207
|
end
|
|
208
208
|
|
|
@@ -248,64 +248,64 @@ describe "Sequel::Plugins::DatasetAssociations with composite keys" do
|
|
|
248
248
|
end
|
|
249
249
|
|
|
250
250
|
it "should work for many_to_one associations" do
|
|
251
|
-
@Album.artists.sql.
|
|
251
|
+
@Album.artists.sql.must_equal "SELECT * FROM artists WHERE ((artists.id1, artists.id2) IN (SELECT albums.artist_id1, albums.artist_id2 FROM albums))"
|
|
252
252
|
end
|
|
253
253
|
|
|
254
254
|
it "should work for one_to_many associations" do
|
|
255
|
-
@Artist.albums.sql.
|
|
255
|
+
@Artist.albums.sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists))"
|
|
256
256
|
end
|
|
257
257
|
|
|
258
258
|
it "should work for one_to_one associations" do
|
|
259
|
-
@Artist.first_albums.sql.
|
|
259
|
+
@Artist.first_albums.sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists))"
|
|
260
260
|
end
|
|
261
261
|
|
|
262
262
|
it "should work for many_to_many associations" do
|
|
263
|
-
@Album.tags.sql.
|
|
263
|
+
@Album.tags.sql.must_equal "SELECT tags.* FROM tags WHERE ((tags.id1, tags.id2) IN (SELECT albums_tags.tag_id1, albums_tags.tag_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.id1) AND (albums_tags.tag_id2 = tags.id2)) WHERE ((albums_tags.album_id1, albums_tags.album_id2) IN (SELECT albums.id1, albums.id2 FROM albums))))"
|
|
264
264
|
end
|
|
265
265
|
|
|
266
266
|
it "should work for one_through_one associations" do
|
|
267
|
-
@Album.first_tags.sql.
|
|
267
|
+
@Album.first_tags.sql.must_equal "SELECT tags.* FROM tags WHERE ((tags.id1, tags.id2) IN (SELECT albums_tags.tag_id1, albums_tags.tag_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.id1) AND (albums_tags.tag_id2 = tags.id2)) WHERE ((albums_tags.album_id1, albums_tags.album_id2) IN (SELECT albums.id1, albums.id2 FROM albums))))"
|
|
268
268
|
end
|
|
269
269
|
|
|
270
270
|
it "should work for many_through_many associations" do
|
|
271
|
-
@Artist.tags.sql.
|
|
271
|
+
@Artist.tags.sql.must_equal "SELECT tags.* FROM tags WHERE ((tags.id1, tags.id2) IN (SELECT albums_tags.tag_id1, albums_tags.tag_id2 FROM artists INNER JOIN albums ON ((albums.artist_id1 = artists.id1) AND (albums.artist_id2 = artists.id2)) INNER JOIN albums_tags ON ((albums_tags.album_id1 = albums.id1) AND (albums_tags.album_id2 = albums.id2)) INNER JOIN tags ON ((tags.id1 = albums_tags.tag_id1) AND (tags.id2 = albums_tags.tag_id2)) WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists))))"
|
|
272
272
|
end
|
|
273
273
|
|
|
274
274
|
it "should work for one_through_many associations" do
|
|
275
|
-
@Artist.otags.sql.
|
|
275
|
+
@Artist.otags.sql.must_equal "SELECT tags.* FROM tags WHERE ((tags.id1, tags.id2) IN (SELECT albums_tags.tag_id1, albums_tags.tag_id2 FROM artists INNER JOIN albums ON ((albums.artist_id1 = artists.id1) AND (albums.artist_id2 = artists.id2)) INNER JOIN albums_tags ON ((albums_tags.album_id1 = albums.id1) AND (albums_tags.album_id2 = albums.id2)) INNER JOIN tags ON ((tags.id1 = albums_tags.tag_id1) AND (tags.id2 = albums_tags.tag_id2)) WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists))))"
|
|
276
276
|
end
|
|
277
277
|
|
|
278
278
|
it "should work correctly when chaining" do
|
|
279
|
-
@Artist.albums.tags.sql.
|
|
279
|
+
@Artist.albums.tags.sql.must_equal "SELECT tags.* FROM tags WHERE ((tags.id1, tags.id2) IN (SELECT albums_tags.tag_id1, albums_tags.tag_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.id1) AND (albums_tags.tag_id2 = tags.id2)) WHERE ((albums_tags.album_id1, albums_tags.album_id2) IN (SELECT albums.id1, albums.id2 FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists))))))"
|
|
280
280
|
end
|
|
281
281
|
|
|
282
282
|
it "should deal correctly with :order option for one_to_one associations" do
|
|
283
283
|
@Artist.one_to_one :first_album, :clone=>:first_album, :order=>:name
|
|
284
|
-
@Artist.first_albums.sql.
|
|
284
|
+
@Artist.first_albums.sql.must_equal 'SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists)) AND ((albums.id1, albums.id2) IN (SELECT DISTINCT ON (albums.artist_id1, albums.artist_id2) albums.id1, albums.id2 FROM albums ORDER BY albums.artist_id1, albums.artist_id2, name))) ORDER BY name'
|
|
285
285
|
end
|
|
286
286
|
|
|
287
287
|
it "should deal correctly with :limit option for one_to_many associations" do
|
|
288
288
|
@Artist.one_to_many :albums, :clone=>:albums, :limit=>10, :order=>:name
|
|
289
|
-
@Artist.albums.sql.
|
|
289
|
+
@Artist.albums.sql.must_equal 'SELECT * FROM albums WHERE (((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists)) AND ((albums.id1, albums.id2) IN (SELECT id1, id2 FROM (SELECT albums.id1, albums.id2, row_number() OVER (PARTITION BY albums.artist_id1, albums.artist_id2 ORDER BY name) AS x_sequel_row_number_x FROM albums) AS t1 WHERE (x_sequel_row_number_x <= 10)))) ORDER BY name'
|
|
290
290
|
end
|
|
291
291
|
|
|
292
292
|
it "should deal correctly with :order option for one_through_one associations" do
|
|
293
293
|
@Album.one_through_one :first_tag, :clone=>:first_tag, :order=>:tags__name
|
|
294
|
-
@Album.first_tags.sql.
|
|
294
|
+
@Album.first_tags.sql.must_equal 'SELECT tags.* FROM tags WHERE ((tags.id1, tags.id2) IN (SELECT albums_tags.tag_id1, albums_tags.tag_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.id1) AND (albums_tags.tag_id2 = tags.id2)) WHERE (((albums_tags.album_id1, albums_tags.album_id2) IN (SELECT albums.id1, albums.id2 FROM albums)) AND ((albums_tags.album_id1, albums_tags.album_id2, tags.id1, tags.id2) IN (SELECT DISTINCT ON (albums_tags.album_id1, albums_tags.album_id2) albums_tags.album_id1, albums_tags.album_id2, tags.id1, tags.id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.id1) AND (albums_tags.tag_id2 = tags.id2)) ORDER BY albums_tags.album_id1, albums_tags.album_id2, tags.name))))) ORDER BY tags.name'
|
|
295
295
|
end
|
|
296
296
|
|
|
297
297
|
it "should deal correctly with :limit option for many_to_many associations" do
|
|
298
298
|
@Album.many_to_many :tags, :clone=>:tags, :limit=>10, :order=>:tags__name
|
|
299
|
-
@Album.tags.sql.
|
|
299
|
+
@Album.tags.sql.must_equal 'SELECT tags.* FROM tags WHERE ((tags.id1, tags.id2) IN (SELECT albums_tags.tag_id1, albums_tags.tag_id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.id1) AND (albums_tags.tag_id2 = tags.id2)) WHERE (((albums_tags.album_id1, albums_tags.album_id2) IN (SELECT albums.id1, albums.id2 FROM albums)) AND ((albums_tags.album_id1, albums_tags.album_id2, tags.id1, tags.id2) IN (SELECT b, c, d, e FROM (SELECT albums_tags.album_id1 AS b, albums_tags.album_id2 AS c, tags.id1 AS d, tags.id2 AS e, row_number() OVER (PARTITION BY albums_tags.album_id1, albums_tags.album_id2 ORDER BY tags.name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.id1) AND (albums_tags.tag_id2 = tags.id2))) AS t1 WHERE (x_sequel_row_number_x <= 10)))))) ORDER BY tags.name'
|
|
300
300
|
end
|
|
301
301
|
|
|
302
302
|
it "should deal correctly with :order option for one_through_many associations" do
|
|
303
303
|
@Artist.one_through_many :otag, :clone=>:otag, :order=>:tags__name
|
|
304
|
-
@Artist.otags.sql.
|
|
304
|
+
@Artist.otags.sql.must_equal 'SELECT tags.* FROM tags WHERE ((tags.id1, tags.id2) IN (SELECT albums_tags.tag_id1, albums_tags.tag_id2 FROM artists INNER JOIN albums ON ((albums.artist_id1 = artists.id1) AND (albums.artist_id2 = artists.id2)) INNER JOIN albums_tags ON ((albums_tags.album_id1 = albums.id1) AND (albums_tags.album_id2 = albums.id2)) INNER JOIN tags ON ((tags.id1 = albums_tags.tag_id1) AND (tags.id2 = albums_tags.tag_id2)) WHERE (((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists)) AND ((albums.artist_id1, albums.artist_id2, tags.id1, tags.id2) IN (SELECT DISTINCT ON (albums.artist_id1, albums.artist_id2) albums.artist_id1, albums.artist_id2, tags.id1, tags.id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.id1) AND (albums_tags.tag_id2 = tags.id2)) INNER JOIN albums ON ((albums.id1 = albums_tags.album_id1) AND (albums.id2 = albums_tags.album_id2)) ORDER BY albums.artist_id1, albums.artist_id2, tags.name))))) ORDER BY tags.name'
|
|
305
305
|
end
|
|
306
306
|
|
|
307
307
|
it "should deal correctly with :limit option for many_through_many associations" do
|
|
308
308
|
@Artist.many_through_many :tags, :clone=>:tags, :limit=>10, :order=>:tags__name
|
|
309
|
-
@Artist.tags.sql.
|
|
309
|
+
@Artist.tags.sql.must_equal 'SELECT tags.* FROM tags WHERE ((tags.id1, tags.id2) IN (SELECT albums_tags.tag_id1, albums_tags.tag_id2 FROM artists INNER JOIN albums ON ((albums.artist_id1 = artists.id1) AND (albums.artist_id2 = artists.id2)) INNER JOIN albums_tags ON ((albums_tags.album_id1 = albums.id1) AND (albums_tags.album_id2 = albums.id2)) INNER JOIN tags ON ((tags.id1 = albums_tags.tag_id1) AND (tags.id2 = albums_tags.tag_id2)) WHERE (((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists)) AND ((albums.artist_id1, albums.artist_id2, tags.id1, tags.id2) IN (SELECT b, c, d, e FROM (SELECT albums.artist_id1 AS b, albums.artist_id2 AS c, tags.id1 AS d, tags.id2 AS e, row_number() OVER (PARTITION BY albums.artist_id1, albums.artist_id2 ORDER BY tags.name) AS x_sequel_row_number_x FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id1 = tags.id1) AND (albums_tags.tag_id2 = tags.id2)) INNER JOIN albums ON ((albums.id1 = albums_tags.album_id1) AND (albums.id2 = albums_tags.album_id2))) AS t1 WHERE (x_sequel_row_number_x <= 10)))))) ORDER BY tags.name'
|
|
310
310
|
end
|
|
311
311
|
end
|