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
|
# The eager_each plugin makes calling each on an eager loaded dataset do eager loading.
|
|
@@ -13,6 +15,11 @@ module Sequel
|
|
|
13
15
|
# and setting a new flag in the cloned dataset, so that each can check with the flag to
|
|
14
16
|
# determine whether it should call all.
|
|
15
17
|
#
|
|
18
|
+
# This plugin also makes #first and related methods that load single records work with
|
|
19
|
+
# eager loading. Note that when using eager_graph, calling #first or a similar method
|
|
20
|
+
# will result in two queries, one to load the main object, and one to eagerly load all associated
|
|
21
|
+
# objects to that main object.
|
|
22
|
+
#
|
|
16
23
|
# Usage:
|
|
17
24
|
#
|
|
18
25
|
# # Make all model subclass instances eagerly load for each (called before loading subclasses)
|
|
@@ -23,16 +30,16 @@ module Sequel
|
|
|
23
30
|
module EagerEach
|
|
24
31
|
module DatasetMethods
|
|
25
32
|
# Don't call #all when attempting to load the columns.
|
|
26
|
-
def columns
|
|
33
|
+
def columns!
|
|
27
34
|
if use_eager_all?
|
|
28
|
-
clone(:all_called=>true).columns
|
|
35
|
+
clone(:all_called=>true).columns!
|
|
29
36
|
else
|
|
30
37
|
super
|
|
31
38
|
end
|
|
32
39
|
end
|
|
33
40
|
|
|
34
41
|
# Call #all instead of #each if eager loading,
|
|
35
|
-
#
|
|
42
|
+
# unless #each is being called by #all.
|
|
36
43
|
def each(&block)
|
|
37
44
|
if use_eager_all?
|
|
38
45
|
all(&block)
|
|
@@ -51,6 +58,23 @@ module Sequel
|
|
|
51
58
|
end
|
|
52
59
|
end
|
|
53
60
|
|
|
61
|
+
# Handle eager loading when calling first and related methods. For eager_graph,
|
|
62
|
+
# this does an additional query after retrieving a single record, because otherwise
|
|
63
|
+
# the associated records won't get eager loaded correctly.
|
|
64
|
+
def single_record!
|
|
65
|
+
if use_eager_all?
|
|
66
|
+
obj = clone(:all_called=>true).all.first
|
|
67
|
+
|
|
68
|
+
if opts[:eager_graph]
|
|
69
|
+
obj = clone(:all_called=>true).where(obj.qualified_pk_hash).unlimited.all.first
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
obj
|
|
73
|
+
else
|
|
74
|
+
super
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
54
78
|
private
|
|
55
79
|
|
|
56
80
|
# Wether to use all when each is called, true when eager loading
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The eager_graph_eager plugin allows for chaining eager loads after eager_graph
|
|
6
|
+
# loads. Given the following model associations:
|
|
7
|
+
#
|
|
8
|
+
# Band.one_to_many :albums
|
|
9
|
+
# Album.one_to_many :tracks
|
|
10
|
+
#
|
|
11
|
+
# Let's say you wanted to return bands ordered by album name, and eagerly load
|
|
12
|
+
# those albums, you can do that using:
|
|
13
|
+
#
|
|
14
|
+
# Band.eager_graph(:albums).order{albums[:name]}
|
|
15
|
+
#
|
|
16
|
+
# Let's say you also wanted to eagerly load the tracks for each album. You could
|
|
17
|
+
# just add them to the eager_graph call:
|
|
18
|
+
#
|
|
19
|
+
# Band.eager_graph(albums: :tracks).order{albums[:name]}
|
|
20
|
+
#
|
|
21
|
+
# However, the bloats the result set, and you aren't ordering by the track
|
|
22
|
+
# information, so a join is not required. The eager_graph_eager plugin allows
|
|
23
|
+
# you to specify that the tracks be eagerly loaded in a separate query after
|
|
24
|
+
# the eager_graph load of albums:
|
|
25
|
+
#
|
|
26
|
+
# Band.eager_graph(:albums).eager_graph_eager([:albums], :tracks).order{albums[:name]}
|
|
27
|
+
#
|
|
28
|
+
# <tt>Dataset#eager_graph_eager</tt>'s first argument is a dependency chain, specified
|
|
29
|
+
# as an array of symbols. This specifies the point at which to perform the eager load.
|
|
30
|
+
# The remaining arguments are arguments that could be passed to Dataset#eager to specify
|
|
31
|
+
# what dependent associations should be loaded at that point.
|
|
32
|
+
#
|
|
33
|
+
# If you also have the following model association:
|
|
34
|
+
#
|
|
35
|
+
# Track.one_to_many :lyrics
|
|
36
|
+
#
|
|
37
|
+
# Here's some different ways of performing eager loading:
|
|
38
|
+
#
|
|
39
|
+
# # 4 Queries: bands, albums, tracks, lyrics
|
|
40
|
+
# Band.eager(albums: {tracks: :lyrics})
|
|
41
|
+
#
|
|
42
|
+
# # 1 Query: bands+albums+tracks+lyrics
|
|
43
|
+
# Band.eager_graph(albums: {tracks: :lyrics})
|
|
44
|
+
#
|
|
45
|
+
# # 3 Queries: bands+albums, tracks, lyrics
|
|
46
|
+
# Band.eager_graph(:albums).eager_graph_eager([:albums], tracks: :lyrics)
|
|
47
|
+
#
|
|
48
|
+
# # 2 Queries: bands+albums+tracks, lyrics
|
|
49
|
+
# Band.eager_graph(albums: :tracks).eager_graph_eager([:albums, :tracks], :lyrics)
|
|
50
|
+
#
|
|
51
|
+
# # 2 Queries: bands+albums, tracks+lyrics
|
|
52
|
+
# Band.eager_graph(:albums).eager_graph_eager([:albums], tracks: proc{|ds| ds.eager_graph(:lyrics)})
|
|
53
|
+
#
|
|
54
|
+
# Usage:
|
|
55
|
+
#
|
|
56
|
+
# # Support eager_graph_eager in all subclass datasets (called before loading subclasses)
|
|
57
|
+
# Sequel::Model.plugin :eager_graph_eager
|
|
58
|
+
#
|
|
59
|
+
# # Support eager_graph_eager in Album class datasets
|
|
60
|
+
# Album.plugin :eager_graph_eager
|
|
61
|
+
module EagerGraphEager
|
|
62
|
+
module DatasetMethods
|
|
63
|
+
# Specify for the given dependency chain, after loading objects for the
|
|
64
|
+
# current dataset via eager_graph, eagerly load the given associations at that point in the
|
|
65
|
+
# dependency chain.
|
|
66
|
+
#
|
|
67
|
+
# dependency_chain :: Array of association symbols, with the first association symbol
|
|
68
|
+
# specifying an association in the dataset's model, the next
|
|
69
|
+
# association specifying an association in the previous association's
|
|
70
|
+
# associated model, and so on.
|
|
71
|
+
# assocs :: Symbols or hashes specifying associations to eagerly load at the point
|
|
72
|
+
# specified by the dependency chain.
|
|
73
|
+
def eager_graph_eager(dependency_chain, *assocs)
|
|
74
|
+
unless dependency_chain.is_a?(Array) && dependency_chain.all?{|s| s.is_a?(Symbol)} && !dependency_chain.empty?
|
|
75
|
+
raise Error, "eager_graph_eager first argument must be array of symbols"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
current = model
|
|
79
|
+
deps = dependency_chain.map do |dep|
|
|
80
|
+
unless ref = current.association_reflection(dep)
|
|
81
|
+
raise Error, "invalid association #{dep.inspect} for #{current.inspect}"
|
|
82
|
+
end
|
|
83
|
+
current = ref.associated_class
|
|
84
|
+
[dep, ref.returns_array?]
|
|
85
|
+
end
|
|
86
|
+
assocs = current.dataset.send(:eager_options_for_associations, assocs)
|
|
87
|
+
|
|
88
|
+
deps.each(&:freeze)
|
|
89
|
+
deps.unshift(current)
|
|
90
|
+
deps.freeze
|
|
91
|
+
|
|
92
|
+
assocs.freeze
|
|
93
|
+
|
|
94
|
+
if h = @opts[:eager_graph_eager]
|
|
95
|
+
h = Hash[h]
|
|
96
|
+
h[deps] = assocs
|
|
97
|
+
else
|
|
98
|
+
h = {deps => assocs}
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
clone(:eager_graph_eager=>h.freeze)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
protected
|
|
105
|
+
|
|
106
|
+
# After building objects from the rows, if eager_graph_eager has been
|
|
107
|
+
# called on the datasets, for each dependency chain specified, eagerly
|
|
108
|
+
# load the appropriate associations.
|
|
109
|
+
def eager_graph_build_associations(rows)
|
|
110
|
+
objects = super
|
|
111
|
+
|
|
112
|
+
if eager_data = @opts[:eager_graph_eager]
|
|
113
|
+
eager_data.each do |deps, assocs|
|
|
114
|
+
current = objects
|
|
115
|
+
|
|
116
|
+
last_class, *deps = deps
|
|
117
|
+
deps.each do |dep, is_multiple|
|
|
118
|
+
current_assocs = current.map(&:associations)
|
|
119
|
+
|
|
120
|
+
if is_multiple
|
|
121
|
+
current = current_assocs.flat_map{|a| a[dep]}
|
|
122
|
+
else
|
|
123
|
+
current = current_assocs.map{|a| a[dep]}
|
|
124
|
+
current.compact!
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
current.uniq!(&:object_id)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
last_class.dataset.send(:eager_load, current, assocs)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
objects
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The empty_failure_backtraces plugin uses empty backtraces when raising HookFailed and ValidationFailed
|
|
6
|
+
# exceptions. This can be significantly faster, and if you are using these exceptions for
|
|
7
|
+
# flow control, you do not need the backtraces. This plugin is about 10% faster on CRuby
|
|
8
|
+
# and 10-15x faster on JRuby 9.2.7.0+. This does not have an effect on JRuby <9.2.7.0.
|
|
9
|
+
#
|
|
10
|
+
# Usage:
|
|
11
|
+
#
|
|
12
|
+
# # Make all model subclass instances use empty backtraces for HookFailed
|
|
13
|
+
# # and ValidationFailed exceptions (called before loading subclasses)
|
|
14
|
+
# Sequel::Model.plugin :empty_failure_backtraces
|
|
15
|
+
#
|
|
16
|
+
# # Make the Album class use empty backtraces for HookFailed and ValidationFailed exceptions
|
|
17
|
+
# Album.plugin :empty_failure_backtraces
|
|
18
|
+
module EmptyFailureBacktraces
|
|
19
|
+
module InstanceMethods
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
# Use empty backtrace for HookFailed exceptions.
|
|
23
|
+
def hook_failed_error(msg)
|
|
24
|
+
e = super
|
|
25
|
+
e.set_backtrace([])
|
|
26
|
+
e
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Use empty backtrace for ValidationFailed exceptions.
|
|
30
|
+
def validation_failed_error
|
|
31
|
+
e = super
|
|
32
|
+
e.set_backtrace([])
|
|
33
|
+
e
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# The error_splitter plugin automatically splits errors entries related to
|
|
@@ -30,25 +32,30 @@ module Sequel
|
|
|
30
32
|
# Album.plugin :error_splitter
|
|
31
33
|
module ErrorSplitter
|
|
32
34
|
module InstanceMethods
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
#
|
|
36
|
-
def _valid?(
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
# If the model instance is not valid, split the errors before returning.
|
|
38
|
+
def _valid?(opts)
|
|
37
39
|
v = super
|
|
38
40
|
unless v
|
|
39
|
-
errors
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
split_validation_errors(errors)
|
|
42
|
+
end
|
|
43
|
+
v
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Go through all of the errors entries. For any that apply to multiple columns,
|
|
47
|
+
# remove them and add separate error entries, one per column.
|
|
48
|
+
def split_validation_errors(errors)
|
|
49
|
+
errors.keys.select{|k| k.is_a?(Array)}.each do |ks|
|
|
50
|
+
msgs = errors.delete(ks)
|
|
51
|
+
ks.each do |k|
|
|
52
|
+
msgs.each do |msg|
|
|
53
|
+
errors.add(k, msg)
|
|
45
54
|
end
|
|
46
55
|
end
|
|
47
56
|
end
|
|
48
|
-
v
|
|
49
57
|
end
|
|
50
58
|
end
|
|
51
59
|
end
|
|
52
60
|
end
|
|
53
61
|
end
|
|
54
|
-
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The finder plugin adds Model.finder for defining optimized finder methods.
|
|
6
|
+
# There are two ways to use this. The recommended way is to pass a symbol
|
|
7
|
+
# that represents a model class method that returns a dataset:
|
|
8
|
+
#
|
|
9
|
+
# def Artist.by_name(name)
|
|
10
|
+
# where(name: name)
|
|
11
|
+
# end
|
|
12
|
+
#
|
|
13
|
+
# Artist.finder :by_name
|
|
14
|
+
#
|
|
15
|
+
# This creates an optimized first_by_name method, which you can call normally:
|
|
16
|
+
#
|
|
17
|
+
# Artist.first_by_name("Joe")
|
|
18
|
+
#
|
|
19
|
+
# The alternative way to use this to pass your own block:
|
|
20
|
+
#
|
|
21
|
+
# Artist.finder(name: :first_by_name){|pl, ds| ds.where(name: pl.arg).limit(1)}
|
|
22
|
+
#
|
|
23
|
+
# Additionally, there is a Model.prepared_finder method. This works similarly
|
|
24
|
+
# to Model.finder, but uses a prepared statement. This limits the types of
|
|
25
|
+
# arguments that will be accepted, but can perform better in the database.
|
|
26
|
+
#
|
|
27
|
+
# Usage:
|
|
28
|
+
#
|
|
29
|
+
# # Make all model subclasses support Model.finder
|
|
30
|
+
# # (called before loading subclasses)
|
|
31
|
+
# Sequel::Model.plugin :finder
|
|
32
|
+
#
|
|
33
|
+
# # Make the Album class support Model.finder
|
|
34
|
+
# Album.plugin :finder
|
|
35
|
+
module Finder
|
|
36
|
+
FINDER_TYPES = [:first, :all, :each, :get].freeze
|
|
37
|
+
|
|
38
|
+
def self.apply(model)
|
|
39
|
+
model.instance_exec do
|
|
40
|
+
@finders ||= {}
|
|
41
|
+
@finder_loaders ||= {}
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
module ClassMethods
|
|
46
|
+
# Create an optimized finder method using a dataset placeholder literalizer.
|
|
47
|
+
# This pre-computes the SQL to use for the query, except for given arguments.
|
|
48
|
+
#
|
|
49
|
+
# There are two ways to use this. The recommended way is to pass a symbol
|
|
50
|
+
# that represents a model class method that returns a dataset:
|
|
51
|
+
#
|
|
52
|
+
# def Artist.by_name(name)
|
|
53
|
+
# where(name: name)
|
|
54
|
+
# end
|
|
55
|
+
#
|
|
56
|
+
# Artist.finder :by_name
|
|
57
|
+
#
|
|
58
|
+
# This creates an optimized first_by_name method, which you can call normally:
|
|
59
|
+
#
|
|
60
|
+
# Artist.first_by_name("Joe")
|
|
61
|
+
#
|
|
62
|
+
# The alternative way to use this to pass your own block:
|
|
63
|
+
#
|
|
64
|
+
# Artist.finder(name: :first_by_name){|pl, ds| ds.where(name: pl.arg).limit(1)}
|
|
65
|
+
#
|
|
66
|
+
# Note that if you pass your own block, you are responsible for manually setting
|
|
67
|
+
# limits if necessary (as shown above).
|
|
68
|
+
#
|
|
69
|
+
# Options:
|
|
70
|
+
# :arity :: When using a symbol method name, this specifies the arity of the method.
|
|
71
|
+
# This should be used if if the method accepts an arbitrary number of arguments,
|
|
72
|
+
# or the method has default argument values. Note that if the method is defined
|
|
73
|
+
# as a dataset method, the class method Sequel creates accepts an arbitrary number
|
|
74
|
+
# of arguments, so you should use this option in that case. If you want to handle
|
|
75
|
+
# multiple possible arities, you need to call the finder method multiple times with
|
|
76
|
+
# unique :arity and :name methods each time.
|
|
77
|
+
# :name :: The name of the method to create. This must be given if you pass a block.
|
|
78
|
+
# If you use a symbol, this defaults to the symbol prefixed by the type.
|
|
79
|
+
# :mod :: The module in which to create the finder method. Defaults to the singleton
|
|
80
|
+
# class of the model.
|
|
81
|
+
# :type :: The type of query to run. Can be :first, :each, :all, or :get, defaults to
|
|
82
|
+
# :first.
|
|
83
|
+
#
|
|
84
|
+
# Caveats:
|
|
85
|
+
#
|
|
86
|
+
# This doesn't handle all possible cases. For example, if you have a method such as:
|
|
87
|
+
#
|
|
88
|
+
# def Artist.by_name(name)
|
|
89
|
+
# name ? where(name: name) : exclude(name: nil)
|
|
90
|
+
# end
|
|
91
|
+
#
|
|
92
|
+
# Then calling a finder without an argument will not work as you expect.
|
|
93
|
+
#
|
|
94
|
+
# Artist.finder :by_name
|
|
95
|
+
# Artist.by_name(nil).first
|
|
96
|
+
# # WHERE (name IS NOT NULL)
|
|
97
|
+
# Artist.first_by_name(nil)
|
|
98
|
+
# # WHERE (name IS NULL)
|
|
99
|
+
#
|
|
100
|
+
# See Dataset::PlaceholderLiteralizer for additional caveats.
|
|
101
|
+
def finder(meth=OPTS, opts=OPTS, &block)
|
|
102
|
+
if block
|
|
103
|
+
raise Error, "cannot pass both a method name argument and a block of Model.finder" unless meth.is_a?(Hash)
|
|
104
|
+
raise Error, "cannot pass two option hashes to Model.finder" unless opts.equal?(OPTS)
|
|
105
|
+
opts = meth
|
|
106
|
+
raise Error, "must provide method name via :name option when passing block to Model.finder" unless meth_name = opts[:name]
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
type = opts.fetch(:type, :first)
|
|
110
|
+
unless prepare = opts[:prepare]
|
|
111
|
+
raise Error, ":type option to Model.finder must be :first, :all, :each, or :get" unless FINDER_TYPES.include?(type)
|
|
112
|
+
end
|
|
113
|
+
limit1 = type == :first || type == :get
|
|
114
|
+
meth_name ||= opts[:name] || :"#{type}_#{meth}"
|
|
115
|
+
|
|
116
|
+
argn = lambda do |model|
|
|
117
|
+
if arity = opts[:arity]
|
|
118
|
+
arity
|
|
119
|
+
else
|
|
120
|
+
method = block || model.method(meth)
|
|
121
|
+
(method.arity < 0 ? method.arity.abs - 1 : method.arity)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
loader_proc = if prepare
|
|
126
|
+
proc do |model|
|
|
127
|
+
args = prepare_method_args('$a', argn.call(model))
|
|
128
|
+
ds = if block
|
|
129
|
+
model.instance_exec(*args, &block)
|
|
130
|
+
else
|
|
131
|
+
model.public_send(meth, *args)
|
|
132
|
+
end
|
|
133
|
+
ds = ds.limit(1) if limit1
|
|
134
|
+
model_name = model.name
|
|
135
|
+
if model_name.to_s.empty?
|
|
136
|
+
model_name = model.object_id
|
|
137
|
+
else
|
|
138
|
+
model_name = model_name.gsub(/\W/, '_')
|
|
139
|
+
end
|
|
140
|
+
ds.prepare(type, :"#{model_name}_#{meth_name}")
|
|
141
|
+
end
|
|
142
|
+
else
|
|
143
|
+
proc do |model|
|
|
144
|
+
n = argn.call(model)
|
|
145
|
+
block ||= lambda do |pl, model2|
|
|
146
|
+
args = (0...n).map{pl.arg}
|
|
147
|
+
ds = model2.public_send(meth, *args)
|
|
148
|
+
ds = ds.limit(1) if limit1
|
|
149
|
+
ds
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
Sequel::Dataset::PlaceholderLiteralizer.loader(model, &block)
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
@finder_loaders[meth_name] = loader_proc
|
|
157
|
+
mod = opts[:mod] || singleton_class
|
|
158
|
+
if prepare
|
|
159
|
+
def_prepare_method(mod, meth_name)
|
|
160
|
+
else
|
|
161
|
+
def_finder_method(mod, meth_name, type)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def freeze
|
|
166
|
+
@finder_loaders.freeze
|
|
167
|
+
@finder_loaders.each_key{|k| finder_for(k)} if @dataset
|
|
168
|
+
@finders.freeze
|
|
169
|
+
super
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Similar to finder, but uses a prepared statement instead of a placeholder
|
|
173
|
+
# literalizer. This makes the SQL used static (cannot vary per call), but
|
|
174
|
+
# allows binding argument values instead of literalizing them into the SQL
|
|
175
|
+
# query string.
|
|
176
|
+
#
|
|
177
|
+
# If a block is used with this method, it is instance_execed by the model,
|
|
178
|
+
# and should accept the desired number of placeholder arguments.
|
|
179
|
+
#
|
|
180
|
+
# The options are the same as the options for finder, with the following
|
|
181
|
+
# exception:
|
|
182
|
+
# :type :: Specifies the type of prepared statement to create
|
|
183
|
+
def prepared_finder(meth=OPTS, opts=OPTS, &block)
|
|
184
|
+
if block
|
|
185
|
+
raise Error, "cannot pass both a method name argument and a block of Model.finder" unless meth.is_a?(Hash)
|
|
186
|
+
meth = meth.merge(:prepare=>true)
|
|
187
|
+
else
|
|
188
|
+
opts = opts.merge(:prepare=>true)
|
|
189
|
+
end
|
|
190
|
+
finder(meth, opts, &block)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
Plugins.inherited_instance_variables(self, :@finders=>:dup, :@finder_loaders=>:dup)
|
|
194
|
+
|
|
195
|
+
private
|
|
196
|
+
|
|
197
|
+
# Define a finder method in the given module with the given method name that
|
|
198
|
+
# load rows using the finder with the given name.
|
|
199
|
+
def def_finder_method(mod, meth, type)
|
|
200
|
+
mod.send(:define_method, meth){|*args, &block| finder_for(meth).public_send(type, *args, &block)}
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# Define a prepared_finder method in the given module that will call the associated prepared
|
|
204
|
+
# statement.
|
|
205
|
+
def def_prepare_method(mod, meth)
|
|
206
|
+
mod.send(:define_method, meth){|*args, &block| finder_for(meth).call(prepare_method_arg_hash(args), &block)}
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Find the finder to use for the give method. If a finder has not been loaded
|
|
210
|
+
# for the method, load the finder and set correctly in the finders hash, then
|
|
211
|
+
# return the finder.
|
|
212
|
+
def finder_for(meth)
|
|
213
|
+
unless finder = (frozen? ? @finders[meth] : Sequel.synchronize{@finders[meth]})
|
|
214
|
+
finder_loader = @finder_loaders.fetch(meth)
|
|
215
|
+
finder = finder_loader.call(self)
|
|
216
|
+
Sequel.synchronize{@finders[meth] = finder}
|
|
217
|
+
end
|
|
218
|
+
finder
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# An hash of prepared argument values for the given arguments, with keys
|
|
222
|
+
# starting at a. Used by the methods created by prepared_finder.
|
|
223
|
+
def prepare_method_arg_hash(args)
|
|
224
|
+
h = {}
|
|
225
|
+
prepare_method_args('a', args.length).zip(args).each{|k, v| h[k] = v}
|
|
226
|
+
h
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# An array of prepared statement argument names, of length n and starting with base.
|
|
230
|
+
def prepare_method_args(base, n)
|
|
231
|
+
(0...n).map do
|
|
232
|
+
s = base.to_sym
|
|
233
|
+
base = base.next
|
|
234
|
+
s
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# Clear any finders when reseting the instance dataset
|
|
239
|
+
def reset_instance_dataset
|
|
240
|
+
Sequel.synchronize{@finders.clear} if @finders && !@finders.frozen?
|
|
241
|
+
super
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
end
|