sequel 5.20.0 → 5.49.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 (511) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +398 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +80 -16
  7. data/doc/cheat_sheet.rdoc +6 -5
  8. data/doc/code_order.rdoc +10 -12
  9. data/doc/dataset_filtering.rdoc +17 -2
  10. data/doc/fork_safety.rdoc +84 -0
  11. data/doc/migration.rdoc +11 -5
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +10 -2
  15. data/doc/postgresql.rdoc +82 -3
  16. data/doc/querying.rdoc +4 -4
  17. data/doc/release_notes/5.21.0.txt +87 -0
  18. data/doc/release_notes/5.22.0.txt +48 -0
  19. data/doc/release_notes/5.23.0.txt +56 -0
  20. data/doc/release_notes/5.24.0.txt +56 -0
  21. data/doc/release_notes/5.25.0.txt +32 -0
  22. data/doc/release_notes/5.26.0.txt +35 -0
  23. data/doc/release_notes/5.27.0.txt +21 -0
  24. data/doc/release_notes/5.28.0.txt +16 -0
  25. data/doc/release_notes/5.29.0.txt +22 -0
  26. data/doc/release_notes/5.30.0.txt +20 -0
  27. data/doc/release_notes/5.31.0.txt +148 -0
  28. data/doc/release_notes/5.32.0.txt +46 -0
  29. data/doc/release_notes/5.33.0.txt +24 -0
  30. data/doc/release_notes/5.34.0.txt +40 -0
  31. data/doc/release_notes/5.35.0.txt +56 -0
  32. data/doc/release_notes/5.36.0.txt +60 -0
  33. data/doc/release_notes/5.37.0.txt +30 -0
  34. data/doc/release_notes/5.38.0.txt +28 -0
  35. data/doc/release_notes/5.39.0.txt +19 -0
  36. data/doc/release_notes/5.40.0.txt +40 -0
  37. data/doc/release_notes/5.41.0.txt +25 -0
  38. data/doc/release_notes/5.42.0.txt +136 -0
  39. data/doc/release_notes/5.43.0.txt +98 -0
  40. data/doc/release_notes/5.44.0.txt +32 -0
  41. data/doc/release_notes/5.45.0.txt +34 -0
  42. data/doc/release_notes/5.46.0.txt +87 -0
  43. data/doc/release_notes/5.47.0.txt +59 -0
  44. data/doc/release_notes/5.48.0.txt +14 -0
  45. data/doc/release_notes/5.49.0.txt +59 -0
  46. data/doc/sharding.rdoc +2 -0
  47. data/doc/sql.rdoc +13 -1
  48. data/doc/testing.rdoc +20 -7
  49. data/doc/transactions.rdoc +0 -8
  50. data/doc/validations.rdoc +1 -1
  51. data/doc/virtual_rows.rdoc +1 -1
  52. data/lib/sequel/adapters/ado/access.rb +1 -1
  53. data/lib/sequel/adapters/ado.rb +43 -35
  54. data/lib/sequel/adapters/ibmdb.rb +2 -2
  55. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  56. data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
  57. data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
  58. data/lib/sequel/adapters/jdbc.rb +24 -6
  59. data/lib/sequel/adapters/mysql.rb +1 -1
  60. data/lib/sequel/adapters/mysql2.rb +2 -3
  61. data/lib/sequel/adapters/odbc.rb +8 -6
  62. data/lib/sequel/adapters/oracle.rb +5 -4
  63. data/lib/sequel/adapters/postgres.rb +15 -9
  64. data/lib/sequel/adapters/shared/access.rb +6 -6
  65. data/lib/sequel/adapters/shared/mssql.rb +66 -21
  66. data/lib/sequel/adapters/shared/mysql.rb +27 -10
  67. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  68. data/lib/sequel/adapters/shared/postgres.rb +271 -32
  69. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  70. data/lib/sequel/adapters/shared/sqlite.rb +161 -19
  71. data/lib/sequel/adapters/sqlanywhere.rb +1 -1
  72. data/lib/sequel/adapters/sqlite.rb +1 -1
  73. data/lib/sequel/adapters/tinytds.rb +15 -2
  74. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
  75. data/lib/sequel/ast_transformer.rb +6 -0
  76. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  77. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  78. data/lib/sequel/connection_pool/single.rb +1 -1
  79. data/lib/sequel/connection_pool/threaded.rb +2 -2
  80. data/lib/sequel/core.rb +333 -319
  81. data/lib/sequel/database/connecting.rb +3 -4
  82. data/lib/sequel/database/logging.rb +7 -1
  83. data/lib/sequel/database/misc.rb +31 -12
  84. data/lib/sequel/database/query.rb +3 -1
  85. data/lib/sequel/database/schema_generator.rb +53 -51
  86. data/lib/sequel/database/schema_methods.rb +38 -23
  87. data/lib/sequel/database/transactions.rb +17 -18
  88. data/lib/sequel/dataset/actions.rb +14 -9
  89. data/lib/sequel/dataset/features.rb +16 -0
  90. data/lib/sequel/dataset/misc.rb +2 -2
  91. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  92. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  93. data/lib/sequel/dataset/query.rb +26 -9
  94. data/lib/sequel/dataset/sql.rb +76 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/deprecated.rb +3 -1
  97. data/lib/sequel/exceptions.rb +2 -0
  98. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  99. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  100. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  101. data/lib/sequel/extensions/blank.rb +8 -0
  102. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  103. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  104. data/lib/sequel/extensions/connection_validator.rb +2 -2
  105. data/lib/sequel/extensions/core_refinements.rb +2 -0
  106. data/lib/sequel/extensions/date_arithmetic.rb +36 -24
  107. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
  108. data/lib/sequel/extensions/eval_inspect.rb +2 -0
  109. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  110. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  111. data/lib/sequel/extensions/index_caching.rb +9 -7
  112. data/lib/sequel/extensions/inflector.rb +9 -1
  113. data/lib/sequel/extensions/integer64.rb +2 -0
  114. data/lib/sequel/extensions/migration.rb +11 -3
  115. data/lib/sequel/extensions/named_timezones.rb +56 -8
  116. data/lib/sequel/extensions/pagination.rb +1 -1
  117. data/lib/sequel/extensions/pg_array.rb +5 -0
  118. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  119. data/lib/sequel/extensions/pg_enum.rb +11 -3
  120. data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
  121. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  122. data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
  123. data/lib/sequel/extensions/pg_inet.rb +15 -5
  124. data/lib/sequel/extensions/pg_interval.rb +36 -8
  125. data/lib/sequel/extensions/pg_json.rb +387 -123
  126. data/lib/sequel/extensions/pg_json_ops.rb +238 -0
  127. data/lib/sequel/extensions/pg_loose_count.rb +3 -1
  128. data/lib/sequel/extensions/pg_range.rb +17 -9
  129. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  130. data/lib/sequel/extensions/pg_row.rb +4 -2
  131. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  132. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  133. data/lib/sequel/extensions/query.rb +3 -0
  134. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  135. data/lib/sequel/extensions/s.rb +2 -0
  136. data/lib/sequel/extensions/schema_dumper.rb +24 -7
  137. data/lib/sequel/extensions/server_block.rb +18 -7
  138. data/lib/sequel/extensions/sql_comments.rb +2 -2
  139. data/lib/sequel/extensions/string_agg.rb +1 -1
  140. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  141. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  142. data/lib/sequel/extensions/to_dot.rb +9 -3
  143. data/lib/sequel/model/associations.rb +356 -117
  144. data/lib/sequel/model/base.rb +107 -68
  145. data/lib/sequel/model/errors.rb +10 -1
  146. data/lib/sequel/model/inflections.rb +1 -1
  147. data/lib/sequel/model/plugins.rb +9 -3
  148. data/lib/sequel/model.rb +3 -1
  149. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  150. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  151. data/lib/sequel/plugins/association_pks.rb +60 -18
  152. data/lib/sequel/plugins/association_proxies.rb +8 -2
  153. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  154. data/lib/sequel/plugins/auto_validations.rb +39 -5
  155. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  156. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  157. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  158. data/lib/sequel/plugins/caching.rb +3 -0
  159. data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
  160. data/lib/sequel/plugins/column_encryption.rb +728 -0
  161. data/lib/sequel/plugins/composition.rb +7 -2
  162. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  163. data/lib/sequel/plugins/constraint_validations.rb +2 -1
  164. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  165. data/lib/sequel/plugins/dataset_associations.rb +4 -1
  166. data/lib/sequel/plugins/dirty.rb +60 -22
  167. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  168. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  169. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  170. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  171. data/lib/sequel/plugins/json_serializer.rb +57 -35
  172. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  173. data/lib/sequel/plugins/many_through_many.rb +108 -9
  174. data/lib/sequel/plugins/nested_attributes.rb +15 -3
  175. data/lib/sequel/plugins/pg_array_associations.rb +58 -41
  176. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
  177. data/lib/sequel/plugins/prepared_statements.rb +15 -12
  178. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  179. data/lib/sequel/plugins/rcte_tree.rb +43 -35
  180. data/lib/sequel/plugins/serialization.rb +8 -3
  181. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  182. data/lib/sequel/plugins/sharding.rb +11 -5
  183. data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
  184. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  185. data/lib/sequel/plugins/static_cache.rb +9 -4
  186. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  187. data/lib/sequel/plugins/string_stripper.rb +1 -1
  188. data/lib/sequel/plugins/subclasses.rb +2 -0
  189. data/lib/sequel/plugins/throw_failures.rb +1 -1
  190. data/lib/sequel/plugins/timestamps.rb +1 -1
  191. data/lib/sequel/plugins/tree.rb +9 -4
  192. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  193. data/lib/sequel/plugins/unused_associations.rb +521 -0
  194. data/lib/sequel/plugins/update_or_create.rb +1 -1
  195. data/lib/sequel/plugins/validation_class_methods.rb +5 -1
  196. data/lib/sequel/plugins/validation_helpers.rb +18 -11
  197. data/lib/sequel/plugins/xml_serializer.rb +1 -1
  198. data/lib/sequel/sql.rb +20 -5
  199. data/lib/sequel/timezones.rb +63 -17
  200. data/lib/sequel/version.rb +1 -1
  201. metadata +113 -381
  202. data/Rakefile +0 -151
  203. data/doc/release_notes/4.0.0.txt +0 -262
  204. data/doc/release_notes/4.1.0.txt +0 -85
  205. data/doc/release_notes/4.10.0.txt +0 -226
  206. data/doc/release_notes/4.11.0.txt +0 -147
  207. data/doc/release_notes/4.12.0.txt +0 -105
  208. data/doc/release_notes/4.13.0.txt +0 -169
  209. data/doc/release_notes/4.14.0.txt +0 -68
  210. data/doc/release_notes/4.15.0.txt +0 -56
  211. data/doc/release_notes/4.16.0.txt +0 -36
  212. data/doc/release_notes/4.17.0.txt +0 -38
  213. data/doc/release_notes/4.18.0.txt +0 -36
  214. data/doc/release_notes/4.19.0.txt +0 -45
  215. data/doc/release_notes/4.2.0.txt +0 -129
  216. data/doc/release_notes/4.20.0.txt +0 -79
  217. data/doc/release_notes/4.21.0.txt +0 -94
  218. data/doc/release_notes/4.22.0.txt +0 -72
  219. data/doc/release_notes/4.23.0.txt +0 -65
  220. data/doc/release_notes/4.24.0.txt +0 -99
  221. data/doc/release_notes/4.25.0.txt +0 -181
  222. data/doc/release_notes/4.26.0.txt +0 -44
  223. data/doc/release_notes/4.27.0.txt +0 -78
  224. data/doc/release_notes/4.28.0.txt +0 -57
  225. data/doc/release_notes/4.29.0.txt +0 -41
  226. data/doc/release_notes/4.3.0.txt +0 -40
  227. data/doc/release_notes/4.30.0.txt +0 -37
  228. data/doc/release_notes/4.31.0.txt +0 -57
  229. data/doc/release_notes/4.32.0.txt +0 -132
  230. data/doc/release_notes/4.33.0.txt +0 -88
  231. data/doc/release_notes/4.34.0.txt +0 -86
  232. data/doc/release_notes/4.35.0.txt +0 -130
  233. data/doc/release_notes/4.36.0.txt +0 -116
  234. data/doc/release_notes/4.37.0.txt +0 -50
  235. data/doc/release_notes/4.38.0.txt +0 -67
  236. data/doc/release_notes/4.39.0.txt +0 -127
  237. data/doc/release_notes/4.4.0.txt +0 -92
  238. data/doc/release_notes/4.40.0.txt +0 -179
  239. data/doc/release_notes/4.41.0.txt +0 -77
  240. data/doc/release_notes/4.42.0.txt +0 -221
  241. data/doc/release_notes/4.43.0.txt +0 -87
  242. data/doc/release_notes/4.44.0.txt +0 -125
  243. data/doc/release_notes/4.45.0.txt +0 -370
  244. data/doc/release_notes/4.46.0.txt +0 -404
  245. data/doc/release_notes/4.47.0.txt +0 -56
  246. data/doc/release_notes/4.48.0.txt +0 -293
  247. data/doc/release_notes/4.49.0.txt +0 -222
  248. data/doc/release_notes/4.5.0.txt +0 -34
  249. data/doc/release_notes/4.6.0.txt +0 -30
  250. data/doc/release_notes/4.7.0.txt +0 -103
  251. data/doc/release_notes/4.8.0.txt +0 -175
  252. data/doc/release_notes/4.9.0.txt +0 -190
  253. data/spec/adapter_spec.rb +0 -4
  254. data/spec/adapters/db2_spec.rb +0 -170
  255. data/spec/adapters/mssql_spec.rb +0 -804
  256. data/spec/adapters/mysql_spec.rb +0 -1065
  257. data/spec/adapters/oracle_spec.rb +0 -371
  258. data/spec/adapters/postgres_spec.rb +0 -4125
  259. data/spec/adapters/spec_helper.rb +0 -44
  260. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  261. data/spec/adapters/sqlite_spec.rb +0 -652
  262. data/spec/bin_spec.rb +0 -278
  263. data/spec/core/connection_pool_spec.rb +0 -1250
  264. data/spec/core/database_spec.rb +0 -2865
  265. data/spec/core/dataset_spec.rb +0 -5515
  266. data/spec/core/deprecated_spec.rb +0 -70
  267. data/spec/core/expression_filters_spec.rb +0 -1455
  268. data/spec/core/mock_adapter_spec.rb +0 -722
  269. data/spec/core/object_graph_spec.rb +0 -336
  270. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  271. data/spec/core/schema_generator_spec.rb +0 -214
  272. data/spec/core/schema_spec.rb +0 -1826
  273. data/spec/core/spec_helper.rb +0 -24
  274. data/spec/core/version_spec.rb +0 -14
  275. data/spec/core_extensions_spec.rb +0 -763
  276. data/spec/core_model_spec.rb +0 -2
  277. data/spec/core_spec.rb +0 -1
  278. data/spec/deprecation_helper.rb +0 -30
  279. data/spec/extensions/accessed_columns_spec.rb +0 -51
  280. data/spec/extensions/active_model_spec.rb +0 -99
  281. data/spec/extensions/after_initialize_spec.rb +0 -28
  282. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  283. data/spec/extensions/association_dependencies_spec.rb +0 -125
  284. data/spec/extensions/association_pks_spec.rb +0 -423
  285. data/spec/extensions/association_proxies_spec.rb +0 -100
  286. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  287. data/spec/extensions/auto_validations_spec.rb +0 -229
  288. data/spec/extensions/blacklist_security_spec.rb +0 -95
  289. data/spec/extensions/blank_spec.rb +0 -69
  290. data/spec/extensions/boolean_readers_spec.rb +0 -93
  291. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  292. data/spec/extensions/caching_spec.rb +0 -273
  293. data/spec/extensions/caller_logging_spec.rb +0 -52
  294. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  295. data/spec/extensions/column_conflicts_spec.rb +0 -75
  296. data/spec/extensions/column_select_spec.rb +0 -129
  297. data/spec/extensions/columns_introspection_spec.rb +0 -90
  298. data/spec/extensions/columns_updated_spec.rb +0 -35
  299. data/spec/extensions/composition_spec.rb +0 -248
  300. data/spec/extensions/connection_expiration_spec.rb +0 -151
  301. data/spec/extensions/connection_validator_spec.rb +0 -144
  302. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  303. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  304. data/spec/extensions/constraint_validations_spec.rb +0 -439
  305. data/spec/extensions/core_refinements_spec.rb +0 -528
  306. data/spec/extensions/csv_serializer_spec.rb +0 -183
  307. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  308. data/spec/extensions/dataset_associations_spec.rb +0 -365
  309. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  310. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  311. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  312. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  313. data/spec/extensions/defaults_setter_spec.rb +0 -150
  314. data/spec/extensions/delay_add_association_spec.rb +0 -73
  315. data/spec/extensions/dirty_spec.rb +0 -189
  316. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  317. data/spec/extensions/eager_each_spec.rb +0 -62
  318. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  319. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  320. data/spec/extensions/error_splitter_spec.rb +0 -18
  321. data/spec/extensions/error_sql_spec.rb +0 -20
  322. data/spec/extensions/escaped_like_spec.rb +0 -40
  323. data/spec/extensions/eval_inspect_spec.rb +0 -81
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -291
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -864
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -111
  348. data/spec/extensions/nested_attributes_spec.rb +0 -767
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
  356. data/spec/extensions/pg_enum_spec.rb +0 -118
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -519
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -177
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -870
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -63
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -471
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/throw_failures_spec.rb +0 -74
  411. data/spec/extensions/timestamps_spec.rb +0 -209
  412. data/spec/extensions/to_dot_spec.rb +0 -153
  413. data/spec/extensions/touch_spec.rb +0 -226
  414. data/spec/extensions/tree_spec.rb +0 -334
  415. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  416. data/spec/extensions/unlimited_update_spec.rb +0 -21
  417. data/spec/extensions/update_or_create_spec.rb +0 -83
  418. data/spec/extensions/update_primary_key_spec.rb +0 -105
  419. data/spec/extensions/update_refresh_spec.rb +0 -59
  420. data/spec/extensions/uuid_spec.rb +0 -101
  421. data/spec/extensions/validate_associated_spec.rb +0 -52
  422. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  423. data/spec/extensions/validation_contexts_spec.rb +0 -31
  424. data/spec/extensions/validation_helpers_spec.rb +0 -525
  425. data/spec/extensions/whitelist_security_spec.rb +0 -157
  426. data/spec/extensions/xml_serializer_spec.rb +0 -213
  427. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  428. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  429. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  431. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  432. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  433. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  434. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  436. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  437. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  438. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  439. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  440. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  441. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  443. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  444. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  446. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  447. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  448. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  449. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  450. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  451. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  452. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  453. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  457. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  458. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  459. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  460. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  461. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  462. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  466. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  468. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  469. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  471. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  473. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  474. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  475. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  476. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  478. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  479. data/spec/guards_helper.rb +0 -59
  480. data/spec/integration/associations_test.rb +0 -2597
  481. data/spec/integration/database_test.rb +0 -113
  482. data/spec/integration/dataset_test.rb +0 -1981
  483. data/spec/integration/eager_loader_test.rb +0 -687
  484. data/spec/integration/migrator_test.rb +0 -262
  485. data/spec/integration/model_test.rb +0 -203
  486. data/spec/integration/plugin_test.rb +0 -2396
  487. data/spec/integration/prepared_statement_test.rb +0 -405
  488. data/spec/integration/schema_test.rb +0 -889
  489. data/spec/integration/spec_helper.rb +0 -65
  490. data/spec/integration/timezone_test.rb +0 -86
  491. data/spec/integration/transaction_test.rb +0 -603
  492. data/spec/integration/type_test.rb +0 -127
  493. data/spec/model/association_reflection_spec.rb +0 -803
  494. data/spec/model/associations_spec.rb +0 -4738
  495. data/spec/model/base_spec.rb +0 -875
  496. data/spec/model/class_dataset_methods_spec.rb +0 -146
  497. data/spec/model/dataset_methods_spec.rb +0 -198
  498. data/spec/model/eager_loading_spec.rb +0 -2377
  499. data/spec/model/hooks_spec.rb +0 -370
  500. data/spec/model/inflector_spec.rb +0 -26
  501. data/spec/model/model_spec.rb +0 -956
  502. data/spec/model/plugins_spec.rb +0 -429
  503. data/spec/model/record_spec.rb +0 -2118
  504. data/spec/model/spec_helper.rb +0 -46
  505. data/spec/model/validations_spec.rb +0 -220
  506. data/spec/model_no_assoc_spec.rb +0 -1
  507. data/spec/model_spec.rb +0 -1
  508. data/spec/plugin_spec.rb +0 -1
  509. data/spec/sequel_coverage.rb +0 -15
  510. data/spec/sequel_warning.rb +0 -4
  511. data/spec/spec_config.rb +0 -12
@@ -1,803 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe Sequel::Model::Associations::AssociationReflection, "#associated_class" do
4
- before do
5
- @c = Class.new(Sequel::Model(:foo))
6
- class ::ParParent < Sequel::Model; end
7
- end
8
- after do
9
- Object.send(:remove_const, :ParParent)
10
- end
11
-
12
- it "should use the :class value if present" do
13
- @c.many_to_one :c, :class=>ParParent
14
- @c.association_reflection(:c).keys.must_include(:class)
15
- @c.association_reflection(:c).associated_class.must_equal ParParent
16
- end
17
-
18
- it "should use the :class value if present" do
19
- @c.many_to_one :c, :class=>@c
20
- @c.one_to_many :cs, :class=>@c
21
- c = @c.association_reflection(:c)
22
- cs = @c.association_reflection(:cs)
23
-
24
- c.association_method.must_equal :c
25
- c.dataset_method.must_equal :c_dataset
26
- c.setter_method.must_equal :c=
27
- c._setter_method.must_equal :_c=
28
-
29
- cs.association_method.must_equal :cs
30
- cs.dataset_method.must_equal :cs_dataset
31
- cs.add_method.must_equal :add_c
32
- cs._add_method.must_equal :_add_c
33
- cs.remove_method.must_equal :remove_c
34
- cs._remove_method.must_equal :_remove_c
35
- cs.remove_all_method.must_equal :remove_all_cs
36
- cs._remove_all_method.must_equal :_remove_all_cs
37
- end
38
-
39
- it "should have inspect include association class and representation of association definition " do
40
- ParParent.many_to_one :c
41
- ParParent.association_reflection(:c).inspect.must_equal "#<Sequel::Model::Associations::ManyToOneAssociationReflection ParParent.many_to_one :c>"
42
- ParParent.many_to_one :c, :class=>ParParent
43
- ParParent.association_reflection(:c).inspect.must_equal "#<Sequel::Model::Associations::ManyToOneAssociationReflection ParParent.many_to_one :c, :class=>ParParent>"
44
- ParParent.many_to_one :c, :class=>ParParent, :key=>:c_id
45
- ParParent.association_reflection(:c).inspect.must_equal "#<Sequel::Model::Associations::ManyToOneAssociationReflection ParParent.many_to_one :c, :key=>:c_id, :class=>ParParent>"
46
-
47
- @c.one_to_many :foos do |ds| ds end
48
- @c.association_reflection(:foos).inspect.must_equal "#<Sequel::Model::Associations::OneToManyAssociationReflection #{@c.to_s}.one_to_many :foos, :block=>#{@c.association_reflection(:foos)[:block].inspect}>"
49
- end
50
-
51
- it "should figure out the class if the :class value is not present" do
52
- @c.many_to_one :c, :class=>'ParParent'
53
- @c.association_reflection(:c).keys.wont_include(:class)
54
- @c.association_reflection(:c).associated_class.must_equal ParParent
55
- end
56
-
57
- it "should respect :class_namespace option for specifying the namespace" do
58
- class ::ParParent
59
- class ParParent < Sequel::Model; end
60
- end
61
- ParParent.many_to_one :par_parent, :class=>'ParParent'
62
- ParParent.association_reflection(:par_parent).associated_class.must_equal ParParent
63
- ParParent.many_to_one :par_parent, :class=>'ParParent', :class_namespace=>'ParParent'
64
- ParParent.association_reflection(:par_parent).associated_class.must_equal ParParent::ParParent
65
- end
66
-
67
- it "should include association inspect output if an exception would be raised" do
68
- r = @c.many_to_one(:c)
69
-
70
- begin
71
- r.associated_class
72
- rescue NameError => e
73
- end
74
-
75
- e.message.must_include r.inspect
76
- end
77
- end
78
-
79
- describe Sequel::Model::Associations::AssociationReflection, "#primary_key" do
80
- before do
81
- @c = Class.new(Sequel::Model(:foo))
82
- class ::ParParent < Sequel::Model; end
83
- end
84
- after do
85
- Object.send(:remove_const, :ParParent)
86
- end
87
-
88
- it "should use the :primary_key value if present" do
89
- @c.many_to_one :c, :class=>ParParent, :primary_key=>:blah__blah
90
- @c.association_reflection(:c).keys.must_include(:primary_key)
91
- @c.association_reflection(:c).primary_key.must_equal :blah__blah
92
- end
93
-
94
- it "should use the associated table's primary key if :primary_key is not present" do
95
- @c.many_to_one :c, :class=>'ParParent'
96
- @c.association_reflection(:c).keys.wont_include(:primary_key)
97
- @c.association_reflection(:c).primary_key.must_equal :id
98
- end
99
- end
100
-
101
- describe Sequel::Model::Associations::AssociationReflection, "#reciprocal_type" do
102
- it "should include a specific type if only one matches" do
103
- c = Class.new(Sequel::Model(:a))
104
- c.one_to_many :cs, :class=>c, :key=>:c_id
105
- c.many_to_one :c, :class=>c, :key=>:c_id
106
- c.association_reflection(:c).send(:reciprocal_type).must_equal :one_to_many
107
- end
108
- end
109
-
110
- describe Sequel::Model::Associations::AssociationReflection, "#reciprocal" do
111
- before do
112
- class ::ParParent < Sequel::Model; end
113
- class ::ParParentTwo < Sequel::Model; end
114
- class ::ParParentThree < Sequel::Model; end
115
- end
116
- after do
117
- Object.send(:remove_const, :ParParent)
118
- Object.send(:remove_const, :ParParentTwo)
119
- Object.send(:remove_const, :ParParentThree)
120
- end
121
-
122
- it "should use the :reciprocal value if present" do
123
- @c = Class.new(Sequel::Model(:foo))
124
- @d = Class.new(Sequel::Model(:foo))
125
- @c.many_to_one :c, :class=>@d, :reciprocal=>:xx
126
- @c.association_reflection(:c).keys.must_include(:reciprocal)
127
- @c.association_reflection(:c).reciprocal.must_equal :xx
128
- end
129
-
130
- it "should not raise an error if some reciprocal associations have invalid associated classes" do
131
- @c = Class.new(Sequel::Model(:foo))
132
- @c.one_to_many :sadfakloasdfioas
133
- @c.many_to_one :c, :class=>@c
134
- @c.association_reflection(:c).reciprocal
135
- end
136
-
137
- it "should require the associated class is the current class to be a reciprocal" do
138
- ParParent.many_to_one :par_parent_two, :key=>:blah
139
- ParParent.many_to_one :par_parent_three, :key=>:blah
140
- ParParentTwo.one_to_many :par_parents, :key=>:blah
141
- ParParentThree.one_to_many :par_parents, :key=>:blah
142
-
143
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
144
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_three
145
-
146
- ParParent.many_to_many :par_parent_twos, :left_key=>:l, :right_key=>:r, :join_table=>:jt
147
- ParParent.many_to_many :par_parent_threes, :left_key=>:l, :right_key=>:r, :join_table=>:jt
148
- ParParentTwo.many_to_many :par_parents, :right_key=>:l, :left_key=>:r, :join_table=>:jt
149
- ParParentThree.many_to_many :par_parents, :right_key=>:l, :left_key=>:r, :join_table=>:jt
150
-
151
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_twos
152
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
153
- end
154
-
155
- it "should handle composite keys" do
156
- ParParent.many_to_one :par_parent_two, :key=>[:a, :b], :primary_key=>[:c, :b]
157
- ParParent.many_to_one :par_parent_three, :key=>[:d, :e], :primary_key=>[:c, :b]
158
- ParParentTwo.one_to_many :par_parents, :primary_key=>[:c, :b], :key=>[:a, :b]
159
- ParParentThree.one_to_many :par_parents, :primary_key=>[:c, :b], :key=>[:d, :e]
160
-
161
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
162
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_three
163
-
164
- ParParent.many_to_many :par_parent_twos, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :left_primary_key=>[:pl1, :pl2], :right_primary_key=>[:pr1, :pr2], :join_table=>:jt
165
- ParParent.many_to_many :par_parent_threes, :right_key=>[:l1, :l2], :left_key=>[:r1, :r2], :left_primary_key=>[:pl1, :pl2], :right_primary_key=>[:pr1, :pr2], :join_table=>:jt
166
- ParParentTwo.many_to_many :par_parents, :right_key=>[:l1, :l2], :left_key=>[:r1, :r2], :right_primary_key=>[:pl1, :pl2], :left_primary_key=>[:pr1, :pr2], :join_table=>:jt
167
- ParParentThree.many_to_many :par_parents, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :right_primary_key=>[:pl1, :pl2], :left_primary_key=>[:pr1, :pr2], :join_table=>:jt
168
-
169
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_twos
170
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
171
- end
172
-
173
- it "should figure out the reciprocal if the :reciprocal value is not present" do
174
- ParParent.many_to_one :par_parent_two
175
- ParParentTwo.one_to_many :par_parents
176
- ParParent.many_to_many :par_parent_threes
177
- ParParentThree.many_to_many :par_parents
178
-
179
- ParParent.association_reflection(:par_parent_two).keys.wont_include(:reciprocal)
180
- ParParent.association_reflection(:par_parent_two).reciprocal.must_equal :par_parents
181
- ParParentTwo.association_reflection(:par_parents).keys.wont_include(:reciprocal)
182
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
183
- ParParent.association_reflection(:par_parent_threes).keys.wont_include(:reciprocal)
184
- ParParent.association_reflection(:par_parent_threes).reciprocal.must_equal :par_parents
185
- ParParentThree.association_reflection(:par_parents).keys.wont_include(:reciprocal)
186
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
187
- end
188
-
189
- it "should handle ambiguous reciprocals where only one doesn't have conditions/blocks" do
190
- ParParent.many_to_one :par_parent_two, :class=>ParParentTwo, :key=>:par_parent_two_id
191
- ParParent.many_to_one :par_parent_two2, :clone=>:par_parent_two, :conditions=>{:id=>:id}
192
- ParParentTwo.one_to_many :par_parents
193
- ParParent.many_to_many :par_parent_threes, :class=>ParParentThree, :right_key=>:par_parent_three_id
194
- ParParent.many_to_many :par_parent_threes2, :clone=>:par_parent_threes do |ds|
195
- ds
196
- end
197
- ParParentThree.many_to_many :par_parents
198
-
199
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
200
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
201
- end
202
-
203
- it "should handle ambiguous reciprocals where only one has matching primary keys" do
204
- ParParent.many_to_one :par_parent_two, :class=>ParParentTwo, :key=>:par_parent_two_id
205
- ParParent.many_to_one :par_parent_two2, :clone=>:par_parent_two, :primary_key=>:foo
206
- ParParentTwo.one_to_many :par_parents, :class=>ParParent, :key=>:par_parent_two_id
207
- ParParentTwo.one_to_many :par_parents2, :clone=>:par_parents, :primary_key=>:foo
208
- ParParent.many_to_many :par_parent_threes, :class=>ParParentThree, :right_key=>:par_parent_three_id
209
- ParParent.many_to_many :par_parent_threes2, :clone=>:par_parent_threes, :right_primary_key=>:foo
210
- ParParent.many_to_many :par_parent_threes3, :clone=>:par_parent_threes, :left_primary_key=>:foo
211
- ParParentThree.many_to_many :par_parents
212
-
213
- ParParent.association_reflection(:par_parent_two).reciprocal.must_equal :par_parents
214
- ParParent.association_reflection(:par_parent_two2).reciprocal.must_equal :par_parents2
215
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
216
- ParParentTwo.association_reflection(:par_parents2).reciprocal.must_equal :par_parent_two2
217
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
218
- end
219
-
220
- it "should handle reciprocals where current association has conditions/block" do
221
- ParParent.many_to_one :par_parent_two, :conditions=>{:id=>:id}
222
- ParParentTwo.one_to_many :par_parents
223
- ParParent.many_to_many :par_parent_threes do |ds|
224
- ds
225
- end
226
- ParParentThree.many_to_many :par_parents
227
-
228
- ParParent.association_reflection(:par_parent_two).reciprocal.must_equal :par_parents
229
- ParParent.association_reflection(:par_parent_threes).reciprocal.must_equal :par_parents
230
- end
231
- end
232
-
233
- describe Sequel::Model::Associations::AssociationReflection, "#select" do
234
- before do
235
- @c = Class.new(Sequel::Model(:foo))
236
- class ::ParParent < Sequel::Model; end
237
- end
238
- after do
239
- Object.send(:remove_const, :ParParent)
240
- end
241
-
242
- it "should use the :select value if present" do
243
- @c.many_to_one :c, :class=>ParParent, :select=>[:par_parents__id]
244
- @c.association_reflection(:c).keys.must_include(:select)
245
- @c.association_reflection(:c).select.must_equal [:par_parents__id]
246
- end
247
- it "should be the associated_table.* if :select is not present for a many_to_many associaiton" do
248
- @c.many_to_many :cs, :class=>'ParParent'
249
- @c.association_reflection(:cs).keys.wont_include(:select)
250
- @c.association_reflection(:cs).select.must_equal Sequel::SQL::ColumnAll.new(:par_parents)
251
- end
252
- it "should be blank if :select is not present for a many_to_one and one_to_many associaiton" do
253
- @c.one_to_many :cs, :class=>'ParParent'
254
- @c.association_reflection(:cs).keys.wont_include(:select)
255
- @c.association_reflection(:cs).select.must_be_nil
256
- @c.many_to_one :c, :class=>'ParParent'
257
- @c.association_reflection(:c).keys.wont_include(:select)
258
- @c.association_reflection(:c).select.must_be_nil
259
- end
260
- end
261
-
262
- describe Sequel::Model::Associations::AssociationReflection, "#can_have_associated_objects?" do
263
- it "should be true for any given object (for backward compatibility)" do
264
- Sequel::Model::Associations::AssociationReflection.new.can_have_associated_objects?(Object.new).must_equal true
265
- end
266
- end
267
-
268
- describe Sequel::Model::Associations::AssociationReflection, "#associated_object_keys" do
269
- before do
270
- @c = Class.new(Sequel::Model(:foo))
271
- class ::ParParent < Sequel::Model; end
272
- end
273
- after do
274
- Object.send(:remove_const, :ParParent)
275
- end
276
-
277
- it "should use the primary keys for a many_to_one association" do
278
- @c.many_to_one :c, :class=>ParParent
279
- @c.association_reflection(:c).associated_object_keys.must_equal [:id]
280
- @c.many_to_one :c, :class=>ParParent, :primary_key=>:d_id
281
- @c.association_reflection(:c).associated_object_keys.must_equal [:d_id]
282
- @c.many_to_one :c, :class=>ParParent, :key=>[:c_id1, :c_id2], :primary_key=>[:id1, :id2]
283
- @c.association_reflection(:c).associated_object_keys.must_equal [:id1, :id2]
284
- end
285
- it "should use the keys for a one_to_many association" do
286
- ParParent.one_to_many :cs, :class=>ParParent
287
- ParParent.association_reflection(:cs).associated_object_keys.must_equal [:par_parent_id]
288
- @c.one_to_many :cs, :class=>ParParent, :key=>:d_id
289
- @c.association_reflection(:cs).associated_object_keys.must_equal [:d_id]
290
- @c.one_to_many :cs, :class=>ParParent, :key=>[:c_id1, :c_id2], :primary_key=>[:id1, :id2]
291
- @c.association_reflection(:cs).associated_object_keys.must_equal [:c_id1, :c_id2]
292
- end
293
- it "should use the right primary keys for a many_to_many association" do
294
- @c.many_to_many :cs, :class=>ParParent
295
- @c.association_reflection(:cs).associated_object_keys.must_equal [:id]
296
- @c.many_to_many :cs, :class=>ParParent, :right_primary_key=>:d_id
297
- @c.association_reflection(:cs).associated_object_keys.must_equal [:d_id]
298
- @c.many_to_many :cs, :class=>ParParent, :right_key=>[:c_id1, :c_id2], :right_primary_key=>[:id1, :id2]
299
- @c.association_reflection(:cs).associated_object_keys.must_equal [:id1, :id2]
300
- end
301
- end
302
-
303
- describe Sequel::Model::Associations::AssociationReflection do
304
- before do
305
- @c = Class.new(Sequel::Model(:foo))
306
- def @c.name() "C" end
307
- end
308
-
309
- it "one_to_many #qualified_primary_key should be a qualified version of the primary key" do
310
- @c.one_to_many :cs, :class=>@c
311
- @c.dataset.literal(@c.association_reflection(:cs).qualified_primary_key).must_equal 'foo.id'
312
- end
313
-
314
- it "many_to_many #associated_key_column should be the left key" do
315
- @c.many_to_many :cs, :class=>@c
316
- @c.association_reflection(:cs).associated_key_column.must_equal :c_id
317
- end
318
-
319
- it "many_to_many #qualified_right_key should be a qualified version of the primary key" do
320
- @c.many_to_many :cs, :class=>@c, :right_key=>:c2_id
321
- @c.dataset.literal(@c.association_reflection(:cs).qualified_right_key).must_equal 'cs_cs.c2_id'
322
- end
323
-
324
- it "many_to_many #qualified_right_primary_key should be a qualified version of the primary key" do
325
- @c.many_to_many :cs, :class=>@c
326
- @c.dataset.literal(@c.association_reflection(:cs).qualified_right_primary_key).must_equal 'foo.id'
327
- end
328
- end
329
-
330
- describe Sequel::Model::Associations::AssociationReflection, "#remove_before_destroy?" do
331
- before do
332
- @c = Class.new(Sequel::Model(:foo))
333
- end
334
-
335
- it "should be true for many_to_one and many_to_many associations" do
336
- @c.many_to_one :c, :class=>@c
337
- @c.association_reflection(:c).remove_before_destroy?.must_equal true
338
- @c.many_to_many :cs, :class=>@c
339
- @c.association_reflection(:cs).remove_before_destroy?.must_equal true
340
- end
341
-
342
- it "should be false for one_to_one and one_to_many associations" do
343
- @c.one_to_one :c, :class=>@c
344
- @c.association_reflection(:c).remove_before_destroy?.must_equal false
345
- @c.one_to_many :cs, :class=>@c
346
- @c.association_reflection(:cs).remove_before_destroy?.must_equal false
347
- end
348
- end
349
-
350
- describe Sequel::Model::Associations::AssociationReflection, "#filter_by_associations_limit_strategy" do
351
- before do
352
- @db = Sequel.mock
353
- @c = Class.new(Sequel::Model(@db[:a]))
354
- end
355
- after do
356
- Sequel::Model.default_eager_limit_strategy = true
357
- end
358
-
359
- it "should be nil by default for *_one associations" do
360
- @c.many_to_one :c, :class=>@c
361
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
362
- @c.one_to_one :c, :class=>@c
363
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
364
- @c.one_through_one :c, :class=>@c
365
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
366
- end
367
-
368
- it "should be :correlated_subquery by default for one_to_many and one_to_one with :order associations" do
369
- @c.one_to_one :c, :class=>@c, :order=>:a
370
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
371
- @c.one_to_many :cs, :class=>@c, :limit=>1
372
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
373
- end
374
-
375
- it "should be :ruby by default for many_to_many and one_through_one with :order associations" do
376
- @c.one_through_one :c, :class=>@c, :order=>:a
377
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :ruby
378
- @c.many_to_many :cs, :class=>@c, :limit=>1
379
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
380
- end
381
-
382
- it "should be nil for many_to_one associations even if :eager_limit_strategy or :filter_limit_strategy is used" do
383
- @c.many_to_one :c, :class=>@c, :eager_limit_strategy=>true
384
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
385
- @c.many_to_one :c, :class=>@c, :eager_limit_strategy=>:distinct_on
386
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
387
- @c.many_to_one :c, :class=>@c, :filter_limit_strategy=>true
388
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
389
- end
390
-
391
- it "should be a symbol for other associations if given a symbol" do
392
- @c.one_to_one :c, :class=>@c, :eager_limit_strategy=>:distinct_on
393
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :distinct_on
394
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>:window_function, :limit=>1
395
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
396
- end
397
-
398
- it "should use :distinct_on for one_to_one associations if picking and the association dataset supports ordered distinct on" do
399
- @c.dataset = @c.dataset.with_extend{def supports_ordered_distinct_on?; true end}
400
- @c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
401
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :distinct_on
402
- end
403
-
404
- it "should use :window_function for associations if picking and the association dataset supports window functions" do
405
- @c.dataset = @c.dataset.with_extend{def supports_window_functions?; true end}
406
- @c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
407
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :window_function
408
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
409
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
410
- @c.many_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
411
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
412
- end
413
-
414
- it "should use :ruby for one_to_many associations if the database doesn't support limits in subqueries" do
415
- @c.dataset = @c.dataset.with_extend{def supports_limits_in_correlated_subqueries?; false end}
416
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
417
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
418
- end
419
-
420
- it "should use :ruby for one_to_many associations if offset doesn't work in correlated subqueries and an offset is used" do
421
- @c.dataset = @c.dataset.with_extend{def supports_offsets_in_correlated_subqueries?; false end}
422
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
423
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
424
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>[1, 1]
425
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
426
- end
427
-
428
- it "should use :ruby for one_to_many associations if composite primary key is used and database does not support multiple columns in IN" do
429
- @c.dataset = @c.dataset.with_extend{def supports_multiple_column_in?; false end}
430
- @c.set_primary_key [:id, :id2]
431
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1, :key=>[:id, :id2]
432
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
433
- end
434
-
435
- it "should use :ruby for many_to_many associations if picking and the association dataset doesn't window functions" do
436
- @c.many_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
437
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
438
- end
439
-
440
- it "should respect Model.default_eager_limit_strategy to *_many associations" do
441
- Sequel::Model.default_eager_limit_strategy = :window_function
442
- Sequel::Model.default_eager_limit_strategy.must_equal :window_function
443
- c = Class.new(Sequel::Model)
444
- c.dataset = :a
445
- c.default_eager_limit_strategy.must_equal :window_function
446
- c.one_to_many :cs, :class=>c, :limit=>1
447
- c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
448
- c.many_to_many :cs, :class=>c, :limit=>1
449
- c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
450
-
451
- Sequel::Model.default_eager_limit_strategy = true
452
- c = Class.new(Sequel::Model)
453
- c.dataset = :a
454
- c.one_to_many :cs, :class=>c, :limit=>1
455
- c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
456
- c.dataset = c.dataset.with_extend{def supports_window_functions?; true end}
457
- c.many_to_many :cs, :class=>c, :limit=>1
458
- c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
459
- end
460
-
461
- it "should ignore Model.default_eager_limit_strategy for one_to_one associations" do
462
- @c.default_eager_limit_strategy = :window_function
463
- @c.one_to_one :c, :class=>@c
464
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
465
- end
466
- end
467
-
468
- describe Sequel::Model::Associations::AssociationReflection, "#apply_eager_dataset_changes" do
469
- it "should apply the eager block as well as the association options to the dataset" do
470
- @c = Class.new(Sequel::Model(:foo))
471
- @c.one_to_many :cs, :class=>@c, :select=>:a, :order=>:b do |ds| ds.where(:c) end
472
- @c.association_reflection(:cs).apply_eager_dataset_changes(@c.dataset).sql.must_equal 'SELECT a FROM foo WHERE c ORDER BY b'
473
- end
474
- end
475
-
476
- describe Sequel::Model, " association reflection methods" do
477
- before do
478
- @c1 = Class.new(Sequel::Model(:nodes)) do
479
- def self.name; 'Node'; end
480
- def self.to_s; 'Node'; end
481
- end
482
- DB.reset
483
- end
484
-
485
- it "#all_association_reflections should include all association reflection hashes" do
486
- @c1.all_association_reflections.must_equal []
487
-
488
- @c1.associate :many_to_one, :parent, :class => @c1
489
- @c1.all_association_reflections.collect{|v| v[:name]}.must_equal [:parent]
490
- @c1.all_association_reflections.collect{|v| v[:type]}.must_equal [:many_to_one]
491
- @c1.all_association_reflections.collect{|v| v[:class]}.must_equal [@c1]
492
-
493
- @c1.associate :one_to_many, :children, :class => @c1
494
- @c1.all_association_reflections.sort_by{|x|x[:name].to_s}
495
- @c1.all_association_reflections.sort_by{|x|x[:name].to_s}.collect{|v| v[:name]}.must_equal [:children, :parent]
496
- @c1.all_association_reflections.sort_by{|x|x[:name].to_s}.collect{|v| v[:type]}.must_equal [:one_to_many, :many_to_one]
497
- @c1.all_association_reflections.sort_by{|x|x[:name].to_s}.collect{|v| v[:class]}.must_equal [@c1, @c1]
498
- end
499
-
500
- it "#association_reflection should return nil for nonexistent association" do
501
- @c1.association_reflection(:blah).must_be_nil
502
- end
503
-
504
- it "#association_reflection should return association reflection hash if association exists" do
505
- @c1.associate :many_to_one, :parent, :class => @c1
506
- @c1.association_reflection(:parent).must_be_kind_of(Sequel::Model::Associations::AssociationReflection)
507
- @c1.association_reflection(:parent)[:name].must_equal :parent
508
- @c1.association_reflection(:parent)[:type].must_equal :many_to_one
509
- @c1.association_reflection(:parent)[:class].must_equal @c1
510
-
511
- @c1.associate :one_to_many, :children, :class => @c1
512
- @c1.association_reflection(:children).must_be_kind_of(Sequel::Model::Associations::AssociationReflection)
513
- @c1.association_reflection(:children)[:name].must_equal :children
514
- @c1.association_reflection(:children)[:type].must_equal :one_to_many
515
- @c1.association_reflection(:children)[:class].must_equal @c1
516
- end
517
-
518
- it "#associations should include all association names" do
519
- @c1.associations.must_equal []
520
- @c1.associate :many_to_one, :parent, :class => @c1
521
- @c1.associations.must_equal [:parent]
522
- @c1.associate :one_to_many, :children, :class => @c1
523
- @c1.associations.sort_by{|x|x.to_s}.must_equal [:children, :parent]
524
- end
525
-
526
- it "association reflections should be copied upon subclasing" do
527
- @c1.associate :many_to_one, :parent, :class => @c1
528
- c = Class.new(@c1)
529
- @c1.associations.must_equal [:parent]
530
- c.associations.must_equal [:parent]
531
- c.associate :many_to_one, :parent2, :class => @c1
532
- @c1.associations.must_equal [:parent]
533
- c.associations.sort_by{|x| x.to_s}.must_equal [:parent, :parent2]
534
- c.instance_methods.must_include(:parent)
535
- end
536
- end
537
-
538
- describe Sequel::Model::Associations::AssociationReflection, "with caching disabled" do
539
- before do
540
- @db = Sequel.mock
541
- @c = Class.new(Sequel::Model)
542
- @c.dataset = @db[:foo]
543
- @c.cache_associations = false
544
- end
545
-
546
- it "should not cache metadata" do
547
- begin
548
- class ::ParParent < Sequel::Model; end
549
- c = ParParent
550
- @c.many_to_one :c, :class=>:ParParent
551
- @c.association_reflection(:c).associated_class.must_equal c
552
- Object.send(:remove_const, :ParParent)
553
- class ::ParParent < Sequel::Model; end
554
- c = ParParent
555
- @c.association_reflection(:c).associated_class.must_equal c
556
- ensure
557
- Object.send(:remove_const, :ParParent)
558
- end
559
- end
560
-
561
- it "should not used cached schema" do
562
- def @db.supports_schema_parsing?; true end
563
- def @db.schema(table, opts={})
564
- [[opts[:reload] ? :reload : :id, {}]]
565
- end
566
- @c.dataset = @db[:items]
567
- @c.columns.must_equal [:reload]
568
-
569
- @c.cache_associations = true
570
- @c.dataset = @db[:items]
571
- @c.columns.must_equal [:id]
572
- end
573
- end
574
-
575
- describe Sequel::Model::Associations::AssociationReflection, "with default association options" do
576
- before do
577
- @db = Sequel.mock
578
- @c = Class.new(Sequel::Model)
579
- @c.dataset = @db[:foo]
580
- end
581
-
582
- it "should use default_association_options as defaults" do
583
- @c.default_association_options = {:foo=>1, :bar=>2}
584
- @c.many_to_one :c, :class=>@c, :foo=>3
585
- r = @c.association_reflection(:c)
586
- r[:foo].must_equal 3
587
- r[:bar].must_equal 2
588
- end
589
-
590
- it "should inherit default_association_options" do
591
- @c.default_association_options = {:foo=>1, :bar=>2}
592
- c = Class.new(@c)
593
- c.many_to_one :c, :class=>c, :foo=>3
594
- r = c.association_reflection(:c)
595
- r[:foo].must_equal 3
596
- r[:bar].must_equal 2
597
-
598
- @c.default_association_options[:bar] = 4
599
- c.many_to_one :d, :class=>c, :foo=>3
600
- r = c.association_reflection(:d)
601
- r[:foo].must_equal 3
602
- r[:bar].must_equal 2
603
- end
604
-
605
- it "should have default_association_type_options take precedence over default_association_options" do
606
- @c.default_association_options = {:foo=>2, :bar=>3}
607
- @c.default_association_type_options[:many_to_one] = {:foo=>1, :bar=>2}
608
- @c.many_to_one :c, :class=>@c, :foo=>3
609
- r = @c.association_reflection(:c)
610
- r[:foo].must_equal 3
611
- r[:bar].must_equal 2
612
- end
613
-
614
- it "should use default_association_type_options as defaults" do
615
- @c.default_association_type_options[:many_to_one] = {:foo=>1, :bar=>2}
616
- @c.many_to_one :c, :class=>@c, :foo=>3
617
- r = @c.association_reflection(:c)
618
- r[:foo].must_equal 3
619
- r[:bar].must_equal 2
620
-
621
- @c.one_to_many :cs, :class=>@c, :foo=>3
622
- r = @c.association_reflection(:cs)
623
- r[:foo].must_equal 3
624
- r[:bar].must_be_nil
625
- end
626
-
627
- it "should inherit default_association_type_options" do
628
- @c.default_association_type_options[:many_to_one] = {:foo=>1, :bar=>2}
629
- c = Class.new(@c)
630
- c.many_to_one :c, :class=>c, :foo=>3
631
- r = c.association_reflection(:c)
632
- r[:foo].must_equal 3
633
- r[:bar].must_equal 2
634
-
635
- @c.default_association_type_options[:many_to_one][:bar] = 4
636
- c.many_to_one :d, :class=>c, :foo=>3
637
- r = c.association_reflection(:d)
638
- r[:foo].must_equal 3
639
- r[:bar].must_equal 2
640
-
641
- c.one_to_many :ds, :class=>c, :foo=>3
642
- r = c.association_reflection(:ds)
643
- r[:foo].must_equal 3
644
- r[:bar].must_be_nil
645
- end
646
- end
647
-
648
- describe "Sequel::Model.freeze" do
649
- it "should freeze the model class and not allow any changes to associations" do
650
- model = Class.new(Sequel::Model(:items))
651
- model.many_to_one :foo, :class=>model, :key=>:id
652
- model.default_association_options = {:read_only=>true}
653
- model.freeze
654
-
655
- model.association_reflections.frozen?.must_equal true
656
- model.association_reflection(:foo).frozen?.must_equal true
657
- model.autoreloading_associations.frozen?.must_equal true
658
- model.autoreloading_associations[:id].frozen?.must_equal true
659
- model.default_association_options.frozen?.must_equal true
660
- end
661
-
662
- it "should allow subclasses of frozen model classes to modify associations" do
663
- model = Class.new(Sequel::Model(:items))
664
- model.many_to_one :foo, :class=>model, :key=>:id
665
- model.freeze
666
- model = Class.new(model)
667
- model.dataset = :items2
668
-
669
- model.association_reflection(:foo).frozen?.must_equal true
670
- model.autoreloading_associations.frozen?.must_equal false
671
- model.autoreloading_associations[:id].frozen?.must_equal false
672
-
673
- model.many_to_one :bar, :class=>model, :key=>:id
674
- model.many_to_one :foo, :class=>model, :key=>:id
675
- model.association_reflections.frozen?.must_equal false
676
- model.association_reflection(:foo).frozen?.must_equal false
677
- model.association_reflection(:bar).frozen?.must_equal false
678
-
679
- model.default_association_options.frozen?.wont_equal true
680
- model.default_association_options = {:read_only=>true}
681
- model.default_association_options.frozen?.wont_equal true
682
- end
683
- end
684
-
685
- describe "Sequel::Model.finalize_associations" do
686
- before do
687
- class ::MtmItem < Sequel::Model
688
- set_primary_key :mtm_id
689
- many_to_many :items
690
- many_to_one :item
691
- end
692
- class ::OtoItem < Sequel::Model
693
- set_primary_key :oto_id
694
- end
695
- class ::Item < Sequel::Model
696
- many_to_one :item
697
- one_to_many :items, :limit=>10
698
- one_to_one :mtm_item
699
- many_to_many :mtm_items
700
- one_through_one :oto_item
701
- end
702
- [MtmItem, OtoItem, Item].each(&:finalize_associations)
703
- end
704
- after do
705
- Object.send(:remove_const, :Item)
706
- Object.send(:remove_const, :MtmItem)
707
- Object.send(:remove_const, :OtoItem)
708
- end
709
-
710
- it "AssociationReflection should have default finalize_settings method" do
711
- Sequel::Model::Associations::AssociationReflection.new.finalize_settings[:associated_class].must_equal :class
712
- end
713
-
714
- it "should finalize many_to_one associations" do
715
- r = Item.association_reflection(:item)
716
- r[:class].must_equal Item
717
- r[:_dataset].sql.must_equal "SELECT * FROM items LIMIT 1"
718
- r[:associated_eager_dataset].sql.must_equal "SELECT * FROM items"
719
- r[:filter_by_associations_conditions_dataset].sql.must_equal "SELECT items.id FROM items WHERE (items.id IS NOT NULL)"
720
- r[:placeholder_loader].wont_be_nil
721
- r[:predicate_key].must_equal Sequel.qualify(:items, :id)
722
- r[:primary_key].must_equal :id
723
- r[:primary_keys].must_equal [:id]
724
- r[:primary_key_method].must_equal :id
725
- r[:primary_key_methods].must_equal [:id]
726
- r[:qualified_primary_key].must_equal Sequel.qualify(:items, :id)
727
- r.fetch(:reciprocal_type).must_equal :one_to_many
728
- r.fetch(:reciprocal).must_equal :items
729
- end
730
-
731
- it "should finalize one_to_many associations" do
732
- r = Item.association_reflection(:items)
733
- r[:class].must_equal Item
734
- r[:_dataset].sql.must_equal "SELECT * FROM items LIMIT 10"
735
- r[:associated_eager_dataset].sql.must_equal "SELECT * FROM items"
736
- r[:_eager_limit_strategy].must_equal :union
737
- r[:filter_by_associations_conditions_dataset].sql.must_equal "SELECT items.item_id FROM items WHERE ((items.item_id IS NOT NULL) AND (items.id IN (SELECT t1.id FROM items AS t1 WHERE (t1.item_id = items.item_id) LIMIT 10)))"
738
- r[:placeholder_loader].wont_be_nil
739
- r[:predicate_key].must_equal Sequel.qualify(:items, :item_id)
740
- r[:predicate_keys].must_equal [Sequel.qualify(:items, :item_id)]
741
- r[:qualified_primary_key].must_equal Sequel.qualify(:items, :id)
742
- r.fetch(:reciprocal).must_equal :item
743
- end
744
-
745
- it "should finalize one_to_one associations" do
746
- r = Item.association_reflection(:mtm_item)
747
- r[:class].must_equal MtmItem
748
- r[:_dataset].sql.must_equal "SELECT * FROM mtm_items LIMIT 1"
749
- r[:associated_eager_dataset].sql.must_equal "SELECT * FROM mtm_items"
750
- r[:_eager_limit_strategy].must_be_nil
751
- r[:filter_by_associations_conditions_dataset].sql.must_equal "SELECT mtm_items.item_id FROM mtm_items WHERE (mtm_items.item_id IS NOT NULL)"
752
- r[:placeholder_loader].wont_be_nil
753
- r[:predicate_key].must_equal Sequel.qualify(:mtm_items, :item_id)
754
- r[:predicate_keys].must_equal [Sequel.qualify(:mtm_items, :item_id)]
755
- r[:qualified_primary_key].must_equal Sequel.qualify(:items, :id)
756
- r.fetch(:reciprocal).must_equal :item
757
- end
758
-
759
- it "should finalize many_to_many associations" do
760
- r = Item.association_reflection(:mtm_items)
761
- r[:class].must_equal MtmItem
762
- r[:_dataset].sql.must_equal "SELECT mtm_items.* FROM mtm_items INNER JOIN items_mtm_items ON (items_mtm_items.mtm_item_id = mtm_items.mtm_id)"
763
- r[:associated_eager_dataset].sql.must_equal "SELECT mtm_items.* FROM mtm_items INNER JOIN items_mtm_items ON (items_mtm_items.mtm_item_id = mtm_items.mtm_id)"
764
- r[:_eager_limit_strategy].must_be_nil
765
- r[:filter_by_associations_conditions_dataset].sql.must_equal "SELECT items_mtm_items.item_id FROM mtm_items INNER JOIN items_mtm_items ON (items_mtm_items.mtm_item_id = mtm_items.mtm_id) WHERE (items_mtm_items.item_id IS NOT NULL)"
766
- r[:placeholder_loader].wont_be_nil
767
- r[:predicate_key].must_equal Sequel.qualify(:items_mtm_items, :item_id)
768
- r[:predicate_keys].must_equal [Sequel.qualify(:items_mtm_items, :item_id)]
769
- r.fetch(:reciprocal).must_equal :items
770
- r[:associated_key_array].must_equal [Sequel.qualify(:items_mtm_items, :item_id).as(:x_foreign_key_x)]
771
- r[:qualified_right_key].must_equal Sequel.qualify(:items_mtm_items, :mtm_item_id)
772
- r[:join_table_source].must_equal :items_mtm_items
773
- r[:join_table_alias].must_equal :items_mtm_items
774
- r[:qualified_right_primary_key].must_equal Sequel.qualify(:mtm_items, :mtm_id)
775
- r[:right_primary_key].must_equal :mtm_id
776
- r[:right_primary_keys].must_equal [:mtm_id]
777
- r[:right_primary_key_method].must_equal :mtm_id
778
- r[:right_primary_key_methods].must_equal [:mtm_id]
779
- r[:select].must_equal Sequel::SQL::ColumnAll.new(:mtm_items)
780
- end
781
-
782
- it "should finalize one_through_one associations" do
783
- r = Item.association_reflection(:oto_item)
784
- r[:class].must_equal OtoItem
785
- r[:_dataset].sql.must_equal "SELECT oto_items.* FROM oto_items INNER JOIN items_oto_items ON (items_oto_items.oto_item_id = oto_items.oto_id) LIMIT 1"
786
- r[:associated_eager_dataset].sql.must_equal "SELECT oto_items.* FROM oto_items INNER JOIN items_oto_items ON (items_oto_items.oto_item_id = oto_items.oto_id)"
787
- r[:_eager_limit_strategy].must_be_nil
788
- r[:filter_by_associations_conditions_dataset].sql.must_equal "SELECT items_oto_items.item_id FROM oto_items INNER JOIN items_oto_items ON (items_oto_items.oto_item_id = oto_items.oto_id) WHERE (items_oto_items.item_id IS NOT NULL)"
789
- r[:placeholder_loader].wont_be_nil
790
- r[:predicate_key].must_equal Sequel.qualify(:items_oto_items, :item_id)
791
- r[:predicate_keys].must_equal [Sequel.qualify(:items_oto_items, :item_id)]
792
- r[:associated_key_array].must_equal [Sequel.qualify(:items_oto_items, :item_id).as(:x_foreign_key_x)]
793
- r[:qualified_right_key].must_equal Sequel.qualify(:items_oto_items, :oto_item_id)
794
- r[:join_table_source].must_equal :items_oto_items
795
- r[:join_table_alias].must_equal :items_oto_items
796
- r[:qualified_right_primary_key].must_equal Sequel.qualify(:oto_items, :oto_id)
797
- r[:right_primary_key].must_equal :oto_id
798
- r[:right_primary_keys].must_equal [:oto_id]
799
- r[:right_primary_key_method].must_equal :oto_id
800
- r[:right_primary_key_methods].must_equal [:oto_id]
801
- r[:select].must_equal Sequel::SQL::ColumnAll.new(:oto_items)
802
- end
803
- end