sequel 4.26.0 → 5.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG +405 -5656
- data/MIT-LICENSE +1 -1
- data/README.rdoc +232 -157
- data/bin/sequel +32 -9
- data/doc/advanced_associations.rdoc +252 -188
- data/doc/association_basics.rdoc +231 -273
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +75 -48
- data/doc/code_order.rdoc +28 -10
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +72 -46
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +59 -69
- data/doc/opening_databases.rdoc +84 -94
- data/doc/postgresql.rdoc +268 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +184 -164
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +102 -77
- data/doc/security.rdoc +160 -87
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +135 -122
- data/doc/testing.rdoc +34 -18
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +101 -19
- data/doc/validations.rdoc +64 -51
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel.rb +3 -1
- data/lib/sequel/adapters/ado.rb +154 -22
- data/lib/sequel/adapters/ado/access.rb +21 -21
- data/lib/sequel/adapters/ado/mssql.rb +8 -15
- data/lib/sequel/adapters/amalgalite.rb +17 -25
- data/lib/sequel/adapters/ibmdb.rb +52 -58
- data/lib/sequel/adapters/jdbc.rb +149 -127
- data/lib/sequel/adapters/jdbc/db2.rb +32 -40
- data/lib/sequel/adapters/jdbc/derby.rb +56 -58
- data/lib/sequel/adapters/jdbc/h2.rb +40 -30
- data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
- data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
- data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
- data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
- data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
- data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
- data/lib/sequel/adapters/mock.rb +104 -113
- data/lib/sequel/adapters/mysql.rb +42 -61
- data/lib/sequel/adapters/mysql2.rb +126 -35
- data/lib/sequel/adapters/odbc.rb +21 -28
- data/lib/sequel/adapters/odbc/db2.rb +3 -1
- data/lib/sequel/adapters/odbc/mssql.rb +11 -15
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/oracle.rb +62 -68
- data/lib/sequel/adapters/postgres.rb +257 -311
- data/lib/sequel/adapters/postgresql.rb +3 -1
- data/lib/sequel/adapters/shared/access.rb +75 -79
- data/lib/sequel/adapters/shared/db2.rb +96 -74
- data/lib/sequel/adapters/shared/mssql.rb +258 -213
- data/lib/sequel/adapters/shared/mysql.rb +284 -216
- data/lib/sequel/adapters/shared/oracle.rb +175 -60
- data/lib/sequel/adapters/shared/postgres.rb +829 -383
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
- data/lib/sequel/adapters/shared/sqlite.rb +382 -159
- data/lib/sequel/adapters/sqlanywhere.rb +53 -38
- data/lib/sequel/adapters/sqlite.rb +111 -105
- data/lib/sequel/adapters/tinytds.rb +38 -46
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +3 -4
- data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +13 -89
- data/lib/sequel/connection_pool.rb +54 -26
- data/lib/sequel/connection_pool/sharded_single.rb +19 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
- data/lib/sequel/connection_pool/single.rb +21 -12
- data/lib/sequel/connection_pool/threaded.rb +137 -119
- data/lib/sequel/core.rb +352 -320
- data/lib/sequel/database.rb +19 -2
- data/lib/sequel/database/connecting.rb +70 -55
- data/lib/sequel/database/dataset.rb +15 -5
- data/lib/sequel/database/dataset_defaults.rb +20 -102
- data/lib/sequel/database/features.rb +20 -4
- data/lib/sequel/database/logging.rb +25 -7
- data/lib/sequel/database/misc.rb +132 -118
- data/lib/sequel/database/query.rb +51 -28
- data/lib/sequel/database/schema_generator.rb +188 -75
- data/lib/sequel/database/schema_methods.rb +161 -92
- data/lib/sequel/database/transactions.rb +260 -58
- data/lib/sequel/dataset.rb +28 -12
- data/lib/sequel/dataset/actions.rb +354 -170
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +81 -34
- data/lib/sequel/dataset/graph.rb +82 -58
- data/lib/sequel/dataset/misc.rb +139 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +428 -214
- data/lib/sequel/dataset/sql.rb +446 -339
- data/lib/sequel/deprecated.rb +14 -2
- data/lib/sequel/exceptions.rb +48 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +10 -9
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +2 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +9 -4
- data/lib/sequel/extensions/connection_expiration.rb +99 -0
- data/lib/sequel/extensions/connection_validator.rb +26 -13
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +93 -38
- data/lib/sequel/extensions/core_extensions.rb +45 -53
- data/lib/sequel/extensions/core_refinements.rb +44 -46
- data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
- data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
- data/lib/sequel/extensions/date_arithmetic.rb +42 -16
- data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
- data/lib/sequel/extensions/error_sql.rb +7 -3
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +14 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +2 -31
- data/lib/sequel/extensions/graph_each.rb +19 -6
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +8 -4
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/looser_typecasting.rb +19 -9
- data/lib/sequel/extensions/migration.rb +132 -80
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/lib/sequel/extensions/null_dataset.rb +12 -8
- data/lib/sequel/extensions/pagination.rb +35 -28
- data/lib/sequel/extensions/pg_array.rb +227 -316
- data/lib/sequel/extensions/pg_array_ops.rb +19 -7
- data/lib/sequel/extensions/pg_enum.rb +69 -24
- data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
- data/lib/sequel/extensions/pg_hstore.rb +50 -59
- data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
- data/lib/sequel/extensions/pg_inet.rb +34 -15
- data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
- data/lib/sequel/extensions/pg_interval.rb +26 -26
- data/lib/sequel/extensions/pg_json.rb +422 -141
- data/lib/sequel/extensions/pg_json_ops.rb +248 -9
- data/lib/sequel/extensions/pg_loose_count.rb +5 -1
- data/lib/sequel/extensions/pg_range.rb +162 -146
- data/lib/sequel/extensions/pg_range_ops.rb +10 -5
- data/lib/sequel/extensions/pg_row.rb +53 -87
- data/lib/sequel/extensions/pg_row_ops.rb +36 -13
- data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/pretty_table.rb +4 -0
- data/lib/sequel/extensions/query.rb +12 -7
- data/lib/sequel/extensions/round_timestamps.rb +6 -9
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +59 -0
- data/lib/sequel/extensions/schema_caching.rb +14 -1
- data/lib/sequel/extensions/schema_dumper.rb +83 -55
- data/lib/sequel/extensions/select_remove.rb +8 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +50 -17
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/split_array_nil.rb +8 -4
- data/lib/sequel/extensions/sql_comments.rb +96 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -1
- data/lib/sequel/extensions/string_agg.rb +181 -0
- data/lib/sequel/extensions/string_date_time.rb +2 -0
- data/lib/sequel/extensions/symbol_aref.rb +53 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
- data/lib/sequel/extensions/to_dot.rb +15 -5
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +36 -126
- data/lib/sequel/model/associations.rb +850 -257
- data/lib/sequel/model/base.rb +652 -764
- data/lib/sequel/model/dataset_module.rb +13 -10
- data/lib/sequel/model/default_inflections.rb +3 -1
- data/lib/sequel/model/errors.rb +3 -3
- data/lib/sequel/model/exceptions.rb +12 -12
- data/lib/sequel/model/inflections.rb +8 -19
- data/lib/sequel/model/plugins.rb +111 -0
- data/lib/sequel/plugins/accessed_columns.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +32 -7
- data/lib/sequel/plugins/after_initialize.rb +3 -1
- data/lib/sequel/plugins/association_dependencies.rb +27 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +181 -83
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/auto_validations.rb +58 -23
- data/lib/sequel/plugins/before_after_save.rb +8 -0
- data/lib/sequel/plugins/blacklist_security.rb +23 -12
- data/lib/sequel/plugins/boolean_readers.rb +9 -6
- data/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/lib/sequel/plugins/caching.rb +27 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
- data/lib/sequel/plugins/column_conflicts.rb +18 -3
- data/lib/sequel/plugins/column_select.rb +9 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +36 -24
- data/lib/sequel/plugins/constraint_validations.rb +37 -16
- data/lib/sequel/plugins/csv_serializer.rb +58 -35
- data/lib/sequel/plugins/dataset_associations.rb +60 -18
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +74 -13
- data/lib/sequel/plugins/delay_add_association.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +65 -24
- data/lib/sequel/plugins/eager_each.rb +27 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/error_splitter.rb +19 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +9 -12
- data/lib/sequel/plugins/hook_class_methods.rb +39 -54
- data/lib/sequel/plugins/input_transformer.rb +20 -10
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/insert_returning_select.rb +4 -2
- data/lib/sequel/plugins/instance_filters.rb +12 -8
- data/lib/sequel/plugins/instance_hooks.rb +36 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +24 -13
- data/lib/sequel/plugins/json_serializer.rb +123 -47
- data/lib/sequel/plugins/lazy_attributes.rb +20 -14
- data/lib/sequel/plugins/list.rb +40 -26
- data/lib/sequel/plugins/many_through_many.rb +28 -12
- data/lib/sequel/plugins/modification_detection.rb +17 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
- data/lib/sequel/plugins/nested_attributes.rb +55 -28
- data/lib/sequel/plugins/optimistic_locking.rb +5 -3
- data/lib/sequel/plugins/pg_array_associations.rb +52 -18
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
- data/lib/sequel/plugins/pg_row.rb +7 -51
- data/lib/sequel/plugins/prepared_statements.rb +53 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
- data/lib/sequel/plugins/rcte_tree.rb +43 -63
- data/lib/sequel/plugins/serialization.rb +37 -44
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
- data/lib/sequel/plugins/sharding.rb +17 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
- data/lib/sequel/plugins/singular_table_names.rb +2 -0
- data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +13 -6
- data/lib/sequel/plugins/static_cache.rb +79 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +5 -3
- data/lib/sequel/plugins/subclasses.rb +20 -2
- data/lib/sequel/plugins/subset_conditions.rb +48 -0
- data/lib/sequel/plugins/table_select.rb +4 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +22 -8
- data/lib/sequel/plugins/touch.rb +21 -8
- data/lib/sequel/plugins/tree.rb +57 -30
- data/lib/sequel/plugins/typecast_on_load.rb +14 -4
- data/lib/sequel/plugins/unlimited_update.rb +3 -7
- data/lib/sequel/plugins/update_or_create.rb +6 -4
- data/lib/sequel/plugins/update_primary_key.rb +3 -1
- data/lib/sequel/plugins/update_refresh.rb +28 -15
- data/lib/sequel/plugins/uuid.rb +70 -0
- data/lib/sequel/plugins/validate_associated.rb +20 -0
- data/lib/sequel/plugins/validation_class_methods.rb +40 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +49 -31
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +31 -30
- data/lib/sequel/sql.rb +479 -329
- data/lib/sequel/timezones.rb +62 -32
- data/lib/sequel/version.rb +10 -3
- metadata +177 -477
- data/Rakefile +0 -165
- data/doc/active_record.rdoc +0 -912
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -142
- data/lib/sequel/adapters/do.rb +0 -156
- data/lib/sequel/adapters/do/mysql.rb +0 -64
- data/lib/sequel/adapters/do/postgres.rb +0 -42
- data/lib/sequel/adapters/do/sqlite3.rb +0 -40
- data/lib/sequel/adapters/jdbc/as400.rb +0 -82
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
- data/lib/sequel/adapters/odbc/progress.rb +0 -8
- data/lib/sequel/adapters/shared/cubrid.rb +0 -243
- data/lib/sequel/adapters/shared/firebird.rb +0 -245
- data/lib/sequel/adapters/shared/informix.rb +0 -52
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
- data/lib/sequel/adapters/shared/progress.rb +0 -38
- data/lib/sequel/adapters/swift.rb +0 -158
- data/lib/sequel/adapters/swift/mysql.rb +0 -47
- data/lib/sequel/adapters/swift/postgres.rb +0 -45
- data/lib/sequel/adapters/swift/sqlite.rb +0 -47
- data/lib/sequel/adapters/utils/pg_types.rb +0 -68
- data/lib/sequel/dataset/mutation.rb +0 -109
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
- data/lib/sequel/extensions/filter_having.rb +0 -59
- data/lib/sequel/extensions/hash_aliases.rb +0 -45
- data/lib/sequel/extensions/meta_def.rb +0 -31
- data/lib/sequel/extensions/query_literals.rb +0 -80
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
- data/lib/sequel/extensions/set_overrides.rb +0 -72
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/association_autoreloading.rb +0 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
- data/lib/sequel/plugins/schema.rb +0 -80
- data/lib/sequel/plugins/scissors.rb +0 -33
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -706
- data/spec/adapters/mysql_spec.rb +0 -1287
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3725
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -653
- data/spec/bin_spec.rb +0 -254
- data/spec/core/connection_pool_spec.rb +0 -1016
- data/spec/core/database_spec.rb +0 -2531
- data/spec/core/dataset_spec.rb +0 -5098
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1243
- data/spec/core/mock_adapter_spec.rb +0 -462
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -179
- data/spec/core/schema_spec.rb +0 -1659
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -123
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -365
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -420
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_validator_spec.rb +0 -120
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
- data/spec/extensions/constraint_validations_spec.rb +0 -325
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -173
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -311
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -150
- data/spec/extensions/defaults_setter_spec.rb +0 -101
- data/spec/extensions/delay_add_association_spec.rb +0 -52
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/eager_each_spec.rb +0 -42
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -109
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -291
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -267
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -712
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -395
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -229
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -404
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -789
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -541
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2454
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1808
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -240
- data/spec/integration/model_test.rb +0 -226
- data/spec/integration/plugin_test.rb +0 -2240
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -817
- data/spec/integration/spec_helper.rb +0 -48
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -374
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -525
- data/spec/model/associations_spec.rb +0 -4426
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2137
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -982
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2147
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# DatasetAssociations allows you to easily use your model associations
|
|
@@ -10,7 +12,7 @@ module Sequel
|
|
|
10
12
|
# plugin :dataset_associations
|
|
11
13
|
# one_to_many :albums
|
|
12
14
|
# end
|
|
13
|
-
# Artist.
|
|
15
|
+
# Artist.where(id: 1..100).albums
|
|
14
16
|
# # SELECT * FROM albums
|
|
15
17
|
# # WHERE (albums.artist_id IN (
|
|
16
18
|
# # SELECT id FROM artists
|
|
@@ -25,7 +27,7 @@ module Sequel
|
|
|
25
27
|
# As the dataset methods return datasets, you can easily chain the
|
|
26
28
|
# methods to get associated datasets of associated datasets:
|
|
27
29
|
#
|
|
28
|
-
# Artist.
|
|
30
|
+
# Artist.where(id: 1..100).albums.where{name < 'M'}.tags
|
|
29
31
|
# # SELECT tags.* FROM tags
|
|
30
32
|
# # WHERE (tags.id IN (
|
|
31
33
|
# # SELECT albums_tags.tag_id FROM albums
|
|
@@ -37,6 +39,14 @@ module Sequel
|
|
|
37
39
|
# # WHERE ((id >= 1) AND (id <= 100)))
|
|
38
40
|
# # AND
|
|
39
41
|
# # (name < 'M')))))
|
|
42
|
+
#
|
|
43
|
+
# For associations that do JOINs, such as many_to_many, note that the datasets returned
|
|
44
|
+
# by a dataset association method do not do a JOIN by default (they use a subquery that
|
|
45
|
+
# JOINs). This can cause problems when you are doing a select, order, or filter on a
|
|
46
|
+
# column in the joined table. In that case, you should use the +:dataset_associations_join+
|
|
47
|
+
# option in the association, which will make sure the datasets returned by the dataset
|
|
48
|
+
# association methods also use JOINs, allowing such dataset association methods to work
|
|
49
|
+
# correctly.
|
|
40
50
|
#
|
|
41
51
|
# Usage:
|
|
42
52
|
#
|
|
@@ -52,7 +62,7 @@ module Sequel
|
|
|
52
62
|
ret = super
|
|
53
63
|
r = association_reflection(name)
|
|
54
64
|
meth = r.returns_array? ? name : pluralize(name).to_sym
|
|
55
|
-
|
|
65
|
+
dataset_module{define_method(meth){associated(name)}}
|
|
56
66
|
ret
|
|
57
67
|
end
|
|
58
68
|
|
|
@@ -73,33 +83,65 @@ module Sequel
|
|
|
73
83
|
sds = opts[:limit] ? self : unordered
|
|
74
84
|
ds = case r[:type]
|
|
75
85
|
when :many_to_one
|
|
76
|
-
ds.
|
|
86
|
+
ds.where(r.qualified_primary_key=>sds.select(*Array(r[:qualified_key])))
|
|
77
87
|
when :one_to_one, :one_to_many
|
|
78
|
-
r.send(:apply_filter_by_associations_limit_strategy, ds.
|
|
88
|
+
r.send(:apply_filter_by_associations_limit_strategy, ds.where(r.qualified_key=>sds.select(*Array(r.qualified_primary_key))))
|
|
79
89
|
when :many_to_many, :one_through_one
|
|
80
90
|
mds = r.associated_class.dataset.
|
|
81
91
|
join(r[:join_table], r[:right_keys].zip(r.right_primary_keys)).
|
|
82
92
|
select(*Array(r.qualified_right_key)).
|
|
83
93
|
where(r.qualify(r.join_table_alias, r[:left_keys])=>sds.select(*r.qualify(model.table_name, r[:left_primary_key_columns])))
|
|
84
|
-
ds.
|
|
94
|
+
ds.where(r.qualified_right_primary_key=>r.send(:apply_filter_by_associations_limit_strategy, mds))
|
|
85
95
|
when :many_through_many, :one_through_many
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
96
|
+
if r.reverse_edges.empty?
|
|
97
|
+
mds = r.associated_dataset
|
|
98
|
+
fe = r.edges.first
|
|
99
|
+
selection = Array(r.qualify(fe[:table], r.final_edge[:left]))
|
|
100
|
+
predicate_key = r.qualify(fe[:table], fe[:right])
|
|
101
|
+
else
|
|
102
|
+
mds = model.dataset
|
|
103
|
+
iq = model.table_name
|
|
104
|
+
edges = r.edges.map(&:dup)
|
|
105
|
+
edges << r.final_edge.dup
|
|
106
|
+
edges.each do |e|
|
|
107
|
+
alias_expr = e[:table]
|
|
108
|
+
aliaz = mds.unused_table_alias(e[:table])
|
|
109
|
+
unless aliaz == alias_expr
|
|
110
|
+
alias_expr = Sequel.as(e[:table], aliaz)
|
|
111
|
+
end
|
|
112
|
+
e[:alias] = aliaz
|
|
113
|
+
mds = mds.join(alias_expr, Array(e[:right]).zip(Array(e[:left])), :implicit_qualifier=>iq)
|
|
114
|
+
iq = nil
|
|
115
|
+
end
|
|
116
|
+
fe, f1e, f2e = edges.values_at(0, -1, -2)
|
|
117
|
+
selection = Array(r.qualify(f2e[:alias], f1e[:left]))
|
|
118
|
+
predicate_key = r.qualify(fe[:alias], fe[:right])
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
mds = mds.
|
|
122
|
+
select(*selection).
|
|
123
|
+
where(predicate_key=>sds.select(*r.qualify(model.table_name, r[:left_primary_key_columns])))
|
|
124
|
+
ds.where(r.qualified_right_primary_key=>r.send(:apply_filter_by_associations_limit_strategy, mds))
|
|
95
125
|
when :pg_array_to_many
|
|
96
|
-
ds.
|
|
126
|
+
ds.where(Sequel[r.primary_key=>sds.select{Sequel.pg_array_op(r.qualify(r[:model].table_name, r[:key])).unnest}])
|
|
97
127
|
when :many_to_pg_array
|
|
98
|
-
ds.
|
|
128
|
+
ds.where(Sequel.function(:coalesce, Sequel.pg_array_op(r[:key]).overlaps(sds.select{array_agg(r.qualify(r[:model].table_name, r.primary_key))}), false))
|
|
99
129
|
else
|
|
100
130
|
raise Error, "unrecognized association type for association #{name.inspect}: #{r[:type].inspect}"
|
|
101
131
|
end
|
|
102
|
-
|
|
132
|
+
|
|
133
|
+
ds = r.apply_eager_dataset_changes(ds).unlimited
|
|
134
|
+
|
|
135
|
+
if r[:dataset_associations_join]
|
|
136
|
+
case r[:type]
|
|
137
|
+
when :many_to_many, :one_through_one
|
|
138
|
+
ds = ds.join(r[:join_table], r[:right_keys].zip(r.right_primary_keys))
|
|
139
|
+
when :many_through_many, :one_through_many
|
|
140
|
+
(r.reverse_edges + [r.final_reverse_edge]).each{|e| ds = ds.join(e[:table], e.fetch(:only_conditions, (Array(e[:left]).zip(Array(e[:right])) + Array(e[:conditions]))), :table_alias=>ds.unused_table_alias(e[:table]), :qualify=>:deep, &e[:block])}
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
ds
|
|
103
145
|
end
|
|
104
146
|
end
|
|
105
147
|
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The def_dataset_method plugin adds Model.def_dataset_method
|
|
6
|
+
# for defining dataset methods:
|
|
7
|
+
#
|
|
8
|
+
# Album.def_dataset_method(:by_name) do |name|
|
|
9
|
+
# where(name: name)
|
|
10
|
+
# end
|
|
11
|
+
#
|
|
12
|
+
# Additionally, this adds support for Model.subset, which can also
|
|
13
|
+
# be used to define dataset methods that add specific filters:
|
|
14
|
+
#
|
|
15
|
+
# Album.subset(:gold){copies_sold >= 500000}
|
|
16
|
+
#
|
|
17
|
+
# This exists for backwards compatibility with previous Sequel versions.
|
|
18
|
+
#
|
|
19
|
+
# Usage:
|
|
20
|
+
#
|
|
21
|
+
# # Make all model subclasses support Model.def_dataset_method
|
|
22
|
+
# # (called before loading subclasses)
|
|
23
|
+
# Sequel::Model.plugin :def_dataset_method
|
|
24
|
+
#
|
|
25
|
+
# # Make the Album class support Model.def_dataset_method
|
|
26
|
+
# Album.plugin :def_dataset_method
|
|
27
|
+
module DefDatasetMethod
|
|
28
|
+
module ClassMethods
|
|
29
|
+
# If a block is given, define a method on the dataset (if the model currently has an dataset) with the given argument name using
|
|
30
|
+
# the given block. Also define a class method on the model that calls the
|
|
31
|
+
# dataset method. Stores the method name and block so that it can be reapplied if the model's
|
|
32
|
+
# dataset changes.
|
|
33
|
+
#
|
|
34
|
+
# If a block is not given, just define a class method on the model for each argument
|
|
35
|
+
# that calls the dataset method of the same argument name.
|
|
36
|
+
#
|
|
37
|
+
# Using dataset_module is recommended over using this method. In addition to allowing
|
|
38
|
+
# more natural ruby syntax for defining methods manually, it also offers numerous
|
|
39
|
+
# helper methods that make defining common dataset methods more easily, as well as
|
|
40
|
+
# supporting dataset caching (assuming the arguments allow it).
|
|
41
|
+
#
|
|
42
|
+
# # Add new dataset method and class method that calls it
|
|
43
|
+
# Artist.def_dataset_method(:by_name){order(:name)}
|
|
44
|
+
# Artist.where(Sequel[:name].like('A%')).by_name
|
|
45
|
+
# Artist.by_name.where(Sequel[:name].like('A%'))
|
|
46
|
+
#
|
|
47
|
+
# # Just add a class method that calls an existing dataset method
|
|
48
|
+
# Artist.def_dataset_method(:paginate)
|
|
49
|
+
# Artist.paginate(2, 10)
|
|
50
|
+
def def_dataset_method(*args, &block)
|
|
51
|
+
raise(Error, "No arguments given") if args.empty?
|
|
52
|
+
|
|
53
|
+
if block
|
|
54
|
+
raise(Error, "Defining a dataset method using a block requires only one argument") if args.length > 1
|
|
55
|
+
dataset_module{define_method(args.first, &block)}
|
|
56
|
+
else
|
|
57
|
+
args.each{|arg| def_model_dataset_method(arg)}
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Sets up a dataset method that returns a filtered dataset.
|
|
62
|
+
# Sometimes thought of as a scope, and like most dataset methods,
|
|
63
|
+
# they can be chained.
|
|
64
|
+
# For example:
|
|
65
|
+
#
|
|
66
|
+
# Topic.subset(:joes, Sequel[:username].like('%joe%'))
|
|
67
|
+
# Topic.subset(:popular){num_posts > 100}
|
|
68
|
+
# Topic.subset(:recent){created_on > Date.today - 7}
|
|
69
|
+
#
|
|
70
|
+
# Allows you to do:
|
|
71
|
+
#
|
|
72
|
+
# Topic.joes.recent.popular
|
|
73
|
+
#
|
|
74
|
+
# to get topics with a username that includes joe that
|
|
75
|
+
# have more than 100 posts and were created less than
|
|
76
|
+
# 7 days ago.
|
|
77
|
+
#
|
|
78
|
+
# Both the args given and the block are passed to <tt>Dataset#where</tt>.
|
|
79
|
+
#
|
|
80
|
+
# This method creates dataset methods that do not accept arguments. To create
|
|
81
|
+
# dataset methods that accept arguments, you should use define a
|
|
82
|
+
# method directly inside a #dataset_module block.
|
|
83
|
+
def subset(*args, &block)
|
|
84
|
+
dataset_module{subset(*args, &block)}
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
@@ -1,12 +1,46 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
+
# The defaults_setter plugin makes the column getter methods return the default
|
|
6
|
+
# values for new objects, if the values have not already been set. Example:
|
|
5
7
|
#
|
|
6
8
|
# # column a default NULL
|
|
7
9
|
# # column b default 2
|
|
8
|
-
# album = Album.new
|
|
9
|
-
# album
|
|
10
|
+
# album = Album.new
|
|
11
|
+
# album.a # => nil
|
|
12
|
+
# album.b # => 2
|
|
13
|
+
# album = Album.new(a: 1, b: 3)
|
|
14
|
+
# album.a # => 1
|
|
15
|
+
# album.b # => 3
|
|
16
|
+
#
|
|
17
|
+
# You can manually set default values as well:
|
|
18
|
+
#
|
|
19
|
+
# Album.default_values[:a] = 4
|
|
20
|
+
# Album.new.a # => 4
|
|
21
|
+
#
|
|
22
|
+
# You can also provide procs to set default values:
|
|
23
|
+
#
|
|
24
|
+
# Album.default_values[:a] = lambda{Date.today}
|
|
25
|
+
# Album.new.a # => Date.today
|
|
26
|
+
#
|
|
27
|
+
# By default, default values returned are not cached:
|
|
28
|
+
#
|
|
29
|
+
# Album.new.a.equal?(Album.new.a) # => false
|
|
30
|
+
#
|
|
31
|
+
# However, you can turn on caching of default values:
|
|
32
|
+
#
|
|
33
|
+
# Album.plugin :defaults_setter, cache: true
|
|
34
|
+
# Album.new.a.equal?(Album.new.a) # => false
|
|
35
|
+
#
|
|
36
|
+
# Note that if the cache is turned on, the cached values are stored in
|
|
37
|
+
# the values hash:
|
|
38
|
+
#
|
|
39
|
+
# Album.plugin :defaults_setter, cache: true
|
|
40
|
+
# album = Album.new
|
|
41
|
+
# album.values # => {}
|
|
42
|
+
# album.a
|
|
43
|
+
# album.values # => {:a => Date.today}
|
|
10
44
|
#
|
|
11
45
|
# Usage:
|
|
12
46
|
#
|
|
@@ -16,27 +50,52 @@ module Sequel
|
|
|
16
50
|
# # Make the Album class set defaults
|
|
17
51
|
# Album.plugin :defaults_setter
|
|
18
52
|
module DefaultsSetter
|
|
19
|
-
# Set the default values based on the model schema
|
|
20
|
-
|
|
21
|
-
|
|
53
|
+
# Set the default values based on the model schema. Options:
|
|
54
|
+
# :cache :: Cache default values returned in the model's values hash.
|
|
55
|
+
def self.configure(model, opts=OPTS)
|
|
56
|
+
model.instance_exec do
|
|
57
|
+
set_default_values
|
|
58
|
+
@cache_default_values = opts[:cache] if opts.has_key?(:cache)
|
|
59
|
+
end
|
|
22
60
|
end
|
|
23
61
|
|
|
24
62
|
module ClassMethods
|
|
25
|
-
# The default values to
|
|
63
|
+
# The default values to use for this model. A hash with column symbol
|
|
26
64
|
# keys and default values. If the default values respond to +call+, it will be called
|
|
27
65
|
# to get the value, otherwise the value will be used directly. You can manually modify
|
|
28
66
|
# this hash to set specific default values, by default the ones will be parsed from the database.
|
|
29
67
|
attr_reader :default_values
|
|
30
|
-
|
|
68
|
+
|
|
31
69
|
Plugins.after_set_dataset(self, :set_default_values)
|
|
32
70
|
|
|
71
|
+
Plugins.inherited_instance_variables(self, :@default_values=>:dup, :@cache_default_values=>nil)
|
|
72
|
+
|
|
73
|
+
# Whether default values should be cached in the values hash after being retrieved.
|
|
74
|
+
def cache_default_values?
|
|
75
|
+
@cache_default_values
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Freeze default values when freezing model class
|
|
79
|
+
def freeze
|
|
80
|
+
@default_values.freeze
|
|
81
|
+
super
|
|
82
|
+
end
|
|
83
|
+
|
|
33
84
|
private
|
|
34
85
|
|
|
35
86
|
# Parse the cached database schema for this model and set the default values appropriately.
|
|
36
87
|
def set_default_values
|
|
37
88
|
h = {}
|
|
38
|
-
|
|
39
|
-
|
|
89
|
+
if @db_schema
|
|
90
|
+
@db_schema.each do |k, v|
|
|
91
|
+
if v[:callable_default]
|
|
92
|
+
h[k] = v[:callable_default]
|
|
93
|
+
elsif !v[:ruby_default].nil?
|
|
94
|
+
h[k] = convert_default_value(v[:ruby_default])
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
@default_values = h.merge!(@default_values || OPTS)
|
|
40
99
|
end
|
|
41
100
|
|
|
42
101
|
# Handle the CURRENT_DATE and CURRENT_TIMESTAMP values specially by returning an appropriate Date or
|
|
@@ -57,8 +116,10 @@ module Sequel
|
|
|
57
116
|
# Use default value for a new record if values doesn't already contain an entry for it.
|
|
58
117
|
def [](k)
|
|
59
118
|
if new? && !values.has_key?(k)
|
|
60
|
-
v = model.default_values
|
|
61
|
-
v
|
|
119
|
+
v = model.default_values.fetch(k){return}
|
|
120
|
+
v = v.call if v.respond_to?(:call)
|
|
121
|
+
values[k] = v if model.cache_default_values?
|
|
122
|
+
v
|
|
62
123
|
else
|
|
63
124
|
super
|
|
64
125
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# The delay_add_association plugin delays the adding of
|
|
@@ -36,8 +38,9 @@ module Sequel
|
|
|
36
38
|
# current object.
|
|
37
39
|
def add_associated_object(opts, o, *args)
|
|
38
40
|
if opts.dataset_need_primary_key? && new?
|
|
41
|
+
o = make_add_associated_object(opts, o)
|
|
39
42
|
delay_validate_associated_object(opts, o)
|
|
40
|
-
|
|
43
|
+
public_send(opts[:name]) << o
|
|
41
44
|
after_create_hook{super(opts, o, *args)}
|
|
42
45
|
o
|
|
43
46
|
else
|
data/lib/sequel/plugins/dirty.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# The dirty plugin makes Sequel save the initial value of
|
|
@@ -39,6 +41,15 @@ module Sequel
|
|
|
39
41
|
# artist.column_changes # => {}
|
|
40
42
|
# artist.previous_changes # => {:name=>['Foo', 'Bar']}
|
|
41
43
|
#
|
|
44
|
+
# artist.column_previously_was(:name)
|
|
45
|
+
# # => 'Foo'
|
|
46
|
+
# artist.column_previously_changed?(:name)
|
|
47
|
+
# # => true
|
|
48
|
+
# artist.column_previously_changed?(:name, from: 'Foo', to: 'Bar')
|
|
49
|
+
# # => true
|
|
50
|
+
# artist.column_previously_changed?(:name, from: 'Foo', to: 'Baz')
|
|
51
|
+
# # => false
|
|
52
|
+
#
|
|
42
53
|
# There is one caveat; when used with a column that also uses the
|
|
43
54
|
# serialization plugin, setting the column back to its original value
|
|
44
55
|
# after changing it is not correctly detected and will leave an entry
|
|
@@ -59,6 +70,19 @@ module Sequel
|
|
|
59
70
|
# that were used in the update statement.
|
|
60
71
|
attr_reader :previous_changes
|
|
61
72
|
|
|
73
|
+
# Reset the initial values after saving.
|
|
74
|
+
def after_save
|
|
75
|
+
super
|
|
76
|
+
reset_initial_values
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Save the current changes so they are available after updating. This happens
|
|
80
|
+
# before after_save resets them.
|
|
81
|
+
def after_update
|
|
82
|
+
super
|
|
83
|
+
@previous_changes = column_changes
|
|
84
|
+
end
|
|
85
|
+
|
|
62
86
|
# An array with the initial value and the current value
|
|
63
87
|
# of the column, if the column has been changed. If the
|
|
64
88
|
# column has not been changed, returns nil.
|
|
@@ -90,6 +114,41 @@ module Sequel
|
|
|
90
114
|
initial_values.has_key?(column)
|
|
91
115
|
end
|
|
92
116
|
|
|
117
|
+
# Whether the column was previously changed.
|
|
118
|
+
# Options:
|
|
119
|
+
# :from :: If given, the previous initial value of the column must match this
|
|
120
|
+
# :to :: If given, the previous changed value of the column must match this
|
|
121
|
+
#
|
|
122
|
+
# update(name: 'Current')
|
|
123
|
+
# previous_changes # => {:name=>['Initial', 'Current']}
|
|
124
|
+
# column_previously_changed?(:name) # => true
|
|
125
|
+
# column_previously_changed?(:id) # => false
|
|
126
|
+
# column_previously_changed?(:name, from: 'Initial', to: 'Current') # => true
|
|
127
|
+
# column_previously_changed?(:name, from: 'Foo', to: 'Current') # => false
|
|
128
|
+
def column_previously_changed?(column, opts=OPTS)
|
|
129
|
+
return false unless (pc = @previous_changes) && (val = pc[column])
|
|
130
|
+
|
|
131
|
+
if opts.has_key?(:from)
|
|
132
|
+
return false unless val[0] == opts[:from]
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
if opts.has_key?(:to)
|
|
136
|
+
return false unless val[1] == opts[:to]
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
true
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# The previous value of the column, which is the initial value of
|
|
143
|
+
# the column before the object was previously saved.
|
|
144
|
+
#
|
|
145
|
+
# initial_value(:name) # => 'Initial'
|
|
146
|
+
# update(name: 'Current')
|
|
147
|
+
# column_previously_was(:name) # => 'Initial'
|
|
148
|
+
def column_previously_was(column)
|
|
149
|
+
(pc = @previous_changes) && (val = pc[column]) && val[0]
|
|
150
|
+
end
|
|
151
|
+
|
|
93
152
|
# Freeze internal data structures
|
|
94
153
|
def freeze
|
|
95
154
|
initial_values.freeze
|
|
@@ -128,6 +187,7 @@ module Sequel
|
|
|
128
187
|
end
|
|
129
188
|
end
|
|
130
189
|
|
|
190
|
+
# Manually specify that a column will change. This should only be used
|
|
131
191
|
# Manually specify that a column will change. This should only be used
|
|
132
192
|
# if you plan to modify a column value in place, which is not recommended.
|
|
133
193
|
#
|
|
@@ -135,7 +195,7 @@ module Sequel
|
|
|
135
195
|
# name.gsub(/i/i, 'o')
|
|
136
196
|
# column_change(:name) # => ['Initial', 'onotoal']
|
|
137
197
|
def will_change_column(column)
|
|
138
|
-
|
|
198
|
+
_add_changed_column(column)
|
|
139
199
|
check_missing_initial_value(column)
|
|
140
200
|
|
|
141
201
|
value = if initial_values.has_key?(column)
|
|
@@ -157,23 +217,10 @@ module Sequel
|
|
|
157
217
|
|
|
158
218
|
private
|
|
159
219
|
|
|
160
|
-
# Reset
|
|
161
|
-
def
|
|
162
|
-
reset_initial_values
|
|
163
|
-
super
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
# Reset the initial values after saving.
|
|
167
|
-
def after_save
|
|
220
|
+
# Reset initial values when clearing changed columns
|
|
221
|
+
def _clear_changed_columns(reason)
|
|
222
|
+
reset_initial_values if reason == :initialize || reason == :refresh
|
|
168
223
|
super
|
|
169
|
-
reset_initial_values
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
# Save the current changes so they are available after updating. This happens
|
|
173
|
-
# before after_save resets them.
|
|
174
|
-
def after_update
|
|
175
|
-
super
|
|
176
|
-
@previous_changes = column_changes
|
|
177
224
|
end
|
|
178
225
|
|
|
179
226
|
# When changing the column value, save the initial column value. If the column
|
|
@@ -184,7 +231,7 @@ module Sequel
|
|
|
184
231
|
initial = iv[column]
|
|
185
232
|
super
|
|
186
233
|
if value == initial
|
|
187
|
-
|
|
234
|
+
_changed_columns.delete(column) unless missing_initial_values.include?(column)
|
|
188
235
|
iv.delete(column)
|
|
189
236
|
end
|
|
190
237
|
else
|
|
@@ -212,12 +259,6 @@ module Sequel
|
|
|
212
259
|
self
|
|
213
260
|
end
|
|
214
261
|
|
|
215
|
-
# Reset the initial values when initializing.
|
|
216
|
-
def initialize_set(h)
|
|
217
|
-
super
|
|
218
|
-
reset_initial_values
|
|
219
|
-
end
|
|
220
|
-
|
|
221
262
|
# Array holding column symbols that were not present initially. This is necessary
|
|
222
263
|
# to differentiate between values that were not present and values that were
|
|
223
264
|
# present but equal to nil.
|