sequel 4.49.0 → 5.0.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 +70 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +3 -5
- data/doc/advanced_associations.rdoc +86 -163
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/schema_modification.rdoc +63 -60
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +3 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel.rb +1 -1
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc.rb +13 -73
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +4 -25
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +7 -13
- data/lib/sequel/adapters/postgres.rb +13 -57
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +23 -224
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +44 -259
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +12 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool.rb +26 -28
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +23 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +89 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/dataset/actions.rb +53 -107
- data/lib/sequel/dataset/dataset_module.rb +3 -15
- data/lib/sequel/dataset/features.rb +30 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +71 -155
- data/lib/sequel/dataset/sql.rb +30 -225
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +23 -40
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +2 -15
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/model/associations.rb +128 -131
- data/lib/sequel/model/base.rb +171 -711
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +101 -480
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +312 -565
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +64 -244
- data/spec/core/dataset_spec.rb +81 -415
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +176 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +74 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +4 -59
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +1 -7
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +2 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +4 -1
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +23 -32
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +1 -1
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +1 -1
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +2 -14
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +3 -3
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +1 -1
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -12
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +3 -3
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +5 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +6 -22
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +6 -6
- data/spec/integration/spec_helper.rb +13 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +18 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +17 -11
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +15 -320
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +29 -121
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +8 -64
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
data/lib/sequel/dataset.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
3
|
module Sequel
|
4
|
-
# A dataset represents an SQL query
|
5
|
-
#
|
6
|
-
# can be used to create, retrieve, update and delete records.
|
4
|
+
# A dataset represents an SQL query. Datasets
|
5
|
+
# can be used to select, insert, update and delete records.
|
7
6
|
#
|
8
7
|
# Query results are always retrieved on demand, so a dataset can be kept
|
9
8
|
# around and reused indefinitely (datasets never cache results):
|
10
9
|
#
|
11
|
-
# my_posts = DB[:posts].where(:
|
10
|
+
# my_posts = DB[:posts].where(author: 'david') # no records are retrieved
|
12
11
|
# my_posts.all # records are retrieved
|
13
12
|
# my_posts.all # records are retrieved again
|
14
13
|
#
|
15
|
-
#
|
16
|
-
#
|
14
|
+
# Datasets are frozen and use a functional style where modification methods
|
15
|
+
# return modified copies of the the dataset. This allows you to reuse
|
16
|
+
# datasets:
|
17
17
|
#
|
18
18
|
# posts = DB[:posts]
|
19
|
-
# davids_posts = posts.where(:
|
20
|
-
# old_posts = posts.where
|
21
|
-
# davids_old_posts = davids_posts.where
|
19
|
+
# davids_posts = posts.where(author: 'david')
|
20
|
+
# old_posts = posts.where{stamp < Date.today - 7}
|
21
|
+
# davids_old_posts = davids_posts.where{stamp < Date.today - 7}
|
22
22
|
#
|
23
23
|
# Datasets are Enumerable objects, so they can be manipulated using any
|
24
24
|
# of the Enumerable methods, such as map, inject, etc.
|
@@ -42,5 +42,13 @@ module Sequel
|
|
42
42
|
include SQL::StringMethods
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
require_relative "dataset/query"
|
46
|
+
require_relative "dataset/actions"
|
47
|
+
require_relative "dataset/features"
|
48
|
+
require_relative "dataset/graph"
|
49
|
+
require_relative "dataset/prepared_statements"
|
50
|
+
require_relative "dataset/misc"
|
51
|
+
require_relative "dataset/sql"
|
52
|
+
require_relative "dataset/placeholder_literalizer"
|
53
|
+
require_relative "dataset/dataset_module"
|
46
54
|
end
|
@@ -12,12 +12,11 @@ module Sequel
|
|
12
12
|
# Action methods defined by Sequel that execute code on the database.
|
13
13
|
ACTION_METHODS = (<<-METHS).split.map(&:to_sym).freeze
|
14
14
|
<< [] all as_hash avg count columns columns! delete each
|
15
|
-
empty? fetch_rows first first! get import insert
|
16
|
-
map max min multi_insert paged_each
|
15
|
+
empty? fetch_rows first first! get import insert last
|
16
|
+
map max min multi_insert paged_each select_hash select_hash_groups select_map select_order_map
|
17
17
|
single_record single_record! single_value single_value! sum to_hash to_hash_groups truncate update
|
18
18
|
where_all where_each where_single_value
|
19
19
|
METHS
|
20
|
-
# SEQUEL5: Remove interval, range
|
21
20
|
|
22
21
|
# The clone options to use when retriveing columns for a dataset.
|
23
22
|
COLUMNS_CLONE_OPTIONS = {:distinct => nil, :limit => 1, :offset=>nil, :where=>nil, :having=>nil, :order=>nil, :row_proc=>nil, :graph=>nil, :eager_graph=>nil}.freeze
|
@@ -25,7 +24,7 @@ module Sequel
|
|
25
24
|
# Inserts the given argument into the database. Returns self so it
|
26
25
|
# can be used safely when chaining:
|
27
26
|
#
|
28
|
-
# DB[:items] << {:
|
27
|
+
# DB[:items] << {id: 0, name: 'Zero'} << DB[:old_items].select(:id, name)
|
29
28
|
def <<(arg)
|
30
29
|
insert(arg)
|
31
30
|
self
|
@@ -33,8 +32,8 @@ module Sequel
|
|
33
32
|
|
34
33
|
# Returns the first record matching the conditions. Examples:
|
35
34
|
#
|
36
|
-
# DB[:table][:
|
37
|
-
# # => {:id
|
35
|
+
# DB[:table][id: 1] # SELECT * FROM table WHERE (id = 1) LIMIT 1
|
36
|
+
# # => {:id=>1}
|
38
37
|
def [](*conditions)
|
39
38
|
raise(Error, 'You cannot call Dataset#[] with an integer or with no arguments') if (conditions.length == 1 and conditions.first.is_a?(Integer)) or conditions.length == 0
|
40
39
|
first(*conditions)
|
@@ -92,6 +91,8 @@ module Sequel
|
|
92
91
|
end
|
93
92
|
end
|
94
93
|
|
94
|
+
COUNT_SELECT = Sequel.function(:count).*.as(:count)
|
95
|
+
|
95
96
|
# Returns the number of records in the dataset. If an argument is provided,
|
96
97
|
# it is used as the argument to count. If a block is provided, it is
|
97
98
|
# treated as a virtual row, and the result is used as the argument to
|
@@ -106,8 +107,7 @@ module Sequel
|
|
106
107
|
def count(arg=(no_arg=true), &block)
|
107
108
|
if no_arg && !block
|
108
109
|
cached_dataset(:_count_ds) do
|
109
|
-
aggregate_dataset.select(
|
110
|
-
#aggregate_dataset.select(COUNT_SELECT).single_value_ds # SEQUEL5
|
110
|
+
aggregate_dataset.select(COUNT_SELECT).single_value_ds
|
111
111
|
end.single_value!.to_i
|
112
112
|
else
|
113
113
|
if block
|
@@ -121,12 +121,8 @@ module Sequel
|
|
121
121
|
_aggregate(:count, arg)
|
122
122
|
end
|
123
123
|
end
|
124
|
-
# SEQUEL5
|
125
|
-
#COUNT_SELECT = Sequel.function(:count).*.as(:count)
|
126
|
-
#private_constant :COUNT_SELECT
|
127
124
|
|
128
|
-
# Deletes the records in the dataset
|
129
|
-
# number of records deleted, but that is adapter dependent.
|
125
|
+
# Deletes the records in the dataset, returning the number of records deleted.
|
130
126
|
#
|
131
127
|
# DB[:table].delete # DELETE * FROM table
|
132
128
|
# # => 3
|
@@ -157,24 +153,22 @@ module Sequel
|
|
157
153
|
self
|
158
154
|
end
|
159
155
|
|
156
|
+
EMPTY_SELECT = Sequel::SQL::AliasedExpression.new(1, :one)
|
157
|
+
|
160
158
|
# Returns true if no records exist in the dataset, false otherwise
|
161
159
|
#
|
162
160
|
# DB[:table].empty? # SELECT 1 AS one FROM table LIMIT 1
|
163
161
|
# # => false
|
164
162
|
def empty?
|
165
163
|
cached_dataset(:_empty_ds) do
|
166
|
-
single_value_ds.unordered.select(
|
167
|
-
# single_value_ds.unordered.select(EMPTY_SELECT) # SEQUEL5
|
164
|
+
single_value_ds.unordered.select(EMPTY_SELECT)
|
168
165
|
end.single_value!.nil?
|
169
166
|
end
|
170
|
-
# SEQUEL5
|
171
|
-
#EMPTY_SELECT = Sequel::SQL::AliasedExpression.new(1, :one)
|
172
|
-
#private_constant :EMPTY_SELECT
|
173
167
|
|
168
|
+
# Returns the first matching record if no arguments are given.
|
174
169
|
# If a integer argument is given, it is interpreted as a limit, and then returns all
|
175
|
-
# matching records up to that limit. If
|
176
|
-
#
|
177
|
-
# argument(s) is passed, it is given to filter and the
|
170
|
+
# matching records up to that limit. If any other type of
|
171
|
+
# argument(s) is passed, it is treated as a filter and the
|
178
172
|
# first matching record is returned. If a block is given, it is used
|
179
173
|
# to filter the dataset before returning anything.
|
180
174
|
#
|
@@ -189,19 +183,19 @@ module Sequel
|
|
189
183
|
# DB[:table].first(2) # SELECT * FROM table LIMIT 2
|
190
184
|
# # => [{:id=>6}, {:id=>4}]
|
191
185
|
#
|
192
|
-
# DB[:table].first(:
|
186
|
+
# DB[:table].first(id: 2) # SELECT * FROM table WHERE (id = 2) LIMIT 1
|
193
187
|
# # => {:id=>2}
|
194
188
|
#
|
195
|
-
# DB[:table].first("id = 3") # SELECT * FROM table WHERE (id = 3) LIMIT 1
|
189
|
+
# DB[:table].first(Sequel.lit("id = 3")) # SELECT * FROM table WHERE (id = 3) LIMIT 1
|
196
190
|
# # => {:id=>3}
|
197
191
|
#
|
198
|
-
# DB[:table].first("id = ?", 4) # SELECT * FROM table WHERE (id = 4) LIMIT 1
|
192
|
+
# DB[:table].first(Sequel.lit("id = ?", 4)) # SELECT * FROM table WHERE (id = 4) LIMIT 1
|
199
193
|
# # => {:id=>4}
|
200
194
|
#
|
201
195
|
# DB[:table].first{id > 2} # SELECT * FROM table WHERE (id > 2) LIMIT 1
|
202
196
|
# # => {:id=>5}
|
203
197
|
#
|
204
|
-
# DB[:table].first("id > ?", 4){id < 6} # SELECT * FROM table WHERE ((id > 4) AND (id < 6)) LIMIT 1
|
198
|
+
# DB[:table].first(Sequel.lit("id > ?", 4)){id < 6} # SELECT * FROM table WHERE ((id > 4) AND (id < 6)) LIMIT 1
|
205
199
|
# # => {:id=>5}
|
206
200
|
#
|
207
201
|
# DB[:table].first(2){id < 2} # SELECT * FROM table WHERE (id < 2) LIMIT 2
|
@@ -361,7 +355,8 @@ module Sequel
|
|
361
355
|
end
|
362
356
|
|
363
357
|
# Inserts values into the associated table. The returned value is generally
|
364
|
-
# the value of the primary key for the inserted row,
|
358
|
+
# the value of the autoincremented primary key for the inserted row, assuming that
|
359
|
+
# the a single row is inserted and the table has an autoincrementing primary key.
|
365
360
|
#
|
366
361
|
# +insert+ handles a number of different argument formats:
|
367
362
|
# no arguments or single empty hash :: Uses DEFAULT VALUES
|
@@ -387,7 +382,7 @@ module Sequel
|
|
387
382
|
# DB[:items].insert([:a, :b], [1,2])
|
388
383
|
# # INSERT INTO items (a, b) VALUES (1, 2)
|
389
384
|
#
|
390
|
-
# DB[:items].insert(:
|
385
|
+
# DB[:items].insert(a: 1, b: 2)
|
391
386
|
# # INSERT INTO items (a, b) VALUES (1, 2)
|
392
387
|
#
|
393
388
|
# DB[:items].insert(DB[:old_items])
|
@@ -404,26 +399,6 @@ module Sequel
|
|
404
399
|
end
|
405
400
|
end
|
406
401
|
|
407
|
-
# Returns the interval between minimum and maximum values for the given
|
408
|
-
# column/expression. Uses a virtual row block if no argument is given.
|
409
|
-
#
|
410
|
-
# DB[:table].interval(:id) # SELECT (max(id) - min(id)) FROM table LIMIT 1
|
411
|
-
# # => 6
|
412
|
-
# DB[:table].interval{function(column)} # SELECT (max(function(column)) - min(function(column))) FROM table LIMIT 1
|
413
|
-
# # => 7
|
414
|
-
def interval(column=Sequel.virtual_row(&Proc.new))
|
415
|
-
Sequel::Deprecation.deprecate("Sequel::Dataset#interval", "Use #max - #min, or use the sequel_4_dataset_methods extension")
|
416
|
-
if loader = cached_placeholder_literalizer(:_interval_loader) do |pl|
|
417
|
-
arg = pl.arg
|
418
|
-
aggregate_dataset.limit(1).select((SQL::Function.new(:max, arg) - SQL::Function.new(:min, arg)).as(:interval))
|
419
|
-
end
|
420
|
-
|
421
|
-
loader.get(column)
|
422
|
-
else
|
423
|
-
aggregate_dataset.get{(max(column) - min(column)).as(:interval)}
|
424
|
-
end
|
425
|
-
end
|
426
|
-
|
427
402
|
# Reverses the order and then runs #first with the given arguments and block. Note that this
|
428
403
|
# will not necessarily give you the last record in the dataset,
|
429
404
|
# unless you have an unambiguous order. If there is not
|
@@ -439,8 +414,8 @@ module Sequel
|
|
439
414
|
reverse.first(*args, &block)
|
440
415
|
end
|
441
416
|
|
442
|
-
# Maps column values for each record in the dataset (if
|
443
|
-
#
|
417
|
+
# Maps column values for each record in the dataset (if an argument is given)
|
418
|
+
# or performs the stock mapping functionality of +Enumerable+ otherwise.
|
444
419
|
# Raises an +Error+ if both an argument and block are given.
|
445
420
|
#
|
446
421
|
# DB[:table].map(:id) # SELECT * FROM table
|
@@ -492,7 +467,7 @@ module Sequel
|
|
492
467
|
# This is a front end for import that allows you to submit an array of
|
493
468
|
# hashes instead of arrays of columns and values:
|
494
469
|
#
|
495
|
-
# DB[:table].multi_insert([{:
|
470
|
+
# DB[:table].multi_insert([{x: 1}, {x: 2}])
|
496
471
|
# # INSERT INTO table (x) VALUES (1)
|
497
472
|
# # INSERT INTO table (x) VALUES (2)
|
498
473
|
#
|
@@ -528,7 +503,7 @@ module Sequel
|
|
528
503
|
# selecting the columns you are ordering by, and none of the columns can contain
|
529
504
|
# NULLs. Note that some Sequel adapters have optimized implementations that will
|
530
505
|
# use cursors or streaming regardless of the :strategy option used.
|
531
|
-
# :filter_values :: If the :
|
506
|
+
# :filter_values :: If the strategy: :filter option is used, this option should be a proc
|
532
507
|
# that accepts the last retreived row for the previous page and an array of
|
533
508
|
# ORDER BY expressions, and returns an array of values relating to those
|
534
509
|
# expressions for the last retrieved row. You will need to use this option
|
@@ -548,13 +523,13 @@ module Sequel
|
|
548
523
|
# # SELECT * FROM table ORDER BY id LIMIT 100 OFFSET 100
|
549
524
|
# # ...
|
550
525
|
#
|
551
|
-
# DB[:table].order(:id).paged_each(:
|
526
|
+
# DB[:table].order(:id).paged_each(strategy: :filter){|row| }
|
552
527
|
# # SELECT * FROM table ORDER BY id LIMIT 1000
|
553
528
|
# # SELECT * FROM table WHERE id > 1001 ORDER BY id LIMIT 1000
|
554
529
|
# # ...
|
555
530
|
#
|
556
|
-
# DB[:table].order(:
|
557
|
-
# :
|
531
|
+
# DB[:table].order(:id).paged_each(strategy: :filter,
|
532
|
+
# filter_values: lambda{|row, exprs| [row[:id]]}){|row| }
|
558
533
|
# # SELECT * FROM table ORDER BY id LIMIT 1000
|
559
534
|
# # SELECT * FROM table WHERE id > 1001 ORDER BY id LIMIT 1000
|
560
535
|
# # ...
|
@@ -618,30 +593,6 @@ module Sequel
|
|
618
593
|
self
|
619
594
|
end
|
620
595
|
|
621
|
-
# Returns a +Range+ instance made from the minimum and maximum values for the
|
622
|
-
# given column/expression. Uses a virtual row block if no argument is given.
|
623
|
-
#
|
624
|
-
# DB[:table].range(:id) # SELECT max(id) AS v1, min(id) AS v2 FROM table LIMIT 1
|
625
|
-
# # => 1..10
|
626
|
-
# DB[:table].interval{function(column)} # SELECT max(function(column)) AS v1, min(function(column)) AS v2 FROM table LIMIT 1
|
627
|
-
# # => 0..7
|
628
|
-
def range(column=Sequel.virtual_row(&Proc.new))
|
629
|
-
Sequel::Deprecation.deprecate("Sequel::Dataset#range", "Use #min..#max, or use the sequel_4_dataset_methods extension")
|
630
|
-
r = if loader = cached_placeholder_literalizer(:_range_loader) do |pl|
|
631
|
-
arg = pl.arg
|
632
|
-
aggregate_dataset.limit(1).select(SQL::Function.new(:min, arg).as(:v1), SQL::Function.new(:max, arg).as(:v2))
|
633
|
-
end
|
634
|
-
|
635
|
-
loader.first(column)
|
636
|
-
else
|
637
|
-
aggregate_dataset.select{[min(column).as(v1), max(column).as(v2)]}.first
|
638
|
-
end
|
639
|
-
|
640
|
-
if r
|
641
|
-
(r[:v1]..r[:v2])
|
642
|
-
end
|
643
|
-
end
|
644
|
-
|
645
596
|
# Returns a hash with key_column values as keys and value_column values as
|
646
597
|
# values. Similar to as_hash, but only selects the columns given. Like
|
647
598
|
# as_hash, it accepts an optional :hash parameter, into which entries will
|
@@ -657,8 +608,7 @@ module Sequel
|
|
657
608
|
# # {[1, 3]=>['a', 'c'], [2, 4]=>['b', 'd'], ...}
|
658
609
|
#
|
659
610
|
# When using this method, you must be sure that each expression has an alias
|
660
|
-
# that Sequel can determine.
|
661
|
-
# on the expression and providing an alias.
|
611
|
+
# that Sequel can determine.
|
662
612
|
def select_hash(key_column, value_column, opts = OPTS)
|
663
613
|
_select_hash(:as_hash, key_column, value_column, opts)
|
664
614
|
end
|
@@ -677,8 +627,7 @@ module Sequel
|
|
677
627
|
# # {['a', 'b']=>[['c', 1], ['d', 2], ...], ...}
|
678
628
|
#
|
679
629
|
# When using this method, you must be sure that each expression has an alias
|
680
|
-
# that Sequel can determine.
|
681
|
-
# on the expression and providing an alias.
|
630
|
+
# that Sequel can determine.
|
682
631
|
def select_hash_groups(key_column, value_column, opts = OPTS)
|
683
632
|
_select_hash(:to_hash_groups, key_column, value_column, opts)
|
684
633
|
end
|
@@ -701,8 +650,7 @@ module Sequel
|
|
701
650
|
# # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
|
702
651
|
#
|
703
652
|
# If you provide an array of expressions, you must be sure that each entry
|
704
|
-
# in the array has an alias that Sequel can determine.
|
705
|
-
# by calling the #as method on the expression and providing an alias.
|
653
|
+
# in the array has an alias that Sequel can determine.
|
706
654
|
def select_map(column=nil, &block)
|
707
655
|
_select_map(column, false, &block)
|
708
656
|
end
|
@@ -721,8 +669,7 @@ module Sequel
|
|
721
669
|
# # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
|
722
670
|
#
|
723
671
|
# If you provide an array of expressions, you must be sure that each entry
|
724
|
-
# in the array has an alias that Sequel can determine.
|
725
|
-
# by calling the #as method on the expression and providing an alias.
|
672
|
+
# in the array has an alias that Sequel can determine.
|
726
673
|
def select_order_map(column=nil, &block)
|
727
674
|
_select_map(column, true, &block)
|
728
675
|
end
|
@@ -817,21 +764,21 @@ module Sequel
|
|
817
764
|
return naked.as_hash(key_column, value_column, opts) if row_proc
|
818
765
|
if value_column.is_a?(Array)
|
819
766
|
if key_column.is_a?(Array)
|
820
|
-
|
767
|
+
public_send(meth){|r| h[r.values_at(*key_column)] = r.values_at(*value_column)}
|
821
768
|
else
|
822
|
-
|
769
|
+
public_send(meth){|r| h[r[key_column]] = r.values_at(*value_column)}
|
823
770
|
end
|
824
771
|
else
|
825
772
|
if key_column.is_a?(Array)
|
826
|
-
|
773
|
+
public_send(meth){|r| h[r.values_at(*key_column)] = r[value_column]}
|
827
774
|
else
|
828
|
-
|
775
|
+
public_send(meth){|r| h[r[key_column]] = r[value_column]}
|
829
776
|
end
|
830
777
|
end
|
831
778
|
elsif key_column.is_a?(Array)
|
832
|
-
|
779
|
+
public_send(meth){|r| h[key_column.map{|k| r[k]}] = r}
|
833
780
|
else
|
834
|
-
|
781
|
+
public_send(meth){|r| h[r[key_column]] = r}
|
835
782
|
end
|
836
783
|
h
|
837
784
|
end
|
@@ -872,21 +819,21 @@ module Sequel
|
|
872
819
|
return naked.to_hash_groups(key_column, value_column, opts) if row_proc
|
873
820
|
if value_column.is_a?(Array)
|
874
821
|
if key_column.is_a?(Array)
|
875
|
-
|
822
|
+
public_send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r.values_at(*value_column)}
|
876
823
|
else
|
877
|
-
|
824
|
+
public_send(meth){|r| (h[r[key_column]] ||= []) << r.values_at(*value_column)}
|
878
825
|
end
|
879
826
|
else
|
880
827
|
if key_column.is_a?(Array)
|
881
|
-
|
828
|
+
public_send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r[value_column]}
|
882
829
|
else
|
883
|
-
|
830
|
+
public_send(meth){|r| (h[r[key_column]] ||= []) << r[value_column]}
|
884
831
|
end
|
885
832
|
end
|
886
833
|
elsif key_column.is_a?(Array)
|
887
|
-
|
834
|
+
public_send(meth){|r| (h[key_column.map{|k| r[k]}] ||= []) << r}
|
888
835
|
else
|
889
|
-
|
836
|
+
public_send(meth){|r| (h[r[key_column]] ||= []) << r}
|
890
837
|
end
|
891
838
|
h
|
892
839
|
end
|
@@ -899,15 +846,14 @@ module Sequel
|
|
899
846
|
execute_ddl(truncate_sql)
|
900
847
|
end
|
901
848
|
|
902
|
-
# Updates values for the dataset. The returned value is
|
903
|
-
#
|
904
|
-
# a hash where the keys are columns to set and values are the values to
|
849
|
+
# Updates values for the dataset. The returned value is the number of rows updated.
|
850
|
+
# +values+ should be a hash where the keys are columns to set and values are the values to
|
905
851
|
# which to set the columns.
|
906
852
|
#
|
907
|
-
# DB[:table].update(:
|
853
|
+
# DB[:table].update(x: nil) # UPDATE table SET x = NULL
|
908
854
|
# # => 10
|
909
855
|
#
|
910
|
-
# DB[:table].update(:
|
856
|
+
# DB[:table].update(x: Sequel[:x]+1, y: 0) # UPDATE table SET x = (x + 1), y = 0
|
911
857
|
# # => 10
|
912
858
|
def update(values=OPTS, &block)
|
913
859
|
sql = update_sql(values)
|
@@ -922,7 +868,7 @@ module Sequel
|
|
922
868
|
# yielding each row to the given block. Basically the same as where(cond).all(&block),
|
923
869
|
# except it can be optimized to not create an intermediate dataset.
|
924
870
|
#
|
925
|
-
# DB[:table].where_all(:
|
871
|
+
# DB[:table].where_all(id: [1,2,3])
|
926
872
|
# # SELECT * FROM table WHERE (id IN (1, 2, 3))
|
927
873
|
def where_all(cond, &block)
|
928
874
|
if loader = _where_loader
|
@@ -936,7 +882,7 @@ module Sequel
|
|
936
882
|
# yielding each row to the given block. Basically the same as where(cond).each(&block),
|
937
883
|
# except it can be optimized to not create an intermediate dataset.
|
938
884
|
#
|
939
|
-
# DB[:table].where_each(:
|
885
|
+
# DB[:table].where_each(id: [1,2,3]){|row| p row}
|
940
886
|
# # SELECT * FROM table WHERE (id IN (1, 2, 3))
|
941
887
|
def where_each(cond, &block)
|
942
888
|
if loader = _where_loader
|
@@ -951,7 +897,7 @@ module Sequel
|
|
951
897
|
# a single column. Basically the same as where(cond).single_value,
|
952
898
|
# except it can be optimized to not create an intermediate dataset.
|
953
899
|
#
|
954
|
-
# DB[:table].select(:name).where_single_value(:
|
900
|
+
# DB[:table].select(:name).where_single_value(id: 1)
|
955
901
|
# # SELECT name FROM table WHERE (id = 1) LIMIT 1
|
956
902
|
def where_single_value(cond)
|
957
903
|
if loader = cached_placeholder_literalizer(:_where_single_value_loader) do |pl|
|
@@ -1069,7 +1015,7 @@ module Sequel
|
|
1069
1015
|
# Internals of +select_hash+ and +select_hash_groups+
|
1070
1016
|
def _select_hash(meth, key_column, value_column, opts=OPTS)
|
1071
1017
|
select(*(key_column.is_a?(Array) ? key_column : [key_column]) + (value_column.is_a?(Array) ? value_column : [value_column])).
|
1072
|
-
|
1018
|
+
public_send(meth, hash_key_symbols(key_column), hash_key_symbols(value_column), opts)
|
1073
1019
|
end
|
1074
1020
|
|
1075
1021
|
# Internals of +select_map+ and +select_order_map+
|
@@ -17,20 +17,8 @@ module Sequel
|
|
17
17
|
# DB[:table].active.with_id_and_name.by_id
|
18
18
|
# # SELECT id, name FROM table WHERE active ORDER BY id
|
19
19
|
class DatasetModule < ::Module
|
20
|
-
%w'where exclude exclude_having having'.map(&:to_sym).each do |meth|
|
21
|
-
define_method(meth) do |name, *args, &block|
|
22
|
-
if block || args.flatten.any?{|arg| arg.is_a?(Proc)}
|
23
|
-
define_method(name){send(meth, *args, &block)}
|
24
|
-
else
|
25
|
-
key = :"_#{meth}_#{name}_ds"
|
26
|
-
define_method(name) do
|
27
|
-
cached_dataset(key){send(meth, *args)}
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
20
|
meths = (<<-METHS).split.map(&:to_sym)
|
21
|
+
where exclude exclude_having having
|
34
22
|
distinct grep group group_and_count group_append
|
35
23
|
limit offset order order_append order_prepend
|
36
24
|
select select_all select_append select_group server
|
@@ -40,11 +28,11 @@ module Sequel
|
|
40
28
|
def self.def_dataset_caching_method(mod, meth)
|
41
29
|
mod.send(:define_method, meth) do |name, *args, &block|
|
42
30
|
if block
|
43
|
-
define_method(name){
|
31
|
+
define_method(name){public_send(meth, *args, &block)}
|
44
32
|
else
|
45
33
|
key = :"_#{meth}_#{name}_ds"
|
46
34
|
define_method(name) do
|
47
|
-
cached_dataset(key){
|
35
|
+
cached_dataset(key){public_send(meth, *args)}
|
48
36
|
end
|
49
37
|
end
|
50
38
|
end
|