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
|
# = Overview
|
|
@@ -29,32 +31,42 @@ module Sequel
|
|
|
29
31
|
# The class_table_inheritance plugin assumes that the root table
|
|
30
32
|
# (e.g. employees) has a primary key column (usually autoincrementing),
|
|
31
33
|
# and all other tables have a foreign key of the same name that points
|
|
32
|
-
# to the same column in their superclass's table
|
|
33
|
-
#
|
|
34
|
-
# other table is a foreign key
|
|
34
|
+
# to the same column in their superclass's table, which is also the primary
|
|
35
|
+
# key for that table. In this example, the employees table has an id column
|
|
36
|
+
# is a primary key and the id column in every other table is a foreign key
|
|
37
|
+
# referencing employees.id, which is also the primary key of that table.
|
|
38
|
+
#
|
|
39
|
+
# Additionally, note that other than the primary key column, no subclass
|
|
40
|
+
# table has a column with the same name as any superclass table. This plugin
|
|
41
|
+
# does not support cases where the column names in a subclass table overlap
|
|
42
|
+
# with any column names in a superclass table.
|
|
35
43
|
#
|
|
36
44
|
# In this example the staff table also stores Cook model objects and the
|
|
37
45
|
# executives table also stores CEO model objects.
|
|
38
46
|
#
|
|
39
47
|
# When using the class_table_inheritance plugin, subclasses that have additional
|
|
40
|
-
# columns use joined datasets:
|
|
48
|
+
# columns use joined datasets in subselects:
|
|
41
49
|
#
|
|
42
50
|
# Employee.dataset.sql
|
|
43
51
|
# # SELECT * FROM employees
|
|
44
52
|
#
|
|
45
53
|
# Manager.dataset.sql
|
|
46
|
-
# # SELECT
|
|
47
|
-
# #
|
|
48
|
-
# #
|
|
49
|
-
# #
|
|
54
|
+
# # SELECT * FROM (
|
|
55
|
+
# # SELECT employees.id, employees.name, employees.kind,
|
|
56
|
+
# # managers.num_staff
|
|
57
|
+
# # FROM employees
|
|
58
|
+
# # JOIN managers ON (managers.id = employees.id)
|
|
59
|
+
# # ) AS employees
|
|
50
60
|
#
|
|
51
61
|
# CEO.dataset.sql
|
|
52
|
-
# # SELECT
|
|
53
|
-
# #
|
|
54
|
-
# #
|
|
55
|
-
# #
|
|
56
|
-
# #
|
|
57
|
-
# #
|
|
62
|
+
# # SELECT * FROM (
|
|
63
|
+
# # SELECT employees.id, employees.name, employees.kind,
|
|
64
|
+
# # managers.num_staff, executives.num_managers
|
|
65
|
+
# # FROM employees
|
|
66
|
+
# # JOIN managers ON (managers.id = employees.id)
|
|
67
|
+
# # JOIN executives ON (executives.id = managers.id)
|
|
68
|
+
# # WHERE (employees.kind IN ('CEO'))
|
|
69
|
+
# # ) AS employees
|
|
58
70
|
#
|
|
59
71
|
# This allows CEO.all to return instances with all attributes
|
|
60
72
|
# loaded. The plugin overrides the deleting, inserting, and updating
|
|
@@ -80,14 +92,38 @@ module Sequel
|
|
|
80
92
|
#
|
|
81
93
|
# a = Employee.first
|
|
82
94
|
# a.values # {:id=>1, name=>'S', :kind=>'CEO'}
|
|
83
|
-
# a.refresh.values # {:id=>1, name=>'S', :kind=>'
|
|
95
|
+
# a.refresh.values # {:id=>1, name=>'S', :kind=>'CEO', :num_staff=>4, :num_managers=>2}
|
|
96
|
+
#
|
|
97
|
+
# You can also load directly from a subclass:
|
|
98
|
+
#
|
|
99
|
+
# a = Executive.first
|
|
100
|
+
# a.values # {:id=>1, name=>'S', :kind=>'Executive', :num_staff=>4, :num_managers=>2}
|
|
101
|
+
#
|
|
102
|
+
# Note that when loading from a subclass, because the subclass dataset uses a subquery
|
|
103
|
+
# that by default uses the same alias at the primary table, any qualified identifiers
|
|
104
|
+
# should reference the subquery alias (and qualified identifiers should not be needed
|
|
105
|
+
# unless joining to another table):
|
|
106
|
+
#
|
|
107
|
+
# a = Executive.where(:id=>1).first # works
|
|
108
|
+
# a = Executive.where{{employees[:id]=>1}}.first # works
|
|
109
|
+
# a = Executive.where{{executives[:id]=>1}}.first # doesn't work
|
|
110
|
+
#
|
|
111
|
+
# Note that because subclass datasets select from a subquery, you cannot update,
|
|
112
|
+
# delete, or insert into them directly. To delete related rows, you need to go
|
|
113
|
+
# through the related tables and remove the related rows. Code that does this would
|
|
114
|
+
# be similar to:
|
|
115
|
+
#
|
|
116
|
+
# pks = Executive.where{num_staff < 10}.select_map(:id)
|
|
117
|
+
# Executive.cti_tables.reverse_each do |table|
|
|
118
|
+
# DB.from(table).where(:id=>pks).delete
|
|
119
|
+
# end
|
|
84
120
|
#
|
|
85
121
|
# = Usage
|
|
86
122
|
#
|
|
87
123
|
# # Use the default of storing the class name in the sti_key
|
|
88
124
|
# # column (:kind in this case)
|
|
89
125
|
# class Employee < Sequel::Model
|
|
90
|
-
# plugin :class_table_inheritance, :
|
|
126
|
+
# plugin :class_table_inheritance, key: :kind
|
|
91
127
|
# end
|
|
92
128
|
#
|
|
93
129
|
# # Have subclasses inherit from the appropriate class
|
|
@@ -101,21 +137,21 @@ module Sequel
|
|
|
101
137
|
#
|
|
102
138
|
# # Specifying the tables with a :table_map hash
|
|
103
139
|
# Employee.plugin :class_table_inheritance,
|
|
104
|
-
# :
|
|
105
|
-
#
|
|
106
|
-
#
|
|
107
|
-
#
|
|
108
|
-
#
|
|
109
|
-
#
|
|
140
|
+
# table_map: {Employee: :employees,
|
|
141
|
+
# Staff: :staff,
|
|
142
|
+
# Cook: :staff,
|
|
143
|
+
# Manager: :managers,
|
|
144
|
+
# Executive: :executives,
|
|
145
|
+
# CEO: :executives }
|
|
110
146
|
#
|
|
111
147
|
# # Using integers to store the class type, with a :model_map hash
|
|
112
148
|
# # and an sti_key of :type
|
|
113
|
-
# Employee.plugin :class_table_inheritance, :type,
|
|
114
|
-
# :
|
|
149
|
+
# Employee.plugin :class_table_inheritance, key: :type,
|
|
150
|
+
# model_map: {1=>:Staff, 2=>:Cook, 3=>:Manager, 4=>:Executive, 5=>:CEO}
|
|
115
151
|
#
|
|
116
152
|
# # Using non-class name strings
|
|
117
|
-
# Employee.plugin :class_table_inheritance, :
|
|
118
|
-
# :
|
|
153
|
+
# Employee.plugin :class_table_inheritance, key: :type,
|
|
154
|
+
# model_map: {'staff'=>:Staff, 'cook staff'=>:Cook, 'supervisor'=>:Manager}
|
|
119
155
|
#
|
|
120
156
|
# # By default the plugin sets the respective column value
|
|
121
157
|
# # when a new instance is created.
|
|
@@ -124,26 +160,26 @@ module Sequel
|
|
|
124
160
|
#
|
|
125
161
|
# # You can customize this behavior with the :key_chooser option.
|
|
126
162
|
# # This is most useful when using a non-bijective mapping.
|
|
127
|
-
# Employee.plugin :class_table_inheritance, :
|
|
128
|
-
# :
|
|
129
|
-
# :
|
|
163
|
+
# Employee.plugin :class_table_inheritance, key: :type,
|
|
164
|
+
# model_map: {'cook staff'=>:Cook, 'supervisor'=>:Manager},
|
|
165
|
+
# key_chooser: proc{|instance| instance.model.sti_key_map[instance.model.to_s].first || 'stranger' }
|
|
130
166
|
#
|
|
131
167
|
# # Using custom procs, with :model_map taking column values
|
|
132
168
|
# # and yielding either a class, string, symbol, or nil,
|
|
133
169
|
# # and :key_map taking a class object and returning the column
|
|
134
170
|
# # value to use
|
|
135
|
-
# Employee.plugin :single_table_inheritance, :
|
|
136
|
-
# :
|
|
137
|
-
# :
|
|
171
|
+
# Employee.plugin :single_table_inheritance, key: :type,
|
|
172
|
+
# model_map: proc{|v| v.reverse},
|
|
173
|
+
# key_map: proc{|klass| klass.name.reverse}
|
|
138
174
|
#
|
|
139
175
|
# # You can use the same class for multiple values.
|
|
140
176
|
# # This is mainly useful when the sti_key column contains multiple values
|
|
141
177
|
# # which are different but do not require different code.
|
|
142
|
-
# Employee.plugin :single_table_inheritance, :
|
|
143
|
-
# :
|
|
144
|
-
#
|
|
145
|
-
#
|
|
146
|
-
#
|
|
178
|
+
# Employee.plugin :single_table_inheritance, key: :type,
|
|
179
|
+
# model_map: {'staff' => "Staff",
|
|
180
|
+
# 'manager' => "Manager",
|
|
181
|
+
# 'overpayed staff' => "Staff",
|
|
182
|
+
# 'underpayed staff' => "Staff"}
|
|
147
183
|
#
|
|
148
184
|
# One minor issue to note is that if you specify the <tt>:key_map</tt>
|
|
149
185
|
# option as a hash, instead of having it inferred from the <tt>:model_map</tt>,
|
|
@@ -159,6 +195,8 @@ module Sequel
|
|
|
159
195
|
end
|
|
160
196
|
|
|
161
197
|
# Initialize the plugin using the following options:
|
|
198
|
+
# :alias :: Change the alias used for the subquery in model datasets.
|
|
199
|
+
# using this as the alias.
|
|
162
200
|
# :key :: Column symbol that holds the key that identifies the class to use.
|
|
163
201
|
# Necessary if you want to call model methods on a superclass
|
|
164
202
|
# that return subclass instances
|
|
@@ -166,32 +204,38 @@ module Sequel
|
|
|
166
204
|
# :key_map :: Hash or proc mapping model class names to key column values.
|
|
167
205
|
# Each value or return is an array of possible key column values.
|
|
168
206
|
# :key_chooser :: proc returning key for the provided model instance
|
|
169
|
-
# :table_map :: Hash with class name symbols keys mapping to table name symbol values
|
|
170
|
-
# Overrides implicit table names
|
|
207
|
+
# :table_map :: Hash with class name symbols keys mapping to table name symbol values.
|
|
208
|
+
# Overrides implicit table names.
|
|
209
|
+
# :ignore_subclass_columns :: Array with column names as symbols that are ignored
|
|
210
|
+
# on all sub-classes.
|
|
211
|
+
# :qualify_tables :: Boolean true to qualify automatically determined
|
|
212
|
+
# subclass tables with the same qualifier as their
|
|
213
|
+
# superclass.
|
|
171
214
|
def self.configure(model, opts = OPTS)
|
|
172
215
|
SingleTableInheritance.configure model, opts[:key], opts
|
|
173
216
|
|
|
174
|
-
model.
|
|
217
|
+
model.instance_exec do
|
|
175
218
|
@cti_models = [self]
|
|
176
219
|
@cti_tables = [table_name]
|
|
177
220
|
@cti_instance_dataset = @instance_dataset
|
|
178
221
|
@cti_table_columns = columns
|
|
179
222
|
@cti_table_map = opts[:table_map] || {}
|
|
223
|
+
@cti_alias = opts[:alias] || case source = @dataset.first_source
|
|
224
|
+
when SQL::QualifiedIdentifier
|
|
225
|
+
@dataset.unqualified_column_for(source)
|
|
226
|
+
else
|
|
227
|
+
source
|
|
228
|
+
end
|
|
229
|
+
@cti_ignore_subclass_columns = opts[:ignore_subclass_columns] || []
|
|
230
|
+
@cti_qualify_tables = !!opts[:qualify_tables]
|
|
180
231
|
end
|
|
181
232
|
end
|
|
182
233
|
|
|
183
234
|
module ClassMethods
|
|
184
|
-
# An array of each model in the inheritance hierarchy that
|
|
235
|
+
# An array of each model in the inheritance hierarchy that is
|
|
185
236
|
# backed by a new table.
|
|
186
237
|
attr_reader :cti_models
|
|
187
238
|
|
|
188
|
-
# The parent/root/base model for this class table inheritance hierarchy.
|
|
189
|
-
# This is the only model in the hierarchy that loads the
|
|
190
|
-
# class_table_inheritance plugin. For backwards compatibility.
|
|
191
|
-
def cti_base_model
|
|
192
|
-
@cti_models.first
|
|
193
|
-
end
|
|
194
|
-
|
|
195
239
|
# An array of column symbols for the backing database table,
|
|
196
240
|
# giving the columns to update in each backing database table.
|
|
197
241
|
attr_reader :cti_table_columns
|
|
@@ -201,67 +245,109 @@ module Sequel
|
|
|
201
245
|
attr_reader :cti_instance_dataset
|
|
202
246
|
|
|
203
247
|
# An array of table symbols that back this model. The first is
|
|
204
|
-
#
|
|
248
|
+
# table symbol for the base model, and the last is the current model
|
|
205
249
|
# table symbol.
|
|
206
250
|
attr_reader :cti_tables
|
|
207
251
|
|
|
208
252
|
# A hash with class name symbol keys and table name symbol values.
|
|
209
|
-
# Specified with the :table_map option to the plugin, and used if
|
|
253
|
+
# Specified with the :table_map option to the plugin, and should be used if
|
|
210
254
|
# the implicit naming is incorrect.
|
|
211
255
|
attr_reader :cti_table_map
|
|
212
256
|
|
|
213
|
-
#
|
|
214
|
-
#
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
257
|
+
# An array of columns that may be duplicated in sub-classes. The
|
|
258
|
+
# primary key column is always allowed to be duplicated
|
|
259
|
+
attr_reader :cti_ignore_subclass_columns
|
|
260
|
+
|
|
261
|
+
# A boolean indicating whether or not to automatically qualify tables
|
|
262
|
+
# backing subclasses with the same qualifier as their superclass, if
|
|
263
|
+
# the superclass is qualified. Specified with the :qualify_tables
|
|
264
|
+
# option to the plugin and only applied to automatically determined
|
|
265
|
+
# table names (not to the :table_map option).
|
|
266
|
+
attr_reader :cti_qualify_tables
|
|
267
|
+
|
|
268
|
+
# Freeze CTI information when freezing model class.
|
|
269
|
+
def freeze
|
|
270
|
+
@cti_models.freeze
|
|
271
|
+
@cti_tables.freeze
|
|
272
|
+
@cti_table_columns.freeze
|
|
273
|
+
@cti_table_map.freeze
|
|
274
|
+
@cti_ignore_subclass_columns.freeze
|
|
275
|
+
|
|
276
|
+
super
|
|
220
277
|
end
|
|
221
278
|
|
|
222
|
-
|
|
223
|
-
def cti_key; sti_key; end
|
|
279
|
+
Plugins.inherited_instance_variables(self, :@cti_models=>nil, :@cti_tables=>nil, :@cti_table_columns=>nil, :@cti_instance_dataset=>nil, :@cti_table_map=>nil, :@cti_alias=>nil, :@cti_ignore_subclass_columns=>nil, :@cti_qualify_tables=>nil)
|
|
224
280
|
|
|
225
|
-
#
|
|
226
|
-
def
|
|
281
|
+
# The table name for the current model class's main table.
|
|
282
|
+
def table_name
|
|
283
|
+
if cti_tables && cti_tables.length > 1
|
|
284
|
+
@cti_alias
|
|
285
|
+
else
|
|
286
|
+
super
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
# The name of the most recently joined table.
|
|
291
|
+
def cti_table_name
|
|
292
|
+
cti_tables.last
|
|
293
|
+
end
|
|
227
294
|
|
|
228
|
-
|
|
295
|
+
# The model class for the given key value.
|
|
296
|
+
def sti_class_from_key(key)
|
|
297
|
+
sti_class(sti_model_map[key])
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
private
|
|
229
301
|
|
|
230
302
|
def inherited(subclass)
|
|
231
303
|
ds = sti_dataset
|
|
232
304
|
|
|
233
305
|
# Prevent inherited in model/base.rb from setting the dataset
|
|
234
|
-
subclass.
|
|
306
|
+
subclass.instance_exec { @dataset = nil }
|
|
235
307
|
|
|
236
308
|
super
|
|
237
309
|
|
|
238
310
|
# Set table if this is a class table inheritance
|
|
239
311
|
table = nil
|
|
240
312
|
columns = nil
|
|
241
|
-
if
|
|
313
|
+
if n = subclass.name
|
|
242
314
|
if table = cti_table_map[n.to_sym]
|
|
243
|
-
columns = db.
|
|
315
|
+
columns = db.schema(table).map(&:first)
|
|
244
316
|
else
|
|
245
|
-
table =
|
|
246
|
-
|
|
317
|
+
table = if cti_qualify_tables && (schema = dataset.schema_and_table(cti_table_name).first)
|
|
318
|
+
SQL::QualifiedIdentifier.new(schema, subclass.implicit_table_name)
|
|
319
|
+
else
|
|
320
|
+
subclass.implicit_table_name
|
|
321
|
+
end
|
|
322
|
+
columns = check_non_connection_error(false){db.schema(table) && db.schema(table).map(&:first)}
|
|
247
323
|
table = nil if !columns || columns.empty?
|
|
248
324
|
end
|
|
249
325
|
end
|
|
250
|
-
table = nil if table && (table ==
|
|
326
|
+
table = nil if table && (table == cti_table_name)
|
|
251
327
|
|
|
252
328
|
return unless table
|
|
253
329
|
|
|
254
330
|
pk = primary_key
|
|
255
|
-
subclass.
|
|
331
|
+
subclass.instance_exec do
|
|
256
332
|
if cti_tables.length == 1
|
|
257
|
-
ds = ds.select(*self.columns.map{|cc| Sequel.qualify(
|
|
333
|
+
ds = ds.select(*self.columns.map{|cc| Sequel.qualify(cti_table_name, Sequel.identifier(cc))})
|
|
258
334
|
end
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
335
|
+
ds.send(:columns=, self.columns)
|
|
336
|
+
cols = (columns - [pk]) - cti_ignore_subclass_columns
|
|
337
|
+
dup_cols = cols & ds.columns
|
|
338
|
+
unless dup_cols.empty?
|
|
339
|
+
raise Error, "class_table_inheritance with duplicate column names (other than the primary key column) is not supported, make sure tables have unique column names (duplicate columns: #{dup_cols}). If this is desired, specify these columns in the :ignore_subclass_columns option when initializing the plugin"
|
|
340
|
+
end
|
|
341
|
+
sel_app = cols.map{|cc| Sequel.qualify(table, Sequel.identifier(cc))}
|
|
342
|
+
@sti_dataset = ds = ds.join(table, pk=>pk).select_append(*sel_app)
|
|
343
|
+
|
|
344
|
+
ds = ds.from_self(:alias=>@cti_alias)
|
|
345
|
+
ds.send(:columns=, self.columns + cols)
|
|
346
|
+
|
|
347
|
+
set_dataset(ds)
|
|
262
348
|
set_columns(self.columns)
|
|
263
|
-
dataset
|
|
264
|
-
|
|
349
|
+
@dataset = @dataset.with_row_proc(lambda{|r| subclass.sti_load(r)})
|
|
350
|
+
cols.each{|a| define_lazy_attribute_getter(a, :dataset=>dataset, :table=>@cti_alias)}
|
|
265
351
|
|
|
266
352
|
@cti_models += [self]
|
|
267
353
|
@cti_tables += [table]
|
|
@@ -271,16 +357,18 @@ module Sequel
|
|
|
271
357
|
cti_tables.reverse_each do |ct|
|
|
272
358
|
db.schema(ct).each{|sk,v| db_schema[sk] = v}
|
|
273
359
|
end
|
|
360
|
+
setup_auto_validations if respond_to?(:setup_auto_validations, true)
|
|
274
361
|
end
|
|
275
362
|
end
|
|
276
363
|
|
|
277
|
-
#
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
364
|
+
# If using a subquery for class table inheritance, also use a subquery
|
|
365
|
+
# when setting subclass dataset.
|
|
366
|
+
def sti_subclass_dataset(key)
|
|
367
|
+
ds = super
|
|
368
|
+
if cti_models[0] != self
|
|
369
|
+
ds = ds.from_self(:alias=>@cti_alias)
|
|
370
|
+
end
|
|
371
|
+
ds
|
|
284
372
|
end
|
|
285
373
|
end
|
|
286
374
|
|
|
@@ -295,29 +383,29 @@ module Sequel
|
|
|
295
383
|
self
|
|
296
384
|
end
|
|
297
385
|
|
|
298
|
-
private
|
|
299
|
-
|
|
300
|
-
def cti_this(model)
|
|
301
|
-
use_server(model.cti_instance_dataset.filter(model.primary_key_hash(pk)))
|
|
302
|
-
end
|
|
303
|
-
|
|
304
386
|
# Set the sti_key column based on the sti_key_map.
|
|
305
|
-
def
|
|
387
|
+
def before_validation
|
|
306
388
|
if new? && (set = self[model.sti_key])
|
|
307
389
|
exp = model.sti_key_chooser.call(self)
|
|
308
390
|
if set != exp
|
|
309
|
-
set_table = model.sti_class_from_key(set).
|
|
310
|
-
exp_table = model.sti_class_from_key(exp).
|
|
391
|
+
set_table = model.sti_class_from_key(set).cti_table_name
|
|
392
|
+
exp_table = model.sti_class_from_key(exp).cti_table_name
|
|
311
393
|
set_column_value("#{model.sti_key}=", exp) if set_table != exp_table
|
|
312
394
|
end
|
|
313
395
|
end
|
|
314
396
|
super
|
|
315
397
|
end
|
|
316
398
|
|
|
399
|
+
private
|
|
400
|
+
|
|
401
|
+
def cti_this(model)
|
|
402
|
+
use_server(model.cti_instance_dataset.where(model.primary_key_hash(pk)))
|
|
403
|
+
end
|
|
404
|
+
|
|
317
405
|
# Insert rows into all backing tables, using the columns
|
|
318
406
|
# in each table.
|
|
319
407
|
def _insert
|
|
320
|
-
return super if model.
|
|
408
|
+
return super if model.cti_models[0] == model
|
|
321
409
|
model.cti_models.each do |m|
|
|
322
410
|
v = {}
|
|
323
411
|
m.cti_table_columns.each{|c| v[c] = @values[c] if @values.include?(c)}
|
|
@@ -329,17 +417,27 @@ module Sequel
|
|
|
329
417
|
@values[primary_key] ||= nid
|
|
330
418
|
end
|
|
331
419
|
end
|
|
332
|
-
|
|
420
|
+
@values[primary_key]
|
|
333
421
|
end
|
|
334
422
|
|
|
335
423
|
# Update rows in all backing tables, using the columns in each table.
|
|
336
424
|
def _update(columns)
|
|
425
|
+
return super if model.cti_models[0] == model
|
|
337
426
|
model.cti_models.each do |m|
|
|
338
427
|
h = {}
|
|
339
428
|
m.cti_table_columns.each{|c| h[c] = columns[c] if columns.include?(c)}
|
|
340
|
-
|
|
429
|
+
unless h.empty?
|
|
430
|
+
ds = cti_this(m)
|
|
431
|
+
n = ds.update(h)
|
|
432
|
+
raise(NoExistingObject, "Attempt to update object did not result in a single row modification (SQL: #{ds.update_sql(h)})") if require_modification && n != 1
|
|
433
|
+
end
|
|
341
434
|
end
|
|
342
435
|
end
|
|
436
|
+
|
|
437
|
+
# Don't allow use of prepared statements.
|
|
438
|
+
def use_prepared_statements_for?(type)
|
|
439
|
+
false
|
|
440
|
+
end
|
|
343
441
|
end
|
|
344
442
|
end
|
|
345
443
|
end
|