sequel 5.29.0 → 5.30.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.
Files changed (323) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +8 -1922
  3. data/doc/release_notes/5.30.0.txt +20 -0
  4. data/lib/sequel/adapters/shared/sqlite.rb +7 -1
  5. data/lib/sequel/database/transactions.rb +5 -9
  6. data/lib/sequel/version.rb +1 -1
  7. metadata +4 -368
  8. data/Rakefile +0 -151
  9. data/doc/release_notes/4.0.0.txt +0 -262
  10. data/doc/release_notes/4.1.0.txt +0 -85
  11. data/doc/release_notes/4.10.0.txt +0 -226
  12. data/doc/release_notes/4.11.0.txt +0 -147
  13. data/doc/release_notes/4.12.0.txt +0 -105
  14. data/doc/release_notes/4.13.0.txt +0 -169
  15. data/doc/release_notes/4.14.0.txt +0 -68
  16. data/doc/release_notes/4.15.0.txt +0 -56
  17. data/doc/release_notes/4.16.0.txt +0 -36
  18. data/doc/release_notes/4.17.0.txt +0 -38
  19. data/doc/release_notes/4.18.0.txt +0 -36
  20. data/doc/release_notes/4.19.0.txt +0 -45
  21. data/doc/release_notes/4.2.0.txt +0 -129
  22. data/doc/release_notes/4.20.0.txt +0 -79
  23. data/doc/release_notes/4.21.0.txt +0 -94
  24. data/doc/release_notes/4.22.0.txt +0 -72
  25. data/doc/release_notes/4.23.0.txt +0 -65
  26. data/doc/release_notes/4.24.0.txt +0 -99
  27. data/doc/release_notes/4.25.0.txt +0 -181
  28. data/doc/release_notes/4.26.0.txt +0 -44
  29. data/doc/release_notes/4.27.0.txt +0 -78
  30. data/doc/release_notes/4.28.0.txt +0 -57
  31. data/doc/release_notes/4.29.0.txt +0 -41
  32. data/doc/release_notes/4.3.0.txt +0 -40
  33. data/doc/release_notes/4.30.0.txt +0 -37
  34. data/doc/release_notes/4.31.0.txt +0 -57
  35. data/doc/release_notes/4.32.0.txt +0 -132
  36. data/doc/release_notes/4.33.0.txt +0 -88
  37. data/doc/release_notes/4.34.0.txt +0 -86
  38. data/doc/release_notes/4.35.0.txt +0 -130
  39. data/doc/release_notes/4.36.0.txt +0 -116
  40. data/doc/release_notes/4.37.0.txt +0 -50
  41. data/doc/release_notes/4.38.0.txt +0 -67
  42. data/doc/release_notes/4.39.0.txt +0 -127
  43. data/doc/release_notes/4.4.0.txt +0 -92
  44. data/doc/release_notes/4.40.0.txt +0 -179
  45. data/doc/release_notes/4.41.0.txt +0 -77
  46. data/doc/release_notes/4.42.0.txt +0 -221
  47. data/doc/release_notes/4.43.0.txt +0 -87
  48. data/doc/release_notes/4.44.0.txt +0 -125
  49. data/doc/release_notes/4.45.0.txt +0 -370
  50. data/doc/release_notes/4.46.0.txt +0 -404
  51. data/doc/release_notes/4.47.0.txt +0 -56
  52. data/doc/release_notes/4.48.0.txt +0 -293
  53. data/doc/release_notes/4.49.0.txt +0 -222
  54. data/doc/release_notes/4.5.0.txt +0 -34
  55. data/doc/release_notes/4.6.0.txt +0 -30
  56. data/doc/release_notes/4.7.0.txt +0 -103
  57. data/doc/release_notes/4.8.0.txt +0 -175
  58. data/doc/release_notes/4.9.0.txt +0 -190
  59. data/spec/adapter_spec.rb +0 -4
  60. data/spec/adapters/db2_spec.rb +0 -170
  61. data/spec/adapters/mssql_spec.rb +0 -828
  62. data/spec/adapters/mysql_spec.rb +0 -1060
  63. data/spec/adapters/oracle_spec.rb +0 -371
  64. data/spec/adapters/postgres_spec.rb +0 -4476
  65. data/spec/adapters/spec_helper.rb +0 -44
  66. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  67. data/spec/adapters/sqlite_spec.rb +0 -652
  68. data/spec/bin_spec.rb +0 -278
  69. data/spec/core/connection_pool_spec.rb +0 -1250
  70. data/spec/core/database_spec.rb +0 -2915
  71. data/spec/core/dataset_spec.rb +0 -5544
  72. data/spec/core/deprecated_spec.rb +0 -70
  73. data/spec/core/expression_filters_spec.rb +0 -1498
  74. data/spec/core/mock_adapter_spec.rb +0 -722
  75. data/spec/core/object_graph_spec.rb +0 -336
  76. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  77. data/spec/core/schema_generator_spec.rb +0 -214
  78. data/spec/core/schema_spec.rb +0 -1844
  79. data/spec/core/spec_helper.rb +0 -24
  80. data/spec/core/version_spec.rb +0 -14
  81. data/spec/core_extensions_spec.rb +0 -763
  82. data/spec/core_model_spec.rb +0 -2
  83. data/spec/core_spec.rb +0 -1
  84. data/spec/deprecation_helper.rb +0 -30
  85. data/spec/extensions/accessed_columns_spec.rb +0 -51
  86. data/spec/extensions/active_model_spec.rb +0 -99
  87. data/spec/extensions/after_initialize_spec.rb +0 -28
  88. data/spec/extensions/any_not_empty_spec.rb +0 -23
  89. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  90. data/spec/extensions/association_dependencies_spec.rb +0 -125
  91. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  92. data/spec/extensions/association_pks_spec.rb +0 -423
  93. data/spec/extensions/association_proxies_spec.rb +0 -100
  94. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  95. data/spec/extensions/auto_validations_spec.rb +0 -229
  96. data/spec/extensions/blacklist_security_spec.rb +0 -95
  97. data/spec/extensions/blank_spec.rb +0 -69
  98. data/spec/extensions/boolean_readers_spec.rb +0 -93
  99. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  100. data/spec/extensions/caching_spec.rb +0 -273
  101. data/spec/extensions/caller_logging_spec.rb +0 -52
  102. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  103. data/spec/extensions/column_conflicts_spec.rb +0 -75
  104. data/spec/extensions/column_select_spec.rb +0 -129
  105. data/spec/extensions/columns_introspection_spec.rb +0 -90
  106. data/spec/extensions/columns_updated_spec.rb +0 -35
  107. data/spec/extensions/composition_spec.rb +0 -248
  108. data/spec/extensions/connection_expiration_spec.rb +0 -151
  109. data/spec/extensions/connection_validator_spec.rb +0 -144
  110. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  111. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  112. data/spec/extensions/constraint_validations_spec.rb +0 -439
  113. data/spec/extensions/core_refinements_spec.rb +0 -528
  114. data/spec/extensions/csv_serializer_spec.rb +0 -183
  115. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  116. data/spec/extensions/dataset_associations_spec.rb +0 -365
  117. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  118. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  119. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  120. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  121. data/spec/extensions/defaults_setter_spec.rb +0 -150
  122. data/spec/extensions/delay_add_association_spec.rb +0 -73
  123. data/spec/extensions/dirty_spec.rb +0 -222
  124. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  125. data/spec/extensions/eager_each_spec.rb +0 -62
  126. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  127. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  128. data/spec/extensions/empty_failure_backtraces_spec.rb +0 -60
  129. data/spec/extensions/error_splitter_spec.rb +0 -18
  130. data/spec/extensions/error_sql_spec.rb +0 -20
  131. data/spec/extensions/escaped_like_spec.rb +0 -40
  132. data/spec/extensions/eval_inspect_spec.rb +0 -81
  133. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  134. data/spec/extensions/finder_spec.rb +0 -260
  135. data/spec/extensions/force_encoding_spec.rb +0 -126
  136. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  137. data/spec/extensions/graph_each_spec.rb +0 -113
  138. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  139. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  140. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  141. data/spec/extensions/index_caching_spec.rb +0 -66
  142. data/spec/extensions/inflector_spec.rb +0 -183
  143. data/spec/extensions/input_transformer_spec.rb +0 -69
  144. data/spec/extensions/insert_conflict_spec.rb +0 -103
  145. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  146. data/spec/extensions/instance_filters_spec.rb +0 -79
  147. data/spec/extensions/instance_hooks_spec.rb +0 -246
  148. data/spec/extensions/integer64_spec.rb +0 -22
  149. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  150. data/spec/extensions/json_serializer_spec.rb +0 -346
  151. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  152. data/spec/extensions/list_spec.rb +0 -291
  153. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  154. data/spec/extensions/many_through_many_spec.rb +0 -2177
  155. data/spec/extensions/migration_spec.rb +0 -864
  156. data/spec/extensions/modification_detection_spec.rb +0 -93
  157. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  158. data/spec/extensions/named_timezones_spec.rb +0 -218
  159. data/spec/extensions/nested_attributes_spec.rb +0 -815
  160. data/spec/extensions/null_dataset_spec.rb +0 -85
  161. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  162. data/spec/extensions/pagination_spec.rb +0 -116
  163. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  164. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  165. data/spec/extensions/pg_array_spec.rb +0 -398
  166. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  167. data/spec/extensions/pg_enum_spec.rb +0 -118
  168. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  169. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  170. data/spec/extensions/pg_hstore_spec.rb +0 -219
  171. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  172. data/spec/extensions/pg_inet_spec.rb +0 -72
  173. data/spec/extensions/pg_interval_spec.rb +0 -103
  174. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  175. data/spec/extensions/pg_json_spec.rb +0 -451
  176. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  177. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  178. data/spec/extensions/pg_range_spec.rb +0 -600
  179. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  180. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  181. data/spec/extensions/pg_row_spec.rb +0 -363
  182. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  183. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  184. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  185. data/spec/extensions/prepared_statements_spec.rb +0 -177
  186. data/spec/extensions/pretty_table_spec.rb +0 -123
  187. data/spec/extensions/query_spec.rb +0 -94
  188. data/spec/extensions/rcte_tree_spec.rb +0 -387
  189. data/spec/extensions/round_timestamps_spec.rb +0 -39
  190. data/spec/extensions/s_spec.rb +0 -60
  191. data/spec/extensions/schema_caching_spec.rb +0 -64
  192. data/spec/extensions/schema_dumper_spec.rb +0 -870
  193. data/spec/extensions/select_remove_spec.rb +0 -38
  194. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  195. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  196. data/spec/extensions/serialization_spec.rb +0 -365
  197. data/spec/extensions/server_block_spec.rb +0 -135
  198. data/spec/extensions/server_logging_spec.rb +0 -45
  199. data/spec/extensions/sharding_spec.rb +0 -197
  200. data/spec/extensions/shared_caching_spec.rb +0 -151
  201. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  202. data/spec/extensions/singular_table_names_spec.rb +0 -22
  203. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  204. data/spec/extensions/spec_helper.rb +0 -70
  205. data/spec/extensions/split_array_nil_spec.rb +0 -24
  206. data/spec/extensions/split_values_spec.rb +0 -57
  207. data/spec/extensions/sql_comments_spec.rb +0 -33
  208. data/spec/extensions/sql_expr_spec.rb +0 -59
  209. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  210. data/spec/extensions/static_cache_spec.rb +0 -471
  211. data/spec/extensions/string_agg_spec.rb +0 -90
  212. data/spec/extensions/string_date_time_spec.rb +0 -95
  213. data/spec/extensions/string_stripper_spec.rb +0 -68
  214. data/spec/extensions/subclasses_spec.rb +0 -79
  215. data/spec/extensions/subset_conditions_spec.rb +0 -38
  216. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  217. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  218. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  219. data/spec/extensions/table_select_spec.rb +0 -83
  220. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  221. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  222. data/spec/extensions/throw_failures_spec.rb +0 -74
  223. data/spec/extensions/timestamps_spec.rb +0 -209
  224. data/spec/extensions/to_dot_spec.rb +0 -153
  225. data/spec/extensions/touch_spec.rb +0 -226
  226. data/spec/extensions/tree_spec.rb +0 -334
  227. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  228. data/spec/extensions/unlimited_update_spec.rb +0 -21
  229. data/spec/extensions/update_or_create_spec.rb +0 -83
  230. data/spec/extensions/update_primary_key_spec.rb +0 -105
  231. data/spec/extensions/update_refresh_spec.rb +0 -59
  232. data/spec/extensions/uuid_spec.rb +0 -101
  233. data/spec/extensions/validate_associated_spec.rb +0 -52
  234. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  235. data/spec/extensions/validation_contexts_spec.rb +0 -31
  236. data/spec/extensions/validation_helpers_spec.rb +0 -525
  237. data/spec/extensions/whitelist_security_spec.rb +0 -157
  238. data/spec/extensions/xml_serializer_spec.rb +0 -213
  239. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  240. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  241. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  242. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  243. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  244. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  245. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  246. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  247. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  248. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  249. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  250. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  251. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  252. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  253. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  254. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  255. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  256. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  257. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  258. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  259. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  260. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  261. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  262. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  263. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  264. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  265. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  266. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  267. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  268. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  269. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  270. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  271. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  272. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  273. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  274. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  275. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  276. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  277. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  278. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  279. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  280. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  281. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  282. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  283. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  284. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  285. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  286. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  287. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  288. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  289. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  290. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  291. data/spec/guards_helper.rb +0 -59
  292. data/spec/integration/associations_test.rb +0 -2597
  293. data/spec/integration/database_test.rb +0 -113
  294. data/spec/integration/dataset_test.rb +0 -2037
  295. data/spec/integration/eager_loader_test.rb +0 -687
  296. data/spec/integration/migrator_test.rb +0 -262
  297. data/spec/integration/model_test.rb +0 -203
  298. data/spec/integration/plugin_test.rb +0 -2423
  299. data/spec/integration/prepared_statement_test.rb +0 -405
  300. data/spec/integration/schema_test.rb +0 -903
  301. data/spec/integration/spec_helper.rb +0 -71
  302. data/spec/integration/timezone_test.rb +0 -86
  303. data/spec/integration/transaction_test.rb +0 -603
  304. data/spec/integration/type_test.rb +0 -127
  305. data/spec/model/association_reflection_spec.rb +0 -803
  306. data/spec/model/associations_spec.rb +0 -4738
  307. data/spec/model/base_spec.rb +0 -875
  308. data/spec/model/class_dataset_methods_spec.rb +0 -146
  309. data/spec/model/dataset_methods_spec.rb +0 -198
  310. data/spec/model/eager_loading_spec.rb +0 -2377
  311. data/spec/model/hooks_spec.rb +0 -370
  312. data/spec/model/inflector_spec.rb +0 -26
  313. data/spec/model/model_spec.rb +0 -956
  314. data/spec/model/plugins_spec.rb +0 -429
  315. data/spec/model/record_spec.rb +0 -2118
  316. data/spec/model/spec_helper.rb +0 -46
  317. data/spec/model/validations_spec.rb +0 -220
  318. data/spec/model_no_assoc_spec.rb +0 -1
  319. data/spec/model_spec.rb +0 -1
  320. data/spec/plugin_spec.rb +0 -1
  321. data/spec/sequel_coverage.rb +0 -15
  322. data/spec/sequel_warning.rb +0 -5
  323. data/spec/spec_config.rb +0 -12
@@ -1,183 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- require 'csv'
4
-
5
- describe "Sequel::Plugins::CsvSerializer" do
6
- before do
7
- artist = @Artist = Class.new(Sequel::Model(:artists))
8
- @Artist.class_eval do
9
- def self.name; 'Artist' end
10
- unrestrict_primary_key
11
- plugin :csv_serializer
12
- columns :id, :name
13
- def_column_accessor :id, :name
14
- @db_schema = {:id=>{:type=>:integer}}
15
- end
16
- @Album = Class.new(Sequel::Model(:albums))
17
- @Album.class_eval do
18
- def self.name; 'Album' end
19
- unrestrict_primary_key
20
- attr_accessor :blah
21
- plugin :csv_serializer
22
- columns :id, :name, :artist_id
23
- def_column_accessor :id, :name, :artist_id
24
- @db_schema = {:id=>{:type=>:integer}, :artist_id=>{:type=>:integer}}
25
- many_to_one :artist, :class=>artist
26
- end
27
- @artist = @Artist.load(:id=>2, :name=>'YJM')
28
- @artist.associations[:albums] = []
29
- @album = @Album.load(:id=>1, :name=>'RF')
30
- @album.artist = @artist
31
- @album.blah = 'Blah'
32
- end
33
-
34
- it "should round trip successfully" do
35
- @Artist.from_csv(@artist.to_csv).must_equal @artist
36
- @Album.from_csv(@album.to_csv).must_equal @album
37
- end
38
-
39
- it "should handle ruby objects in values" do
40
- @Artist.send(:define_method, :name=) do |v|
41
- super(Date.parse(v))
42
- end
43
- a = @Artist.load(:name=>Date.today)
44
- opts = {:columns=>[:name]}
45
- @Artist.from_csv(a.to_csv(opts), opts).must_equal a
46
- end
47
-
48
- it "should handle the :only option" do
49
- @Artist.from_csv(@artist.to_csv(:only=>:name), :only=>:name).must_equal @Artist.load(:name=>@artist.name)
50
- @Album.from_csv(@album.to_csv(:only=>[:id, :name]), :only=>[:id, :name]).must_equal @Album.load(:id=>@album.id, :name=>@album.name)
51
- end
52
-
53
- it "should handle the :except option" do
54
- @Artist.from_csv(@artist.to_csv(:except=>:id), :except=>:id).must_equal @Artist.load(:name=>@artist.name)
55
- @Album.from_csv(@album.to_csv(:except=>[:id, :artist_id]), :except=>[:id, :artist_id]).must_equal @Album.load(:name=>@album.name)
56
- end
57
-
58
- it "should handle the :include option for arbitrary attributes" do
59
- @Album.from_csv(@album.to_csv(:include=>:blah), :include=>:blah).blah.must_equal @album.blah
60
- end
61
-
62
- it "should handle multiple inclusions using an array for the :include option" do
63
- a = @Album.from_csv(@album.to_csv(:include=>[:blah]), :include=>:blah)
64
- a.blah.must_equal @album.blah
65
- end
66
-
67
- it "#from_csv should set column values" do
68
- @artist.from_csv('AS', :only=>:name)
69
- @artist.name.must_equal 'AS'
70
- @artist.id.must_equal 2
71
-
72
- @artist.from_csv('1', :only=>:id)
73
- @artist.name.must_equal 'AS'
74
- @artist.id.must_equal 1
75
- end
76
-
77
- it ".array_from_csv should support :headers to specify headers" do
78
- @albums = @Album.array_from_csv("AS,2\nDF,3", :headers=>['name', 'artist_id'])
79
- @albums.map(&:name).must_equal %w'AS DF'
80
- @albums.map(&:artist_id).must_equal [2, 3]
81
-
82
- @albums = @Album.array_from_csv("2,AS\n3,DF", :headers=>[nil, 'name'])
83
- @albums.map(&:name).must_equal %w'AS DF'
84
- @albums.map(&:artist_id).must_equal [nil, nil]
85
- end
86
-
87
- it ".from_csv should support :headers to specify headers" do
88
- @album = @Album.from_csv('AS,2', :headers=>['name', 'artist_id'])
89
- @album.name.must_equal 'AS'
90
- @album.artist_id.must_equal 2
91
-
92
- @album = @Album.from_csv('2,AS', :headers=>[nil, 'name'])
93
- @album.name.must_equal 'AS'
94
- @album.artist_id.must_be_nil
95
- end
96
-
97
- it "#from_csv should support :headers to specify headers" do
98
- @album.from_csv('AS,2', :headers=>['name'])
99
- @album.name.must_equal 'AS'
100
- @album.artist_id.must_equal 2
101
-
102
- @album.from_csv('2,AS', :headers=>[nil, 'name'])
103
- @album.name.must_equal 'AS'
104
- @album.artist_id.must_equal 2
105
- end
106
-
107
- it "should support a to_csv class and dataset method" do
108
- @Album.dataset = @Album.dataset.with_fetch(:id=>1, :name=>'RF', :artist_id=>2)
109
- @Artist.dataset = @Artist.dataset.with_fetch(:id=>2, :name=>'YJM')
110
- @Album.columns(:id, :name, :artist_id)
111
- @Album.db_schema.replace(:id=>{:type=>:integer}, :artist_id=>{:type=>:integer})
112
- @Album.array_from_csv(@Album.to_csv).must_equal [@album]
113
- @Album.array_from_csv(@Album.dataset.to_csv(:only=>:name), :only=>:name).must_equal [@Album.load(:name=>@album.name)]
114
- end
115
-
116
- it "should have dataset to_csv method respect :array option" do
117
- a = @Album.new(:id=>1, :name=>'RF', :artist_id=>3)
118
- @Album.array_from_csv(@Album.to_csv(:array=>[a])).must_equal [a]
119
- end
120
-
121
- it "#to_csv should respect class options" do
122
- @Album = Class.new(Sequel::Model(:albums))
123
- artist = @Artist
124
- @Album.class_eval do
125
- attr_accessor :blah
126
- plugin :csv_serializer, :except => :id, :write_headers=>true, :include=>:blah
127
- columns :id, :name, :artist_id
128
- many_to_one :artist, :class=>artist
129
- end
130
- @album = @Album.load(:id=>2, :name=>'JK')
131
- @album.artist = @artist
132
- @album.blah = 'Gak'
133
-
134
- @album.to_csv.must_equal "name,artist_id,blah\nJK,2,Gak\n"
135
- @album.to_csv(:write_headers=>false).must_equal "JK,2,Gak\n"
136
- @album.to_csv(:headers=>[:name]).must_equal "name\nJK\n"
137
- @album.to_csv(:headers=>[:name, :id]).must_equal "name,id\nJK,2\n"
138
- @album.to_csv(:only=>[:name]).must_equal "name,blah\nJK,Gak\n"
139
- @album.to_csv(:except=>nil).must_equal "id,name,artist_id,blah\n2,JK,2,Gak\n"
140
- @album.to_csv(:except=>[:blah]).must_equal "id,name,artist_id\n2,JK,2\n"
141
- end
142
-
143
- it "should store the default options in csv_serializer_opts" do
144
- @Album.csv_serializer_opts.must_equal({})
145
- c = Class.new(@Album)
146
- @Album.csv_serializer_opts[:include] = :blah
147
- c.plugin :csv_serializer, :naked=>false
148
- c.csv_serializer_opts.must_equal(:naked=>false)
149
- @Album.csv_serializer_opts.must_equal(:include=>:blah)
150
- end
151
-
152
- it "should work correctly when subclassing" do
153
- @Artist2 = Class.new(@Artist)
154
- @Artist2.plugin :csv_serializer, :only=>:name
155
- @Artist3 = Class.new(@Artist2)
156
- @Artist3.from_csv(@Artist3.load(:id=>2, :name=>'YYY').to_csv).must_equal @Artist3.load(:name=>'YYY')
157
- end
158
-
159
- it "should raise an error if attempting to set a restricted column and :all_columns is not used" do
160
- @Artist.restrict_primary_key
161
- proc{@Artist.from_csv(@artist.to_csv)}.must_raise(Sequel::MassAssignmentRestriction)
162
- end
163
-
164
- it "should use a dataset's selected columns" do
165
- columns = [:id]
166
- ds = @Artist.select(*columns).limit(1)
167
- ds.send(:columns=, columns)
168
- ds.with_fetch(:id => 10).to_csv(:write_headers => true).must_equal "id\n10\n"
169
- end
170
-
171
- it "should pass all the examples from the documentation" do
172
- @album.to_csv(:write_headers=>true).must_equal "id,name,artist_id\n1,RF,2\n"
173
- @album.to_csv(:only=>:name).must_equal "RF\n"
174
- @album.to_csv(:except=>[:id, :artist_id]).must_equal "RF\n"
175
- end
176
-
177
- it "should freeze csv serializier opts when model class is frozen" do
178
- @Album.csv_serializer_opts[:only] = [:id]
179
- @Album.freeze
180
- @Album.csv_serializer_opts.frozen?.must_equal true
181
- @Album.csv_serializer_opts[:only].frozen?.must_equal true
182
- end
183
- end
@@ -1,27 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "current_datetime_timestamp extension" do
4
- before do
5
- @ds = Sequel.mock[:table].extension(:current_datetime_timestamp)
6
- end
7
- after do
8
- Sequel.datetime_class = Time
9
- end
10
-
11
- it "should have current_timestamp respect Sequel.datetime_class" do
12
- t = Sequel::Dataset.new(nil).current_datetime
13
- t.must_be_kind_of(Time)
14
- (Time.now - t < 0.1).must_equal true
15
-
16
- Sequel.datetime_class = DateTime
17
- t = Sequel::Dataset.new(nil).current_datetime
18
- t.must_be_kind_of(DateTime)
19
- (DateTime.now - t < (0.1/86400)).must_equal true
20
- end
21
-
22
- it "should have current_timestamp value be literalized as CURRENT_TIMESTAMP" do
23
- @ds.literal(@ds.current_datetime).must_equal 'CURRENT_TIMESTAMP'
24
- Sequel.datetime_class = DateTime
25
- @ds.literal(@ds.current_datetime).must_equal 'CURRENT_TIMESTAMP'
26
- end
27
- end
@@ -1,365 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::DatasetAssociations" do
4
- before do
5
- @db = Sequel.mock(:host=>'postgres')
6
- @db.extend_datasets do
7
- def quote_identifiers?; false end
8
- def supports_window_functions?; true; end
9
- def supports_distinct_on?; true; end
10
- end
11
- @Base = Class.new(Sequel::Model)
12
- @Base.plugin :dataset_associations
13
-
14
- @Artist = Class.new(@Base)
15
- @Album = Class.new(@Base)
16
- @Tag = Class.new(@Base)
17
- @Track = Class.new(@Base)
18
-
19
- def @Artist.name; 'Artist' end
20
- def @Album.name; 'Album' end
21
- def @Tag.name; 'Tag' end
22
- def @Track.name; 'Track' end
23
-
24
- @Artist.dataset = @db[:artists]
25
- @Album.dataset = @db[:albums]
26
- @Tag.dataset = @db[:tags]
27
- @Track.dataset = @db[:tracks]
28
-
29
- @Artist.columns :id, :name
30
- @Album.columns :id, :name, :artist_id
31
- @Tag.columns :id, :name
32
-
33
- @Album.plugin :many_through_many
34
- @Artist.plugin :many_through_many
35
- @Track.plugin :many_through_many
36
- @Artist.plugin :pg_array_associations
37
- @Tag.plugin :pg_array_associations
38
- @Artist.one_to_many :albums, :class=>@Album
39
- @Artist.one_to_one :first_album, :class=>@Album
40
- @Album.many_to_one :artist, :class=>@Artist
41
- @Album.many_to_many :tags, :class=>@Tag
42
- @Album.many_through_many :mthm_tags, [[:albums_tags, :album_id, :tag_id]], :class=>@Tag
43
- @Album.one_through_one :first_tag, :class=>@Tag, :right_key=>:tag_id
44
- @Tag.many_to_many :albums, :class=>@Album
45
- @Artist.pg_array_to_many :artist_tags, :class=>@Tag, :key=>:tag_ids
46
- @Tag.many_to_pg_array :artists, :class=>@Artist
47
- @Artist.many_through_many :tags, [[:albums, :artist_id, :id], [:albums_tags, :album_id, :tag_id]], :class=>@Tag
48
- @Artist.one_through_many :otag, [[:albums, :artist_id, :id], [:albums_tags, :album_id, :tag_id]], :class=>@Tag
49
- @Track.many_through_many :artist_tracks, [[:albums, :id, :artist_id], [:albums, :artist_id, :id]], :class=>@Track, :left_primary_key=>:album_id, :right_primary_key=>:album_id
50
- end
51
-
52
- it "should work for many_to_one associations" do
53
- ds = @Album.artists
54
- ds.must_be_kind_of(Sequel::Dataset)
55
- ds.model.must_equal @Artist
56
- ds.sql.must_equal "SELECT * FROM artists WHERE (artists.id IN (SELECT albums.artist_id FROM albums))"
57
- end
58
-
59
- it "should work for one_to_many associations" do
60
- ds = @Artist.albums
61
- ds.must_be_kind_of(Sequel::Dataset)
62
- ds.model.must_equal @Album
63
- ds.sql.must_equal "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists))"
64
- end
65
-
66
- it "should work for one_to_one associations" do
67
- ds = @Artist.first_albums
68
- ds.must_be_kind_of(Sequel::Dataset)
69
- ds.model.must_equal @Album
70
- ds.sql.must_equal "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists))"
71
- end
72
-
73
- it "should work for many_to_many associations" do
74
- ds = @Album.tags
75
- ds.must_be_kind_of(Sequel::Dataset)
76
- ds.model.must_equal @Tag
77
- 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))))"
78
- end
79
-
80
- it "should work for one_through_one associations" do
81
- ds = @Album.first_tags
82
- ds.must_be_kind_of(Sequel::Dataset)
83
- ds.model.must_equal @Tag
84
- 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))))"
85
- end
86
-
87
- it "should work for many_through_many associations" do
88
- ds = @Artist.tags
89
- ds.must_be_kind_of(Sequel::Dataset)
90
- ds.model.must_equal @Tag
91
- 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))))"
92
- end
93
-
94
- it "should work for self referential many_through_many associations" do
95
- ds = @Track.artist_tracks
96
- ds.must_be_kind_of(Sequel::Dataset)
97
- ds.model.must_equal @Track
98
- ds.sql.must_equal "SELECT tracks.* FROM tracks WHERE (tracks.album_id IN (SELECT albums_0.id FROM tracks INNER JOIN albums ON (albums.id = tracks.album_id) INNER JOIN albums AS albums_0 ON (albums_0.artist_id = albums.artist_id) INNER JOIN tracks AS tracks_0 ON (tracks_0.album_id = albums_0.id) WHERE (albums.id IN (SELECT tracks.album_id FROM tracks))))"
99
- end
100
-
101
- it "should work for many_through_many associations with a single join table" do
102
- ds = @Album.mthm_tags
103
- ds.must_be_kind_of(Sequel::Dataset)
104
- ds.model.must_equal @Tag
105
- 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))))"
106
- end
107
-
108
- it "should work for one_through_many associations" do
109
- ds = @Artist.otags
110
- ds.must_be_kind_of(Sequel::Dataset)
111
- ds.model.must_equal @Tag
112
- 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))))"
113
- end
114
-
115
- it "should work for many_to_many associations with :dataset_association_join=>true" do
116
- @Album.many_to_many :tags, :clone=>:tags, :dataset_associations_join=>true, :select=>[Sequel.expr(:tags).*, Sequel[:albums_tags][:foo]]
117
- ds = @Album.tags
118
- ds.must_be_kind_of(Sequel::Dataset)
119
- ds.model.must_equal @Tag
120
- ds.sql.must_equal "SELECT tags.*, albums_tags.foo FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) 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))))"
121
- end
122
-
123
- it "should work for one_through_one associations with :dataset_association_join=>true" do
124
- @Album.one_through_one :first_tag, :clone=>:first_tag, :dataset_associations_join=>true, :select=>[Sequel.expr(:tags).*, Sequel[:albums_tags][:foo]]
125
- ds = @Album.first_tags
126
- ds.must_be_kind_of(Sequel::Dataset)
127
- ds.model.must_equal @Tag
128
- ds.sql.must_equal "SELECT tags.*, albums_tags.foo FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) 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))))"
129
- end
130
-
131
- it "should work for many_through_many associations with :dataset_association_join=>true" do
132
- @Artist.many_through_many :tags, :clone=>:tags, :dataset_associations_join=>true, :select=>[Sequel.expr(:tags).*, Sequel[:albums_tags][:foo]]
133
- ds = @Artist.tags
134
- ds.must_be_kind_of(Sequel::Dataset)
135
- ds.model.must_equal @Tag
136
- ds.sql.must_equal "SELECT tags.*, albums_tags.foo FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) 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))))"
137
- end
138
-
139
- it "should work for one_through_many associations with :dataset_association_join=>true" do
140
- @Artist.one_through_many :otag, :clone=>:otag, :dataset_associations_join=>true, :select=>[Sequel.expr(:tags).*, Sequel[:albums_tags][:foo]]
141
- ds = @Artist.otags
142
- ds.must_be_kind_of(Sequel::Dataset)
143
- ds.model.must_equal @Tag
144
- ds.sql.must_equal "SELECT tags.*, albums_tags.foo FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) 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))))"
145
- end
146
-
147
- it "should work for pg_array_to_many associations" do
148
- ds = @Artist.artist_tags
149
- ds.must_be_kind_of(Sequel::Dataset)
150
- ds.model.must_equal @Tag
151
- ds.sql.must_equal "SELECT * FROM tags WHERE (id IN (SELECT unnest(artists.tag_ids) FROM artists))"
152
- end
153
-
154
- it "should work for many_to_pg_array associations" do
155
- ds = @Tag.artists
156
- ds.must_be_kind_of(Sequel::Dataset)
157
- ds.model.must_equal @Artist
158
- ds.sql.must_equal "SELECT * FROM artists WHERE coalesce((tag_ids && (SELECT array_agg(tags.id) FROM tags)), false)"
159
- end
160
-
161
- it "should have an associated method that takes an association symbol" do
162
- ds = @Album.associated(:artist)
163
- ds.must_be_kind_of(Sequel::Dataset)
164
- ds.model.must_equal @Artist
165
- ds.sql.must_equal "SELECT * FROM artists WHERE (artists.id IN (SELECT albums.artist_id FROM albums))"
166
- end
167
-
168
- it "should raise an Error if an invalid association is given to associated" do
169
- proc{@Album.associated(:foo)}.must_raise(Sequel::Error)
170
- end
171
-
172
- it "should raise an Error if an unrecognized association type is used" do
173
- @Album.association_reflection(:artist)[:type] = :foo
174
- proc{@Album.artists}.must_raise(Sequel::Error)
175
- end
176
-
177
- it "should work correctly when chaining" do
178
- ds = @Artist.albums.tags
179
- ds.must_be_kind_of(Sequel::Dataset)
180
- ds.model.must_equal @Tag
181
- 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))))))"
182
- end
183
-
184
- it "should deal correctly with filters before the association method" do
185
- @Artist.filter(:id=>1).albums.sql.must_equal "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists WHERE (id = 1)))"
186
- end
187
-
188
- it "should deal correctly with filters after the association method" do
189
- @Artist.albums.filter(:id=>1).sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (id = 1))"
190
- end
191
-
192
- it "should deal correctly with block on the association" do
193
- @Artist.one_to_many :albums, :clone=>:albums do |ds| ds.filter(:id=>1..100) end
194
- @Artist.albums.sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (id >= 1) AND (id <= 100))"
195
- end
196
-
197
- it "should deal correctly with :conditions option on the association" do
198
- @Artist.one_to_many :albums, :clone=>:albums, :conditions=>{:id=>1..100}
199
- @Artist.albums.sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (id >= 1) AND (id <= 100))"
200
- end
201
-
202
- it "should deal correctly with :distinct option on the association" do
203
- @Artist.one_to_many :albums, :clone=>:albums, :distinct=>true
204
- @Artist.albums.sql.must_equal "SELECT DISTINCT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists))"
205
- end
206
-
207
- it "should deal correctly with :eager option on the association" do
208
- @Artist.one_to_many :albums, :clone=>:albums, :eager=>:tags
209
- @Artist.albums.opts[:eager].must_equal(:tags=>nil)
210
- end
211
-
212
- it "should deal correctly with :eager_block option on the association, ignoring the association block" do
213
- @Artist.one_to_many :albums, :clone=>:albums, :eager_block=>proc{|ds| ds.filter(:id=>1..100)} do |ds| ds.filter(:id=>2..200) end
214
- @Artist.albums.sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (id >= 1) AND (id <= 100))"
215
- end
216
-
217
- it "should deal correctly with :extend option on the association" do
218
- @Artist.one_to_many :albums, :clone=>:albums, :extend=>Module.new{def foo(x) filter(:id=>x) end}
219
- @Artist.albums.foo(1).sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id IN (SELECT artists.id FROM artists)) AND (id = 1))"
220
- end
221
-
222
- it "should deal correctly with :order option on the association" do
223
- @Artist.one_to_many :albums, :clone=>:albums, :order=>:name
224
- @Artist.albums.sql.must_equal "SELECT * FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists)) ORDER BY name"
225
- end
226
-
227
- it "should deal correctly with :select option on the association" do
228
- @Artist.one_to_many :albums, :clone=>:albums, :select=>[:id, :name]
229
- @Artist.albums.sql.must_equal "SELECT id, name FROM albums WHERE (albums.artist_id IN (SELECT artists.id FROM artists))"
230
- end
231
-
232
- it "should deal correctly with :order option for one_to_one associations" do
233
- @Artist.one_to_one :first_album, :clone=>:first_album, :order=>:name
234
- @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'
235
- end
236
-
237
- it "should deal correctly with :limit option for one_to_many associations" do
238
- @Artist.one_to_many :albums, :clone=>:albums, :limit=>10, :order=>:name
239
- @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'
240
- end
241
-
242
- it "should deal correctly with :order option for one_through_one associations" do
243
- @Album.one_through_one :first_tag, :clone=>:first_tag, :order=>Sequel[:tags][:name]
244
- @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'
245
- end
246
-
247
- it "should deal correctly with :limit option for many_to_many associations" do
248
- @Album.many_to_many :tags, :clone=>:tags, :limit=>10, :order=>Sequel[:tags][:name]
249
- @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'
250
- end
251
-
252
- it "should deal correctly with :order option for one_through_many associations" do
253
- @Artist.one_through_many :otag, :clone=>:otag, :order=>Sequel[:tags][:name]
254
- @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'
255
- end
256
-
257
- it "should deal correctly with :limit option for many_through_many associations" do
258
- @Artist.many_through_many :tags, :clone=>:tags, :limit=>10, :order=>Sequel[:tags][:name]
259
- @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'
260
- end
261
- end
262
-
263
- describe "Sequel::Plugins::DatasetAssociations with composite keys" do
264
- before do
265
- @db = Sequel.mock
266
- @db.extend_datasets do
267
- def supports_window_functions?; true; end
268
- def supports_distinct_on?; true; end
269
- end
270
- @Base = Class.new(Sequel::Model)
271
- @Base.plugin :dataset_associations
272
-
273
- @Artist = Class.new(@Base)
274
- @Album = Class.new(@Base)
275
- @Tag = Class.new(@Base)
276
-
277
- def @Artist.name; 'Artist' end
278
- def @Album.name; 'Album' end
279
- def @Tag.name; 'Tag' end
280
-
281
- @Artist.dataset = @db[:artists]
282
- @Album.dataset = @db[:albums]
283
- @Tag.dataset = @db[:tags]
284
-
285
- @Artist.set_primary_key([:id1, :id2])
286
- @Album.set_primary_key([:id1, :id2])
287
- @Tag.set_primary_key([:id1, :id2])
288
-
289
- @Artist.columns :id1, :id2, :name
290
- @Album.columns :id1, :id2, :name, :artist_id1, :artist_id2
291
- @Tag.columns :id1, :id2, :name
292
-
293
- @Artist.plugin :many_through_many
294
- @Artist.one_to_many :albums, :class=>@Album, :key=>[:artist_id1, :artist_id2]
295
- @Artist.one_to_one :first_album, :class=>@Album, :key=>[:artist_id1, :artist_id2]
296
- @Album.many_to_one :artist, :class=>@Artist, :key=>[:artist_id1, :artist_id2]
297
- @Album.many_to_many :tags, :class=>@Tag, :left_key=>[:album_id1, :album_id2], :right_key=>[:tag_id1, :tag_id2]
298
- @Album.one_through_one :first_tag, :class=>@Tag, :left_key=>[:album_id1, :album_id2], :right_key=>[:tag_id1, :tag_id2]
299
- @Tag.many_to_many :albums, :class=>@Album, :right_key=>[:album_id1, :album_id2], :left_key=>[:tag_id1, :tag_id2]
300
- @Artist.many_through_many :tags, [[:albums, [:artist_id1, :artist_id2], [:id1, :id2]], [:albums_tags, [:album_id1, :album_id2], [:tag_id1, :tag_id2]]], :class=>@Tag
301
- @Artist.one_through_many :otag, [[:albums, [:artist_id1, :artist_id2], [:id1, :id2]], [:albums_tags, [:album_id1, :album_id2], [:tag_id1, :tag_id2]]], :class=>@Tag
302
- end
303
-
304
- it "should work for many_to_one associations" do
305
- @Album.artists.sql.must_equal "SELECT * FROM artists WHERE ((artists.id1, artists.id2) IN (SELECT albums.artist_id1, albums.artist_id2 FROM albums))"
306
- end
307
-
308
- it "should work for one_to_many associations" do
309
- @Artist.albums.sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists))"
310
- end
311
-
312
- it "should work for one_to_one associations" do
313
- @Artist.first_albums.sql.must_equal "SELECT * FROM albums WHERE ((albums.artist_id1, albums.artist_id2) IN (SELECT artists.id1, artists.id2 FROM artists))"
314
- end
315
-
316
- it "should work for many_to_many associations" do
317
- @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))))"
318
- end
319
-
320
- it "should work for one_through_one associations" do
321
- @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))))"
322
- end
323
-
324
- it "should work for many_through_many associations" do
325
- @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))))"
326
- end
327
-
328
- it "should work for one_through_many associations" do
329
- @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))))"
330
- end
331
-
332
- it "should work correctly when chaining" do
333
- @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))))))"
334
- end
335
-
336
- it "should deal correctly with :order option for one_to_one associations" do
337
- @Artist.one_to_one :first_album, :clone=>:first_album, :order=>:name
338
- @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'
339
- end
340
-
341
- it "should deal correctly with :limit option for one_to_many associations" do
342
- @Artist.one_to_many :albums, :clone=>:albums, :limit=>10, :order=>:name
343
- @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'
344
- end
345
-
346
- it "should deal correctly with :order option for one_through_one associations" do
347
- @Album.one_through_one :first_tag, :clone=>:first_tag, :order=>Sequel[:tags][:name]
348
- @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'
349
- end
350
-
351
- it "should deal correctly with :limit option for many_to_many associations" do
352
- @Album.many_to_many :tags, :clone=>:tags, :limit=>10, :order=>Sequel[:tags][:name]
353
- @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'
354
- end
355
-
356
- it "should deal correctly with :order option for one_through_many associations" do
357
- @Artist.one_through_many :otag, :clone=>:otag, :order=>Sequel[:tags][:name]
358
- @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'
359
- end
360
-
361
- it "should deal correctly with :limit option for many_through_many associations" do
362
- @Artist.many_through_many :tags, :clone=>:tags, :limit=>10, :order=>Sequel[:tags][:name]
363
- @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'
364
- end
365
- end