sequel 5.20.0 → 5.49.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 +4 -4
- data/CHANGELOG +398 -1922
- data/MIT-LICENSE +1 -1
- data/README.rdoc +7 -7
- data/doc/advanced_associations.rdoc +4 -4
- data/doc/association_basics.rdoc +80 -16
- data/doc/cheat_sheet.rdoc +6 -5
- data/doc/code_order.rdoc +10 -12
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/fork_safety.rdoc +84 -0
- data/doc/migration.rdoc +11 -5
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +10 -2
- data/doc/postgresql.rdoc +82 -3
- data/doc/querying.rdoc +4 -4
- 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.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.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/sharding.rdoc +2 -0
- data/doc/sql.rdoc +13 -1
- data/doc/testing.rdoc +20 -7
- data/doc/transactions.rdoc +0 -8
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ado/access.rb +1 -1
- data/lib/sequel/adapters/ado.rb +43 -35
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
- data/lib/sequel/adapters/jdbc.rb +24 -6
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +2 -3
- data/lib/sequel/adapters/odbc.rb +8 -6
- data/lib/sequel/adapters/oracle.rb +5 -4
- data/lib/sequel/adapters/postgres.rb +15 -9
- data/lib/sequel/adapters/shared/access.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +66 -21
- data/lib/sequel/adapters/shared/mysql.rb +27 -10
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +271 -32
- data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
- data/lib/sequel/adapters/shared/sqlite.rb +161 -19
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +15 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
- data/lib/sequel/ast_transformer.rb +6 -0
- data/lib/sequel/connection_pool/sharded_single.rb +4 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/core.rb +333 -319
- data/lib/sequel/database/connecting.rb +3 -4
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +31 -12
- data/lib/sequel/database/query.rb +3 -1
- data/lib/sequel/database/schema_generator.rb +53 -51
- data/lib/sequel/database/schema_methods.rb +38 -23
- data/lib/sequel/database/transactions.rb +17 -18
- data/lib/sequel/dataset/actions.rb +14 -9
- data/lib/sequel/dataset/features.rb +16 -0
- data/lib/sequel/dataset/misc.rb +2 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/query.rb +26 -9
- data/lib/sequel/dataset/sql.rb +76 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +2 -2
- data/lib/sequel/extensions/connection_validator.rb +2 -2
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/date_arithmetic.rb +36 -24
- data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
- data/lib/sequel/extensions/eval_inspect.rb +2 -0
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/inflector.rb +9 -1
- data/lib/sequel/extensions/integer64.rb +2 -0
- data/lib/sequel/extensions/migration.rb +11 -3
- data/lib/sequel/extensions/named_timezones.rb +56 -8
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +5 -0
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +11 -3
- data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +36 -8
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +238 -0
- data/lib/sequel/extensions/pg_loose_count.rb +3 -1
- data/lib/sequel/extensions/pg_range.rb +17 -9
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +4 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +3 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +24 -7
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +1 -1
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model/associations.rb +356 -117
- data/lib/sequel/model/base.rb +107 -68
- data/lib/sequel/model/errors.rb +10 -1
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model/plugins.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- 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 +60 -18
- data/lib/sequel/plugins/association_proxies.rb +8 -2
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_validations.rb +39 -5
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/composition.rb +7 -2
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +2 -1
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/dataset_associations.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/json_serializer.rb +57 -35
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +108 -9
- data/lib/sequel/plugins/nested_attributes.rb +15 -3
- data/lib/sequel/plugins/pg_array_associations.rb +58 -41
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
- data/lib/sequel/plugins/prepared_statements.rb +15 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +43 -35
- data/lib/sequel/plugins/serialization.rb +8 -3
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +11 -5
- data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +9 -4
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/throw_failures.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/tree.rb +9 -4
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +1 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -1
- data/lib/sequel/plugins/validation_helpers.rb +18 -11
- data/lib/sequel/plugins/xml_serializer.rb +1 -1
- data/lib/sequel/sql.rb +20 -5
- data/lib/sequel/timezones.rb +63 -17
- data/lib/sequel/version.rb +1 -1
- metadata +113 -381
- data/Rakefile +0 -151
- 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.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- 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/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1065
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4125
- data/spec/adapters/spec_helper.rb +0 -44
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -652
- data/spec/bin_spec.rb +0 -278
- data/spec/core/connection_pool_spec.rb +0 -1250
- data/spec/core/database_spec.rb +0 -2865
- data/spec/core/dataset_spec.rb +0 -5515
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1455
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -336
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1826
- data/spec/core/spec_helper.rb +0 -24
- data/spec/core/version_spec.rb +0 -14
- data/spec/core_extensions_spec.rb +0 -763
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -28
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -229
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/caller_logging_spec.rb +0 -52
- data/spec/extensions/class_table_inheritance_spec.rb +0 -750
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -151
- data/spec/extensions/connection_validator_spec.rb +0 -144
- data/spec/extensions/constant_sql_override_spec.rb +0 -24
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -439
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -150
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/eager_graph_eager_spec.rb +0 -100
- 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/escaped_like_spec.rb +0 -40
- data/spec/extensions/eval_inspect_spec.rb +0 -81
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -402
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -291
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -864
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -111
- data/spec/extensions/nested_attributes_spec.rb +0 -767
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
- data/spec/extensions/pg_enum_spec.rb +0 -118
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -519
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -177
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -870
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -63
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -471
- data/spec/extensions/string_agg_spec.rb +0 -90
- 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 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/throw_failures_spec.rb +0 -74
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -334
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- 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/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- 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/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_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/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_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 -59
- data/spec/integration/associations_test.rb +0 -2597
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1981
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2396
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -889
- data/spec/integration/spec_helper.rb +0 -65
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -603
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4738
- data/spec/model/base_spec.rb +0 -875
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2377
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -956
- data/spec/model/plugins_spec.rb +0 -429
- data/spec/model/record_spec.rb +0 -2118
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -220
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The insert_conflict plugin allows handling conflicts due to unique
|
|
6
|
+
# constraints when saving new model instance, using the INSERT ON CONFLICT
|
|
7
|
+
# support in PostgreSQL 9.5+ and SQLite 3.24.0+. Example:
|
|
8
|
+
#
|
|
9
|
+
# class Album < Sequel::Model
|
|
10
|
+
# plugin :insert_conflict
|
|
11
|
+
# end
|
|
12
|
+
#
|
|
13
|
+
# Album.new(name: 'Foo', copies_sold: 1000).
|
|
14
|
+
# insert_conflict(
|
|
15
|
+
# target: :name,
|
|
16
|
+
# update: {copies_sold: Sequel[:excluded][:b]}
|
|
17
|
+
# ).
|
|
18
|
+
# save
|
|
19
|
+
#
|
|
20
|
+
# This example will try to insert the album, but if there is an existing
|
|
21
|
+
# album with the name 'Foo', this will update the copies_sold attribute
|
|
22
|
+
# for that album. See the PostgreSQL and SQLite adapter documention for
|
|
23
|
+
# the options you can pass to the insert_conflict method.
|
|
24
|
+
#
|
|
25
|
+
# Usage:
|
|
26
|
+
#
|
|
27
|
+
# # Make all model subclasses support insert_conflict
|
|
28
|
+
# Sequel::Model.plugin :insert_conflict
|
|
29
|
+
#
|
|
30
|
+
# # Make the Album class support insert_conflict
|
|
31
|
+
# Album.plugin :insert_conflict
|
|
32
|
+
module InsertConflict
|
|
33
|
+
def self.configure(model)
|
|
34
|
+
model.instance_exec do
|
|
35
|
+
if @dataset && !@dataset.respond_to?(:insert_conflict)
|
|
36
|
+
raise Error, "#{self}'s dataset does not support insert_conflict"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
module InstanceMethods
|
|
42
|
+
# Set the insert_conflict options to pass to the dataset when inserting.
|
|
43
|
+
def insert_conflict(opts=OPTS)
|
|
44
|
+
raise Error, "Model#insert_conflict is only supported on new model instances" unless new?
|
|
45
|
+
@insert_conflict_opts = opts
|
|
46
|
+
self
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# Set the dataset used for inserting to use INSERT ON CONFLICT
|
|
52
|
+
# Model#insert_conflict has been called on the instance previously.
|
|
53
|
+
def _insert_dataset
|
|
54
|
+
ds = super
|
|
55
|
+
|
|
56
|
+
if @insert_conflict_opts
|
|
57
|
+
ds = ds.insert_conflict(@insert_conflict_opts)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
ds
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Disable the use of prepared insert statements, as they are not compatible
|
|
64
|
+
# with this plugin.
|
|
65
|
+
def use_prepared_statements_for?(type)
|
|
66
|
+
return false if type == :insert || type == :insert_select
|
|
67
|
+
super if defined?(super)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The instance_specific_default plugin exists to make it easier to use a
|
|
6
|
+
# global :instance_specific association option, or to warn or raise when Sequel
|
|
7
|
+
# has to guess which value to use :instance_specific option (Sequel defaults to
|
|
8
|
+
# guessing true as that is the conservative setting). It is helpful to
|
|
9
|
+
# use this plugin, particularly with the :warn or :raise settings, to determine
|
|
10
|
+
# which associations should have :instance_specific set. Setting the
|
|
11
|
+
# :instance_specific to false for associations that are not instance specific
|
|
12
|
+
# can improve performance.
|
|
13
|
+
#
|
|
14
|
+
# Associations are instance-specific if their block calls
|
|
15
|
+
# a model instance method, or where the value of the block varies
|
|
16
|
+
# based on runtime state, and the variance is outside of a delayed evaluation.
|
|
17
|
+
# For example, with the following three associations:
|
|
18
|
+
#
|
|
19
|
+
# Album.one_to_one :first_track, class: :Track do |ds|
|
|
20
|
+
# ds.where(number: 1)
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# Album.one_to_one :last_track, class: :Track do |ds|
|
|
24
|
+
# ds.where(number: num_tracks)
|
|
25
|
+
# end
|
|
26
|
+
#
|
|
27
|
+
# Album.one_to_many :recent_tracks, class: :Track do |ds|
|
|
28
|
+
# ds.where{date_updated > Date.today - 10}
|
|
29
|
+
# end
|
|
30
|
+
#
|
|
31
|
+
# +first_track+ is not instance specific, but +last_track+ and +recent_tracks+ are.
|
|
32
|
+
# +last_trac+ is because the +num_tracks+ call in the block is calling
|
|
33
|
+
# <tt>Album#num_tracks</tt>. +recent_tracks+ is because the value will change over
|
|
34
|
+
# time. This plugin allows you to find these cases, and set the :instance_specific
|
|
35
|
+
# option appropriately for them:
|
|
36
|
+
#
|
|
37
|
+
# Album.one_to_one :first_track, class: :Track, instance_specific: false do |ds|
|
|
38
|
+
# ds.where(number: 1)
|
|
39
|
+
# end
|
|
40
|
+
#
|
|
41
|
+
# Album.one_to_one :last_track, class: :Track, instance_specific: true do |ds|
|
|
42
|
+
# ds.where(number: num_tracks)
|
|
43
|
+
# end
|
|
44
|
+
#
|
|
45
|
+
# Album.one_to_many :recent_tracks, class: :Track, instance_specific: true do |ds|
|
|
46
|
+
# ds.where{date_updated > Date.today - 10}
|
|
47
|
+
# end
|
|
48
|
+
#
|
|
49
|
+
# For the +recent_tracks+ association, instead of marking it instance_specific, you
|
|
50
|
+
# could also use a delayed evaluation, since it doesn't actually contain
|
|
51
|
+
# instance-specific code:
|
|
52
|
+
#
|
|
53
|
+
# Album.one_to_many :recent_tracks, class: :Track, instance_specific: false do |ds|
|
|
54
|
+
# ds.where{date_updated > Sequel.delay{Date.today - 10}}
|
|
55
|
+
# end
|
|
56
|
+
#
|
|
57
|
+
# Possible arguments to provide when loading the plugin:
|
|
58
|
+
#
|
|
59
|
+
# true :: Set the :instance_specific option to true
|
|
60
|
+
# false :: Set the :instance_specific option to false
|
|
61
|
+
# :default :: Call super to set the :instance_specific option
|
|
62
|
+
# :warn :: Emit a warning before calling super to set the :instance_specific option
|
|
63
|
+
# :raise :: Raise a Sequel::Error if an :instance_specific option is not provided and
|
|
64
|
+
# an association could be instance-specific.
|
|
65
|
+
#
|
|
66
|
+
# Note that this plugin only affects associations which could be instance
|
|
67
|
+
# specific (those with blocks), where the :instance_specific option was not
|
|
68
|
+
# specified when the association was created.
|
|
69
|
+
#
|
|
70
|
+
# Usage:
|
|
71
|
+
#
|
|
72
|
+
# # Set how to handle associations that could be instance specific
|
|
73
|
+
# # but did not specify an :instance_specific option, for all subclasses
|
|
74
|
+
# # (set before creating subclasses).
|
|
75
|
+
# Sequel::Model.plugin :instance_specific_default, :warn
|
|
76
|
+
#
|
|
77
|
+
# # Set how to handle associations that could be instance specific
|
|
78
|
+
# # but did not specify an :instance_specific option, for the Album class
|
|
79
|
+
# Album.plugin :instance_specific_default, :warn
|
|
80
|
+
module InstanceSpecificDefault
|
|
81
|
+
# Set how to handle associations that could be instance specific but did
|
|
82
|
+
# not specify an :instance_specific value.
|
|
83
|
+
def self.configure(model, default)
|
|
84
|
+
model.instance_variable_set(:@instance_specific_default, default)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
module ClassMethods
|
|
88
|
+
Plugins.inherited_instance_variables(self, :@instance_specific_default=>nil)
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
# Return the appropriate :instance_specific value, or warn or raise if
|
|
93
|
+
# configured.
|
|
94
|
+
def _association_instance_specific_default(name)
|
|
95
|
+
case @instance_specific_default
|
|
96
|
+
when true, false
|
|
97
|
+
return @instance_specific_default
|
|
98
|
+
when :default
|
|
99
|
+
# nothing
|
|
100
|
+
when :warn
|
|
101
|
+
warn("possibly instance-specific association without :instance_specific option (class: #{self}, association: #{name})", :uplevel => 3)
|
|
102
|
+
when :raise
|
|
103
|
+
raise Sequel::Error, "possibly instance-specific association without :instance_specific option (class: #{self}, association: #{name})"
|
|
104
|
+
else
|
|
105
|
+
raise Sequel::Error, "invalid value passed to instance_specific_default plugin: #{@instance_specific_default.inspect}"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
super
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -106,17 +106,13 @@ module Sequel
|
|
|
106
106
|
# and breaks some aspects of the json_serializer plugin. You can undo the damage
|
|
107
107
|
# done by active_support/json by doing:
|
|
108
108
|
#
|
|
109
|
-
#
|
|
110
|
-
# def to_json(options = {})
|
|
111
|
-
# JSON.generate(self)
|
|
112
|
-
# end
|
|
113
|
-
# end
|
|
114
|
-
#
|
|
115
|
-
# class Hash
|
|
109
|
+
# module ActiveSupportBrokenJSONFix
|
|
116
110
|
# def to_json(options = {})
|
|
117
111
|
# JSON.generate(self)
|
|
118
112
|
# end
|
|
119
113
|
# end
|
|
114
|
+
# Array.send(:prepend, ActiveSupportBrokenJSONFix)
|
|
115
|
+
# Hash.send(:prepend, ActiveSupportBrokenJSONFix)
|
|
120
116
|
#
|
|
121
117
|
# Note that this will probably cause active_support/json to no longer work
|
|
122
118
|
# correctly in some cases.
|
|
@@ -137,21 +133,39 @@ module Sequel
|
|
|
137
133
|
end
|
|
138
134
|
end
|
|
139
135
|
|
|
140
|
-
#
|
|
141
|
-
#
|
|
142
|
-
# work by creating instances of this class, which take a
|
|
143
|
-
# literal JSON string and have +to_json+ return it.
|
|
136
|
+
# SEQUEL6: Remove
|
|
137
|
+
# :nocov:
|
|
144
138
|
class Literal
|
|
145
|
-
# Store the literal JSON to use
|
|
146
139
|
def initialize(json)
|
|
147
140
|
@json = json
|
|
148
141
|
end
|
|
149
142
|
|
|
150
|
-
# Return the literal JSON to use
|
|
151
143
|
def to_json(*a)
|
|
152
144
|
@json
|
|
153
145
|
end
|
|
154
146
|
end
|
|
147
|
+
# :nocov:
|
|
148
|
+
Sequel::Deprecation.deprecate_constant(self, :Literal)
|
|
149
|
+
|
|
150
|
+
# Convert the given object to a JSON data structure using the given arguments.
|
|
151
|
+
def self.object_to_json_data(obj, *args, &block)
|
|
152
|
+
if obj.is_a?(Array)
|
|
153
|
+
obj.map{|x| object_to_json_data(x, *args, &block)}
|
|
154
|
+
else
|
|
155
|
+
if obj.respond_to?(:to_json_data)
|
|
156
|
+
obj.to_json_data(*args, &block)
|
|
157
|
+
else
|
|
158
|
+
begin
|
|
159
|
+
Sequel.parse_json(Sequel.object_to_json(obj, *args, &block))
|
|
160
|
+
# :nocov:
|
|
161
|
+
rescue Sequel.json_parser_error_class
|
|
162
|
+
# Support for old Ruby code that only supports parsing JSON object/array
|
|
163
|
+
Sequel.parse_json(Sequel.object_to_json([obj], *args, &block))[0]
|
|
164
|
+
# :nocov:
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
155
169
|
|
|
156
170
|
module ClassMethods
|
|
157
171
|
# The default opts to use when serializing model objects to JSON.
|
|
@@ -328,20 +342,7 @@ module Sequel
|
|
|
328
342
|
end
|
|
329
343
|
|
|
330
344
|
v = v.empty? ? [] : [v]
|
|
331
|
-
|
|
332
|
-
objs = public_send(k)
|
|
333
|
-
|
|
334
|
-
is_array = if r = model.association_reflection(k)
|
|
335
|
-
r.returns_array?
|
|
336
|
-
else
|
|
337
|
-
objs.is_a?(Array)
|
|
338
|
-
end
|
|
339
|
-
|
|
340
|
-
h[key_name] = if is_array
|
|
341
|
-
objs.map{|obj| Literal.new(Sequel.object_to_json(obj, *v))}
|
|
342
|
-
else
|
|
343
|
-
Literal.new(Sequel.object_to_json(objs, *v))
|
|
344
|
-
end
|
|
345
|
+
h[key_name] = JsonSerializer.object_to_json_data(public_send(k), *v)
|
|
345
346
|
end
|
|
346
347
|
else
|
|
347
348
|
Array(inc).each do |c|
|
|
@@ -351,7 +352,8 @@ module Sequel
|
|
|
351
352
|
else
|
|
352
353
|
key_name = c.to_s
|
|
353
354
|
end
|
|
354
|
-
|
|
355
|
+
|
|
356
|
+
h[key_name] = JsonSerializer.object_to_json_data(public_send(c))
|
|
355
357
|
end
|
|
356
358
|
end
|
|
357
359
|
end
|
|
@@ -363,12 +365,28 @@ module Sequel
|
|
|
363
365
|
h = {root => h}
|
|
364
366
|
end
|
|
365
367
|
|
|
366
|
-
h = yield h if
|
|
368
|
+
h = yield h if defined?(yield)
|
|
367
369
|
Sequel.object_to_json(h, *a)
|
|
368
370
|
end
|
|
371
|
+
|
|
372
|
+
# Convert the receiver to a JSON data structure using the given arguments.
|
|
373
|
+
def to_json_data(*args, &block)
|
|
374
|
+
if block
|
|
375
|
+
to_json(*args){|x| return block.call(x)}
|
|
376
|
+
else
|
|
377
|
+
to_json(*args){|x| return x}
|
|
378
|
+
end
|
|
379
|
+
end
|
|
369
380
|
end
|
|
370
381
|
|
|
371
382
|
module DatasetMethods
|
|
383
|
+
# Store default options used when calling to_json on this dataset.
|
|
384
|
+
# These options take precedence over the class level options,
|
|
385
|
+
# and can be overridden by passing options directly to to_json.
|
|
386
|
+
def json_serializer_opts(opts=OPTS)
|
|
387
|
+
clone(:json_serializer_opts=>opts)
|
|
388
|
+
end
|
|
389
|
+
|
|
372
390
|
# Return a JSON string representing an array of all objects in
|
|
373
391
|
# this dataset. Takes the same options as the instance
|
|
374
392
|
# method, and passes them to every instance. Additionally,
|
|
@@ -386,11 +404,15 @@ module Sequel
|
|
|
386
404
|
# object. If set to a string, wraps the collection in
|
|
387
405
|
# a root object using the string as the key.
|
|
388
406
|
def to_json(*a)
|
|
389
|
-
|
|
390
|
-
|
|
407
|
+
opts = model.json_serializer_opts
|
|
408
|
+
|
|
409
|
+
if ds_opts = @opts[:json_serializer_opts]
|
|
410
|
+
opts = opts.merge(ds_opts)
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
if (arg = a.first).is_a?(Hash)
|
|
414
|
+
opts = opts.merge(arg)
|
|
391
415
|
a = []
|
|
392
|
-
else
|
|
393
|
-
opts = model.json_serializer_opts
|
|
394
416
|
end
|
|
395
417
|
|
|
396
418
|
case collection_root = opts[:root]
|
|
@@ -413,13 +435,13 @@ module Sequel
|
|
|
413
435
|
else
|
|
414
436
|
all
|
|
415
437
|
end
|
|
416
|
-
|
|
438
|
+
JsonSerializer.object_to_json_data(array, opts, &opts[:instance_block])
|
|
417
439
|
else
|
|
418
440
|
all
|
|
419
441
|
end
|
|
420
442
|
|
|
421
443
|
res = {collection_root => res} if collection_root
|
|
422
|
-
res = yield res if
|
|
444
|
+
res = yield res if defined?(yield)
|
|
423
445
|
|
|
424
446
|
Sequel.object_to_json(res, *a)
|
|
425
447
|
end
|
|
@@ -98,7 +98,7 @@ module Sequel
|
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
if retrieved_with
|
|
101
|
-
|
|
101
|
+
primary_key = model.primary_key
|
|
102
102
|
composite_pk = true if primary_key.is_a?(Array)
|
|
103
103
|
id_map = {}
|
|
104
104
|
retrieved_with.each{|o| id_map[o.pk] = o unless o.values.has_key?(a) || o.frozen?}
|
|
@@ -123,16 +123,25 @@ module Sequel
|
|
|
123
123
|
nil
|
|
124
124
|
end
|
|
125
125
|
|
|
126
|
+
# Whether a separate query should be used for each join table.
|
|
127
|
+
def separate_query_per_table?
|
|
128
|
+
self[:separate_query_per_table]
|
|
129
|
+
end
|
|
130
|
+
|
|
126
131
|
private
|
|
127
132
|
|
|
128
133
|
def _associated_dataset
|
|
129
134
|
ds = associated_class
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
135
|
+
if separate_query_per_table?
|
|
136
|
+
ds = ds.dataset
|
|
137
|
+
else
|
|
138
|
+
(reverse_edges + [final_reverse_edge]).each do |t|
|
|
139
|
+
h = {:qualify=>:deep}
|
|
140
|
+
if t[:alias] != t[:table]
|
|
141
|
+
h[:table_alias] = t[:alias]
|
|
142
|
+
end
|
|
143
|
+
ds = ds.join(t[:table], Array(t[:left]).zip(Array(t[:right])), h)
|
|
134
144
|
end
|
|
135
|
-
ds = ds.join(t[:table], Array(t[:left]).zip(Array(t[:right])), h)
|
|
136
145
|
end
|
|
137
146
|
ds
|
|
138
147
|
end
|
|
@@ -208,6 +217,7 @@ module Sequel
|
|
|
208
217
|
# :right (last array element) :: The key joining the table to the next table. Can use an
|
|
209
218
|
# array of symbols for a composite key association.
|
|
210
219
|
# If a hash is provided, the following keys are respected when using eager_graph:
|
|
220
|
+
# :db :: The Database containing the table. This changes lookup to use a separate query for each join table.
|
|
211
221
|
# :block :: A proc to use as the block argument to join.
|
|
212
222
|
# :conditions :: Extra conditions to add to the JOIN ON clause. Must be a hash or array of two pairs.
|
|
213
223
|
# :join_type :: The join type to use for the join, defaults to :left_outer.
|
|
@@ -233,32 +243,121 @@ module Sequel
|
|
|
233
243
|
opts[:after_load].unshift(:array_uniq!)
|
|
234
244
|
end
|
|
235
245
|
opts[:cartesian_product_number] ||= one_through_many ? 0 : 2
|
|
236
|
-
|
|
246
|
+
separate_query_per_table = false
|
|
247
|
+
through = opts[:through] = opts[:through].map do |e|
|
|
237
248
|
case e
|
|
238
249
|
when Array
|
|
239
250
|
raise(Error, "array elements of the through option/argument for many_through_many associations must have at least three elements") unless e.length == 3
|
|
240
251
|
{:table=>e[0], :left=>e[1], :right=>e[2]}
|
|
241
252
|
when Hash
|
|
242
253
|
raise(Error, "hash elements of the through option/argument for many_through_many associations must contain :table, :left, and :right keys") unless e[:table] && e[:left] && e[:right]
|
|
254
|
+
separate_query_per_table = true if e[:db]
|
|
243
255
|
e
|
|
244
256
|
else
|
|
245
257
|
raise(Error, "the through option/argument for many_through_many associations must be an enumerable of arrays or hashes")
|
|
246
258
|
end
|
|
247
259
|
end
|
|
260
|
+
opts[:separate_query_per_table] = separate_query_per_table
|
|
248
261
|
|
|
249
262
|
left_key = opts[:left_key] = opts[:through].first[:left]
|
|
250
263
|
opts[:left_keys] = Array(left_key)
|
|
251
|
-
opts[:uses_left_composite_keys] = left_key.is_a?(Array)
|
|
264
|
+
uses_lcks = opts[:uses_left_composite_keys] = left_key.is_a?(Array)
|
|
252
265
|
left_pk = (opts[:left_primary_key] ||= self.primary_key)
|
|
253
266
|
raise(Error, "no primary key specified for #{inspect}") unless left_pk
|
|
254
267
|
opts[:eager_loader_key] = left_pk unless opts.has_key?(:eager_loader_key)
|
|
255
268
|
opts[:left_primary_keys] = Array(left_pk)
|
|
256
269
|
lpkc = opts[:left_primary_key_column] ||= left_pk
|
|
257
270
|
lpkcs = opts[:left_primary_key_columns] ||= Array(lpkc)
|
|
258
|
-
opts[:dataset] ||= opts.association_dataset_proc
|
|
259
271
|
|
|
260
272
|
opts[:left_key_alias] ||= opts.default_associated_key_alias
|
|
261
|
-
|
|
273
|
+
if separate_query_per_table
|
|
274
|
+
opts[:use_placeholder_loader] = false
|
|
275
|
+
opts[:allow_eager_graph] = false
|
|
276
|
+
opts[:allow_filtering_by] = false
|
|
277
|
+
opts[:eager_limit_strategy] = nil
|
|
278
|
+
|
|
279
|
+
opts[:dataset] ||= proc do |r|
|
|
280
|
+
def_db = r.associated_class.db
|
|
281
|
+
vals = uses_lcks ? [lpkcs.map{|k| get_column_value(k)}] : get_column_value(left_pk)
|
|
282
|
+
|
|
283
|
+
has_results = through.each do |edge|
|
|
284
|
+
ds = (edge[:db] || def_db).from(edge[:table]).where(edge[:left]=>vals)
|
|
285
|
+
ds = ds.where(edge[:conditions]) if edge[:conditions]
|
|
286
|
+
right = edge[:right]
|
|
287
|
+
vals = ds.select_map(right)
|
|
288
|
+
if right.is_a?(Array)
|
|
289
|
+
vals.delete_if{|v| v.any?(&:nil?)}
|
|
290
|
+
else
|
|
291
|
+
vals.delete(nil)
|
|
292
|
+
end
|
|
293
|
+
break if vals.empty?
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
ds = r.associated_dataset.where(opts.right_primary_key=>vals)
|
|
297
|
+
ds = ds.clone(:no_results=>true) unless has_results
|
|
298
|
+
ds
|
|
299
|
+
end
|
|
300
|
+
opts[:eager_loader] ||= proc do |eo|
|
|
301
|
+
h = eo[:id_map]
|
|
302
|
+
assign_singular = opts.assign_singular?
|
|
303
|
+
uses_rcks = opts.right_primary_key.is_a?(Array)
|
|
304
|
+
rpk = uses_rcks ? opts.right_primary_keys : opts.right_primary_key
|
|
305
|
+
name = opts[:name]
|
|
306
|
+
def_db = opts.associated_class.db
|
|
307
|
+
join_map = h
|
|
308
|
+
|
|
309
|
+
run_query = through.each do |edge|
|
|
310
|
+
ds = (edge[:db] || def_db).from(edge[:table])
|
|
311
|
+
ds = ds.where(edge[:conditions]) if edge[:conditions]
|
|
312
|
+
left = edge[:left]
|
|
313
|
+
right = edge[:right]
|
|
314
|
+
prev_map = join_map
|
|
315
|
+
join_map = ds.where(left=>join_map.keys).select_hash_groups(right, left)
|
|
316
|
+
if right.is_a?(Array)
|
|
317
|
+
join_map.delete_if{|v,| v.any?(&:nil?)}
|
|
318
|
+
else
|
|
319
|
+
join_map.delete(nil)
|
|
320
|
+
end
|
|
321
|
+
break if join_map.empty?
|
|
322
|
+
join_map.each_value do |vs|
|
|
323
|
+
vs.replace(vs.flat_map{|v| prev_map[v]})
|
|
324
|
+
vs.uniq!
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
eo = Hash[eo]
|
|
329
|
+
|
|
330
|
+
if run_query
|
|
331
|
+
eo[:loader] = false
|
|
332
|
+
eo[:right_keys] = join_map.keys
|
|
333
|
+
else
|
|
334
|
+
eo[:no_results] = true
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
opts[:model].eager_load_results(opts, eo) do |assoc_record|
|
|
338
|
+
rpkv = if uses_rcks
|
|
339
|
+
assoc_record.values.values_at(*rpk)
|
|
340
|
+
else
|
|
341
|
+
assoc_record.values[rpk]
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
objects = join_map[rpkv]
|
|
345
|
+
|
|
346
|
+
if assign_singular
|
|
347
|
+
objects.each do |object|
|
|
348
|
+
object.associations[name] ||= assoc_record
|
|
349
|
+
end
|
|
350
|
+
else
|
|
351
|
+
objects.each do |object|
|
|
352
|
+
object.associations[name].push(assoc_record)
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
else
|
|
358
|
+
opts[:dataset] ||= opts.association_dataset_proc
|
|
359
|
+
opts[:eager_loader] ||= opts.method(:default_eager_loader)
|
|
360
|
+
end
|
|
262
361
|
|
|
263
362
|
join_type = opts[:graph_join_type]
|
|
264
363
|
select = opts[:graph_select]
|
|
@@ -108,11 +108,16 @@ module Sequel
|
|
|
108
108
|
# array of the allowable fields.
|
|
109
109
|
# :limit :: For *_to_many associations, a limit on the number of records
|
|
110
110
|
# that will be processed, to prevent denial of service attacks.
|
|
111
|
-
# :reject_if :: A proc that is
|
|
111
|
+
# :reject_if :: A proc that is called with each attribute hash before it is
|
|
112
112
|
# passed to its associated object. If the proc returns a truthy
|
|
113
113
|
# value, the attribute hash is ignored.
|
|
114
|
+
# :reject_nil :: Ignore nil objects passed to nested attributes setter methods.
|
|
114
115
|
# :remove :: Allow disassociation of nested records (can remove the associated
|
|
115
116
|
# object from the parent object, but not destroy the associated object).
|
|
117
|
+
# :require_modification :: Whether to require modification of nested objects when
|
|
118
|
+
# updating or deleting them (checking that a single row was
|
|
119
|
+
# updated). By default, uses the default require_modification
|
|
120
|
+
# setting for the nested object.
|
|
116
121
|
# :transform :: A proc to transform attribute hashes before they are
|
|
117
122
|
# passed to associated object. Takes two arguments, the parent object and
|
|
118
123
|
# the attribute hash. Uses the return value as the new attribute hash.
|
|
@@ -141,9 +146,12 @@ module Sequel
|
|
|
141
146
|
# class.
|
|
142
147
|
def def_nested_attribute_method(reflection)
|
|
143
148
|
@nested_attributes_module.class_eval do
|
|
144
|
-
|
|
145
|
-
|
|
149
|
+
meth = :"#{reflection[:name]}_attributes="
|
|
150
|
+
assoc = reflection[:name]
|
|
151
|
+
define_method(meth) do |v|
|
|
152
|
+
set_nested_attributes(assoc, v)
|
|
146
153
|
end
|
|
154
|
+
alias_method meth, meth
|
|
147
155
|
end
|
|
148
156
|
end
|
|
149
157
|
end
|
|
@@ -155,6 +163,7 @@ module Sequel
|
|
|
155
163
|
def set_nested_attributes(assoc, obj, opts=OPTS)
|
|
156
164
|
raise(Error, "no association named #{assoc} for #{model.inspect}") unless ref = model.association_reflection(assoc)
|
|
157
165
|
raise(Error, "nested attributes are not enabled for association #{assoc} for #{model.inspect}") unless meta = ref[:nested_attributes]
|
|
166
|
+
return if obj.nil? && meta[:reject_nil]
|
|
158
167
|
meta = meta.merge(opts)
|
|
159
168
|
meta[:reflection] = ref
|
|
160
169
|
if ref.returns_array?
|
|
@@ -282,6 +291,9 @@ module Sequel
|
|
|
282
291
|
obj = Array(public_send(reflection[:name])).find{|x| Array(x.pk).map(&:to_s) == pk}
|
|
283
292
|
end
|
|
284
293
|
if obj
|
|
294
|
+
unless (require_modification = meta[:require_modification]).nil?
|
|
295
|
+
obj.require_modification = require_modification
|
|
296
|
+
end
|
|
285
297
|
attributes = attributes.dup.delete_if{|k,v| str_keys.include? k.to_s}
|
|
286
298
|
if meta[:destroy] && klass.db.send(:typecast_value_boolean, attributes.delete(:_delete) || attributes.delete('_delete'))
|
|
287
299
|
nested_attributes_remove(meta, obj, :destroy=>true)
|