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,8 +1,10 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# The tactical_eager_loading plugin allows you to eagerly load
|
|
4
6
|
# an association for all objects retrieved from the same dataset
|
|
5
|
-
# without calling eager on the dataset. If you attempt to load
|
|
7
|
+
# without calling +eager+ on the dataset. If you attempt to load
|
|
6
8
|
# associated objects for a record and the association for that
|
|
7
9
|
# object is currently not cached, it assumes you want to get
|
|
8
10
|
# the associated objects for all objects retrieved with the dataset that
|
|
@@ -14,10 +16,99 @@ module Sequel
|
|
|
14
16
|
#
|
|
15
17
|
# Basically, this allows the following code to issue only two queries:
|
|
16
18
|
#
|
|
17
|
-
# Album.
|
|
19
|
+
# Album.where{id<100}.all do |a|
|
|
18
20
|
# a.artists
|
|
19
21
|
# end
|
|
22
|
+
# # SELECT * FROM albums WHERE (id < 100)
|
|
23
|
+
# # SELECT * FROM artists WHERE id IN (...)
|
|
24
|
+
#
|
|
25
|
+
# Note that if you are passing a callback to the association method via
|
|
26
|
+
# a block or :callback option, or using the :reload option to reload
|
|
27
|
+
# the association, eager loading will not be done.
|
|
28
|
+
#
|
|
29
|
+
# You can use the :eager_reload option to reload the association for all
|
|
30
|
+
# objects that the current object was retrieved with:
|
|
31
|
+
#
|
|
32
|
+
# # SELECT * FROM albums WHERE (id < 100)
|
|
33
|
+
# albums = Album.where{id<100}.all
|
|
34
|
+
#
|
|
35
|
+
# # Eagerly load all artists for these albums
|
|
36
|
+
# # SELECT * FROM artists WHERE id IN (...)
|
|
37
|
+
# albums.first.artists
|
|
38
|
+
#
|
|
39
|
+
# # Do something that may affect which artists are associated to the albums
|
|
40
|
+
#
|
|
41
|
+
# # Eagerly reload all artists for these albums
|
|
42
|
+
# # SELECT * FROM artists WHERE id IN (...)
|
|
43
|
+
# albums.first.artists(eager_reload: true)
|
|
20
44
|
#
|
|
45
|
+
# You can also use the :eager option to specify dependent associations
|
|
46
|
+
# to eager load:
|
|
47
|
+
#
|
|
48
|
+
# albums = Album.where{id<100}.all
|
|
49
|
+
#
|
|
50
|
+
# # Eager load all artists for these albums, and all albums for those artists
|
|
51
|
+
# # SELECT * FROM artists WHERE id IN (...)
|
|
52
|
+
# # SELECT * FROM albums WHERE artist_id IN (...)
|
|
53
|
+
# albums.first.artists(eager: :albums)
|
|
54
|
+
#
|
|
55
|
+
# You can also use :eager to specify an eager callback. For example:
|
|
56
|
+
#
|
|
57
|
+
# albums = Album.where{id<100}.all
|
|
58
|
+
#
|
|
59
|
+
# # Eagerly load all artists whose name starts with A-M for these albums
|
|
60
|
+
# # SELECT * FROM artists WHERE name > 'N' AND id IN (...)
|
|
61
|
+
# albums.first.artists(eager: lambda{|ds| ds.where(Sequel[:name] > 'N')})
|
|
62
|
+
#
|
|
63
|
+
# Note that the :eager option only takes effect if the association
|
|
64
|
+
# has not already been loaded for the model.
|
|
65
|
+
#
|
|
66
|
+
# The tactical_eager_loading plugin also allows transparent eager
|
|
67
|
+
# loading when calling association methods on associated objects
|
|
68
|
+
# eagerly loaded via Dataset#eager_graph. This can reduce N queries
|
|
69
|
+
# to a single query when iterating over all associated objects.
|
|
70
|
+
# Consider the following code:
|
|
71
|
+
#
|
|
72
|
+
# artists = Artist.eager_graph(:albums).all
|
|
73
|
+
# artists.each do |artist|
|
|
74
|
+
# artist.albums.each do |album|
|
|
75
|
+
# album.tracks
|
|
76
|
+
# end
|
|
77
|
+
# end
|
|
78
|
+
#
|
|
79
|
+
# By default this will issue a single query to load the artists and
|
|
80
|
+
# albums, and then one query for each album to load the tracks for
|
|
81
|
+
# the album:
|
|
82
|
+
#
|
|
83
|
+
# # SELECT artists.id, ...
|
|
84
|
+
# albums.id, ...
|
|
85
|
+
# # FROM artists
|
|
86
|
+
# # LEFT OUTER JOIN albums ON (albums.artist_id = artists.id);
|
|
87
|
+
# # SELECT * FROM tracks WHERE album_id = 1;
|
|
88
|
+
# # SELECT * FROM tracks WHERE album_id = 2;
|
|
89
|
+
# # SELECT * FROM tracks WHERE album_id = 10;
|
|
90
|
+
# # ...
|
|
91
|
+
#
|
|
92
|
+
# With the tactical_eager_loading plugin, this uses the same
|
|
93
|
+
# query to load the artists and albums, but then issues a single query
|
|
94
|
+
# to load the tracks for all albums.
|
|
95
|
+
#
|
|
96
|
+
# # SELECT artists.id, ...
|
|
97
|
+
# albums.id, ...
|
|
98
|
+
# # FROM artists
|
|
99
|
+
# # LEFT OUTER JOIN albums ON (albums.artist_id = artists.id);
|
|
100
|
+
# # SELECT * FROM tracks WHERE (tracks.album_id IN (1, 2, 10, ...));
|
|
101
|
+
#
|
|
102
|
+
# Note that transparent eager loading for associated objects
|
|
103
|
+
# loaded by eager_graph will only take place if the associated classes
|
|
104
|
+
# also use the tactical_eager_loading plugin.
|
|
105
|
+
#
|
|
106
|
+
# When using this plugin, calling association methods on separate
|
|
107
|
+
# instances of the same result set is not thread-safe, because this
|
|
108
|
+
# plugin attempts to modify all instances of the same result set
|
|
109
|
+
# to eagerly set the associated objects, and having separate threads
|
|
110
|
+
# modify the same model instance is not thread-safe.
|
|
111
|
+
#
|
|
21
112
|
# Usage:
|
|
22
113
|
#
|
|
23
114
|
# # Make all model subclass instances use tactical eager loading (called before loading subclasses)
|
|
@@ -49,11 +140,12 @@ module Sequel
|
|
|
49
140
|
# If there the association is not in the associations cache and the object
|
|
50
141
|
# was reteived via Dataset#all, eagerly load the association for all model
|
|
51
142
|
# objects retrieved with the current object.
|
|
52
|
-
def load_associated_objects(opts,
|
|
143
|
+
def load_associated_objects(opts, dynamic_opts=OPTS, &block)
|
|
144
|
+
dynamic_opts = load_association_objects_options(dynamic_opts, &block)
|
|
53
145
|
name = opts[:name]
|
|
54
|
-
if !associations.include?(name) && retrieved_by && !frozen?
|
|
146
|
+
if (!associations.include?(name) || dynamic_opts[:eager_reload]) && opts[:allow_eager] != false && retrieved_by && !frozen? && !dynamic_opts[:callback] && !dynamic_opts[:reload]
|
|
55
147
|
begin
|
|
56
|
-
retrieved_by.send(:eager_load, retrieved_with.reject(&:frozen?), name=>
|
|
148
|
+
retrieved_by.send(:eager_load, retrieved_with.reject(&:frozen?), name=>dynamic_opts[:eager] || OPTS)
|
|
57
149
|
rescue Sequel::UndefinedAssociation
|
|
58
150
|
# This can happen if class table inheritance is used and the association
|
|
59
151
|
# is only defined in a subclass. This particular instance can use the
|
|
@@ -69,7 +161,29 @@ module Sequel
|
|
|
69
161
|
module DatasetMethods
|
|
70
162
|
private
|
|
71
163
|
|
|
72
|
-
# Set the retrieved_with and retrieved_by attributes for the
|
|
164
|
+
# Set the retrieved_with and retrieved_by attributes for each of the associated objects
|
|
165
|
+
# created by the eager graph loader with the appropriate class dataset and array of objects.
|
|
166
|
+
def _eager_graph_build_associations(_, egl)
|
|
167
|
+
objects = super
|
|
168
|
+
|
|
169
|
+
master = egl.master
|
|
170
|
+
egl.records_map.each do |k, v|
|
|
171
|
+
next if k == master || v.empty?
|
|
172
|
+
|
|
173
|
+
by = opts[:graph][:table_aliases][k]
|
|
174
|
+
values = v.values
|
|
175
|
+
|
|
176
|
+
values.each do |o|
|
|
177
|
+
next unless o.is_a?(TacticalEagerLoading::InstanceMethods) && !o.retrieved_by
|
|
178
|
+
o.retrieved_by = by
|
|
179
|
+
o.retrieved_with = values
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
objects
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Set the retrieved_with and retrieved_by attributes for each object
|
|
73
187
|
# with the current dataset and array of all objects.
|
|
74
188
|
def post_load(objects)
|
|
75
189
|
super
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The throw_failures plugin throws HookFailed and ValidationFailed exceptions instead
|
|
6
|
+
# of raising them. If there is no matching catch block, the UncaughtThrowError will be rescued
|
|
7
|
+
# and the HookFailed or ValidationFailed exception will be raised normally.
|
|
8
|
+
#
|
|
9
|
+
# If you are setting up the catch blocks to handle these failures, in the failure case this
|
|
10
|
+
# plugin is about 10-15% faster on CRuby and 10x faster on JRuby. If you are not
|
|
11
|
+
# setting up the catch blocks, in the failure case this plugin is about 30% slower on CRuby
|
|
12
|
+
# and 2x slower on JRuby. So this plugin should only be used if you are setting up catch
|
|
13
|
+
# blocks manually.
|
|
14
|
+
#
|
|
15
|
+
# This plugin will setup catch blocks automatically for internally rescued HookFailed
|
|
16
|
+
# exceptions when the model is configured to not raise exceptions on failure (by default,
|
|
17
|
+
# the exceptions are internally rescued in that case.
|
|
18
|
+
#
|
|
19
|
+
# To set up the catch blocks, use the class of the exception:
|
|
20
|
+
#
|
|
21
|
+
# ret = catch(Sequel::ValidationFailed) do
|
|
22
|
+
# model_instance.save
|
|
23
|
+
# end
|
|
24
|
+
# if ret.is_a?(Sequel::ValidationFailed)
|
|
25
|
+
# # handle failure
|
|
26
|
+
# else
|
|
27
|
+
# # handle success
|
|
28
|
+
# end
|
|
29
|
+
#
|
|
30
|
+
# Usage:
|
|
31
|
+
#
|
|
32
|
+
# # Make all model subclass instances throw HookFailed and ValidationFailed exceptions
|
|
33
|
+
# # (called before loading subclasses)
|
|
34
|
+
# Sequel::Model.plugin :throw_failures
|
|
35
|
+
#
|
|
36
|
+
# # Make the Album class throw HookFailed and ValidationFailed exceptions
|
|
37
|
+
# Album.plugin :throw_failures
|
|
38
|
+
module ThrowFailures
|
|
39
|
+
module InstanceMethods
|
|
40
|
+
# Catch any thrown HookFailed exceptions.
|
|
41
|
+
def valid?(opts = OPTS)
|
|
42
|
+
catch_hook_failures{super} || false
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
# Catch any HookFailed exceptions thrown inside the block, and return
|
|
48
|
+
# nil if there were any.
|
|
49
|
+
def catch_hook_failures
|
|
50
|
+
called = ret = nil
|
|
51
|
+
catch(HookFailed) do
|
|
52
|
+
ret = yield
|
|
53
|
+
called = true
|
|
54
|
+
end
|
|
55
|
+
ret if called
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Catch any thrown HookFailed exceptions if not raising on failure.
|
|
59
|
+
def checked_save_failure(opts)
|
|
60
|
+
if raise_on_failure?(opts)
|
|
61
|
+
super
|
|
62
|
+
else
|
|
63
|
+
catch_hook_failures{super}
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
if RUBY_VERSION >= '2.2' && (!defined?(JRUBY_VERSION) || JRUBY_VERSION > '9.1')
|
|
68
|
+
# Throw HookFailed with the generated error. If the throw is not
|
|
69
|
+
# caught, just return the originally generated error.
|
|
70
|
+
def hook_failed_error(msg)
|
|
71
|
+
e = super
|
|
72
|
+
throw HookFailed, e
|
|
73
|
+
rescue UncaughtThrowError
|
|
74
|
+
e
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Throw ValidationFailed with the generated error. If the throw is not
|
|
78
|
+
# caught, just return the originally generated error.
|
|
79
|
+
def validation_failed_error
|
|
80
|
+
e = super
|
|
81
|
+
throw ValidationFailed, e
|
|
82
|
+
rescue UncaughtThrowError
|
|
83
|
+
e
|
|
84
|
+
end
|
|
85
|
+
else
|
|
86
|
+
# UncaughtThrowError was added in Ruby 2.2. Older Ruby versions
|
|
87
|
+
# used ArgumentError with "uncaught throw" at the start of the message
|
|
88
|
+
|
|
89
|
+
# :nocov:
|
|
90
|
+
def hook_failed_error(msg)
|
|
91
|
+
e = super
|
|
92
|
+
throw HookFailed, e
|
|
93
|
+
rescue ArgumentError => e2
|
|
94
|
+
raise e2 unless e2.message.start_with?('uncaught throw')
|
|
95
|
+
e
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def validation_failed_error
|
|
99
|
+
e = super
|
|
100
|
+
throw ValidationFailed, e
|
|
101
|
+
rescue ArgumentError => e2
|
|
102
|
+
raise e2 unless e2.message.start_with?('uncaught throw')
|
|
103
|
+
e
|
|
104
|
+
end
|
|
105
|
+
# :nocov:
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# The timestamps plugin creates hooks that automatically set create and
|
|
@@ -13,21 +15,23 @@ module Sequel
|
|
|
13
15
|
# Sequel::Model.plugin :timestamps
|
|
14
16
|
#
|
|
15
17
|
# # Timestamp Album instances, with custom column names
|
|
16
|
-
# Album.plugin :timestamps, :
|
|
18
|
+
# Album.plugin :timestamps, create: :created_on, update: :updated_on
|
|
17
19
|
#
|
|
18
20
|
# # Timestamp Artist instances, forcing an overwrite of the create
|
|
19
21
|
# # timestamp, and setting the update timestamp when creating
|
|
20
|
-
# Album.plugin :timestamps, :
|
|
22
|
+
# Album.plugin :timestamps, force: true, update_on_create: true
|
|
21
23
|
module Timestamps
|
|
22
24
|
# Configure the plugin by setting the available options. Note that
|
|
23
25
|
# if this method is run more than once, previous settings are ignored,
|
|
24
26
|
# and it will just use the settings given or the default settings. Options:
|
|
27
|
+
# :allow_manual_update :: Whether to skip setting the update timestamp if it has been modified manually (default: false)
|
|
25
28
|
# :create :: The field to hold the create timestamp (default: :created_at)
|
|
26
29
|
# :force :: Whether to overwrite an existing create timestamp (default: false)
|
|
27
30
|
# :update :: The field to hold the update timestamp (default: :updated_at)
|
|
28
31
|
# :update_on_create :: Whether to set the update timestamp to the create timestamp when creating (default: false)
|
|
29
32
|
def self.configure(model, opts=OPTS)
|
|
30
|
-
model.
|
|
33
|
+
model.instance_exec do
|
|
34
|
+
@allow_manual_timestamp_update = opts[:allow_manual_update]||false
|
|
31
35
|
@create_timestamp_field = opts[:create]||:created_at
|
|
32
36
|
@update_timestamp_field = opts[:update]||:updated_at
|
|
33
37
|
@create_timestamp_overwrite = opts[:force]||false
|
|
@@ -47,9 +51,18 @@ module Sequel
|
|
|
47
51
|
@create_timestamp_overwrite
|
|
48
52
|
end
|
|
49
53
|
|
|
50
|
-
Plugins.inherited_instance_variables(self,
|
|
51
|
-
:@
|
|
54
|
+
Plugins.inherited_instance_variables(self,
|
|
55
|
+
:@allow_manual_timestamp_update=>nil,
|
|
56
|
+
:@create_timestamp_field=>nil,
|
|
57
|
+
:@create_timestamp_overwrite=>nil,
|
|
58
|
+
:@set_update_timestamp_on_create=>nil,
|
|
59
|
+
:@update_timestamp_field=>nil)
|
|
52
60
|
|
|
61
|
+
# Whether to allow manual setting of the update timestamp when creating
|
|
62
|
+
def allow_manual_timestamp_update?
|
|
63
|
+
@allow_manual_timestamp_update
|
|
64
|
+
end
|
|
65
|
+
|
|
53
66
|
# Whether to set the update timestamp to the create timestamp when creating
|
|
54
67
|
def set_update_timestamp_on_create?
|
|
55
68
|
@set_update_timestamp_on_create
|
|
@@ -63,14 +76,14 @@ module Sequel
|
|
|
63
76
|
super
|
|
64
77
|
end
|
|
65
78
|
|
|
66
|
-
private
|
|
67
|
-
|
|
68
79
|
# Set the create timestamp when creating
|
|
69
|
-
def
|
|
80
|
+
def before_validation
|
|
70
81
|
set_create_timestamp if new?
|
|
71
82
|
super
|
|
72
83
|
end
|
|
73
84
|
|
|
85
|
+
private
|
|
86
|
+
|
|
74
87
|
# If the object has accessor methods for the create timestamp field, and
|
|
75
88
|
# the create timestamp value is nil or overwriting it is allowed, set the
|
|
76
89
|
# create timestamp field to the time given or the current time. If setting
|
|
@@ -86,6 +99,7 @@ module Sequel
|
|
|
86
99
|
# Set the update timestamp to the time given or the current time if the
|
|
87
100
|
# object has a setter method for the update timestamp field.
|
|
88
101
|
def set_update_timestamp(time=nil)
|
|
102
|
+
return if model.allow_manual_timestamp_update? && modified?(model.update_timestamp_field)
|
|
89
103
|
meth = :"#{model.update_timestamp_field}="
|
|
90
104
|
set_column_value(meth, time||model.dataset.current_datetime) if respond_to?(meth)
|
|
91
105
|
end
|
data/lib/sequel/plugins/touch.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# The touch plugin adds a touch method to model instances, which saves
|
|
@@ -20,16 +22,13 @@ module Sequel
|
|
|
20
22
|
# Sequel::Model.plugin :touch
|
|
21
23
|
#
|
|
22
24
|
# # Allow touching of Album instances, with a custom column
|
|
23
|
-
# Album.plugin :touch, :
|
|
25
|
+
# Album.plugin :touch, column: :updated_on
|
|
24
26
|
#
|
|
25
27
|
# # Allow touching of Artist instances, updating the albums and tags
|
|
26
28
|
# # associations when touching, touching the +updated_on+ column for
|
|
27
29
|
# # albums and the +updated_at+ column for tags
|
|
28
|
-
# Artist.plugin :touch, :
|
|
30
|
+
# Artist.plugin :touch, associations: [{albums: :updated_on}, :tags]
|
|
29
31
|
module Touch
|
|
30
|
-
# The default column to update when touching
|
|
31
|
-
TOUCH_COLUMN_DEFAULT = :updated_at
|
|
32
|
-
|
|
33
32
|
def self.apply(model, opts=OPTS)
|
|
34
33
|
model.instance_variable_set(:@touched_associations, {})
|
|
35
34
|
end
|
|
@@ -44,7 +43,7 @@ module Sequel
|
|
|
44
43
|
# If a hash is used, the value is used as the column to update.
|
|
45
44
|
# :column :: The column to modify when touching a model instance.
|
|
46
45
|
def self.configure(model, opts=OPTS)
|
|
47
|
-
model.touch_column = opts[:column] ||
|
|
46
|
+
model.touch_column = opts[:column] || :updated_at if opts[:column] || !model.touch_column
|
|
48
47
|
model.touch_associations(opts[:associations]) if opts[:associations]
|
|
49
48
|
end
|
|
50
49
|
|
|
@@ -61,6 +60,13 @@ module Sequel
|
|
|
61
60
|
|
|
62
61
|
Plugins.inherited_instance_variables(self, :@touched_associations=>:dup, :@touch_column=>nil)
|
|
63
62
|
|
|
63
|
+
# Freeze the touched associations when freezing the model class.
|
|
64
|
+
def freeze
|
|
65
|
+
@touched_associations.freeze
|
|
66
|
+
|
|
67
|
+
super
|
|
68
|
+
end
|
|
69
|
+
|
|
64
70
|
# Add additional associations to be touched. See the :association option
|
|
65
71
|
# of the Sequel::Plugin::Touch.configure method for the format of the associations
|
|
66
72
|
# arguments.
|
|
@@ -76,6 +82,12 @@ module Sequel
|
|
|
76
82
|
end
|
|
77
83
|
|
|
78
84
|
module InstanceMethods
|
|
85
|
+
# Touch all of the model's touched_associations when creating the object.
|
|
86
|
+
def after_create
|
|
87
|
+
super
|
|
88
|
+
touch_associations
|
|
89
|
+
end
|
|
90
|
+
|
|
79
91
|
# Touch all of the model's touched_associations when destroying the object.
|
|
80
92
|
def after_destroy
|
|
81
93
|
super
|
|
@@ -115,16 +127,17 @@ module Sequel
|
|
|
115
127
|
model.touched_associations.each do |assoc, column|
|
|
116
128
|
r = model.association_reflection(assoc)
|
|
117
129
|
next unless r.can_have_associated_objects?(self)
|
|
118
|
-
ds =
|
|
130
|
+
ds = public_send(r[:dataset_method])
|
|
119
131
|
|
|
120
132
|
if ds.send(:joined_dataset?)
|
|
121
133
|
# Can't update all values at once, so update each instance individually.
|
|
122
134
|
# Instead if doing a simple save, update via the instance's dataset,
|
|
123
135
|
# to avoid going into an infinite loop in some cases.
|
|
124
|
-
|
|
136
|
+
public_send(assoc).each{|x| x.this.update(column=>touch_association_value)}
|
|
125
137
|
else
|
|
126
138
|
# Update all values at once for performance reasons.
|
|
127
139
|
ds.update(column=>touch_association_value)
|
|
140
|
+
associations.delete(assoc)
|
|
128
141
|
end
|
|
129
142
|
end
|
|
130
143
|
end
|
data/lib/sequel/plugins/tree.rb
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
|
-
# The
|
|
5
|
+
# The tree plugin adds additional associations and methods that allow you to
|
|
4
6
|
# treat a Model as a tree.
|
|
5
7
|
#
|
|
6
8
|
# A column for holding the parent key is required and is :parent_id by default.
|
|
@@ -19,7 +21,7 @@ module Sequel
|
|
|
19
21
|
# end
|
|
20
22
|
#
|
|
21
23
|
# class Node < Sequel::Model
|
|
22
|
-
# plugin :tree, :
|
|
24
|
+
# plugin :tree, key: :parentid, order: :position
|
|
23
25
|
# end
|
|
24
26
|
module Tree
|
|
25
27
|
# Create parent and children associations. Any options
|
|
@@ -30,25 +32,27 @@ module Sequel
|
|
|
30
32
|
def self.apply(model, opts=OPTS)
|
|
31
33
|
opts = opts.dup
|
|
32
34
|
opts[:class] = model
|
|
35
|
+
opts[:key] ||= :parent_id
|
|
33
36
|
|
|
34
|
-
|
|
35
|
-
@parent_column = (opts[:key] ||= :parent_id)
|
|
36
|
-
@tree_order = opts[:order]
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
par = opts.merge(opts.fetch(:parent, {}))
|
|
37
|
+
par = opts.merge(opts.fetch(:parent, OPTS))
|
|
40
38
|
parent = par.fetch(:name, :parent)
|
|
41
39
|
|
|
42
|
-
chi = opts.merge(opts.fetch(:children,
|
|
40
|
+
chi = opts.merge(opts.fetch(:children, OPTS))
|
|
43
41
|
children = chi.fetch(:name, :children)
|
|
44
42
|
|
|
45
43
|
par[:reciprocal] = children
|
|
46
44
|
chi[:reciprocal] = parent
|
|
47
45
|
|
|
48
|
-
model.
|
|
49
|
-
|
|
46
|
+
model.instance_exec do
|
|
47
|
+
@parent_column = opts[:key]
|
|
48
|
+
@tree_order = opts[:order]
|
|
49
|
+
@parent_association_name = parent
|
|
50
|
+
@children_association_name = children
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
many_to_one parent, par
|
|
53
|
+
one_to_many children, chi
|
|
54
|
+
plugin SingleRoot if opts[:single_root]
|
|
55
|
+
end
|
|
52
56
|
end
|
|
53
57
|
|
|
54
58
|
module ClassMethods
|
|
@@ -59,22 +63,20 @@ module Sequel
|
|
|
59
63
|
# parent of the leaf.
|
|
60
64
|
attr_accessor :parent_column
|
|
61
65
|
|
|
62
|
-
|
|
66
|
+
# The association name for the parent association
|
|
67
|
+
attr_reader :parent_association_name
|
|
63
68
|
|
|
64
|
-
#
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
# The association name for the children association
|
|
70
|
+
attr_reader :children_association_name
|
|
71
|
+
|
|
72
|
+
Plugins.inherited_instance_variables(self, :@parent_column=>nil, :@tree_order=>nil, :@parent_association_name=>nil, :@children_association_name=>nil)
|
|
73
|
+
Plugins.def_dataset_methods(self, [:roots, :roots_dataset])
|
|
74
|
+
|
|
75
|
+
# Should freeze tree order if it is an array when freezing the model class.
|
|
76
|
+
def freeze
|
|
77
|
+
@tree_order.freeze if @tree_order.is_a?(Array)
|
|
70
78
|
|
|
71
|
-
|
|
72
|
-
#
|
|
73
|
-
# TreeClass.roots_dataset # => Sequel::Dataset instance
|
|
74
|
-
def roots_dataset
|
|
75
|
-
ds = where(Sequel.or(Array(parent_column).zip([])))
|
|
76
|
-
ds = ds.order(*tree_order) if tree_order
|
|
77
|
-
ds
|
|
79
|
+
super
|
|
78
80
|
end
|
|
79
81
|
end
|
|
80
82
|
|
|
@@ -84,7 +86,10 @@ module Sequel
|
|
|
84
86
|
# subchild1.ancestors # => [child1, root]
|
|
85
87
|
def ancestors
|
|
86
88
|
node, nodes = self, []
|
|
87
|
-
|
|
89
|
+
meth = model.parent_association_name
|
|
90
|
+
while par = node.send(meth)
|
|
91
|
+
nodes << node = par
|
|
92
|
+
end
|
|
88
93
|
nodes
|
|
89
94
|
end
|
|
90
95
|
|
|
@@ -92,8 +97,8 @@ module Sequel
|
|
|
92
97
|
#
|
|
93
98
|
# node.descendants # => [child1, child2, subchild1_1, subchild1_2, subchild2_1, subchild2_2]
|
|
94
99
|
def descendants
|
|
95
|
-
nodes =
|
|
96
|
-
|
|
100
|
+
nodes = send(model.children_association_name).dup
|
|
101
|
+
send(model.children_association_name).each{|child| nodes.concat(child.descendants)}
|
|
97
102
|
nodes
|
|
98
103
|
end
|
|
99
104
|
|
|
@@ -112,7 +117,11 @@ module Sequel
|
|
|
112
117
|
#
|
|
113
118
|
# subchild1.self_and_siblings # => [subchild1, subchild2]
|
|
114
119
|
def self_and_siblings
|
|
115
|
-
|
|
120
|
+
if parent = send(model.parent_association_name)
|
|
121
|
+
parent.send(model.children_association_name)
|
|
122
|
+
else
|
|
123
|
+
model.roots
|
|
124
|
+
end
|
|
116
125
|
end
|
|
117
126
|
|
|
118
127
|
# Returns all siblings of the current node.
|
|
@@ -130,6 +139,24 @@ module Sequel
|
|
|
130
139
|
end
|
|
131
140
|
end
|
|
132
141
|
|
|
142
|
+
module DatasetMethods
|
|
143
|
+
# Returns list of all root nodes (those with no parent nodes).
|
|
144
|
+
#
|
|
145
|
+
# TreeClass.roots # => [root1, root2]
|
|
146
|
+
def roots
|
|
147
|
+
roots_dataset.all
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Returns the dataset for retrieval of all root nodes
|
|
151
|
+
#
|
|
152
|
+
# TreeClass.roots_dataset # => Sequel::Dataset instance
|
|
153
|
+
def roots_dataset
|
|
154
|
+
ds = where(Sequel.or(Array(model.parent_column).zip([])))
|
|
155
|
+
ds = ds.order(*model.tree_order) if model.tree_order
|
|
156
|
+
ds
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
133
160
|
# Plugin included when :single_root option is passed.
|
|
134
161
|
module SingleRoot
|
|
135
162
|
module ClassMethods
|