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 pg_row plugin allows you to use Sequel::Model classes as composite type
|
|
@@ -39,64 +41,21 @@ module Sequel
|
|
|
39
41
|
#
|
|
40
42
|
# Address.register_row_type
|
|
41
43
|
#
|
|
42
|
-
# Note that automatic conversion only works with the native postgres adapter.
|
|
43
|
-
# For other adapters that connect to PostgreSQL, you need to call the conversion
|
|
44
|
-
# proc manually.
|
|
45
|
-
#
|
|
46
44
|
# In addition to returning row-valued/composite types as instances of Sequel::Model,
|
|
47
45
|
# this also lets you use model instances in datasets when inserting, updating, and
|
|
48
46
|
# filtering:
|
|
49
47
|
#
|
|
50
|
-
# DB[:company].insert(:
|
|
51
|
-
# Address.load(:
|
|
48
|
+
# DB[:company].insert(name: 'MS', address:
|
|
49
|
+
# Address.load(street: '123 Foo St', city: 'Bar Town', zip: '12345'))
|
|
52
50
|
module PgRow
|
|
53
51
|
# When loading the extension, make sure the database has the pg_row extension
|
|
54
52
|
# loaded, load the custom database extensions, and automatically register the
|
|
55
53
|
# row type if the model has a dataset.
|
|
56
54
|
def self.configure(model)
|
|
57
|
-
model.db.extension(:pg_row)
|
|
58
|
-
model.db.extend(DatabaseMethods)
|
|
55
|
+
model.db.extension(:pg_row, :_model_pg_row)
|
|
59
56
|
model.register_row_type if model.instance_variable_get(:@dataset)
|
|
60
57
|
end
|
|
61
58
|
|
|
62
|
-
module DatabaseMethods
|
|
63
|
-
ESCAPE_RE = /("|\\)/.freeze
|
|
64
|
-
ESCAPE_REPLACEMENT = '\\\\\1'.freeze
|
|
65
|
-
COMMA = ','
|
|
66
|
-
|
|
67
|
-
# Handle Sequel::Model instances in bound variables.
|
|
68
|
-
def bound_variable_arg(arg, conn)
|
|
69
|
-
case arg
|
|
70
|
-
when Sequel::Model
|
|
71
|
-
"(#{arg.values.values_at(*arg.columns).map{|v| bound_variable_array(v)}.join(COMMA)})"
|
|
72
|
-
else
|
|
73
|
-
super
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# If a Sequel::Model instance is given, return it as-is
|
|
78
|
-
# instead of attempting to convert it.
|
|
79
|
-
def row_type(db_type, v)
|
|
80
|
-
if v.is_a?(Sequel::Model)
|
|
81
|
-
v
|
|
82
|
-
else
|
|
83
|
-
super
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
private
|
|
88
|
-
|
|
89
|
-
# Handle Sequel::Model instances in bound variable arrays.
|
|
90
|
-
def bound_variable_array(arg)
|
|
91
|
-
case arg
|
|
92
|
-
when Sequel::Model
|
|
93
|
-
"\"(#{arg.values.values_at(*arg.columns).map{|v| bound_variable_array(v)}.join(COMMA).gsub(ESCAPE_RE, ESCAPE_REPLACEMENT)})\""
|
|
94
|
-
else
|
|
95
|
-
super
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
59
|
module ClassMethods
|
|
101
60
|
# Register the model's row type with the database.
|
|
102
61
|
def register_row_type
|
|
@@ -107,14 +66,11 @@ module Sequel
|
|
|
107
66
|
end
|
|
108
67
|
|
|
109
68
|
module InstanceMethods
|
|
110
|
-
ROW = 'ROW'.freeze
|
|
111
|
-
CAST = '::'.freeze
|
|
112
|
-
|
|
113
69
|
# Literalize the model instance and append it to the sql.
|
|
114
70
|
def sql_literal_append(ds, sql)
|
|
115
|
-
sql << ROW
|
|
71
|
+
sql << 'ROW'
|
|
116
72
|
ds.literal_append(sql, values.values_at(*columns))
|
|
117
|
-
sql <<
|
|
73
|
+
sql << '::'
|
|
118
74
|
ds.quote_schema_table_append(sql, model.dataset.first_source_table)
|
|
119
75
|
end
|
|
120
76
|
end
|
|
@@ -1,24 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
class Model
|
|
3
|
-
module InstanceMethods
|
|
4
|
-
# Whether prepared statements should be used for the given type of query
|
|
5
|
-
# (:insert, :insert_select, :refresh, :update, or :delete). True by default,
|
|
6
|
-
# can be overridden in other plugins to disallow prepared statements for
|
|
7
|
-
# specific types of queries.
|
|
8
|
-
def use_prepared_statements_for?(type)
|
|
9
|
-
true
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
1
|
+
# frozen-string-literal: true
|
|
13
2
|
|
|
3
|
+
module Sequel
|
|
14
4
|
module Plugins
|
|
15
5
|
# The prepared_statements plugin modifies the model to use prepared statements for
|
|
16
|
-
# instance level
|
|
17
|
-
# primary key.
|
|
6
|
+
# instance level inserts and updates.
|
|
18
7
|
#
|
|
19
8
|
# Note that this plugin is unsafe in some circumstances, as it can allow up to
|
|
20
9
|
# 2^N prepared statements to be created for each type of insert and update query, where
|
|
21
|
-
# N is the number of
|
|
10
|
+
# N is the number of columns in the table. It is recommended that you use the
|
|
22
11
|
# +prepared_statements_safe+ plugin in addition to this plugin to reduce the number
|
|
23
12
|
# of prepared statements that can be created, unless you tightly control how your
|
|
24
13
|
# model instances are saved.
|
|
@@ -41,22 +30,20 @@ module Sequel
|
|
|
41
30
|
|
|
42
31
|
# Setup the datastructure used to hold the prepared statements in the model.
|
|
43
32
|
def self.apply(model)
|
|
44
|
-
model.instance_variable_set(:@prepared_statements, :insert=>{}, :insert_select=>{}, :update=>{}
|
|
33
|
+
model.instance_variable_set(:@prepared_statements, {:insert=>{}, :insert_select=>{}, :update=>{}}.freeze)
|
|
45
34
|
end
|
|
46
35
|
|
|
47
36
|
module ClassMethods
|
|
48
|
-
Plugins.inherited_instance_variables(self, :@prepared_statements=>lambda{|v| {:insert=>{}, :insert_select=>{}, :update=>{}
|
|
37
|
+
Plugins.inherited_instance_variables(self, :@prepared_statements=>lambda{|v| {:insert=>{}, :insert_select=>{}, :update=>{}}.freeze})
|
|
49
38
|
|
|
50
39
|
private
|
|
51
40
|
|
|
52
41
|
# Create a prepared statement, but modify the SQL used so that the model's columns are explicitly
|
|
53
42
|
# selected instead of using *, assuming that the dataset selects from a single table.
|
|
54
43
|
def prepare_explicit_statement(ds, type, vals=OPTS)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if f && f.length == 1 && !ds.opts[:join] && (!s || s.empty?)
|
|
59
|
-
ds = ds.send(meth, *columns.map{|c| Sequel.identifier(c)})
|
|
44
|
+
s = ds.opts[:returning]
|
|
45
|
+
if !s || s.empty?
|
|
46
|
+
ds = ds.returning(*columns.map{|c| Sequel.identifier(c)})
|
|
60
47
|
end
|
|
61
48
|
|
|
62
49
|
prepare_statement(ds, type, vals)
|
|
@@ -65,19 +52,12 @@ module Sequel
|
|
|
65
52
|
# Create a prepared statement based on the given dataset with a unique name for the given
|
|
66
53
|
# type of query and values.
|
|
67
54
|
def prepare_statement(ds, type, vals=OPTS)
|
|
68
|
-
|
|
69
|
-
ps.log_sql = true
|
|
70
|
-
ps
|
|
55
|
+
ds.clone(:log_sql=>true).prepare(type, :"smpsp_#{NEXT.call}", vals)
|
|
71
56
|
end
|
|
72
57
|
|
|
73
58
|
# Return a sorted array of columns for use as a hash key.
|
|
74
59
|
def prepared_columns(cols)
|
|
75
|
-
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Return a prepared statement that can be used to delete a row from this model's dataset.
|
|
79
|
-
def prepared_delete
|
|
80
|
-
cached_prepared_statement(:fixed, :delete){prepare_statement(filter(prepared_statement_key_array(primary_key)), :delete)}
|
|
60
|
+
cols.sort
|
|
81
61
|
end
|
|
82
62
|
|
|
83
63
|
# Return a prepared statement that can be used to insert a row using the given columns.
|
|
@@ -88,19 +68,7 @@ module Sequel
|
|
|
88
68
|
# Return a prepared statement that can be used to insert a row using the given columns
|
|
89
69
|
# and return that column values for the row created.
|
|
90
70
|
def prepared_insert_select(cols)
|
|
91
|
-
|
|
92
|
-
cached_prepared_statement(:insert_select, prepared_columns(cols)){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)), :insert_select, prepared_statement_key_hash(cols))}
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
# Return a prepared statement that can be used to lookup a row solely based on the primary key.
|
|
97
|
-
def prepared_lookup
|
|
98
|
-
cached_prepared_statement(:fixed, :lookup){prepare_explicit_statement(filter(prepared_statement_key_array(primary_key)), :first)}
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# Return a prepared statement that can be used to refresh a row to get new column values after insertion.
|
|
102
|
-
def prepared_refresh
|
|
103
|
-
cached_prepared_statement(:fixed, :refresh){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)).filter(prepared_statement_key_array(primary_key)), :first)}
|
|
71
|
+
cached_prepared_statement(:insert_select, prepared_columns(cols)){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)), :insert_select, prepared_statement_key_hash(cols))}
|
|
104
72
|
end
|
|
105
73
|
|
|
106
74
|
# Return an array of two element arrays with the column symbol as the first entry and the
|
|
@@ -127,12 +95,7 @@ module Sequel
|
|
|
127
95
|
|
|
128
96
|
# Return a prepared statement that can be used to update row using the given columns.
|
|
129
97
|
def prepared_update(cols)
|
|
130
|
-
cached_prepared_statement(:update, prepared_columns(cols)){prepare_statement(
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# Use a prepared statement to query the database for the row matching the given primary key.
|
|
134
|
-
def primary_key_lookup(pk)
|
|
135
|
-
prepared_lookup.call(primary_key_hash(pk))
|
|
98
|
+
cached_prepared_statement(:update, prepared_columns(cols)){prepare_statement(where(prepared_statement_key_array(primary_key)), :update, prepared_statement_key_hash(cols))}
|
|
136
99
|
end
|
|
137
100
|
|
|
138
101
|
# If a prepared statement has already been cached for the given type and subtype,
|
|
@@ -147,24 +110,21 @@ module Sequel
|
|
|
147
110
|
ps = yield
|
|
148
111
|
Sequel.synchronize{h[subtype] = ps}
|
|
149
112
|
end
|
|
113
|
+
|
|
114
|
+
# Whether to use prepared statements for lookups by primary key. True if the default
|
|
115
|
+
# primary key lookup isn't optimized.
|
|
116
|
+
def use_prepared_statements_for_pk_lookup?
|
|
117
|
+
!@fast_pk_lookup_sql && !dataset.joined_dataset?
|
|
118
|
+
end
|
|
150
119
|
end
|
|
151
120
|
|
|
152
121
|
module InstanceMethods
|
|
153
122
|
private
|
|
154
123
|
|
|
155
|
-
# Use a prepared statement to delete the row.
|
|
156
|
-
def _delete_without_checking
|
|
157
|
-
if use_prepared_statements_for?(:delete)
|
|
158
|
-
model.send(:prepared_delete).call(pk_hash)
|
|
159
|
-
else
|
|
160
|
-
super
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
|
|
164
124
|
# Use a prepared statement to insert the values into the model's dataset.
|
|
165
125
|
def _insert_raw(ds)
|
|
166
126
|
if use_prepared_statements_for?(:insert)
|
|
167
|
-
model.send(:prepared_insert, @values.keys).call(@values)
|
|
127
|
+
_set_prepared_statement_server(model.send(:prepared_insert, @values.keys)).call(@values)
|
|
168
128
|
else
|
|
169
129
|
super
|
|
170
130
|
end
|
|
@@ -174,29 +134,50 @@ module Sequel
|
|
|
174
134
|
# and return the new column values.
|
|
175
135
|
def _insert_select_raw(ds)
|
|
176
136
|
if use_prepared_statements_for?(:insert_select)
|
|
177
|
-
|
|
178
|
-
ps.call(@values)
|
|
179
|
-
end
|
|
137
|
+
_set_prepared_statement_server(model.send(:prepared_insert_select, @values.keys)).call(@values)
|
|
180
138
|
else
|
|
181
139
|
super
|
|
182
140
|
end
|
|
183
141
|
end
|
|
184
142
|
|
|
185
|
-
# Use a prepared statement to
|
|
186
|
-
def
|
|
187
|
-
if use_prepared_statements_for?(:
|
|
188
|
-
model.send(:
|
|
143
|
+
# Use a prepared statement to update this model's columns in the database.
|
|
144
|
+
def _update_without_checking(columns)
|
|
145
|
+
if use_prepared_statements_for?(:update)
|
|
146
|
+
_set_prepared_statement_server(model.send(:prepared_update, columns.keys)).call(columns.merge(pk_hash))
|
|
189
147
|
else
|
|
190
148
|
super
|
|
191
149
|
end
|
|
192
150
|
end
|
|
193
151
|
|
|
194
|
-
#
|
|
195
|
-
def
|
|
196
|
-
if
|
|
197
|
-
|
|
152
|
+
# If a server is set for the instance, return a prepared statement that will use that server.
|
|
153
|
+
def _set_prepared_statement_server(ps)
|
|
154
|
+
if @server
|
|
155
|
+
ps.server(@server)
|
|
198
156
|
else
|
|
199
|
-
|
|
157
|
+
ps
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Whether prepared statements should be used for the given type of query
|
|
162
|
+
# (:insert, :insert_select, :update). True by default,
|
|
163
|
+
# can be overridden in other plugins to disallow prepared statements for
|
|
164
|
+
# specific types of queries.
|
|
165
|
+
def use_prepared_statements_for?(type)
|
|
166
|
+
if defined?(super)
|
|
167
|
+
result = super
|
|
168
|
+
return result unless result.nil?
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
case type
|
|
172
|
+
when :insert, :insert_select, :update
|
|
173
|
+
true
|
|
174
|
+
# :nocov:
|
|
175
|
+
when :delete, :refresh
|
|
176
|
+
Sequel::Deprecation.deprecate("The :delete and :refresh prepared statement types", "There should be no need to check if these types are supported")
|
|
177
|
+
false
|
|
178
|
+
# :nocov:
|
|
179
|
+
else
|
|
180
|
+
raise Error, "unsupported type used: #{type.inspect}"
|
|
200
181
|
end
|
|
201
182
|
end
|
|
202
183
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# The prepared_statements_safe plugin modifies the model to reduce the number of
|
|
@@ -26,7 +28,7 @@ module Sequel
|
|
|
26
28
|
end
|
|
27
29
|
|
|
28
30
|
module ClassMethods
|
|
29
|
-
# A hash with column symbol keys and default values. Instance
|
|
31
|
+
# A hash with column symbol keys and default values. Instance
|
|
30
32
|
# values are merged into this hash before creating to reduce the
|
|
31
33
|
# number of free columns (columns that may or may not be present
|
|
32
34
|
# in the INSERT statement), as the number of prepared statements
|
|
@@ -36,6 +38,13 @@ module Sequel
|
|
|
36
38
|
Plugins.inherited_instance_variables(self, :@prepared_statements_column_defaults=>:dup)
|
|
37
39
|
Plugins.after_set_dataset(self, :set_prepared_statements_column_defaults)
|
|
38
40
|
|
|
41
|
+
# Freeze the prepared statements column defaults when freezing the model class.
|
|
42
|
+
def freeze
|
|
43
|
+
@prepared_statements_column_defaults.freeze if @prepared_statements_column_defaults
|
|
44
|
+
|
|
45
|
+
super
|
|
46
|
+
end
|
|
47
|
+
|
|
39
48
|
private
|
|
40
49
|
|
|
41
50
|
# Set the column defaults based on the database schema. All columns
|
|
@@ -45,7 +54,8 @@ module Sequel
|
|
|
45
54
|
if db_schema
|
|
46
55
|
h = {}
|
|
47
56
|
db_schema.each do |k, v|
|
|
48
|
-
|
|
57
|
+
default = v[:ruby_default]
|
|
58
|
+
h[k] = default if (default || !v[:default]) && !v[:primary_key] && !default.is_a?(Sequel::SQL::Expression)
|
|
49
59
|
end
|
|
50
60
|
@prepared_statements_column_defaults = h
|
|
51
61
|
end
|
|
@@ -56,9 +66,7 @@ module Sequel
|
|
|
56
66
|
# Merge the current values into the default values to reduce the number
|
|
57
67
|
# of free columns.
|
|
58
68
|
def before_create
|
|
59
|
-
|
|
60
|
-
@values = Hash[v].merge!(values)
|
|
61
|
-
end
|
|
69
|
+
@values = model.prepared_statements_column_defaults.merge(@values)
|
|
62
70
|
super
|
|
63
71
|
end
|
|
64
72
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# = Overview
|
|
@@ -10,26 +12,6 @@ module Sequel
|
|
|
10
12
|
# level (where level 1 is children, level 2 is children and grandchildren
|
|
11
13
|
# etc.) in a single query.
|
|
12
14
|
#
|
|
13
|
-
# = Background
|
|
14
|
-
#
|
|
15
|
-
# There are two types of common models for storing tree structured data
|
|
16
|
-
# in an SQL database, the adjacency list model and the nested set model.
|
|
17
|
-
# Before recursive common table expressions (or similar capabilities such
|
|
18
|
-
# as CONNECT BY for Oracle), the nested set model was the only easy way
|
|
19
|
-
# to retrieve all ancestors and descendants in a single query. However,
|
|
20
|
-
# it has significant performance corner cases.
|
|
21
|
-
#
|
|
22
|
-
# On PostgreSQL 8.4, with a significant number of rows, the nested set
|
|
23
|
-
# model is almost 500 times slower than using a recursive common table
|
|
24
|
-
# expression with the adjacency list model to get all descendants, and
|
|
25
|
-
# almost 24,000 times slower to get all descendants to a given level.
|
|
26
|
-
#
|
|
27
|
-
# Considering that the nested set model requires more difficult management
|
|
28
|
-
# than the adjacency list model, it's almost always better to use the
|
|
29
|
-
# adjacency list model if your database supports common table expressions.
|
|
30
|
-
# See http://explainextended.com/2009/09/24/adjacency-list-vs-nested-sets-postgresql/
|
|
31
|
-
# for detailed analysis.
|
|
32
|
-
#
|
|
33
15
|
# = Usage
|
|
34
16
|
#
|
|
35
17
|
# The rcte_tree plugin adds four associations to the model: parent, children, ancestors, and
|
|
@@ -54,12 +36,12 @@ module Sequel
|
|
|
54
36
|
#
|
|
55
37
|
# # Eager loading - also populates the :parent and children associations
|
|
56
38
|
# # for all ancestors and descendants
|
|
57
|
-
# Model.
|
|
39
|
+
# Model.where(id: [1, 2]).eager(:ancestors, :descendants).all
|
|
58
40
|
#
|
|
59
|
-
# # Eager loading children and
|
|
60
|
-
# Model.
|
|
61
|
-
# # Eager loading children,
|
|
62
|
-
# Model.
|
|
41
|
+
# # Eager loading children and grandchildren
|
|
42
|
+
# Model.where(id: [1, 2]).eager(descendants: 2).all
|
|
43
|
+
# # Eager loading children, grandchildren, and great grandchildren
|
|
44
|
+
# Model.where(id: [1, 2]).eager(descendants: 3).all
|
|
63
45
|
#
|
|
64
46
|
# = Options
|
|
65
47
|
#
|
|
@@ -74,8 +56,8 @@ module Sequel
|
|
|
74
56
|
# Note that you can change the name of the above associations by specifying
|
|
75
57
|
# a :name key in the appropriate hash of options above. For example:
|
|
76
58
|
#
|
|
77
|
-
# Model.plugin :rcte_tree, :
|
|
78
|
-
# :
|
|
59
|
+
# Model.plugin :rcte_tree, parent: {name: :mother},
|
|
60
|
+
# children: {name: :daughters}, descendants: {name: :offspring}
|
|
79
61
|
#
|
|
80
62
|
# Any other keys in the main options hash are treated as options shared by
|
|
81
63
|
# all of the associations. Here's a few options that affect the plugin:
|
|
@@ -123,7 +105,6 @@ module Sequel
|
|
|
123
105
|
key_present = lambda{|m| key_conv[m].all?}
|
|
124
106
|
prkey_conv = lambda{|m| prkey_array.map{|k| m[k]}}
|
|
125
107
|
key_aliases = (0...key_array.length).map{|i| :"#{ka}_#{i}"}
|
|
126
|
-
ka_conv = lambda{|m| key_aliases.map{|k| m[k]}}
|
|
127
108
|
ancestor_base_case_columns = prkey_array.zip(key_aliases).map{|k, ka_| SQL::AliasedExpression.new(k, ka_)} + c_all
|
|
128
109
|
descendant_base_case_columns = key_array.zip(key_aliases).map{|k, ka_| SQL::AliasedExpression.new(k, ka_)} + c_all
|
|
129
110
|
recursive_case_columns = prkey_array.zip(key_aliases).map{|k, ka_| SQL::QualifiedIdentifier.new(t, ka_)} + c_all
|
|
@@ -132,27 +113,29 @@ module Sequel
|
|
|
132
113
|
key_present = key_conv = lambda{|m| m[key]}
|
|
133
114
|
prkey_conv = lambda{|m| m[prkey]}
|
|
134
115
|
key_aliases = [ka]
|
|
135
|
-
ka_conv = lambda{|m| m[ka]}
|
|
136
116
|
ancestor_base_case_columns = [SQL::AliasedExpression.new(prkey, ka)] + c_all
|
|
137
117
|
descendant_base_case_columns = [SQL::AliasedExpression.new(key, ka)] + c_all
|
|
138
118
|
recursive_case_columns = [SQL::QualifiedIdentifier.new(t, ka)] + c_all
|
|
139
119
|
extract_key_alias = lambda{|m| bd_conv[m.values.delete(ka)]}
|
|
140
120
|
end
|
|
141
121
|
|
|
142
|
-
parent = opts.merge(opts.fetch(:parent,
|
|
143
|
-
childrena = opts.merge(opts.fetch(:children,
|
|
122
|
+
parent = opts.merge(opts.fetch(:parent, OPTS)).fetch(:name, :parent)
|
|
123
|
+
childrena = opts.merge(opts.fetch(:children, OPTS)).fetch(:name, :children)
|
|
144
124
|
|
|
145
125
|
opts[:reciprocal] = nil
|
|
146
|
-
a = opts.merge(opts.fetch(:ancestors,
|
|
126
|
+
a = opts.merge(opts.fetch(:ancestors, OPTS))
|
|
147
127
|
ancestors = a.fetch(:name, :ancestors)
|
|
148
128
|
a[:read_only] = true unless a.has_key?(:read_only)
|
|
129
|
+
a[:eager_grapher] = proc do |_|
|
|
130
|
+
raise Sequel::Error, "the #{ancestors} association for #{self} does not support eager graphing"
|
|
131
|
+
end
|
|
149
132
|
a[:eager_loader_key] = key
|
|
150
133
|
a[:dataset] ||= proc do
|
|
151
|
-
base_ds = model.
|
|
134
|
+
base_ds = model.where(prkey_array.zip(key_array.map{|k| get_column_value(k)}))
|
|
152
135
|
recursive_ds = model.join(t, key_array.zip(prkey_array))
|
|
153
136
|
if c = a[:conditions]
|
|
154
|
-
(base_ds, recursive_ds) = [base_ds, recursive_ds].
|
|
155
|
-
(c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.
|
|
137
|
+
(base_ds, recursive_ds) = [base_ds, recursive_ds].map do |ds|
|
|
138
|
+
(c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.where(*c) : ds.where(c)
|
|
156
139
|
end
|
|
157
140
|
end
|
|
158
141
|
table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
|
|
@@ -194,13 +177,13 @@ module Sequel
|
|
|
194
177
|
obj.associations[parent] = nil
|
|
195
178
|
end
|
|
196
179
|
r = model.association_reflection(ancestors)
|
|
197
|
-
base_case = model.
|
|
180
|
+
base_case = model.where(prkey=>id_map.keys).
|
|
198
181
|
select(*ancestor_base_case_columns)
|
|
199
182
|
recursive_case = model.join(t, key_array.zip(prkey_array)).
|
|
200
183
|
select(*recursive_case_columns)
|
|
201
184
|
if c = r[:conditions]
|
|
202
|
-
(base_case, recursive_case) = [base_case, recursive_case].
|
|
203
|
-
(c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.
|
|
185
|
+
(base_case, recursive_case) = [base_case, recursive_case].map do |ds|
|
|
186
|
+
(c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.where(*c) : ds.where(c)
|
|
204
187
|
end
|
|
205
188
|
end
|
|
206
189
|
table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
|
|
@@ -209,23 +192,19 @@ module Sequel
|
|
|
209
192
|
:args=>((key_aliases + col_aliases) if col_aliases))
|
|
210
193
|
ds = r.apply_eager_dataset_changes(ds)
|
|
211
194
|
ds = ds.select_append(ka) unless ds.opts[:select] == nil
|
|
212
|
-
model.eager_load_results(r, eo.merge(:loader=>false, :
|
|
195
|
+
model.eager_load_results(r, eo.merge(:loader=>false, :initialize_rows=>false, :dataset=>ds, :id_map=>nil)) do |obj|
|
|
213
196
|
opk = prkey_conv[obj]
|
|
214
|
-
if parent_map
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
obj = idm_obj
|
|
218
|
-
end
|
|
197
|
+
if idm_obj = parent_map[opk]
|
|
198
|
+
key_aliases.each{|ka_| idm_obj.values[ka_] = obj.values[ka_]}
|
|
199
|
+
obj = idm_obj
|
|
219
200
|
else
|
|
220
201
|
obj.associations[parent] = nil
|
|
221
202
|
parent_map[opk] = obj
|
|
222
203
|
(children_map[key_conv[obj]] ||= []) << obj
|
|
223
204
|
end
|
|
224
205
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
root.associations[ancestors] << obj
|
|
228
|
-
end
|
|
206
|
+
id_map[extract_key_alias[obj]].each do |root|
|
|
207
|
+
root.associations[ancestors] << obj
|
|
229
208
|
end
|
|
230
209
|
end
|
|
231
210
|
parent_map.each do |parent_id, obj|
|
|
@@ -238,16 +217,19 @@ module Sequel
|
|
|
238
217
|
end
|
|
239
218
|
model.one_to_many ancestors, a
|
|
240
219
|
|
|
241
|
-
d = opts.merge(opts.fetch(:descendants,
|
|
220
|
+
d = opts.merge(opts.fetch(:descendants, OPTS))
|
|
242
221
|
descendants = d.fetch(:name, :descendants)
|
|
243
222
|
d[:read_only] = true unless d.has_key?(:read_only)
|
|
223
|
+
d[:eager_grapher] = proc do |_|
|
|
224
|
+
raise Sequel::Error, "the #{descendants} association for #{self} does not support eager graphing"
|
|
225
|
+
end
|
|
244
226
|
la = d[:level_alias] ||= :x_level_x
|
|
245
227
|
d[:dataset] ||= proc do
|
|
246
|
-
base_ds = model.
|
|
228
|
+
base_ds = model.where(key_array.zip(prkey_array.map{|k| get_column_value(k)}))
|
|
247
229
|
recursive_ds = model.join(t, prkey_array.zip(key_array))
|
|
248
230
|
if c = d[:conditions]
|
|
249
|
-
(base_ds, recursive_ds) = [base_ds, recursive_ds].
|
|
250
|
-
(c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.
|
|
231
|
+
(base_ds, recursive_ds) = [base_ds, recursive_ds].map do |ds|
|
|
232
|
+
(c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.where(*c) : ds.where(c)
|
|
251
233
|
end
|
|
252
234
|
end
|
|
253
235
|
table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
|
|
@@ -292,21 +274,21 @@ module Sequel
|
|
|
292
274
|
obj.associations[childrena] = []
|
|
293
275
|
end
|
|
294
276
|
r = model.association_reflection(descendants)
|
|
295
|
-
base_case = model.
|
|
277
|
+
base_case = model.where(key=>id_map.keys).
|
|
296
278
|
select(*descendant_base_case_columns)
|
|
297
279
|
recursive_case = model.join(t, prkey_array.zip(key_array)).
|
|
298
280
|
select(*recursive_case_columns)
|
|
299
281
|
if c = r[:conditions]
|
|
300
|
-
(base_case, recursive_case) = [base_case, recursive_case].
|
|
301
|
-
(c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.
|
|
282
|
+
(base_case, recursive_case) = [base_case, recursive_case].map do |ds|
|
|
283
|
+
(c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.where(*c) : ds.where(c)
|
|
302
284
|
end
|
|
303
285
|
end
|
|
304
286
|
if associations.is_a?(Integer)
|
|
305
287
|
level = associations
|
|
306
288
|
no_cache_level = level - 1
|
|
307
289
|
associations = {}
|
|
308
|
-
base_case = base_case.
|
|
309
|
-
recursive_case = recursive_case.
|
|
290
|
+
base_case = base_case.select_append(SQL::AliasedExpression.new(Sequel.cast(0, Integer), la))
|
|
291
|
+
recursive_case = recursive_case.select_append(SQL::AliasedExpression.new(SQL::QualifiedIdentifier.new(t, la) + 1, la)).where(SQL::QualifiedIdentifier.new(t, la) < level - 1)
|
|
310
292
|
end
|
|
311
293
|
table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
|
|
312
294
|
ds = model.from(SQL::AliasedExpression.new(t, table_alias)).
|
|
@@ -314,17 +296,15 @@ module Sequel
|
|
|
314
296
|
:args=>((key_aliases + col_aliases + (level ? [la] : [])) if col_aliases))
|
|
315
297
|
ds = r.apply_eager_dataset_changes(ds)
|
|
316
298
|
ds = ds.select_append(ka) unless ds.opts[:select] == nil
|
|
317
|
-
model.eager_load_results(r, eo.merge(:loader=>false, :
|
|
299
|
+
model.eager_load_results(r, eo.merge(:loader=>false, :initialize_rows=>false, :dataset=>ds, :id_map=>nil, :associations=>OPTS)) do |obj|
|
|
318
300
|
if level
|
|
319
301
|
no_cache = no_cache_level == obj.values.delete(la)
|
|
320
302
|
end
|
|
321
303
|
|
|
322
304
|
opk = prkey_conv[obj]
|
|
323
|
-
if parent_map
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
obj = idm_obj
|
|
327
|
-
end
|
|
305
|
+
if idm_obj = parent_map[opk]
|
|
306
|
+
key_aliases.each{|ka_| idm_obj.values[ka_] = obj.values[ka_]}
|
|
307
|
+
obj = idm_obj
|
|
328
308
|
else
|
|
329
309
|
obj.associations[childrena] = [] unless no_cache
|
|
330
310
|
parent_map[opk] = obj
|